F, R, U, Ri, Ui, Fi
vom 5. January 2008Ich hab mir gestern einen Rubiks Cube gekauft und seitdem vergeht keine Stunde in der ich nicht an diesem kleinen Würfel rumdrehe. Als ich vor ein paar Wochen auf YouTube ein paar Videos zu Speedcubing gesehen habe wollte ich es testen - geht das wirklich so schnell und gibt es da ein Schema nach dem man dieses hochkomplexe Rätsel lösen kann?
Nach etwas Recherche habe ich ein paar Seiten gefunden, die sog. Movement-Patterns auflisten, die man je nach Anwendungsfall verwenden kann. Das Pattern im Titel bspw. gibt die Drehreihenfolge "Front, Right, Up, Right inverted, Up inverted, Front inverted" vor, die man verwenden kann, um auf der untersten Ebene die Flächen zu ordnen. Ebenen deshalb, weil der Würfel von oben nach unten gelöst wird. Also zuerst eine Fläche incl. den Seiten, dann die mittlere Achse und zuletzt die untere Fläche. Je näher man der Lösung ist, desto komplizierter werden die Patterns. Um die letzten vier Ecken auszurichten braucht es ~30-60 Drehungen (nach der Methode die ich verwende).
Mittlerweile schaffe ich den kompletten Würfel (mit etwas spicken auf die Patterns) in ca. 5 Minuten (wenn ich keine Patzer reinmache und nochmal von vorn anfangen muss). Der Weltrekord liegt bei 9 Sekunden, man merkt, das Teil hat Suchtpotential :)
Sammelkiste
vom 21. December 2007Dinge, über die ich bloggen wollte, aber nicht dazugekommen bin:
UnitTests mit Mocks: Anhand eines IRC-Clients wird demonstriert wie man mit einem Mock-Objekt den Gegenpart (den IRC-Server) simulieren kann. Klick
NetBSD 4.0 ist drausen. Auch sowas das ich mir schon lange mal näher anschauen wollte, bisher hat es allerdings nur zu einer kurzen Testinstallation gereicht. Klick
Linus Torvalds verteidigt Linux und gibt Solaris den Abschuss. Hey, that's not a bug, that's a FEATURE!. Klick
Bash bunter machen. Wem es gefällt: Klick
Anzeichen dafür, dass man ein schlechter Programmierer ist: Klick
Die Gesichter hinter der großen Software-Gurus. Ziemlich lustige Zusammenstellung. Klick
Raumschiffe basteln für Anfänger und Freaks. Es gibt sogar einen (sehr teuren) Bausatz für die Serenity. Klick
Gedicht-Generator der Spitzenklasse. Was haben wir gelacht :) Klick
Read it later.
vom 5. December 2007Beim Surfen kommt es oft vor, das man zwar nicht viel Zeit hat, aber mal schnell den Reedreader durchgeht, ein paar Links folgt und etwas rumstöbert. Und oft hat man dann keine Lust/Zeit längere Artikel durchzulesen die man "grade gefunden" hat. Bisher hab ich dann die offenen Tabs in meinem del.icio.us mit dem Tag "toRead" verankert, oder schnell die Links per DragAndDrop aufs Desktop gezogen. Die Desktop-Verknüpfungen hat man dann noch präsent und kann sie auch schnell löschen, aber die Bookmarks in del.icio.us durchsuche ich seltenst nach dem "toRead"-Tag, und dann müsste ich das Tag wieder enfternen oder den Bookmark löschen. Alles ziemlich suboptimal.
Markus hat mir heute ein tolles Firefox-Plugin gezeigt, mit dem man solche Seiten in einem Stack speichern kann (einfach ein Icon drücken) um dann den Stack später durchzuarbeiten. Sehr praktisch das Teil!
ISS mit dem blosen Auge erkennbar
vom 5. December 2007Auf dem neuen ESA-Blog hab ich grade gelesen, das man die ISS und das Shuttle Atlantis während der STS-122 Mission mit blosem Auge am Himmel erkennen kann. Allerdings muss man genau wissen wo man wann hinschauen muss um was zu erkennen. Von meinem Balkon seh ich leider nicht viel, da die Straßenlaternen die Sicht ziemlich stark beeinträchtigen.
Die Atlantis wird übrigends morgen vom KSC um 4:31 p.m. EST (22:31 Uhr UTC+1) starten und das lange, lange vorbereitete europäische Forschungsmodul Columbus zur ISS transportieren. Die präzisen Montagearbeiten kann natürlich nicht irgend jemand ausführen, da muss der deutsche Mission Specialist Hans Schlegel persönlich Hand anlegen :)
PHP am Limit?
vom 5. December 2007Ich hab mich erst schon gefreut, das PHP endlich Namespaces implementiert. Doch auf der Mailingliste ging es die letzten Tage ziemlich rund und nun gibt es ein zusammengefasstes RFC mit dem Titel "Droping Namespaces". Nur dumm das der komplette Code von Phing schon auf Namespaces umgestellt wurde:
Hey guys, Just a heads up, but there is an RFC to pull "namespaces" from PHP 5.3. Personally, give how broken the implementation is, I would be for pulling them until someone just ports Python's module code to PHP. At any rate, thought it would be worth noting here since phing's trunk is using the current NS implementation.
So langsam habe ich das Gefühl, das die Codebase von PHP an ihrem Limit angelangt ist. Die Altlasten machen den Programmierern schon seit Jahren zu schaffen, gerade wenn es um wirkliche Neuerungen geht. Je mehr ich mich mit Ruby beschäftige desto weniger möchte ich mit PHP programmieren, allerdings ist das die einzige Sprache, die jeder Webserver spricht. Ich würde sofort PHP links liegen lassen, wenn da nicht die Kunden wären, die eine Dynamische Webseite wollen, die auf ihrem 2,99 EUR Webspace-Paket läuft. Wenn jemand einen günstigen Ruby/Python/... Hoster kennt der unter 3 EUR/Monat Webspace-Pakete anbietet wäre das schon mal ein erster Schritt.
Nasa 2.0
vom 4. December 2007Grade staunte ich nicht schlecht, als ich nasa.gov aufrief. Ich erkannte es garnicht mehr wieder.

Die Seite erfuhr ein komplettes Redesign, ganz im Web2.0-Stil. Die Farben sind in Grau- und Blautönen gehalten, natürlich mit roten Highlights. Das Menü das sich jetzt oben befinden lässt sich aufklappen, und schnell das finden was man sucht. Auf der Startseite findet man rechts Kategorien und drunter den "Tag-Space".
Mit MyNasa kann man sich eine persönliche Startseite mit News zusammenklicken. Besonders genial finde ich die Playlist und die Bookmarks. So kann man während man auf der Seite stöbert einzelne Seiten und Videos Bookmarken und diese dann nochmal gesondert auf seiner Startseite anschauen.
Dagegen sieht jetzt esa.int ziemlich langweilig aus :)
Kommentar schreiben,
del.icio.us,
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 :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17