Clojure Tutorial, Teil 1

Dies ist der erste Artikel in einer kleinen Serie, die meine ersten Schritte in der neuen funktionalen Programmiersprache Clojure dokumentieren soll. Die Artikel werden in unregelmäßigen Abständen hier publiziert.

Ich beschäftige mich im Moment mit Clojure, einer relativ neuen funktionalen Programmiersprache. Dabei will ich vor allem von meinem bisherigen Fokus der objekt-orientierten Programmierung (OOP) abrücken, um mal wieder ein wenig frischen Wind zu schnuppern. Golang war nicht ganz das richtige, da ich dort auch auf objekt-orientierte Weise entwickelt habe.

Funktionale Programmierung

Im Gegensatz zu der Daten- und Verhaltenssicht der OOP steht bei der funktionalen Programmierung das Zusammenschalten von Funktionen im Vordergrund. Ein Programm wird dabei nicht so sehr durch nacheinander abzuarbeitende Befehle, sondern durch ineinander geschachtelte Funktionsaufrufe beschrieben. Dabei stehen die sog. pure functions im Vordergrund, also Funktionen ohne Seiteneffekte. Weiterer wichtiger Bestandteil ist die Rekursion, mit der Probleme elegant gelöst werden können.

Clojure

Clojure ist ein LISP-Dialekt, läuft auf der Java VM und ist seit 2009 verfügbar. Als Einstieg habe ich mir das Buch Practical Clojure (Blick ins Buch) gekauft, an dem ich mich nun entlang arbeite.

Die wichtigsten Merkmale von Clojure sind

Explorative Entwicklung

In Clojure (und anderen Sprache?) hat sich die REPL durchgesetzt: Read Eval Print Loop. Man startet eine Kommandozeile, in der man direkt Code eingeben und ausführen kann. Damit lässt sich schnell etwas ausprobieren oder sogar ein laufendes Programm verändern. Für die ersten Schritte arbeite ich auch direkt in der REPL und verzichte auf gespeicherte Quelltexte. Natürlich lässt sich jede Clojure-Applikation auch in Dateien organisieren und ausführen.

Download und Start

Clojure kann als ZIP-Archiv heruntergeladen oder direkt von Github gecloned und gebaut werden. Hat man Clojure entpackt bzw. installiert, liegt im Installationsverzeichnis die Datei clojure.jar. Mit folgender Kommandozeile starte ich anschliessend die REPL:

java -cp clojure.jar clojure.main

Ich werde durch einen Prompt begrüßt und kann sofort Code eingeben:

$> java -cp clojure.jar clojure.main
Clojure 1.3.0-alpha3-SNAPSHOT
user=>

Jetzt kann ich das erste Programm schreiben.

Hallo, Welt!

Als erstes Programm steht natürlich das klassische Hallo Welt auf dem Programm. Die Anwendung soll den String “Hallo, Welt!” ausgeben, nichts weiter.

(println "Hallo, Welt!")

Die Ausgabe sieht so aus:

Hallo Welt
nil
user=>

Die erste Zeile ist die Ausgabe, die zweite Zeile ist der Rückgabewert der Funktion println und die dritte Zeile ist wieder der Prompt. Die Funktion println ist eine sog. special form, eine Systemfunktion von Clojure. Die übergebenen Argumente werden durch Leerzeichen getrennt ausgegeben. Ein etwas erweitertes Hallo Welt verwendet eine Var für die auszugebende Nachricht:

(def msg "Hallo Welt")
(println msg)

Das war es erstmal für diesen Artikel. In den kommenden Artikeln will ich etwas weiter in die verfügbaren Datenstrukturen einsteigen. Stichwort: Alles ist eine Liste!

Was ist die Abgabe auf Brennelemente?

Eine"Abgabe" und keine Steuer? Und die Unternehmen können sie absetzen und zahlen ihren Ländern dafür weniger Gewerbesteuer? Das hört sich für mich an wie eine ganz ganz große Schieberei und Augenwischerei für die Bürger, statt einer Kostenbeteiligung der Unternehmen an den Auswirkungen der Atomenergie.

Was meinen wohl die Anwohner bei der Asse dazu, die mit der erhöhten Krebsrate in ihrem Gebiet?

Brauche ich einen Trainingspartner?

Gerade hab ich den Artikel “Do I really need a training partner?” auf worldfitnessnetwork.com gelesen:

Getting stuck on a heavy set without a spotter can be a disaster. It’s never happened to me because I have a phobia of it, and I will never do a heavy set of bench presses without a spotter.

Es geht also darum, dass man ohne Trainingspartner immer Angst haben muss, das schwere Gewichte einen in Bedrängnis bringen. Das passiert hauptsächlich am Ende des Satzes, wenn man schon alle Kraftreserven rausgeholt hat. Entweder man versucht die letzte(n) Wiederholungen gar nicht mehr, weil man denkt, es würde gar nicht mehr klappen oder man versucht es und es klappt wirklich nicht mehr.

Mir ging das gerade diese Woche so: Beim Schrägbankdrücken hab ich mich wohl etwas verschätzt und die letzte Wiederholung hab ich einfach nicht mehr hochbekommen. Allerdings sehe ich das nicht so kritisch: Ich war nicht ernsthaft in Gefahr, d.h. nicht in Lebensgefahr. Es besteht natürlich immer die Gefahr einer Verletzung – aber die kann man auch bekommen, wenn man nach den Klimmzügen den Kopf zu schnell rumwirbelt… Auch gerade erlebt. 🙁

Ich hab also das Gewicht langsam auf die Brust runtergelassen und dort erstmal ein paar Sekunden liegen lassen. Das Gewicht war natürlich nur so hoch, dass ich es noch kontrolliert bewegen konnte. Anschliessend hab ich nochmal alles zusammengekratzt und meinen Oberkörper aufgerichtet und die Stange anschliessend auf meine Beine “geworfen”. Das war schon etwas unkontrolliertert, da ich das Gewicht nicht langsam über meinen Bauch heben kann.

Trotzdem: Ich hatte bis jetzt noch keine gefährliche Situation ohne Trainingspartner. Aber es ist schon was anderes, wenn eine zweite Person das Gewicht nachführen kann, wenn man ans Limit geht. Und man kann auch einige Wiederholungen mehr rausquetschen. Aber ich bin nicht überzeugt, dass das so ein großer Vorteil ist. Da lasse ich eher die zusätzliche Motivation gelten, die man durch einen Trainingspartner bekommen kann.

Nexus One auf FRG82D aktualisiert – noch kein Android Gingerbread

Heute morgen wollte ich mich schon kurz freuen: Mein Nexus One signalisierte mir, es wäre ein Systemupdate verfügbar. Ich dachte natürlich gleich, Android 2.3 aka Gingerbread wäre da! Aber das Update hat mein Nexus One mit Stock Android 2.2.1 aka Froyo “nur” auf FRG83D aktualisiert. Im Nexus One Forum gibt es einen Thread zum Update auf FRG83D.

Das Update verlief in zwei Schritte, die beide einen Neustart verlangten. Der erste Neustart startete nur kurz den Bootloader, aber nach wenigen Sekunden wurde das Gerät ganz normal gebootet. Anschliessend war noch ein Neustart fällig, der diesmal deutlich länger dauerte. Anschliessend konnte ich die neue Version FRG83D in meinen Telefoninformationen sehen.

Ein paar Informationen zu dem Update auf FRG83D konnte ich bei androinica.com finden:

  • Updates to the core and framework JARs
  • Updates to the Dalvik VM and Webcore libraries
  • Updates to the Email, Google Services Framework and Market packages.
  • A couple of other very minor patches

Projekt in der Google AppEngine: Twitter Cleaner

Ich habe vor einiger Zeit angefangen, ein kleines Projekt in der Google AppEngine zu erstellen: der TwitterCleaner. <p /><div>Damit will ich die Möglichkeit schaffen, einen Twitter-Account ohne Neuanmeldung und Umbenennung von alten Tweets zu befreien. Im Prinzip das gleiche wie TwitWipe, aber eben selbst gemacht und auf der AppEngine.</div> <p /><div>Im Moment kann ich schon die aktuelle Timeline einsehen und die Tweets auf der ersten Seite löschen. Im Prinzip kann man also bereits manuell alle Tweets  löschen, etwas bequemer als bei Twitter selbst, wo nur ein Tweet einzeln gelöscht werden kann. Es gibt einfach keine Massenabfrage dafür.</div> <p /><div>Als nächste will ich das Löschen auf die Task Queue API umstellen, damit das Löschen im Hintergrund erfolgen kann und man nur benachrichtigt wird, wenn alles abgeschlossen ist. Mein Problem ist noch die Parameterübergabe an die Task und das Rate Limit der Twitter API. Mit 150 Zugriffen pro Stunde kann man einfach nicht besonders viel löschen, oder ich hab noch nicht die richtige Abfrage in der Twitter API gefunden.</div> <p /><div>Das ganze ist eher ein Lernprojekt als ein</div>

Installation der USB-Treiber für die serielle Konsole des SheevaPlug unter Windows 7

Heute nachmittag wollte ich meinem SheevaPlug noch einmal auf den Zahn fühlen. Seit ein paar Tagen kann ich mich nicht mehr per SSH einloggen, obwohl er ansonsten wie erwartet funktioniert. Ich wollte mich also über die serielle Konsole per USB-Port einloggen – aber leider werden die Treiber nicht korrekt unter Windows 7 installiert.

Man muss nach dem Download die Dateien entpacken und anschliessend die ftdibus.inf und ftdiport.inf editieren und mehrere Zeilen einfügen. Bei Georg Stich hab ich schliesslich einen Artikel gefunden, in dem der Vorgang erklärt ist. Ich poste hier nochmal die Änderungen, damit sie nicht verloren gehen:

FTDIBUS.INF

[FtdiHw]
%USBVID_9E88&PID_9E8F&MI_00.DeviceDesc%=FtdiBus.NT,USBVID_9E88&PID_9E8F&MI_00
%USBVID_9E88&PID_9E8F&MI_01.DeviceDesc%=FtdiBus.NT,USBVID_9E88&PID_9E8F&MI_01

[FtdiHw.NTamd64]
%USBVID_9E88&PID_9E8F&MI_00.DeviceDesc%=FtdiBus.NTamd64,USBVID_9E88&PID_9E8F&MI_00
%USBVID_9E88&PID_9E8F&MI_01.DeviceDesc%=FtdiBus.NTamd64,USBVID_9E88&PID_9E8F&MI_01

[Strings]
USBVID_9E88&PID_9E8F.DeviceDesc="SheevaPlug JTAGKey FT2232D B"
USBVID_9E88&PID_9E8F&MI_00.DeviceDesc="SheevaPlug JTAGKey FT2232D B Port A"
USBVID_9E88&PID_9E8F&MI_01.DeviceDesc="SheevaPlug JTAGKey FT2232D B Port B"

FTDIPORT.INF

[FtdiHw]
%VID_9E88&PID_9E8F.DeviceDesc%=FtdiPort2232.NT,FTDIBUSCOMPORT&VID_9E88&PID_9E8F

[FtdiHw.NTamd64]
%VID_9E88&PID_9E8F.DeviceDesc%=FtdiPort2232.NTamd64,FTDIBUSCOMPORT&VID_9E88&PID_9E8F

[Strings]
VID_9E88&PID_9E8F.DeviceDesc="SheevaPlug JTAGKey FT2232D B Serial Port"

Die fett gedruckten Stellen kann man auch in den Gerätedetails im Gerätemanager nachsehen. Und so soll das ganze anschliessend im Gerätemanager aussehen:

SS-2010-11-22_18.24.53

Ist das erledigt, kann man sich z.B. mit Putty auf dem neu erstellten COM-Port (bei mir ist das jetzt COM8) mit folgenden Einstellungen verbinden:

SS-2010-11-22_18.25.14

Jetzt ist man auf dem SheevaPlug und kann sich ganz normal einloggen.

Werden Links jetzt illegal?

Auf http://torrentfreak.com/man-fined-for-publishing-links-to-legal-sports-broadcast-101111/ kann man jetzt nachlesen, dass man verklagt werden kann, wenn man die ureigene Funktion des Internets nutzt: Links auf andere Informationen.

Ein Mann hat öffentlich zugängliche Links eines TV-Senders in einem Forum gepostet. Die hätte sich also jeder von der Seite nehmen können, ohne weitere Zugangskontrolle des Anbieters.

Die Contentmafia wird in den nächsten Jahren weiter versuchen, die Kunden für diese zu bestrafen. Es deuten immer mehr Hinweise auf die anonymen Netze wie I2P oder das Freenet Project… so langsam geht das Netz echt den Bach runter.

Schlägerei statt Programmarbeit auf dem Bundesparteitag der Piratenpartei?

Ich nehme nicht am Bundesparteitag der Piratenpartei teil, jedenfalls nicht persönlich. Aber ich verfolge die Berichte in der Presse und vor allem in den privaten Blogs. Dort bekommen man nämlich einen etwas tieferen Einblick in die Vorgänge, auch wenn der dann ordentlich von subjektiven Stimmungen eingefärbt ist.

Was mir als erstes in den Sinn kommt: Tätlichkeiten wegen einer Akkreditierung? Was soll denn das bitte?

Gut, hier ist die subjektive Einfärbung dann nicht mehr so hilfreich, aber allein die Tatsache, dass man sich wegen sowas von den Themen eines Bundesparteitags abhalten lässt, ist für mich schwer nachzuvollziehen. Ich hoffe, der restliche Teil des BPT kann jetzt ohne große Verzögerungen oder Unterbrechungen durchgeführt werden.

Es gibt genug Themen, z.B. Bedingungsloses Grundeinkommen. Und die aktuellen Pseudo-Terrorwarnungen der Politiker (Bombenattrappe, anyone?), zur Festigung ihrer Macht, die wiederbelebte Forderung für eine Vorratsdatenspeicherung und weitere Beschneidungen der Grundrechte der Bürger reichen eigentlich vollkommen aus, um alle Experten der Piratenpartei zu binden. Ich glaube nicht, dass sich die Piraten mit allen möglichen Themen beschäftigen sollten, sondern sich auf den Kern der Partei stürzen sollten: Freiheits- und Informationsrechte.

Über Gehälter und Motivation

Auf geek.com gibt es einen interessanten Artikel über die Gehälter bei Google und Facebook. Interessante Unterschiede, aber was für mich wirklich aufregend ist, ist die letzte ܜbersicht: Gehalt nach Job bei Google.</p> <p>Und anscheinend verdienen die Engineers dort mehr als die Product bzw Project Manager. Ist das normal oder eher die Ausnahme? Was meint ihr?

Fitbit erlaubt die manuelle Eingabe von Kalorien für Aktivitäten

Gerade hab ich folgende Nachricht im Forum von Fitbit gelesen:

SS-2010-11-18_06.31.47
(klicken zum vergrößern)

Und hier nochmal der Text:

Hey all, quick note that we just launched the ability to manually enter calories burned when you log an activity. For instance on a treadmill at the gym and our estimate for your calorie burn is different from what the machine says, you can use the machine’s count instead.

Man kann jetzt also für eine Aktivität die Menge der umgesetzten (jaja, verbrannten) Kalorien angeben. Das dürfte hilfreich sein, wenn man z.B. auf Geräten im Fitnessstudio trainiert und die Angaben der Geräte übernehmen will.