Gelesen: Programming Erlang

Erlang ist eine funktionale Sprache, welche bei Ericsson zur Programmierung von Telekommunikations-Equipment geschaffen wurde. Der Autor (und Hauptentwickler) nennt sie auch eine “Concurrency Oriented Programming Language”, denn in diesem Gebiet ist Erlang besonders stark.

Weshalb? Nun, das mühsamste bei der Parallel-Programmierung ist doch, aufzupassen, dass die gemeinsam genutzten Ressourcen korrekt benützt werden und auch keine Deadlocks auftreten können (und dabei das Programm auch wirklich noch parallel läuft!). Bei Erlang hat man dieses Problem insofern gelöst, als dass es keine geteilten Ressourcen gibt (naja, vereinfacht gesagt). Also keine globalen Variablen oder geteilten Speicher, die verschiedenen Prozesse kommunizieren nur durch Messages miteinander. Eigentlich gibt es nicht mal Variablen im eigentlichen Sinn, denn wenn eine Variable einmal einen Wert angenommen hat, lässt sich dies nicht mehr ändern (für Java-Programmierer: Es gibt nur lokale, final Variablen).

Ich weiss, nur Code spricht die Wahrheit, also, ein kleines Beispiel. Ein Programm zur Berechnung der Fakultät sieht folgendermassen aus:

fac(1) ->  1;
fac(N) ->  N * fac(N-1).

Die erste Variante von fac nimmt als Parameter eine 1 und evaluiert dies zu 1. Rufen wir also fac(1) auf, dann erhalten wir als Resultat 1. Rufen wir fac allerdings mit Bsp. 3 auf, dann wird die zweite Alternative aufgerufen und die Variable N wird an den Wert 3 gebunden. Danach kommt wie erwartet die Rekursion. Wer mehr Code sehen möchte, dem sei das Erlang Whitepaper empfohlen (hier gibt es noch mehr gute Links).

Zu Erlang gibt es auch noch ein recht umfangreiches Framework zur Erstellung von C/S-Applikationen, sowie eine eigene Datenbank, welche auf die doch recht speziellen Bedürfnisse zugeschnitten ist. Dies wird natürlich alles im Buch behandelt, ausserdem schreibt man einen Chatserver, einen MP3-Streamingserver und weitere interessante Beispielprogramme.

Ich würde jedem, der schon mal etwas mit Parallel- und Netzwerkprogrammierung zu tun hatte (also sicher mal alle HSR-Informatikstudenten) empfehlen, einen Blick auf Erlang zu werfen.

Zu Beginn fand ich es recht anstrengend den Beispielen zu folgen, aber wenn man sich mal daran gewöhnt hat, dass andauernd rekursiert und neue Threads gespawnt werden und wie das Messaging funktioniert, macht es eigentlich ziemlich Spass :)

2 comments »

Billig Bücher kaufen

Regelmässige Leser meines Blogs haben bestimmt schon gemerkt, dass meine Ausgaben für Bücher nicht gerade gering sind. Seit in der Schweiz die Buchpreisbindung weggefallen ist und der Euro immer teurer wird, könnte es ja sein, dass es sich nicht mehr lohnt, bei Amazon zu bestellen (oder falls Amazon ein Buch mal nicht lieferbar hat). Glücklicherweise gibt es den Service von billigbuch.ch, welcher einige der bekannteren Schweizer Shops sowie Amazon.de abfragt und so den günstigsten Preis ermittelt.

Es sieht allerdings so aus, als ob ich weiterhin bei Amazon bleiben würde:

Buch Amazon Schweiz gespart
Programming Erlang 39.85 59.90 33%
Successful Project Management 37.50 57.90 35%
Qt 4 49.20 63.70 22%

Nicht übel, oder? Alle Preise sind natürlich in CHF, und auch wenn auf die Amazon-Preise noch 1.5% Gebühren der Kreditkarte kommen wirds noch lange nicht teurer.

4 comments »

Everyday Scripting mit Ruby oder: Werden die PragProg-Bücher immer dicker?

Als ich heute meine beiden neusten Bücher der Pragmatic Programmers ausgepackt habe, viel mir auf, dass beide ziemlich viele Seiten haben. Auch mein aktuelles Buch ist nicht allzu dünn. Könnte es sein, dass ihre Bücher immer dicker werden? Fände ich schade, denn ich lese eigentlich lieber kleine, kompakte Bücher.

Wie finde ich das jetzt am schnellsten heraus? Auf der Webseite gibt es eine schöne Liste aller Bücher, die sich ausserdem nach Release Date sortieren lässt. Perfekt! Also rasch eine Konsole mit irb gestartet, und das Dokument geöffnet:

require 'open-uri'; require 'hpricot'
doc = Hpricot(\
  open("http://pragprog.com/categories/all?sort=pubdate"))

Die Links zu den Detailseiten aller Bücher (”a”s in einem div mit class=”thumbnail” Attribut) fand ich mit Hilfe folgender Query:

books = \
  (doc/"div[@class=thumbnail]/a").collect \
    {|link| link.attributes["href"] }

Es hilft natürlich extrem, wenn die Webseite vernünftig aufgebaut ist und vieles in divs mit css-Klassen unterteilt. Die Anzahl Seiten aller Bücher findet man mit:

pages = books.collect {|book|
  doc = Hpricot(open(book))
  (doc/"div[@class=stats]").collect {|stat|
    stat.inner_html.strip.split(' ').first unless stat.inner_html =~ /friday/
  }}.flatten.compact.reverse

Mich interessieren nur die echten Bücher, deshalb habe ich die PDFs der Friday-Serie ausgelassen.

Nun haben wir also ein Array mit den Seitenzahlen aller Bücher. Sehr viel nützt das noch nicht, wir sollten das ganze vielleicht mit Gnuplot visualisieren:

Gnuplot.open do |gp|
  Gnuplot::Plot.new( gp ) do |plot|

    plot.ylabel "Seiten"

    y = pages.collect{|y| y.to_i }
    x = (1..y.length).to_a

    plot.data << Gnuplot::DataSet.new([x,y]) do |ds|
      ds.with = "lines"
    end
  end
end

Und das schönste daran? Es hat nur eine halbe Stunde gedauert (inkl. Gnuplot kompilieren ;) ), genau so lange wie ich währenddessen meine Blutwurst gekocht habe :-)

Ach ja, das Resultat:

pragprog_seiten.png

Man könnte das wohl noch schöner machen, aber es reicht mir eigentlich, denn man sieht, dass die Seitenzahlen eher zunehmen...

3 comments »

Copy/Paste unter X

Ich glaube, es herrscht eine grosse Verwirrung wenn es um das Thema Cut/Copy-Paste unter X geht. Zumindest höre ich oft Dinge wie “es wurde nicht kopiert”, “das Kopierte ist verlorengegangen” und viele wissen auch nicht, dass es zwei verschiedene Buffer gibt.

Vielleicht das Verwirrendste ist, dass beim Kopieren eigentlich noch nichts kopiert wird, sondern das Programm sich beim X-Server meldet und mitteilt, dass es jetzt die Selektion “besitzt”. Wenn nun in einem anderen Programm eingefügt wird, dann holt sich das aktive Programm von Besitzer der Selektion den Inhalt. Dabei kann auch eine “Verhandlung” über den Inhalt geführt werden: Nehmen wir an, ich kopiere im Browser ein Bild. Wenn ich das nun in der Konsole einfüge, wird einfach die URL eingefügt, da die Konsole mit dem Bildinhalt nicht allzu viel anfangen kann.

Ok, was passiert jedoch, wenn das Programm, aus dem kopiert wurde, zum Zeitpunkt des Einfügens nicht mehr läuft? Dann geschieht nämlich nichts, und das verwirrt viele. Natürlich gibt es dafür auch Abhilfe, beispielsweise das KDE-Programm Klipper, welches immer gleich alles kopiert und ausserdem auch noch eine History bietet.

Wie bereits gesagt, gibt es zwei verschiedene Zwischenablagen:

  • Immer wenn Text mit der Maus selektiert wird (implizit).
  • Über Ctrl^C, bzw. über das Applikations- oder Kontextmenu (explizit).

Das Einfügen geschieht in der ersten Variante mit der mittleren Maustaste und ansonsten wie gewohnt über Ctrl^V.

Ok, ich hoffe damit etwas Klarheit geschafft zu haben :)

No comment »

Ruby ist cool (und Java leider nicht ganz so)

Ruby ist cool, das ist wohl jedem klar, oder? :) Falls nicht, schaut euch mal den Beitrag von Daniel Berger an. Sieht doch wirklich chic aus, wenn man die korrekten, mathematischen Symbole benutzen kann.

“Hm, mit Java müsste das doch auch gehen, immerhin wissen wir, dass auch Umlaute erlaubt sind”. Also, Eclipse gestartet und ausprobiert:

java_sigma.png

Den Screenshot von der Greenbar muss man sich halt vorstellen.. ;)

Mit Lambda kann man unter Java eh nichts rechtes Anfangen, und das Wurzelzeichen wurde leider auch nicht als gültiger Identifier akzeptiert. Also leider nur ein Teilerfolg.

Ach ja, wie tippt man denn überhaupt beliebige Unicode-Zeichen? Mit der Kombination Ctrl+Alt+Shift+u und dann die Hex-Nummer das Codes, also beispielsweise 3A3 für Σ. Ich weiss aber nicht, ob das unter Windows so auch funktioniert, die Kombination ist, soviel ich weiss, GTK-spezifisch.

5 comments »