Spaß am Gerät
vom 3. December 2007
Durch Martin bin ich vor Kurzem ziemlich günstig an einen 1HE Server gekommen. Heute hab ich endlich Gelegenheit gefunden mir das Baby etwas näher anzuschauen. Da das integrierte CD-Rom Laufwerk nicht so recht wollte, hab ich Ubuntu übers Netzwerk (PXE-Boot/TFTPd) installiert, was zu meinem Erstaunen verdammt gut funktionierte.
Da der Server einen Höllenkrach macht, kann ich ihn nicht im Wohnzimmer stehen lassen. Aus diesem Grund suche ich gerade nach einem passenden Zuhause. Da ich momentan die Serverkapazität nicht brauche, würde ich diese gerne einem OpenSource-Projekt zukommen lassen, also wer da was nützliches kennt das viel CPU-Power braucht (nein Seti@home kommt nicht drauf), solle sich bitte in den Kommentaren melden.
Ein kleines Script hätte ich da schon (hab ich geschrieben während die Installation durchlief :):
#!/usr/bin/env ruby
require 'date'
require 'open-uri'
host = "http://entwickler-press.de"
url = host+"/ep/xmas_calendar.php?day="+Date.today.day.to_s
name = open(url).read.scan(/href="(.+.pdf)"/).to_s.gsub(/ /, "%20").gsub(/#/, "%23")
local_name = name.scan(/ebooks/(.+)_[a-z0-9]+.pdf/).to_s.gsub(/%[0-9]{2}/, "_")+".pdf"
open(local_name, "w").write(open(host+name).read)
Das Script zieht das täglich verfügbare kostenlose eBook vom Adventskalender von entwickler-press. Da kommt Weihnachtsstimmung auf :)
Lively BestOf, Volume #1
vom 30. November 2007Im Rahmen der Vorlesung MSWA mussten wir den Code vom Lively Kernel (ein Research-Projekt von Sun) analysieren und einen Teilaspekt bis ins kleinste Detail untersuchen und verstehen. Florian und ich nahmen uns Morph als Spezielgebiet, was sich im Nachhinein ziemlich in Arbeit ausartete. Um die heutige Abgabe zu zelebrieren, beendeten wir dieses Projekt mit einem Bierchen (thx Andreas).
Bei der Analyse des Codes (>10k Zeilen Javascript) sind uns ein paar lustige und/oder merkwürdige Stellen aufgefallen, die ich euch nicht vorenthalten möchte :) Hier also die BestOf Codezeilen von Lively.
Da alle Javascript-Objekte auch wie eine Hashmap angesprochen werden können, ist es z.B. möglich die Superklasse des Objekts zu löschen oder aber dieses tolle Konstrukt (ähnliches geht übrigens auch in PHP):
addVariable: function(varName, initialValue) {
// functional programming is fun!
this[varName] = initialValue;
this[getter(varName)] = function(name) {
return function() { return this[name]; }
}(varName); // let name = varName ()
this[setter(varName)] = function(name) {
return function(newValue, v) {
this[name] = newValue;
this.changed(getter(name), v);
}
}(varName);
},
Auch ziemlich cool fand ich folgende Funktion:
// my kingdom for a Smalltalk block!
applyFunctionToShape: function() {
var args = $A(arguments);
var func = args.shift();
func.apply(this.shape, args);
if (this.clipPath) {
console.log('clipped to new shape ' + this.shape);
this.clipToShape();
}
this.adjustForNewBounds();
}.wrap(Morph.onLayoutChange('shape')),
Der Funktion wird ein Funktionsblock und eine beliebige Anzahl Parameter übergeben (Funktionsparameter zu definieren oder zummindest in einem Kommentar zu hinterlassen was denn evtl. in die Funktion reinkommt ist was für Weicheier). Der Funktionsblock wird mit einem zusätzlichen Parameter und den restlichen Argumenten aufgerufen ($A() ist übrigends eine Prototype-Funktion die alle Argumente in ein Array schiebt) und am Ende noch mit der Funktion wrap() noch mit dem Aspekt von onLayoutChange() ausgeführt.
Allerdings war nicht alles so genial wie es jetzt den Anschein hat.
for (var i = 1; i <= vertices.length; i++) {
var p2 = vertices[i % vertices.length];
if (p.y > Math.min(p1.y, p2.y)) {
if (p.y <= Math.max(p1.y, p2.y)) {
if (p.x <= Math.max(p1.x, p2.x)) {
if (p1.y != p2.y) {
var xinters = (p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x;
if (p1.x == p2.x || p.x <= xinters)
counter ++;
}
}
}
}
p1 = p2;
}
Oder das hier:
/* ca. 5 Seiten von diesen Zuweisungen */ this.images[1][0] = this.images[0][0]; this.images[1][1] = this.images[0][1]; this.images[1][2] = this.images[0][2]; this.images[1][3] = this.images[0][3]; this.images[1][4] = this.images[0][4]; //images[2] = images[1]; // DO NOT DO THIS, -> javascript nice copy-features //images[1] = images[0];
Manche Dinge waren aber auch total sinnlos:
setToggle: function(flag) {
this.setAttributeNS(Namespace.LIVELY, "toggle", !!flag);
},
Nachtrag: Wie sich heute in MSWA herausgestellt hat, ist die doppelte Negation doch nicht so sinnlos wie es offensichtlich scheint. Sie sorgt in diesem Fall für eine Typkonvertierung. Damit die Funktion setAttributeNS() auf jeden Fall einen Boolean als dritten Parameter bekommt, wird der Wert zuerst negiert (also zu einem echten boolschen False gemacht) und anschließend zu einem echten True. (Hintergrund: In dynamisch typisierten Sprachen wird alles was kein False ist automatisch als True interpretiert.)
Erst nach dem fünften Durchsehen des Codes wurde mir klar das das hier eine Art Interfacedefinition sein muss:
recordChange: function(fieldName/*:String*/) {
// Update sever or change log or something
return;
},
Auch eine "Ellegante" Art Copy&Paste zu betreiben - einfach von einer anderen Prototype-Klasse klauen:
// poorman's traits :) bounds: PolygonShape.prototype.bounds, vertices: PolygonShape.prototype.vertices, inspect: PolygonShape.prototype.inspect, setVertices: PolygonShape.prototype.setVertices, reshape: PolygonShape.prototype.reshape, /* ... */
... oder einfach mal bei jedem Schleifendurchgang das Array neu definieren und die i-te Position rausziehen:
for (var i = 0; i < 12; i++) {
... ['XII','I','II','III','IV','V','VI','VII','VIII','IX','X','XI'][i];
/* ... */
}
Bei manchen Funktionen waren sich die Programmierer auch nicht so ganz sicher was sie da gemacht haben.
compositionWidth: function() {
if (this.wrap === WrapStyle.NORMAL) return this.shape.bounds().width - (2*this.inset.x);
else return 9999; // Huh??
},
Function.prototype.inspect = function() {
return this.toString().substring(8, 88);
};
// yes yes.. so its a little laggy to add the current line and delete it...
parent.setIMText("");
... und kleine Zankereien unter den Entwicklern ist auch zu finden:
// KP: note layoutChanged will be called on addition to the tree // DI: ... and yet this seems necessary! this.layoutChanged();
// this code is all copied -- should be factored or, better, removed
Das leidige Thema Browserkompatibilität ...
if (newShape.pathSegList.numberOfItems != this.pathSegList.numberOfItems) {
// ARGH, Safari doesn't clone lists properly???
for (var i = 0; i < this.pathSegList.numberOfItems; i++) {
// How annoying, no way of cloning path segments
var seg = this.pathSegList.getItem(i);
// KP: add the top morph to the world first, to make firefox happy WorldMorph.current().addMorphAt(WindowMorph(engine, 'A Lively Engine'), pt(250, 5)); engine.openAllToDnD(); // have a little fun...
Performance ist auch so ein Thema für sich. An einer ziemlich zentralen Stelle:
// TODO: there MUST be a better way to do this // there "might" be some performance issues with this :)
while (sin < 0) sin += 360; // Can be slow...
Und wer genau hinschaut findet sogar ein Easteregg :)
// uncomment for extra icon fun
/*
sign = NodeFactory.create("use").withHref("#GearIcon");
sign.setAttributeNS(null, 'transform', 'translate(-10, -10) scale(0.040)');
menuButton.addChildElement(sign);
*/
In diesem Sinne:
this.state = "shutdown"; // no one will ever know...
Bug-freier Code ist kein Traum
vom 24. November 2007Tony Hoare (das ist der der den Quicksort-Algorithmus erfunden hat) hat auf einer Informatikveranstaltung an der TU München sein Konzept zu Werkzeugen für die Erstellung von 100% fehlerfreiem Code vorgestellt. Sein Konzept bezieht sich auf einen "Verifying Compiler", also ein Compiler der nicht nur die Syntax checkt, sondern auch auf Semantik und Fehlerfreiheit testet.
Die Idee ist folgende: Man wandle das Programm in eine mathematische Formel um und versuche diese zu beweisen. Wenn die Formel nicht beweisbar ist, ist der Code fehlerhaft. Damit das funktioniert muss das Programm Assertions beinhalten, um die entsprechende Formel zu bilden. Erfahren habe ich darüber in der Computer Zeitung Nr. 45 vom 5.11.2007. Noch mehr Informationen zu diesem speziellen Compiler gibts hier.
Interessant ist, das die langweilige Beweisführung die wir in "Logik und KI" und "Lineare Algebra" ständig machen, einen (mir endlich) ersichtlichen, praktischen Nutzen hat.
Android Die Handy-Plattform von Google
vom 12. November 2007Seite ein paar Stunden kann man das Android SDK von Google herunterladen (~55MB). Entwickelt wird mit Java6 auf Basis eines Linux-Kernels. Als Entwicklungsumgebung wird Eclipse empfohlen (es existiert schon ein recht brauchbares Plugin).

Im SDK dabei sind gut dokumentierte Beispiele, eine hervorragende Dokumentation sowie tools und Scripts für die Emulation und das Deployment. Das Ganze macht nach der ersten Besichtigung einen sehr guten Eindruck, mehr zur Architektur und dem SDK gibt es später :)
Phing 2.3 heute?
vom 2. November 2007Gerade habe ich über die Phing-dev Mailingliste erfahren, das das 2.3er Release kurz bevorsteht. Offene Bugs gibt es keine mehr. Der Branch ist im SVN schon erstellt, es fehlt also nur noch das Zusammenschnüren der Pakete.
Die wichtigsten Änderungen sind:
- PHPUnit3 support
- Der Task "phpdoc" unterstützt jetzt neben <
- Es werden nun Streams für die komplette Ausgabe und das Logging verwendet.
- ... und viele weitere kleinere Features wie der überarbeitete move-task, und eine Menge BugFixes.
Die nächsten (schon heiß diskutierten) Schritte werden vermutlich die Unterstützung bzw. den Umstieg auf PHP6 sein, zudem wollen die Entwickler den kompletten Code mit den in PHP6 kommenden Namespaces ausstatten.
Kommentar schreiben,
del.icio.us
Time Warp
vom 31. October 2007Zeitzonen, Sommerzeit, Normalzeit, UTC, CET, MEZ und NTP, das ist absolut nicht mein Ding. Gerade hab ich mir ein kleines Makefile geschrieben um ein etwas größeres LaTeX-File nach PDF umzuwandeln, da sagt mir make:
Warning: File `Makefile' has modification time 6.4e+03 s in the future
Ich schau auf meine Systemuhr: Alles ok. Dann wurde es mir klar: Mein Fileserver hat noch die Sommerzeit eingestellt. Und tatsächlich ging die Systemzeit vom Fileserver mehr als eine Stunde vor. Um dem für allemal vorzubeugen habe ich einen NTP-Daemon installiert, doch dieser gab mir eine Zeit die genau eine Stunde in der Vergangenheit lag und die Hardware-Uhr lag immer noch in der Zukunft.
root@datenpool:/etc# date Wed Oct 31 19:38:08 UTC 2007 root@datenpool:/etc# ntpdate pool.ntp.org Looking for host pool.ntp.org and service ntp host found : pd907efc7.dip0.t-ipconnect.de 31 Oct 20:04:27 ntpdate[2097]: step time server 217.7.239.199 offset -6788.989946 sec root@datenpool:/etc# hwclock --show Wed Oct 31 22:58:56 2007 0.000000 seconds
Also musste ich mich doch mit all dem Kram beschäftigen, dabei wollte ich doch nur an meinem LaTeX-File weiterschreiben. Wieder mal voll verzettelt.
Der Fehler war dann, das die Zeitzone Europe/Berlin nicht gesetzt war und die Zeit in der Hardware-Uhr nicht erneuert wurde. Ich bin für die Abschaffung der Sommerzeit!
Sonntägliches Link-Mashup
vom 28. October 2007The Future of Software Development Warum das Wasserfallmodell gescheitert ist und warum ein paar einzelne Webseiten programmieren, die Millionen nutzen, alles gewürzt mit einer Hand voll BuzzWords.
Understanding Ruby blocks, Procs and methods Blocks, yield, lambda und high-order-function einmal richtig erklärt. Die Kommentare sind auch sehr aufschlussreich.
Execution in the Kingdom of Nouns Java-Bashing at its best. Warum im Javaland die Verben von den Hauptwörtern beherrscht werden.
Design by Metaphor Warum kunden bei der Projektplanung gerne Vergleiche oder "Referenzen" zur Beschreibung von Features nutzen und wo die Gefahren liegen. "Just like eBay" is not enough!
Kommentar schreiben,
del.icio.us
OpenOffice auch mit Word
vom 15. October 2007Sun hat mit dem ODF Plugin (Version 1.1) eine Möglichkeit geschaffen, OpenOffice-Dateien auch mit MS Word, MS Excel und MS Powerpoint zu öffnen und zu speichern! Das ist der Moment auf den ich gewartet habe; Ab sofort werde ich keine Ausreden mehr gelten lassen, wenn ich OpenOffice-Dateien verschicke. Das Tool ist kostenlos und ~30MB groß.
Die Exportfunktion von OpenOffice-Dateien ins Microsoft-Equivalent hat bei mir nie 100% funktioniert. Vor allem bei Tabellen gab es sehr oft Probleme. Also wer noch Windows und Word auf seinem Rechner hat, sollte das Tool unbedingt installieren (und mir dann berichten wie es funktioniert :)
Radiohead "In Rainbows"
vom 10. October 2007Heute wurde mir das neue Album "In Rainbows" von Radiohead kostenfrei per E-Mail ausgeliefert. (Wer es nicht mitbekommen hat: Das Album konnte für einen Betrag den man selbst wählen konnte, online bestellen) Leider ist kein Cover dabei, aber das Album an sich ist nach dem ersten Durchhören wirklich verdammt gut! An die anderen Bands und Plattenlabels: Nachmachen!
Fluxbox 1.0
vom 10. October 2007Lange hat es gedauert, doch nun ist es getan: Der Windowmanager Fluxbox ist in der Version 1.0 erschienen. Fluxbox wurde vor ca. 7 Jahren von Blackbox abgespalten und seit über 4 Jahren trug er 0.9x Versionsnummern. Ich werde am Wochenende mal einen Blick reinwerfen und anschauen was sich in den letzten Jahren so getan hat.
Kommentar schreiben,
del.icio.us
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16