Ein simpler statischer Webserver mit Node.js

Des Öfteren braucht man ja einen Http Server, um rein ein paar statische Files bereit zu stellen.
Lösungen gibt es ja hier wie Sand am Meer, wobei die meisten dann doch viel zu viel können (und vor allem viel zu viel installieren), als man eigentlich braucht.

Abhilfe kann hier ein einfacher 5-Zeiler mit nodejs bieten:

Davor muß man aber noch Node.js installieren
und connect mit npm installieren

npm install connect

Jetzt der 5 Zeiler (server.js):

var connect = require('connect');

//Hier den Pfad eingeben,
//indem die statischen (html/js/css) Files liegen.
var HTDOCSPATH = 'C:\data\js\learn'

console.log("serving from dir " + HTDOCSPATH)
connect.createServer(
  connect.static(HTDOCSPATH)
).listen(8080);

Und dann noch starten …

node server.js

Voila!

Jaja, ich weiß. Hardcodierter Pfad und so. Das kann man sicher schöner machen.
Bittesehr: https://gist.github.com/2639556

Ein schönerer Ubuntu Desktop mit elementary und AVN

Irgendwie werde ich nicht so richtig mit dem Aussehen und der Funktionalität des default Ubuntu Themes warm. Mir ist das Theme bei den Headern zu dunkel, zu düster. Das dunkle Braun passt irgendwie nicht so ganz recht ins Bild. Und eigentlich habe ich mich vom Orange auch schon ein wenig abgesehen.

Man kann sich zwar natürlich ein anderes Theme aus den mitgelieferten auswählen, ein wirklich schönes habe ich mir aber nicht gefunden.

Per Zufall bin ich aber dann auf das Elementary Theme gestoßen:

sudo add-apt-repository ppa:elementaryart/ppa
suda apt-get update
sudo apt-get install elementary-theme elementary-icon-theme

Und bin damit viel viel glücklicher:

Optisch gefällt mir so mein Desktop eindeutig besser. Probleme habe ich aber noch immer mit der Taskleiste und mit den Programmstartern.

Doch auch hier gibt es Abhilfe, die sogar aus den Standard Quellen kommt. Das Tool nennt sich Avant Window Navigator und ist nichts anderes als ein stark an OS X angelehntes Dock. Dieses Dock kombiniert also die herkömmliche Taskleiste und die Programmstarter. Man muss es nur installieren:

sudo apt-get install avant-window-navigator

Danach braucht man den AVN nur mehr unter Anwendungen->Zubehör starten, bzw. System->Einstellungen konfigurieren.

Aussehen kann das Ganze dann so:

Für mich ist das um Welten übersichtlicher, schöner und praktischer. So wünsche ich mir mein Interface. Warum kommt das eigentlich nicht so als default?

Festplatte spinnt? S.M.A.R.T. !

Mein System verhält sich wieder mal komisch. Ab und zu scheint der PC kurzfristig einzufrieren, speziell beim Kopieren von großen Dateimengen wird es langsam.

Die Ursache könnte ein Problem mit der Festplatte sein. Jetzt muss ich nur noch sicher gehen, dass es wirklich von der Harddisk kommt.

Eine wirklich gescheite Lösung liefert hier SMART. Die Self-Monitoring, Analysis and Reporting Technology ist ein Standard, der in fast allen Festplatten eingebaut ist. Diese Technologie überwacht die Festplatte, zeichnet Kennzahlen der Disk auf und soll somit automatisch den Zustand der Festplatte ermitteln können.

Die von SMART überwachten Kennzahlen sind zum Beispiel:

Wird jetzt bei einer Kennzahl ein gewisser Threshold überschritten, kann das in den meisten Fällen auf einen defekt der Platte hinweisen.

Neben diesen Kennzahlen bietet aber SMART auch noch die Funktionalität des Loggings von Fehlern, die im Betrieb der Disk auftreten. Per Definition sollen hier im Fehlerfall die genauen Details des Problems im Errorlog der Festplatte gespeichert werden. Damit man solche Fehler einfacher findet, hilft ein Selbsttest der Platte.

Natürlich braucht man jetzt noch Hilfsprogramme, die einerseits die SMART- Logs auslesen und andererseits die Selbsttests anwerfen können. Frei und für die meisten Platformen verfügbar sind hier die smartmontools.

Ich hab jedoch unter Ubuntu die eine grafische Variante davon gewählt und einfach gsmartcontrol installiert:

sudo aptitude install gsmartcontrol

Und damit hab ich auch gleich folgendes auf der Identity-Seite gefunden:

Konventionen für Source Code

Bekanntlich wird ja Code viel öfter gelesen als geschrieben. Meistens natürlich auch noch von unterschiedlichen Personen. Darum ist es äußerst wichtig, dass der Quelltext leserlich, leicht verständlich und damit auch einfach wartbar ist.

Das setzt natürlich einen exzellenten Schreibstil voraus. Und in einer Gruppe von drei Programmieren wird man vermutlich auch drei verschiedene Meinungen finden, wie den jetzt guter Stil genau aussieht. Hält sich jeder an seinen eigenen guten Stil, wird das Endprodukt, an dem alle gemeinsam arbeiten, vermutlich zum Fleckerlteppich. Das kann schon bei trivialen Dingen wie der Benennung von Variablen zum Problem werden:

Willi verwendet seit Jahren die hungarian notation und seine Variablen haben auch englische Namen.
Deshalb definiert er eine seiner Variablen so:

 //changeFlag
int m_iAlter; 

Für ihn ist ganz klar was gemeint ist: Er sieht sofort den Gültigkeitsbereich und den Typ. Speichern will er in dieser Variable den Status, ob sich die Klasse geändert hat. Ganz klar für ihn, er macht das immer so.

Norman findet Abkürzungen super. Deshalb würde er die selbe Variable so definieren:

 boolean chgd;

Josef hingegen liebt ausgeschriebene Variablen und entwickelt grundsätzlich in Deutsch. Sein Code:

 boolean ObjektIstUnverändert; //Wird falsch wenn jemand das Objekt modifiziert

Jetzt hat man mit einem simplen Beispiel drei komplett unterschiedliche Ausprägungen. Und das bei nur einer einzigen Zeile Code. Ganz klar, dass hier schwer lesbarer und unwartbarer Code entsteht. Um das zu vermeiden, muss man sich auf einen gemeinsamen Stil einigen.

Doch was sollen jetzt diese Code Conventions alles abdecken?

  • Naming:
    Wie benennen wir Variablen/Konstanten/Klassen/Typen/Namespaces …? In welcher Sprache? Was schreiben wir groß, was klein?
    Was machen wir mit Sonderzeichen?
  • Kommentierung:
    Was kommentieren wir, wo und in welcher Detailstufe?
  • Klammernsetzung und Einrückung:
    Wohin setzen wir bei Kontrollstrukturen die Klammern hin? Folgezeile? Wie tief rücken wir wann ein?
  • Verbote ?:
    Gibt es Language Features die wir explizit vermeiden wollen (goto, globale Variablen ..) ?
  • Best Practices:
    Maximale Zeilenanzahl von Funktionen und Klassen, Obergrenze der Anzahl von Übergabeparametern einer Funktion, Hardcodierung von Werten …

Als erstes hilft es sicherlich, sich an Herstellervorgaben zu orientieren, wie bei Java, .net oder python. Ich würde hier nur bei Sonderfällen von diesen Vorgaben abweichen, weil sie defacto Standards sind. Von diesen kann man seine internen Konventionen ableiten und mit Best Practices anreichern.

Wichtig ist aber auch, dass die Konventionen nicht zu umfangreich werden. Ein dickes “Gesetzbuch” wird wohl niemand lesen, kennen und einhalten. Hier helfen kleine Codebrocken viel mehr als Beschreibungen in Prosa. Wirklich gut gelungen finde ich den IDesign C# Coding Standard.

Aber am wichtigsten ist natürlich die Einhaltung solcher Conventions. Sonst macht das keinen Sinn.

Produktiver arbeiten mit Cygwin

Am meisten unter Windows fehlt mir mit Abstand eine brauchbare Command-line. Microsoft hat zwar vor einiger Zeit mit der Powershell hier nachgebessert, trotzdem wurde und werde ich damit nicht richtig warm. Das liegt aber vermutlich auch sehr daran, dass ich vermehrt auf unix-artigen Systemen arbeite. Dort hat sich de facto die bash als Standard etabliert. Dank cygwin kann man auch unter Windows mit der bash arbeiten.

Cygwin ist einerseits nicht mehr als eine dll, die Unix System Calls in die Windows-Welt “übersetzt”. Mit dieser Emulationsschicht wird es viel einfacher, Unix Programme unter Windows zum Laufen zu bringen.
Den zweiten Teil von cygwin bilden die eigentlichen Programme, die man mit dem mitgelieferten Setup relativ einfach selektieren, installieren und  updaten kann.

In der Praxis ist die Einrichtung von cygwin ziemlich easy: Man lädt sich die aktuelle setup.exe auf der cygwin-Seite herunter und führt sie aus.
Im Setup kann man optional zusätzliche Pakete/Programme sofort mit-installieren, per default ist die minimum Base selektiert, die für den ersten Start schon mal reicht. Für ein späteres Update oder zum Installieren von zusätzlichen Programmen startet man einfach das Setup neu.

Ist die Installation durch, kann man schon cygwin und damit die bash starten:

Grundsätzlich funktionert jetzt schon alles, trotzdem sollte man dem Standard – Terminalprogramm bessere Umsetzungen vorziehen:

Zum einen gibt es puttycyg, eine gepatchte Version von putty, mit der man auch auf das lokale cygwin zugreifen kann.

Ich verwende aber mintty als Terminal, weil es sich besser in Windows integriert, copy/paste entscheidend besser funktioniert und weil es viel mehr Einstellungen bietet. Mintty kann man einfach im setup.exe auswählen, es wird danach ein Eintrag im Startmenü angelegt.

Wenn man jetzt noch weiß, dass man auf das Windows C: Laufwerk im cygwin unter cygdrivec findet, hat man endgültig gewonnen und kann endlich mit der bash und den Standard Unix Tools unter Windows arbeiten. Zumindest ich bin dadurch um Welten produktiver.

Kuh vs. Erdmännchen

Vor etwas mehr als zwei Jahren habe ich einen Artikel geschrieben über meine Erfahrungen mit Gentoo Linux. Seit dieser Zeit hat sich doch das Eine oder Andere geändert.

Gleich geblieben ist definitiv meine Freude mit Linux. Allerdings tue ich mir nicht mehr die Arbeit mit Gentoo an. Ich will nicht immer wieder selber kompilieren, bei den Updates die Config-Files per Hand mergen. Generell will ich mit Updates so wenig Arbeit wie möglich haben. Das soll einfach funktionieren. Automatisch am Besten.

Irgendwann bin ich dann bei Ubuntu angelangt und bin bis jetzt äußerst zufrieden. Ubuntu gefällt mir wegen der Einfachheit, es funktioniert eigentlich problemlos. Die Zeiten, wo man noch verdammt viel wissen musste, um sich ein Linux zu installieren, sind lange schon vorbei. Das geht mindestens so einfach wie bei Windows. Und wenn man dann doch mal ansteht, gibt es eine Doku, die ihresgleichen sucht.

Ganz besonders gefällt mir die Paketverwaltung in Ubuntu. Neue Programme werden aus definierten Katalogen geladen und dann installiert und konfiguriert. Über diesen Katalog sind auch Updates zu den bereits installierten Programmen abgreifbar. Ubuntu weiß welche Programme in welchen Versionen installiert wurden und kann somit periodisch alle diese Anwendungen auf mögliche Aktualisierungen prüfen. Dieses Konzept fehlt mir bei Windows und am Mac komplett, hier ist jedes Programm auf sich selbst gestellt. Eine vollständige Systemaktualisierung gibt es da so einfach nicht. Bei Ubuntu (eigentlich generell bei Linux) ist das aber der Usus.

Meinen Mac verwende ich nur mehr wegen meiner iPhoto – Familienfotosammlung und wegen iTunes. Windows brauche ich privat nur ganz selten, und wenn, dann nur zum Spielen. Wobei da ist mir mittlerweile die PS3 auch schon lieber. Vor zwei Jahren machte mir noch das Entwickeln unter Windows Spaß. Mittlerweile ist das schon längst nicht mehr so. Um auf einem Windows Rechner richtig produktiv zu sein, brauche ich cygwin, das mir ein Linux emuliert. Nur so fühle ich mich halbwegs zuhause, aber halt emuliert.

Aber natürlich gibt es auch nicht so tolle Seiten an Ubuntu. Mir fehlt beispielsweise ein anständiges Grafikprogramm. Auch bei der Navigation im System-menü habe ich so meine Schwierigkeiten, weil ich auf den ersten Klick nie das Gesuchte finde.

Aber eigentlich wird ja das Betriebssystem immer unwichtiger. Wichtiger wird dagegen immer mehr ein Programm, in dem die meisten weiteren Anwendungen laufen. Ein Container, den ich eigentlich immer offen habe und der mehr und mehr das eigentliche Betriebssystem ablöst. Klar, ich rede vom Browser. Aber das ist eine andere Geschichte…

Appliances mit Virtualbox (nicht nur) für Ubuntu Maverick

Unter Ubuntu kann man den einfachen Weg gehen und die Open Source Edition von VirtualBox installieren:

sudo aptitude install virtualbox-ose virtualbox-ose-guest-utils

Will man aber “erweiterte” Features wie USB pass-trough zum Guest und RDP haben, dann muß man die PUEL (Personal Use and Evaluation License) –  Version installieren.

Glücklicherweise ist das auch nicht wirklich schwer:

In /etc/apt/sources.list die zusätzliche Paketquelle hinzufügen:

deb http://download.virtualbox.org/virtualbox/debian maverick non-free

danach den Key einspielen:

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 98AB5139

und jetzt kann man schon installieren

sudo apt-get update
sudo apt-get install virtualbox-3.2

Und schon findet man VirtualBox im Anwendungen Menü.

Hat man jetzt die Anwendung eingerichtet, hilft das ohne einer virtuellen Maschine mit entsprechendem Guest Operating System mal nicht viel. Natürlich kann man jetzt eine neue VM einrichten und ein OS nach Geschmack per Hand aufsetzen.

Glücklicherweise gibt aber auch eine ganze Menge vorgefertigter Appliances zum downloaden, die meisten findet man auf virtualboxes.org

Ich habe aber auch sehr brauchbare fertige Appliances von turnkeylinux gefunden. Die sind deswegen so praktisch, weil diese für einen ganz spezifischen Zweck gebundelt wurden. Neben fertigen CMS Systemen (Joomla, WordPress) findet man unter anderem vorkonfigurierte Bugtracker, Wikis, und sogar spezielle Developer Boxen für Ruby/Rails, Java und natürlich auch vordefinierte LAMP Stacks.
Will man nur kurz mal was probieren, und sich viel Installation und Konfiguration ersparen, dann sind diese Appliances optimal.

Suse bietet einen ähnlichen Service, man kann sich entweder selbst Online eine Appliance zusammenbauen, oder in der suse gallery fertige Images herunterladen. Hier muss man sich zwar mit einer OpenId anmelden, dafür funktioniert der Service prima und macht auch eine Menge Spaß.

Hat man jetzt noch einen halbwegs schnellen Rechner mit ausreichend Arbeitsspeicher eingebaut, dann laufen auch die virtuellen Maschinen rund und performant.

HTML5 Forms mit Firefox 4

Vor kurzem hab ich ja meinen Firefox auf die Beta 7 gehoben. Und damit steht mir jetzt endlich die HTML5 Form Validation zur Verfügung. Das klingt vorerst ja mal toll, aber was heißt das eigentlich wirklich?

Erstens kann man für Text-Inputs mit Bordmitteln einen Platzhaltertext definieren, der sofort verschwindet wenn der Cursor im Feld ist, oder das Feld ausgefüllt wurde.

<input placeholder="Enter your text here !!!" />

Selbiges funktioniert auch wunderbar für Textareas.

Als erste wirkliche Validierungsfunktionalität sticht gleich mal das Attribut required ins Auge:

<input required />
<textarea required></textarea>


Hier markiert der Browser diese Felder sofort mit einem roten Rand und verhindert ein Submit der Form, falls das Feld leer ist.

Dazu gibt es noch das maxlength Attribut, um die Anzahl der Zeichen zu begrenzen.

<input maxlength="4" />

Firefox blockiert hier einfach die Eingabe nach den angegebenen Zeichen, das funktioniert aber auch schon in der Version 3.6

Zusätzlich sind in HTML 5 auch noch die Attribute min, max und step definiert:

<input min="100" max="400" step="10" />

Leider ist dieses Feature aber noch nicht im Firefox implementiert, wobei ich aber davon ausgehe, dass das spätestens mit der 4.0 Final fertig sein wird.

Neu in der 4er Beta sind jedoch die zusätzlichen Typen für die Input Boxen:

  <input type="search" />
  <input type="tel" />
  <input type="url" />
  <input type="email" />

Wobei ich beim type=”search noch keine spezielle Funktionalität erkennen konnte, type=”tel validiert in der Basiseinstellung vorerst alles.
Url und email hingegen prüfen out of the box auf gültige Werte.
Genauer konfigurieren lassen sich diese Typen mit dem pattern Attribut, dann macht auch der Tel-type Sinn.

Eine Vorschlagsliste für potentielle Werte deckt HTML5 auch ab:

  <input placeholder="list" list="nameslist"/>

  <datalist id="nameslist">
    <option value="Daniel" />
    <option value="Kreiseder" />
    <option value="XYZ" />
  </datalist>

Hier ist endlich kein JavaScript mehr notwendig und die Datalist ließe sich sehr einfach am Server generieren. Toll wär jetzt auch noch, wenn man auch nur Items, die in der Datalist auftauchen zulassen könnte, obwohl sich da doch auch eine Select Box anbietet. Aber schön wärs trotzdem.

Will man jetzt schlußendlich noch die Validation-Error-Meldungen anpassen, kann man das Mozilla spezifisch mit dem Attribut x-moz-errormessage auch machen. Ist zwar blöd, dass das über keinen Standard geht, aber grundsätzlich kann man das tun.

Firefox 4 Beta 7

Ich bin ja schon seit einiger Zeit Firefox 4 Beta User. Heute meldete sich ein Update desselben auf die neue Beta 7.

Große Erwartungen hatte ich eigentlich nicht wirklich, umso überraschender fand ich dann doch die markanten Änderungen. Markant deswegen, weil man die Changes sofort sieht und erst recht fühlt.

Ich hab vom Feeling her ein gutes Gefühl (Andi Möller)

Mit Fühlen meine ich die (subjektiv) merkbar bessere Performance im Seitenaufbau. Große, schwergewichtige Websites laden irgendwie schneller, es wirkt einfach runder, flinker. Grund für die gespürte schnellere Geschwindigkeit ist die neue JavaScript Engine Jägermonkey, erste Benchmarks hinterlegen den subjektiven Eindruck auch mit Zahlen.

Neben dem schnelleren Surfen wirkt auch der ganze Browser flinker, mir ist das extrem beim TabCandy aufgefallen, das neuerdings Firefox Panorama genannt wird. Hier wirkt der Firefox endlich rund und fertig.

Ich habe ihn nur ganz leicht retuschiert (Olaf Thon)

Ins Auge sticht aber auch sofort die überarbeitete GUI der Beta 7. Angelehnt an die Webkit Browser kann man jetzt getrost die Statusleiste am unteren Ende des Fensters ausblenden, weil sie schlichtweg nicht mehr gebraucht wird. Ich brauchte die Leiste nur zum Starten vom Firebug und wenn ich wissen wollte wohin mich ein Link führt. Firebug lässt sich bekanntlich mit <F12> starten, die Adresse eines Links beim Mouse-over erscheint jetzt in der neu gestalteten Navigation Toolbar.

Der reload Button sitzt jetzt an der rechten Ende der Adresszeile, die ganze Toolbar wirkt aufgeräumter und eleganter.

Das ist Schnee von morgen (Jens Jeremies)

Gerade letzte Woche wünschte ich mir die HTML 5 Form Validation für den Firefox, jetzt funktionert es schon.
Hardware Acceleration für diverse Renderings und per default aktiviertes WebGL sind weitere Neuerungen, die komplette Feature Liste und Details findet man in den Release Notes.

Manni Bananenflanke, ich Kopf, Tor! (Horst Hrubesch)

Und dann war noch dieses kleine, versteckte Feature. Oft bekomme ich Links geschickt, auf die ich nicht klicken kann. Sprich ich muss den Text markieren – Rechtsklick – kopieren – klick auf “neuen Tab öffnen” – Rechtsklick . Und jetzt kommt die Neuerung:

Mit Paste & Go wird die Seite sofort geladen, ich erspare mir einen unnötigen Schritt. Das mag jetzt trivial und irrelevant klingen, macht man diese Abfolge (so wie ich) mehrmals täglich ist das eine erhebliche Erleichterung. Für mich ist dieses Feature schlichtweg genial.

Das war europäische Weltklasse (Felix Magath)

Mich hat die Beta 7 erstmal voll überzeugt. Jetzt kann eigentlich nur mehr Instabilität diesen Eindruck stören, ich gehe aber nicht davon aus. Jetzt hoffe ich nur mehr, dass bald das Beta aus der Versionsbezeichnung raus fällt.

Ich habe fertig.