Archive for September, 2005

ASCII Mandelbrot

Tuesday, September 27th, 2005

Durstöbert man die Python FAQ, so stößt man dabei auf die Frage, wie man denn möglichst unüberschaubaren Code in Python schreiben kann.

Die Antwort ist folgender verschachtelte Lambda-Audruck, um die Mandelbrotmenge (,,Apfelmännchen”) zeichnen zu lassen.

print (lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,
Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM,
Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,
i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(
64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy
))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24)
#    \___ ___  \___ ___  |   |   |__ lines on screen
#        V          V      |   |______ columns on screen
#        |          |      |__________ maximum of "iterations"
#        |          |_________________ range on y axis
#        |____________________________ range on x axis

Und weil ich sowas immer schlecht ,,einfach so” glauben kann, habe ich es ausprobiert. Und ja - richtig! Das Ergebnis ist folgendes:

BBBBBBBBBBBBBBBCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCCCCCCCCCC
BBBBBBBBBBBBBCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEFGJJHFFFEEEEEDDDDDCCCCCCCCCC
BBBBBBBBBBBCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEFFFGHJPJKL_FEEEEEEDDDDDDDCCCCC
BBBBBBBBBCCCCCCDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEFFFFGHIJZR_QJIGFFFEEEEEEDDDDDDDCC
BBBBBBBBCCCCDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEFFFGGGHIKP______SKHGFFFFFEEEEDDDDDDD
BBBBBBBCCCDDDDDDDDDDDDDDDDDDDDEEEEEEEEEFFFHHIXIIIIJKLO______NKJJIHGGGHSGFEEDDDDD
BBBBBBCCDDDDDDDDDDDDDDDDDDDEEEEEFFFFFFFGGHIM___R_________________PLN[SQXIFEEDDDD
BBBBBCDDDDDDDDDDDDDDDDEEEFFFFFFFFFFFGGGHIKMNS_________________________UIGGFEEDDD
BBBBBDDDDDDDDDDEEEEEFFGHOIHHHHHHHHHHHHIJLP____________________________RKJPGFEEDD
BBBBDDDDEEEEEEEEEFFFFGGHJM___LNW_ONKJJKNY______________________________SKHGFEEED
BBBBDEEEEEEEEEFFFFFFGHHJLOT__________QPZ_________________________________HFFEEEE
BBBDEEEEEEEFGGGGHHHJM_QNS______________________________________________[HGFFEEEE
BBB_________________________________________________________________QLIHGFFFEEEE
BBBDEEEEEEEFGGGGHHHJM_QNS______________________________________________[HGFFEEEE
BBBBDEEEEEEEEEFFFFFFGHHJLOT__________QPZ_________________________________HFFEEEE
BBBBDDDDEEEEEEEEEFFFFGGHJM___LNW_ONKJJKNY______________________________SKHGFEEED
BBBBBDDDDDDDDDDEEEEEFFGHOIHHHHHHHHHHHHIJLP____________________________RKJPGFEEDD
BBBBBCDDDDDDDDDDDDDDDDEEEFFFFFFFFFFFGGGHIKMNS_________________________UIGGFEEDDD
BBBBBBCCDDDDDDDDDDDDDDDDDDDEEEEEFFFFFFFGGHIM___R_________________PLN[SQXIFEEDDDD
BBBBBBBCCCDDDDDDDDDDDDDDDDDDDDEEEEEEEEEFFFHHIXIIIIJKLO______NKJJIHGGGHSGFEEDDDDD
BBBBBBBBCCCCDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEFFFGGGHIKP______SKHGFFFFFEEEEDDDDDDD
BBBBBBBBBCCCCCCDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEFFFFGHIJZR_QJIGFFFEEEEEEDDDDDDDCC
BBBBBBBBBBBCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEFFFGHJPJKL_FEEEEEEDDDDDDDCCCCC
BBBBBBBBBBBBBCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEFGJJHFFFEEEEEDDDDDCCCCCCCCCC

Der Blick über den Tellerrand

Tuesday, September 27th, 2005

Obwohl ich mich immer wieder darüber ärgere komme ich doch nicht so richtig davon los: Die Entwicklung von Internetanwendungen. Vielleicht fehlt mir einfach eine Alternative Anwendungen zu schreiben, die auf möglichst vielen Plattformen laufen. Wo geht das einfacher als im Internet.

Hier findet man im Gegensatz zum Rest der IT-Branche Standards, die noch einigermaßen eingehalten werden und einigermaßen Sinn ergeben: HTML, XML, CSS und auch JavaScript (bzw. EcmaScript) sind mittlerweile verhältnismäßig weit verbreitet und unterstützt.

Verhältnismäßig ist dabei das richtige Wort: Man muss testen, testen, testen. Am Ende steht dann jedoch oft ein mehr oder weniger gutes Ergebnis. Oder man deaktiviert einfach das CSS im Internet Explorer, so wie ich es tat. Einer der Gründe für meine Ignoranz bezüglich des Internet Explorers ist das nicht gegebene Vorhandensein eines Computers, auf dem der Internet Explorer läuft. Und selbst wer einen Computer mit Windows sein eigen nennt, kann nur eine Version testen.

Ich entdeckte heute jedoch über einen Beitrag auf der Ruby On Rails Mailingliste zwei Werkzeuge, die einem die Installation von Virtual PC unter Umständen erübrigen (mal ganz abgesehen von dem für sich schon (be)merkenswertem fundable.org):

Bei browsercam.com handelt es sich um eines dieser Dinge, die ich als ,,einfach aber genial” bezeichnen würde: VNC-Verbindungen auf dedizierte Rechner, also ein ferngesteuertes Windows bzw. Mac Os X auf einem Rechner in einer Serverfarm. Weil die Preise recht happig sind, sammeln findige Entwickler über fundable.org genug Interessenten um den Preis auf rund 20 USD zu drücken.

Das Projekt browsershots.org stellt eine ähnliche Funktion bereit: Man gibt eine URL in einem Formular ein und erhält dann eine Liste mit Screenshots der sich dahinter verbergenden Seite aus verschiedenen Browser heraus (nachdem man in einer noch kurzen Warteschleife gewartet hat). In etwa sieht das Ergebnis für diese Seite so aus. Damit kann man zwar keine dynamischen Inhalte testen, aber zum Suche von Darstellungsfehlern ist das schon praktisch - und kostenlos.

Kill Everything

Monday, September 26th, 2005

Kill Everything ist das Motto von Kill Monty, eines dieser kurzeiligen Sucht-Arcardespiele, von denen es viel zu wenige gibt. Man ballert sich durch Horden von Affen in ebenso affigen Verkleidungen, sammelt Waffenupgrades und versucht sich gegen Zwischenbosse durchzusetzen.

Kill Monty

Die Demo gibt es hier, die Vollversion kostet 12.95 USD. Und: Das Spiel gibt es nur für den Mac.

Ich fand es auf meinen Streifzug über die wenigen Internetseiten, die sich mit Spielen für Apples Betriebssystem auseinandersetzen. Es gibt doch weniger Spiele für Macs als für den PC :)

Dinge, die ich an Ruby mag #2: Iteratoren

Sunday, September 25th, 2005

Ihr größtes Anwendungsgebiet haben Closure (DdiaRm #1) in Ruby bei Iteratoren. Damit kann man sequentiell auf alle Elemente einer Kollektion wie etwa Felder oder Listen zugreifen. Dabei wird die interne Struktur gekapselt.

Ohne Iteratoren sieht der Zugriff auf Felder in Java etwa so aus:

// arr ist ein mit Integern gefülltes Feld

for (int i = 0; i ) {
  System.out.println(arr[i]);
}

In Java sieht das ganze mit Iteratoren etwa so aus:

// v ist ein Vector

for (Enumeration e = v.elements() ; e.hasMoreElements() ;) {
  System.out.println(e.nextElement());
}

In Ruby werden Blöcke benutzt, an die dann je nach Kollektionstyp die Werte übergeben werden. Zum Beispiel sieht das ganze so aus:

// arr ist ein Feld, hash eine Hashtabelle

arr.each do |element|
  puts element
end

hash.each do |key, value|
  puts "#{key}, #{value}"
end

Und es gibt dann noch ein bisschen syntaktischen Zucker, so dass man auch wie folgt über Felder iterieren kann:

for element in arr do
  puts element
end

Blöcke haben den Vorteil, dass sie z.B. auch rekursiv angewendet werden können:

def dump_tree(node, depth=0, &block)
  puts (" " * depth) + yield(node)
  for child in node.children do
    dump_tree(child, depth + 1)
  end
end

Jetzt kann ich diese Routine auf alle Instanzen von Datenstrukturen die eine children Methode bereit stellen loslassen:

dump_tree(tree) do |node|
  node.title + ", " + node.foo + ": " + node.bar
end

Rein syntaktisch sind Iteratoren mit Blöcken in Ruby meiner Meinung nach Konzepten aus der funktionalen Programmierung ähnlicher als den Iteratoren aus Java/C# usw. Statt ein zusätzliches Objekt einer speziellen Klasse zu instantiieren, kann man ähnlich wie bei Typen in Haskell, welche die Functor Klasse implementieren einfach Code auf alle Elemente der Datenstruktur anwenden. Das Äquivalent zu Lambda-Funktionen in Haskell sind dabei dann die Blöcke.

Sicher, das ganze funktioniert ähnlich in Java/C# bzw. anderen statischen Sprachen auch - aber nicht ohne zusätzliche Klassen zu erzeugen. Natürlich wird es einfach, sobald man eine Skriptsprache wie Jython oder JavaScript einbindet…

Code-Kommentator ,,The Commentator”

Sunday, September 25th, 2005

Leider findet man manche Aprilscherze viel zu spät. Wie zum Beispiel The Commentator von Cenqua.

Dieses Programm sollte anhand von verschiedenen Parametern automatisch den Code generieren. Dabei könne man an verschiedenen Reglern wie zum Beispiel ,,FUD” (vom Wert ,,Electronic Frontier Foundation” bis ,,Microsoft”) oder ,,Ausführlichkeit” (RTFM bis IBM) drehen und der Generator spuckt dann mehr oder weniger sinnvolle Kommentare aus.

Das ganze ist ja irgendwie schon eine verlockende Idee, die man wohl mit einem hinreichend großen Vorrat an Kommentaren, etwas künstlicher Intelligenz und IR (,,Information Retrieveal”) umsetzen können müsste. Vielleicht könnt ihr auf dieser Seite ja am nächsten 1. April ein ähnliches Programm herunterladen. Mal sehen.

Kudos an Felix.