Node.js mit Eclipse einrichten

Ich möchte einen Server für Fehlermeldungen erstellen. Dieser soll sehr dynamisch sein und deshalb werde ich Node.js und MongoDB oder eine andere NoSQL-Datenbank verwenden. Hier möchte ich festhalten, welche Schritte ich unternommen habe, um den Server zu entwickeln. Zunächst die Einrichtung von Node.js auf der Entwicklermaschine (Windows). Node.js von nodejs.org herunterladen. Ausführen. Fertig! Das war einfach.

Jetzt zur IDE. Ich möchte Eclipse benutzen, da dies, wenn auch manchmal etwas unhandlich, mir bis jetzt gute Dienste geleistet hat. Ich lade also die Eclipse Java Version von eclipse.org runter. Entpacken und den Workspace einstellen.

Als nächstes lade ich die Javascript Development Tools für Eclipse runter. Unter Help -> Install New Software kann man diese, wenn man „All available Sites“ auswählt, als Unterpunkt von Programming Languages finden. Anhaken und durchklicken. Fertig!

Nun noch schnell ein Javascript-Projekt mit den Standardoptionen erstellen. Dazu noch eine Javascript Source File im Projekt erstellen und folgendes eintragen:

console.log("Hello World!");

Jetzt möchte ich dies Debuggen. Dazu brauche ich den Eclipse Debugger für Googles V8 von http://code.google.com/p/chromedevtools/
I
n Eclipse wird einfach wieder Help -> Install new Software aufgerufen und als Site  http://chromedevtools.googlecode.com/svn/update/dev/ hinzugefügt.
Ausgewählt habe ich die Punkte „Chromium JavaScript Remote Debugger“ und „Chromium JavaScript Debugger Bridge to JSDT“ für die Javascript Development Tools.

Einen Link zur Einrichtung ist dieser: https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger

Viel Spaß damit. Ich probiere den Inhalt des Links jetzt selbst aus.

Windows 8 Metro Enterprise Apps

Metro wurde von Microsoft ganz klar für Consumer konzipiert. Es geht um Unterhaltung, um Spiele, um Nachrichten und das möglichst attraktiv.

Enterprise Apps stehen da zunächst etwas zurück. Obwohl es Wege geben wird Apps im Unternehmen zu installieren, ohne über den Store zu gehen, hat Metro einige Einschränkungen. Eine davon ist, dass Metro-Apps und Desktop-Applikationen nicht direkt miteinander kommunizieren können. (Beispielsweise per API) Und das es erstmal nicht möglich ist direkt auf SQL Server zuzugreifen.

Einen möglichen Weg zur Kommunikation habe ich eben erfolgreich getestet. Da die Metro-Apps Internetzugriff haben, können sie mit Webservices interagieren. Die gute Nachricht: Es ist möglich einen Webservice in einer Desktop-Applikation laufen zu lassen, welcher auf einen bestimmten Port horcht und diesen dann aus der Metro App heraus über localhost abzufragen. Dadurch können, wenn auch umständlich, Metro Apps mit Desktop-Apps kommunizieren. Auch reines TCP soll möglich sein, was noch performanter sein könnte.

Zum Test habe ich mir Node.js runtergeladen und das Beispiel der Webseite mit Node.js ausgeführt. Dies ist ein Webserver, der „Hello World“ zurückliefert. Anschließend habe ich eine neue Grid App in VS 2012 erzeugt und dort in einen der Event-Handler folgenden Code eingefügt:

Dim client As HttpClient = New HttpClient()
Dim s As String = Await client.GetStringAsync("http://127.0.0.1:1337")
Debug.WriteLine(s)

Wichtig ist dabei noch, dass der Event-Handler das Keyword Async bekommen muss, damit Await funktioniert. Der HttpClient befindet sich unter System.Net.Http.
Ergebnis war, dass „Hello World“ ausgegeben wurde. Die Türe zwischen Desktop-Applikationen und Metro steht also offen.

Standardwerte in Jade-Templates

Folgendes Problem:
Ich habe ein Jade-Layout und ein Jade-Template. Ich möchte den Titel-Tag beim Rendern der Seite bestimmen. Das Layout-Template sah so aus (Funktioniert nicht!):

!!! strict
html
  head
    title #{title}
  body
    #kopfzeile Guten Tag!
    #inhalt!= body

Dies funktionierte auch, wenn man es wie folgt aus Express aufrief:

res.render('template.jade', {title: "Mein Titel"});

Nun wollte ich an manchen Stellen das Attribut einfach nicht verwenden und bekam eine Fehlermeldung.
title is not defined
Ich hab mich dann im Git-Repository umgesehen und diesen Eintrag gefunden.
Die Lösung ist, statt direkt auf die Eigenschaft zuzugreifen das locals-Objekt zu benutzen:

!!! strict
html
  head
    title= (locals.title || "Standardtitel")
  body
    #kopfzeile Guten Tag!
    #inhalt!= body

Dies kann nun so aufgerufen werden:

res.render('template.jade');

Oder mit gesetztem Titel:

res.render('template.jade', {locals:{title:"Mein Titel"}});

Aptana Studio 3 zeigt (Pseudo-)Fehler bei statischen Dateien in Node.js

Ich nutze nun Aptana Studio 3 um unter Ubuntu für Node.js zu programmieren. Es gefällt mir gut, da es Autovervollständigung unterstützt. Nun hatte ich einen kleinen Test geschrieben, um statische Dateien, wie Bilder, mit Express verfügbar zu machen und musste feststellen, dass Aptana diesen als Falsch anmeckerte, obwohl er läuft.
Es geht um die folgende Zeile:

app.use(express.static(__dirname + '/public'));

Das Problem ist das Wort static. Dies gehört zu den reservierten Wörtern in Javascript und wurde trotzdem von den Entwicklern genutzt. Da mich das Anmeckern des Fehlers nervte, habe ich die Array-Schreibweise angewendet:

app.use(express['static'](__dirname + '/public'));

Nun meckert er nicht mehr und es funktioniert.

Installieren von Node.js

Um mit Node.js zu arbeiten, benötigt man eine Installation. Die Windows-Packer funktionieren, aber ich hatte Probleme den Paketmanager npm damit laufen zu lassen. Deshalb wird meine Entwicklung mit Node.js in einem Ubuntu in einer virtuellen Maschine stattfinden.

Hier möchte ich beschreiben, wie ich diese Maschine installiert habe, da es viele Anleitungen gab, möchte ich hier den, wie ich finde, einfachsten Weg vorstellen.

Zunächst habe ich Virtual Box heruntergeladen und installiert. Danach habe ich eine Ubuntu Installations-CD runtergeladen, diese in Virtual Box eingebunden, eine Maschine erstellt und Ubuntu standardmäßig installiert.

Da dies nicht meine Produktivumgebung sein soll, habe ich eine Ubuntu Desktop Version gewählt.

Die Anleitungen zur Installation findet man auf nodejs.org im dortigen Wiki. Dort findet man auch eine Anleitung für Windows.
Ich habe diese Anleitung benutzt, welche Node mithilfe des Paketmanagers installiert. Für Ubuntu gab es folgende Befehle:

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:jerome-etienne/neoip
sudo apt-get update
sudo apt-get install nodejs

Nachdem diese ausgeführt waren, konnte ich mit folgendem Befehl die Version von Node abfragen:

node -v

Direkt auf nodejs.org findet man ein Beispiel. Dieses habe ich dann noch in eine Datei gespeichert und ausgeführt. Es funktioniert.

Achja, zuletzt habe ich noch curl installiert, damit ich reine http-Requests absenden kann.

sudo apt-get install curl

Neuentdecktes und TechTalk Online

Ich habe mir heute den Tech Talk Online angesehen. Es war sehr interessant und ich konnte neues Wissen über T-SQL, Windows Azure und Windows 7 erfahren. Freue mich schon auf weitere Online Tech Talks. Aber auch einen richtigen würde ich gerne wieder besuchen.

Außerdem habe ich mir heute interessante Techniken angesehen.
Node.js ist eine hochskalierbare effektive Möglichkeit Webanwendungen zu schreiben. Als Programmiersprache wird dabei Javascript eingesetzt. Dadurch, dass alle I/O-Operationen ansynchron aufgerufen werden, ist der Memory-Footprint sehr viel geringer als bei normalen Servern.

MongoDB ist eine objektorientierte Datenbank. Anstatt Tabellen zu benutzen, werden Objekte in Sammlungen abgelegt. Dabei muss vorher nicht bekannt sein, wie die Objekte aussehen. Als Format für die Objekte wird JSON verwendet. Dadurch eignet sich die Datenbank gut für Webanwendungen und sehr gut für Node.js geeignet, da hier Objekte bereits im richtigen Format vorliegen.

Stay tuned.