Linktipp: Online JavaScript Obfuscator

Monday, May 19, 2008 6:10:13 PM (Mitteleuropäische Sommerzeit, UTC+02:00)

Eigentlich soll mein Blog keine Linksammlung werden, das folgende Tool hat mir aber so gut gefallen, dass ich es gern weiterempfehlen möchte.

Das JavaScript Utility ist nicht nur ein Obfuscator. Er kann außerdem:

  • JavaScript testen
  • JavaScript validieren
  • JavaScript Quellcode neu formatieren (wäre im Visual Studio auch sinnvoll gewesen)
  • JavaScript komprimieren
Was mir bei der Funktion JavaScript komprimieren gut gefallen hat, ist die Option „Add missing semicolon“. Die meisten JS  Obfuscatoren haben diese Option nicht. Das hat zur Folge, dass das JS hinterher nicht mehr läuft.

Hier nun der Link: http://jsutility.pjoneil.net/

Kick it on dotnet-kicks.de

dotnet-forum.de mit eigener Mitgliederkarte

Saturday, April 12, 2008 7:49:22 PM (Mitteleuropäische Sommerzeit, UTC+02:00)

Aus vielen Internetforen kennt man Mitgliederkarten, in denen zu sehen ist, wo welches Mitglied zu Hause ist. So kann man auf einen Blick erkennen, wer in der Nähe wohnt.
Für das dotnet-forum.de setze ich den CommunityServer ein, eine hervorragende Community Plattform mit sehr vielen netten Features.
Leider gibt es keine "Membermap".
Auf externe Dienste, wie zum Beispiel Frappr, wollte ich nicht zurückgreifen, weil sie kaum konfigurierbar und meiner Meinung nach, auch nicht schön sind.
Solch eine Karte kann mit bestehenden APIs relativ schnell entwickelt werden. Ich habe mich als Grundlage für die Microsoft Virtual Earth API entschieden. Schnell musste ich allerdings feststellen, dass die Microsoft Klassen und Methoden viel zu langsam sind um einige hundert User auf der Karte darzustellen. Dies liegt daran, dass die komplette Logik auf dem Client läuft. Wenn z.B. 200 User dargestellt werden sollen, muss das clientseitige JavaScript bei jedem Seitenaufbau alle geografischen Koordinaten bei Microsoft abfragen. Das dauert bei 200 Usern und einer schnellen Internetverbindung etwas über 20 Sekunden.

Ich habe mich entschieden, die geografischen Koordinaten auf dem Server in der Datenbank zu speichern. Dank des ASP.NET Ajax Frameworks ist es nicht sehr schwer, die Daten im Hintergrund vom Server zu laden.
Wenn ein User seinen Wohnort im Profil ändert oder ein neuer User hinzukommt, holt der Webserver sich nur einmal die neuen Geodaten.

Ich hab zwei weitere Gimmicks implementiert: Jeder User wird mit einem farbigen Pushpin angezeigt Dabei werden User, die gerade online sind, mit einem grünen Pin gezeigt. Der eigene Pushpin ist rot, alle anderen sind blau.
Die benötigten Daten frage ich mit Hilfe der CommunityServer API ab.
Weiterhin habe ich eine Umkreissuche implementiert, auch hier ist wieder die komplette Logik auf dem Server.

Die Karte ist ab sofort online und ist für jedes registrierte Mitglied des dotnet-forum.de nutzbar.
Es können natürlich nur Mitglieder angezeigt werden, die auch einen Wohnort im eigenen Profil angegeben haben. ;-)

UsermapIII
Die Umkreissuche

UsermapIV 
Mouseover Effekt

Kick it on dotnet-kicks.de

dotnet-forum.de Individualisieren

Tuesday, March 25, 2008 10:54:02 PM (Mitteleuropäische Zeit, UTC+01:00)

auf der Startseite des dotnet-forum.de ist folgendes zu lesen: Es werden alle Bereiche abgedeckt. Von der Entwicklung von Clientanwendungen, Webapplikationen,  bis zur Add-In Entwicklung für das Visual Studio.“

Diese Fülle an Themen bringt leider einen kleinen Nachteil mit sich, die Anzahl der Unterforen (zur Zeit 30), ist sehr hoch, dies kann schnell unübersichtlich werden. Vermutlich interessieren sich nicht alle Forenmitglieder für alle Themen bzw. Unterforen.

Die Foren – Software bietet hier ein sehr nützliche Funktion, das Individualisieren des Forums.

Durch einen Klick auf diesen unscheinbaren Link

IndividualisierenI

gelangt man zu einer sehr komfortable Oberfläche (Ajax) mit der man einzelne Unterforen ein und ausblenden kann.

IndividualisierenII

So können z.B. Webentwickler alle Foren ausblenden die sich mit der Entwicklung von Windows Clients beschäftigen.

Praktische Sache!

Kick it on dotnet-kicks.de

Ausgeben der aktuellen Serverzeit mit ASP.NET AJAX

Monday, November 12, 2007 11:12:32 PM (Mitteleuropäische Zeit, UTC+01:00)

Immer wieder wird in unterschiedlichen Foren gefragt wie man die aktuelle Zeit des Webservers auf einer Webseite anzeigen kann.
Dies ist mit reinem ASP.NET nicht möglich, es sei denn, man bringt den Benutzer der Webseite dazu, im Sekundentakt (oder schneller) die F5 Taste zu drücken :-)
Wie kann das Problem also gelöst werden? Vielleicht mit JavaScript? Nein, denn JavaScript wird auf der Client-Seite ausgeführt, das bedeutet, es wird die Uhrzeit des Client Rechners angezeigt und ob die immer stimmt, lasse ich mal offen.  Ganz ohne JavaScript geht es trotzdem nicht.
Im folgenden Beispiel wird ein JavaScript in regelmäßigen Abständen die aktuelle Uhrzeit vom Server abfragen und das Ergebnis in ein Textfeld schreiben.
Die aktuelle Uhrzeit liefert ein Webservice der sich auf dem Server läuft.
Als Proxy zwischen JavaScript und Webservice dient ein ASP.NET AJAX ScriptManager:

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Services>
        <asp:ServiceReference Path="WebServiceServerTime.asmx" />
    </Services>
</asp:ScriptManager>

Im Scriptmanager wird der Webservice referenziert, der die Zeit als String zurückgibt.
Der Webservice liegt im gleichen Verzeichnis wie die Webseite, die die Zeit ausgeben soll. Der Webservice ist sehr übersichtlich:

using System;
using System.Web.Script.Services;
using System.Web.Services;

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class WebServiceServerTime : WebService
{
    [WebMethod]
    public string GetTime()
    {
        return DateTime.Now.ToString();
    }
}

Wichtig ist hierbei das Attribut [ScriptService]. Mit diesem Attribut ist der Webservice auch für JavaScript-Clients verfügbar.
Kommen wir nun zur Client Seite, wie bereits erwähnt, geht es nicht ohne JavaScript:

<script language="javascript" type="text/javascript">

    function CallTimeservice() 
    {
        ret = WebServiceServerTime.GetTime(onGetTime);
        setTimeout('CallTimeservice()', 500);                        
    }

    function onGetTime (arg) 
    {
        var textfeld = document.getElementById('input1');          
        textfeld.value = arg;          
    }

</script>

Das dazugehörige Textfeld:

<input id="input1" readonly="readonly" type="text" />

Das Script beinhaltet eine Methode und einen Ereignishandler.
Die Methode CallTimeservice () wird alle 500 ms neu aufgerufen.
Die aktuelle Zeit die vom Webserver übertragen wurde, wird durch den Handler onGetTime() in das Textfeld geschrieben.
Leider gibt es in JavaScript keine Sleep() oder Wait() Methode desshalb muss die SetTimeout() Methode verwendet werden.

Warum habe ich 500 ms gewählt?
Das Nyquist-Shannon-Abtasttheorem besagt, dass die Abtastfrequenz mindestens doppelt so hoch sein muss wie das Ursprungssignal um Informationsverlust zu vermeiden.
Das bedeutet im Klartext: Die Zeit die auf dem Server mit DatTime.Now.ToString() abgefragt wird, ändert sich mit 1Hz, also muss die Zeit mit 2 Hz (f=1/s --> 1/2 Hz = 0,5s) abgefragt werden, damit der User einen gleichmäßigen Timer ticken sieht. Der Wert darf natürlich auch kleiner als 500ms sein, dies wäre genauer, erhöht aber die Netzwerklast des Servers zusätzlich.

Zum Erstellen des Projektes sollte man zuerst ASP.Net AJAX installieren, dann kann im Visual Studio eine „Ajax Enabled Webseite“ erstellt werden.

AjaxEnabledWebsite

Diese Vorlage hat den Vorteil, dass die Web.config für Ajax vorbereitet ist und dass sich der Scriptmanager in jeder .aspx Datei befindet.

Mit dieser kleinen Anleitung sollte es nicht schwer fallen einen Countdown oder ähnliches zu realisieren.

Vielleicht sollte Ebay auch mal drüber nachdenken.
So ein Auktionscountdown wäre sicher sinnvoll.

Kick it on dotnet-kicks.de