Sprechende Boardcomputer

vom 6. January 2008

Ist das denn zu viel verlangt? Ich will doch nur Firefly zurück. Ich kann sie nicht mehr sehen, die SciFi-Serien in denen der Boardcomputer reden kann, selbst denkt, sich störrisch und wiederwillig benimmt und anfängt Befehle zu verweigern weil er es nicht für ethisch korrekt hält.

Ich versteh ja, das Schiff ist auch ein Teil der Crew, aber muss es denn gleich per Spracheingabe gesteuert werden? Und mit Spracheingabe meine ich natürlich Befehle wie "Los, mach schon den Lüftungsschacht auf, sonst entferne ich dir deine Neuronaldatenbank!". Das muss man sich mal auf der Zunge vergehen lassen: Der Schiffscomputer weiß genau, welcher Lüftungsschacht gemeint ist (Hellseher?), hat Angst (Gefühl) um sein Wissen und kann das komplette Schiff steuern (absolute Macht). Wenn man es objektiv betrachtet ist das grob fahrlässig. Der Boardcomputer hat die absolute Kontrolle über alles und wenn er nen schlechten Tag hat dreht er eben mal die Sauerstoffzufuhr etwas runter. (Ich sag nur DarkStar ("Hier ist Sargend Pinback, Bombe kannst du mich hören?"), WarGames, Red Planet, 2001: Odyssee im Weltraum, ...)

Neulich hab ich wieder einen Anlauf mit der Serie Starhunter 2300 gestartet, welche eigentlich nicht schlecht klingt wenn man sich ein paar Sachen auf Wikipedia und den Fanpages durchliest. Doch schon in der Pilotfolge fangen die Diskussionen mit dem Boardcomputer an. Danach war mir klar, das war die erste und letzte Folge die ich mir davon angesehen habe.

Ich steh auf Realismus. Klar SciFi ist nicht echt und alles andere als mathematisch Beweisbar, doch fordere ich schon etwas Logik die einen glauben lässt das es evtl. so funktionieren könnte. Deshalb war (und bin) ich ein großer FireFly, Stargate (SG1|Atlantis), StarTrek Enterprise und Babylon5 Fan, da in diesen Serien alles logisch zusammenpasst.

Die absoluten NoNo's sind für mich Serien wie LEXX - The Dark Zone (das abartigste schlechthin) oder StarHunter 2300. Wer also noch eine SciFi-Serie ohne Boardcomputer, coolem Schiff und lustiger Crew kennt, nur raus damit :)

9 Kommentare, delicious bookmark del.icio.us, Ist das denn zu viel verlangt? Ich will doch nur [Fire][0][fly][1] zurück. Ich kann sie nicht mehr sehen, die SciFi-Serien in denen der Boardcomputer reden kann, selbst denkt, sich störrisch und wiederwillig benimmt und anfängt Befehle zu verweigern we


F, R, U, Ri, Ui, Fi

vom 5. January 2008

Ich 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 :)

6 Kommentare, delicious bookmark del.icio.us, Ich hab mir gestern einen [Rubiks Cube][1] 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 wi


Sammelkiste

vom 21. December 2007

Dinge, ü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

1 Kommentar, delicious bookmark del.icio.us, Dinge, ü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][1] **NetBSD 4.0** ist drausen


Read it later.

vom 5. December 2007

Beim 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!

3 Kommentare, delicious bookmark del.icio.us, Beim 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


ISS mit dem blosen Auge erkennbar

vom 5. December 2007

Auf 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.

Columbus

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 :)

1 Kommentar, delicious bookmark del.icio.us, Auf dem neuen [ESA-Blog][1] hab ich grade gelesen, das man die ISS und das Shuttle [Atlantis][3] während der [STS-122 Mission][4] mit blosem Auge am Himmel erkennen kann. Allerdings muss man genau wissen [wo man wann][2] hinschauen muss um was zu erkenne


PHP am Limit?

vom 5. December 2007

Ich 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.

2 Kommentare, delicious bookmark del.icio.us, Ich 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][1] mit dem Titel "Droping Namespaces". Nur dumm das der komplette Code


Nasa 2.0

vom 4. December 2007

Grade staunte ich nicht schlecht, als ich nasa.gov aufrief. Ich erkannte es garnicht mehr wieder.

Nasa

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, delicious bookmark del.icio.us, Grade staunte ich nicht schlecht, als ich [nasa.gov][1] aufrief. Ich erkannte es garnicht mehr wieder. ![Nasa](http://aaron-mueller.de/bilder/20071204_nasa_web20.png) Die Seite erfuhr ein komplettes Redesign, ganz im Web2.0-Stil. Die Farben sind in


Spaß am Gerät

vom 3. December 2007

Server

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 :)

5 Kommentare, delicious bookmark del.icio.us, ![Server](http://aaron-mueller.de/bilder/20071203_server.jpg) Durch [Martin][1] 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-R


Lively BestOf, Volume #1

vom 30. November 2007

Im 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...

4 Kommentare, delicious bookmark del.icio.us, Im Rahmen der Vorlesung [MSWA][1] mussten wir [den Code][2] vom Lively Kernel (ein [Research-Projekt von Sun][3]) analysieren und einen Teilaspekt bis ins kleinste Detail untersuchen und verstehen. [Florian][4] und ich nahmen uns *Morph* als Spezielgebiet


Bug-freier Code ist kein Traum

vom 24. November 2007

Tony 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.

1 Kommentar, delicious bookmark del.icio.us, [Tony Hoare][1] (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 "[