Ein Paar Interessante Paper

Ich war gerade am ausmisten meiner Blog-Drafts und bin über diesen unfertigen Beitrag hier gestossen. Anstatt ihn zu löschen, könnte ich ihn aber auch geradesogut einfach ohne viele Worte veröffentlichen, vielleicht interessierts ja jemanden.

Evaluating Static Analysis Defect Warnings On Production Software

Why Calculating Is Betten Than Scheming

A History of Haskell: Being Lazy With Class

Re-Approaching the Refactoring Rubicon

4 comments »

Factor Programming Language

Google Tech Talk mit Factor Entwickler Slava Pestov.

Auf den ersten Blick sieht der Code ziemlich verwirrend aus, da die Sprache Stack-basiert ist (ähnlich der reverse polish Notation unseres geliebten HP48 Taschenrechners) aber es ist ziemlich erstaunlich, was man damit alles anstellen kann.

Ein kleines Beispiel aus der Dokumentation:

: negative? ( n -- ? ) 0 < ; # Funktionsdefinition
{ -12 10 16 0 -1 -3 -9 } [ negative? ] filter . # Anwenden auf ein Array
{ -12 -1 -3 -9 } # Output

Factor ist sowohl objektorientiert als auch funktional, ziemlich am Anfang des oben erwähnten Techtalks wird das ganze erklärt (also wenigstens mal die ersten Minuten reinschauen!).

Auch sonst hat die Sprache einiges Interessantes zu bieten: beispielsweise sind lokale Variablen nicht Bestandteil der Sprache, sondern stammen aus einer Library. Ausserdem scheint Factor alle möglichen Zeichen für Methoden zu akzeptieren, in der Präsentation kommen vor: :, [, { und sogar ", wobei dies alles nur Methoden sind, die Factor's Parser erweitern. Ziemlich beeindruckend, finde ich. Ausserdem ist der Grossteil von Factor in Factor selbst implementiert, was nur konsequent ist (vergleichbar mit Rubinius in der Ruby-Welt).

Ausserdem sieht die dazugehörige Umgebung sehr mächtig aus: Profiler, Debugger, Inspector, integrierte Hilfe etc. sind vorhanden (Slava ist auch der Entwickler von jEdit).

Wieder eine Sprache mehr, die ich gerne mal genauer anschauen möchte.

No comment »

Halteproblem erklärt für Programmierer

Nachdem wir heute in der theoretischen Informatik wieder mal einen Beweis des Halteproblems gehört haben, wage ich auch mal einen Versuch, das ganze möglichst einfach für jedermann zu erklären, der Programmieren kann, aber ansonsten kein Wissen der theoretischen Informatik hat.

Annahme: Wir haben eine Funktion terminate?(f) welche true zurückgibt, wenn die als Parameter übergebene Funktion f terminiert, also irgendwann mal anhält, und ansonsten false. (Ende der Annahme.)

Nun schreiben wir eine andere Funktion, welche folgendes tut:

def f
  while terminate? f
    # Endlosschlaufe
  end
end


Das wars eigentlich schon. Was erwarten wir nun, wenn wir f aufrufen? Falls die Funktion anhält, würde das ja heissen, dass terminate?(f) false zurückgegeben hat, dass die Funktion also nicht terminiert, obwohl sie das soeben getan hat. Das gleiche haben wir, wenn wir annehmen, dass f nicht anhält: einen Widerspruch! Die Annahme ist also falsch. ∎

Ganz einfach und völlig logisch, oder? Was das ganze für Auswirkungen hat lässt sich sehr ausführlich diskutieren. Aber alle Mathematiker und Informatiker die ihren Job mögen sollten froh sein :-)

(Und ich konnte endlich mal das coole ∎ Symbol benutzen.)

2 comments »

XSel, dict.leo.org und KDialog vereint

Mein Bruder hat mir von diesem sehr praktischen Progrämmchen namens XSel erzählt, welches die X-Selektion verändern kann.

Damit lassen sich lustige Dinge anstellen:

require 'open-uri'
require 'hpricot'
require 'iconv'

word = `xsel`.split(" ").first

exit 1 unless word =~ /\w+/

doc = Hpricot(open("http://dict.leo.org/ [...] search=#{word}"))

translation = doc/"table[@id=results]"

translation.search("img").remove

translation.search("a") { |a| a.swap(a.innerHTML) }

(translation.search("tr")[20..-1] || []).each { |e| e.swap("") }

translation = Iconv.conv("UTF-8", "ISO-8859-1", translation.to_s)

translation.gsub!("'", "&#x#{?'.to_s(16)};")

`kdialog --passivepopup '#{translation}'`

(die Leo-URL musste ich aus Layoutründen hier kürzen)

Ok, was macht das? Es holt sich das erste Wort aus der X-Selektion und holt sich dafür die Uebersetzung von dict.leo.org. Danach noch etwas Kosmetik am HTML, Encoding verändern, Anzahl Einträge beschränken, böses Zeichen ersetzen und dann mit kdialog –passivepopup darstellen. Das Ergebnis sieht dann so aus:

Das Script habe ich mir auf die ThinkVantage-Taste gelegt, per Selektion und Knopfdruck kriege ich jetzt als die Uebersetzungen direkt auf den Bildschirm.

Wer lust hat, kann mit dem Leo-Script machen was er will, gewidmet sei es meinem gleichnamigen Kollegen, auch wenn es ihm wahrscheinlich nicht viel nützt.

No comment »

Ruby Quine

Ich hab mich mal an einem Quine in Ruby versucht:

def print a
  puts a, "print %s(#{a})"
end
print %s(def print a
  puts a, "print %s(#{a})"
end)


Ist zwar nicht das kürzeste, aber dafür lesbar.

Sonst noch jemand? Fürs ausprobieren empfehle ich: ruby q.rb | diff -u q.rb -

Bonusfrage: Welches Buch lese ich im Moment wohl? :-)

No comment »

Weg mit Java?

Ich bin mal wieder etwas im Rückstand mit Computer (das IEEE Magazin) lesen, und ehrlich gesagt blättere ich es meistens einfach durch. Ab und zu findet man aber auch sehr interessante Dinge, wie in der Juli Ausgabe unter dem Titel In Praise of Scripting: Real Programming Pragmatism:

To me, Java-based CS1 is the single greatest mistake in the history of computing curricula. Students should learn to love their own possibilities before they learn to loathe other people’s restrictions.

Students who learn to script early are empowered throughout their college years, especially in the crucial Unix and Web environments. Those who learn Java and C++ first are stifled by enterprise-sized correctness. Early programmers must learn to be creative and inventive, and they need programming tools that support exploration rather than production.

Recht hat er!

Interessant ist auch, welche Sprachen er verwenden würde:

What scripting language could be used for CS1? [..] an emerging consensus in the scripting community holds that Python is the right solution for freshman programming. Ruby would also be a defensible choice.
Python and Ruby have the enviable properties that almost no one dislikes them, and almost everyone respects them.

Also los, kippen wir Java aus Programmieren 1 und 2. Aber wohin damit? Vielleicht zusammen mit C++ ins Programmieren 3? Oder vielleicht nach Ruby zuerst C++ lernen, denn wenn man C++ und Ruby verstanden hat, sollte Java eigentlich kein Problem mehr sein. Oder?

4 comments »

Gelesen: The Little Schemer

Im Modul Wissensbasierte Systeme habe ich meine Liebe zu Lisp entdeckt. So war es auch nur eine Frage der Zeit, bis ich eines der Standardwerke endlich mal durcharbeite—und es hat sich gelohnt! The Little Schemer besitzt einen sehr speziellen Aufbau, und zwar ist das gesamte Buch als Dialog zwischen Lehrer und Schüler gehalten:

Ziemlich genial, und wenn man die Schüler-Spalte abdeckt, gibt es einiges zu hirnen.

Um das Buch zu lesen, braucht man keine Vorkenntnisse im Programmieren. Wahrscheinlich ist es sogar einfacher, wenn man nicht schon durch andere Sprachen voreingenommen ist. Allerdings wird es gegen Ende schon ziemlich hart; den applicative-order Y combinator habe ich erst nach einiger Zeit verstanden (Richard Gabriel’s Erklärung ist auch ziemlich gut).

Für alle, die eine etwas andere Einführung in Lisp erhalten möchten, unbedingt empfehlenswert!

No comment »

Imap-Feeder: RSS und Atom Feeds nach IMAP

Imap-Feeder ist ein Programm, welches eine Reihe von Feeds abklappert und die Einträge als E-Mails auf einem IMAP Server ablegt.

Warum?

Mein Problem, das ich lösen wollte war, dass ich meine Feeds an mehreren Orten lesen will (also am Arbeitsplatz, am PC zu Hause und auf mindestens einem Laptop), das ist aber ziemlich mühsam weil man von Hand die bereits gelesenen Einträge verwalten muss. Und bei rund 50 Feeds ist das ziemlich nervig.

“Browser-basierte Feedreader” höre ich es schon rufen. Sorry, aber ist für mich keine Alternative. Ich kann mich mit Browser-basierten Anwendungen einfach nicht anfreunden – bin wohl von KDE zu sehr verwöhnt was Desktop-Applikationen und Interoperabilität anbelangt. Ausserdem bin ich nicht immer Online (jaja, Google Gears..).

Die Lösung: IMAP

Eigentlich gibt es ja schon eine sehr bewährte Technologie um Mail-ähnliche Daten aufzubewahren: IMAP. Von beliebig vielen Clients kann ich auf meinen IMAP Account zugreifen, und mit Cached- oder Offline-IMAP stehen die Daten auch immer zur Verfügung. Der Unterschied zwischen einer E-Mail und einem Eintrag in einem Feed sind eigentlich auch nicht so gross: Beide besitzen einen Betreff und einen Inhalt; bei Feeds kommt teilweise noch ein Autor sowie ein Timestamp dazu.

Vorteile

  • Mehrere Clients können ohne Probleme zugreiffen, wenns sein muss kann man immer noch einen Webmail-Client nutzen.
  • Einträge können wie E-Mails behandelt werden, man kann sie also mit speziellen Tags versehen, an andere Leute weiterleiten, archivieren, verschieben, durchsuchen und so weiter.
  • Man (oder zumindest ich als Entwickler) habe die volle Kontrolle, in welcher Form die Einträge abgelegt werden. Dadurch lassen sich eine Erweiterungen realisieren, wie beispielsweise:
    • Aenderungen an bereits vorhandenen Einträgen: Neu hinzufügen oder ignorieren?
    • Filtern von Einträgen, wenn man blog.misto.ch nicht mag und trotzdem den Planet-HSR abonnieren möchte.
    • Minderwertige Feeds aufwerten: Man könnte durch einen CSS oder XPath-Ausrucke beispielsweise die News von heise.de scrapen und direkt als Body einfügen.
    • … (nehme gerne neue Ideen entgegen).

Nachteile

Es gibt auch Nachteile, man braucht natürlich einen Server, welcher das imap-feeder Skript regelmässig laufen lässt.

Imap-Feeder

Momentan sind noch nicht alle oben genannten Features implementiert, auch gibt es keine HTML-Mails: der HTML-Code von Feeds wird mit ein paar simplen Regeln in Text umgewandelt. Mein Beitrag zu GitHub sieht dann so aus:

Ich hätte noch Einladungen für GitHub[1] zu vergeben (FCFS), falls jemand eine will. Einfach mit einer E-Mail-Adresse bei mir melden.

Wer mer über GitHub erfahren will, kann ja mal hier[2] weiterlesen.

[1] http://github.com/
[2] http://www.infoq.com/news/2008/03/github-git-repository-hosting

http://blog.misto.ch/archives/551

Die Links werden alle gesammelt und am Schluss dargestellt, um den Lesefluss nicht zu stören.

Das ganze ist in Ruby geschrieben und kann von der offiziellen Website bezogen werden. Installation und Einrichtung sind eigentlich ziemlich simpel.

Zukunft

Als nächstes werde ich wohl noch einige der oben genannten Features implementieren oder vervollständigen; HTML-Mails könnten durchaus praktisch sein für Einträge mit Bildern.

5 comments »

Gelesen: The Practice of Programming

Ich weiss leider nicht mehr genau, wie ich auf dieses Buch gestossen bin, ich glaube es wurde in einem anderen Buch als must-read erwähnt. Wie alt das Buch bereits ist, ist mir beim bestellen gar nicht aufgefallen. Erst beim durchblättern habe ich all den C-Code gesehen… :) (Es ist aus dem Jahre 1999)

Gelesen hab ichs trotzdem—was sollte ich sonst damit tun?

Allerdings möchte ich nicht allzu viel über den Inhalt erzählen, sondern gleich das inhaltlich ähnliche und einiges bessere, da modernere und angenehmer zu lesende Code Craft von Pete Goodliffe empfehlen. Auch wenn es rund doppelt so dick ist.

No comment »

GitHub – Git Repository Hosting

Ich hätte noch Einladungen für GitHub zu vergeben (FCFS), falls jemand eine will. Einfach mit einer E-Mail-Adresse bei mir melden.

Wer mer über GitHub erfahren will, kann ja mal hier weiterlesen.

No comment »