Notebookreparatur, 2

Über den ersten Teil meiner Notebookreparatur habe ich vor einiger Zeit schon geschrieben. Gestern und heute ging es dann weiter mit Teil zwei.

Nachdem ich mir geeignetes Werkzeug besorgt hatte, um die Seriell- und Parallelport-Anschlüsse auf der Rückseite des Notebooks abzuschrauben, habe ich es gestern Abend noch einmal auseinandergenommen. Diesmal ist es mir auch gelungen, das Mainboard mit der schadhaften Netzteilbuchse zu auszubauen.

Die korrekte Fehlerdiagnose: Da die Buchse nur an ihren Lötfahnen befestigt ist, wurde durch die dauerhafte Belastung eine dieser Fahnen abgerissen. Das erklärt, wieso das Verkanten des Steckers für eine Weile geholfen hat, bevor dann gar nichts mehr zu holen war.

Ich habe die Buchse ausgelötet, was überraschend reicht ging, und bin damit heute zum Elektronikladen gelaufen. Der Verkäufer kannte zwar mich nicht (wie auch …), aber sowohl Buchse als auch Problem. Und er wusste, dass es diese Buchse so nicht gibt und ich mir aus Drähten, einer anderen Buchse (die es gibt …) und Schrumpfschlauch etwas selbst basteln muss.

Jetzt habe ich also zwei Optionen:

  1. Entweder etwas basteln, das mit Draht, Buchse und Schrumpfschlauch wieder einen Anschluss ermöglicht – wobei ich noch das Problem der Zugentlastung lösen muss.
  2. Ein (kaputtes) Mainboard mit gleicher, intakter Buchse finden, das ist als Ersatzteillager missbrauchen kann.

Ich tendiere mittlerweile aber schon sehr zu Variante eins. Das ist nicht so schick, aber weitere Reparaturen dürften sich wesentlich einfacher gestalten.

Spontane Idee: Festplattenstecker und -buchse verwenden. (Also, die Teile, die im PC zur Stromversorgung genutzt werden.) Die Festplattenbuchse wird dann mit Kabeln aufs Mainboard gelötet, an den Festplattenstecker kommt die Buchse für die Notebook-Stromversorgung. Der Festplattenstecker passt dann noch ins Notebook und dient gleichzeitig als Zugentlastung. Falls dort mal etwas reisst, lässt sich das leichter reparieren, als wenn ich wieder am Notebook löten müsste.

Songbird: Music Player für Windows

Meine Suche nach einem Amarok-Äquivalent für Windows hat ein Ende gefunden!

Ich bin heute zufällig über einen Mozilla-basierten Music-Player für Windows gestolpert: Songbird.

Die Playlist sieht ähnlich aus wie beim Amarok (oder iTunes, das sich auf meinem Rechner aber nicht gut benimmt), ich bekomme die für mich interessanten Meta-Informationen angezeigt und es gibt – wie man es von Mozilla gewohnt ist – eine Menge addons. Zum Beispiel, um bei last.fm zu scrobbeln.

Einziges Manko: Das Programm lässt sich nicht in die Traybar minimieren – aber da finde ich sicherlich auch noch etwas.

Kommentare in der .htpasswd

Ich bin gerade ein wenig unsicher, ob ich mal wieder Google-blind bin oder ob es wirklich nicht vorhanden ist – jedenfalls war ich nicht in der Lage, eine vernünftige Dokumentation des Dateiformats für die Passwortdateien des Apache zu finden.

Die meisten Einträge befassen sich damit, wie man das htpasswd-Tool benutzt, mit dem sich solche Dateien über die Kommandozeile bearbeiten lassen. Ich möchte aber wissen, ob und wie ich dort Kommentare einfügen kann.

Letztendlich habe ich einfach mal probiert und war damit erfolgreich, vor die betroffene Zeile eine Raute zu setzen (#), also so zu kommentieren, wie in shell-Scripten.

Aber eine fundierte Lösung wäre mir natürlich lieber. Falls jemand etwas hat: Ab in die Kommentare damit!

Browser-basiertes "Getting Things Done" mit MonkeyGTD

Weil sich bei mir im Job immer mehr Aufgaben und Verantwortungsbereiche anhaeufen und das Jonglieren damit zur zunehmenden Qual wird, hab ich mich im Internet auf Softwarehilfen zur Implementierung von David Allens “Getting Things Done”-Methode umgesehen. Mein Favorit war schnell gefunden: MonkeyGTD, ein browser-basiertes Tool auf Basis von TiddlyWiki.

Die Vorteile:

  • browser-basiert (funktioniert prima mit Firefox) und damit plattformunabhaengig
  • Nur eine einzelne (zugegeben grosse) HTML-Datei, brauch lediglich einen Javascript-faehigen Browser
  • Datei kann lokal gehalten werden oder auch auf tiddlyspot.com oder eigenem Webserver online verfuegbar gemacht werden
  • fuer mich sehr angenehme Verwaltung der einzelnen Arbeitseinheiten von GTD (Actions, Projects, Areas)
  • einfache Bedienung durch Tiddlers (Miniseiten innerhalb des TiddlyWikis)
  • MonkeyGTD erstell beim Speichern selbst ein Backup von sich, dass nur noch manuelle archiviert werden muss
  • Backups und Upgrades koennen scheinbar ueber einen vorhandenes Plugin jeweils ohne viel Aufwand mit der aktuellen Version zusammengefuehrt werden (habe ich noch nicht probiert)

Einziger Nachteil, den ich bisher gefunden habe, ist, dass die Backupdateien mit der Zeit sehr viel Platz beanspruchen (bei knapp 500 KB pro einzelnem Backup).

Mein MonkeyGTD befindet auf einem USB-Stick, ich setze es seit knapp drei Wochen taeglich sowohl im Buero als auch daheim ein  (jeweils mit Firefox) und ich bin sehr gluecklich damit. Mein Arbeitstag mit seinen vielen Aufgaben und auch Ablenkungen wird zunehmend ueberschaubarer und handhabbarer, weil ich nichts mehr im Kopf behalten muss, ich deswegen mehr schaffe und ich trotzdem nichts vergesse.

Spaß-Admins?

heise.de schreibt im Artikel “Per Browser auf den Mainframe”:

Es werde aber immer schwieriger, Nachwuchs für die Betreuung der Rechner und der Software zu finden, der mit den herkömmlichen Terminals arbeiten will.

Das bestätigt einen Eindruck, den ich selbst auch schon desöfteren hatte: Die neue Generation der Computernutzer scheint davon verwöhnt, dass Systeme entweder auf Anhieb funktionieren oder sich durch bunte Howtos und Rumklicken zu einer Form von Funktion bewegen lassen. Auf jeden Fall müssen sie schön bunt sein und Spaß machen.

Nach einem Hype von Ich-kenn-mich-mit-Computern-aus-Menschen scheinen sich wieder die herauszukristallisieren, die sich wirklich mit der Materie beschäftigen wollen – und sie dementsprechend auch beherrschen.

Gehen uns die Admins aus?

(Der Artikel ist einseitig, übertrieben und verallgemeinernd. Das muss so. Es darf diskutiert werden.)

Tiefenanordnung von Linien in Matlab-Plots

Heute geht es mal um ein sehr spezielles Problem mit einer Lösung auf die ich gestern durch Probieren gekommen bin und sehr erstaunt war, dass das so funktioniert und offenbar sogar so vorgesehen ist. Zunächst ein paar Worte zum ursprünglichen Problem.

Ich arbeite im Institut mit Matlab 6.1, zwar schon etwas in die Jahre gekommen aber brauchbar. Für die Auswertung meiner Messdaten habe ich ein GUI programmiert wo ich zwei verschiedene Sachen gleichzeitig in einem axes-Objekt darstellen will. Normalerweise kann man hier mit den Funktionen hold und plot arbeiten, aber mir war das zu unflexibel und ich habe daher gleich die LowLevel-Funktionen benutzt. Ich habe in dem GUI das gewünschte axes-Objekt. Direkt darunter in der Objekthierarchie kommen bereits die line-Objekte, die auch plot erzeugt. Von Hand kann man sich die mit dem Befehl line erzeugen, die landen dann in dem aktuellen axes-Objekt, das man zuvor mit axes(axeshandle) festlegen sollte. Bei der Erzeugung der line-Objekte speichere ich das line-Handle um später direkt wieder drauf zugreifen und beispielsweise die zugrundeliegenden Daten ändern zu können.

Soweit so gut, nun ist es so, dass ich nicht bestimmen kann, wann der Benutzer die eine Sache zum Plotten anklickt und wann die andere. Oben erscheint aber immer die zuletzt gewählte. Genauso verhält sich der Befehl plot. Was zuerst geplottet wird, landet hinten, die nachfolgenden Sachen darüber. Das ist bei vielen Darstellungen egal, bei einigen aber nicht.

Der Trick um die Darstellungsreihenfolge – oder englisch z-Order – zu ändern klingt ein wenig wie »von hinten durch die Brust ins Auge«, funktioniert aber wunderbar. Um zu verstehen, was dort gemacht werden muss, schaut man sich am besten nochmal die Objekthierarchie an. Ein axes-Objekt beherbergt beliebig viele line-Objekte. Die Handles dieser Objekte kann man sich ausgeben lassen:

linehandles = get(gca, 'Children')

Die einzelnen Elemente des Vektors linehandles haben genau die Reihenfolge der Anordnung in z-Richtung wobei das erste Element das zu oberst angezeigte ist. Es spricht nichts dagegen, die Elemente umzuordnen und dem axes-Objekt wieder zuzuweisen, z.B. in umgekehrter Reihenfolge:

set(gca, 'Children', flipud(get(gca, 'Children')))

Ich war einigermaßen überrascht, dass das tatsächlich so funktioniert, da ich in der ausführlichen Matlab-Hilfe nie darüber gestolpert bin. Dass das wirklich so vorgesehen ist, sagt einem Matlab selbst, wenn man versucht der Eigenschaft Children etwas anderes als ein umgeordnetes selbst zuzuweisen:

??? Error using ==> set
Children may only be set to a permutation of itself.

Damit das ganze noch ein wenig anschaulicher wird, habe ich noch ein kleines Skript geschrieben, dass die Sache nochmal illustriert:

% test data
a = rand(5,1)
b = rand(5,1)
c = rand(5,1)
% line handles
hp = plot([a b c])                  % hp in order we plotted
ha = get(gca, 'Children')           % reverse order
% vectors of line handles equal?
all(hp==ha)                         % not equal
all(hp==flipud(ha))                 % should be equal, see above
all(sort(hp)==sort(ha))             % also equal
% thick lines
set(ha, 'LineWidth', 10)
title('original order')
legend('a','b','c')                 % order as in plot call
print(gcf, '-dpng', 'z-order-original.png')
% color of the most front line, should be c
get(ha(1), 'Color')                 % should be red aka [1 0 0]
% now flip lines, put c in the back
set(gca, 'Children', [ha(2) ha(3) ha(1)])
title('flipped order')
print(gcf, '-dpng', 'z-order-flipped.png')
% color of the most front line, should be b
ha = get(gca, 'Children')
get(ha(1), 'Color')                 % should be green aka [0 0.5 0]

Schaut man sich hier die erzeugten PNG-Bilder an, erkennt man, dass die Linie für die Datenreihe c zunächst ganz vorn und dann ganz hinten dargestellt wird:

Alte Revisionen wiederherstellen mit Subversion

Im täglichen Umgang mit Subversion passiert es, dass man Dateien eincheckt, die man dann doch eigentlich nicht commiten wollte. Zum Glück kann man alte Revisionen wiederherstellen, dafür hat man ja das Versionsverwaltungssystem, man muss nur wissen wie.

Die erste Idee: revert – das funktioniert nicht, weil revert nur Änderungen an der lokalen Working Copy rückgängig macht, nach dem Commit kann revert nichts mehr ausrichten.

Die zweite Idee: update auf die ursprüngliche Version. Dann hat man in der Working Copy zwar zunächst mal die alte Version liegen. Man kann sie aber nich direkt commiten, weil Subversion sie für aktuell hält. Das ist sie im Grunde auch, nur halt in einer vorherigen Revision. Lokale Änderungen gibt es in dem Sinne nicht an der Datei. Bei Binärdateien kommt man an dieser Stelle nicht weiter, wenn man nicht jedesmal wieder ein update auf die alte Revision machen will.

Die dritte Idee: ins Handbuch schauen. Das exzellente Subversion-Buch hat natürlich auch zu dieser Problematik die passenden Tipps parat: Undoing Changes. (Wir arbeiten hier noch mit Subversion 1.4, daher der Link ins »alte« Buch.) Was auf den ersten Blick überraschend klingt: merge ist die Lösung für das Problem. Der Trick ist, dass wir dieses Mal rückwärts mergen. Dadurch gelangt die ältere Revision wieder in die Working Copy und nachdem man kontrolliert hat, ob damit alles stimmt, kann man die erneut commiten.

Genug der Vorrede, ich zeige den Vorgang mit dem Kommandozeilen-Client und mit TortoiseSVN am Beispiel. Ich habe hier eine Binärdatei driftcompgui.fig, die ich zuletzt in Revision 297 korrekt eingecheckt habe. In Revision 300 habe ich versehentlich eine falsche Version der Datei eingecheckt und möchte jetzt wieder die Version aus Revision 297 haben. Auf der Kommandozeile sieht das recht einfach aus (mit anschließendem Screenshot der Ausgaben):

svn merge -c -300 driftcompgui.fig

Wie man sieht liegt die Datei nun geändert in der Working Copy und zwar in der gleichen Version wie in Revision 297. Jetzt kann man die so einchecken oder noch weiter damit arbeiten. Bei TortoiseSVN erschließt sich diese Funktion aus dem GUI eher überhaupt nicht. Ich zeige zunächst mal den entscheidenden Screenshot und erkläre dann nochmal:

Hier wählt man zunächst im Feld »From:« die gewünschte Datei aus und klickt »HEAD Revision« an. Das ist sozusagen der Startpunkt des Rückwärts mergens. Bei »To:« natürlich »Use “From:” URL« auswählen, da es um die selbe eine Datei geht. Als Ziel Revision gibt man hier die an, die man wiederherstellen will, in meinem Fall 297. Jetzt kann man ohne weiteres auf »Merge« klicken und dann die Datei in der Working Copy untersuchen. Sollte irgendetwas nicht stimmen, kommt man mit revert wieder zur HEAD Revision, da wie bei jedem anderen Merge kein automatischer Commit passiert sondern die Änderungen des merge nur in der Working Copy landen. Wenn alles ok ist, kann man commiten und hat danach wieder die alte Version der Datei im HEAD des Repository.

Keys für Upgrade auf WordPress 2.6

Gestern kam mal wieder ein neues Update für WordPress. Wir setzen hier die DE-Edition ein und da gibt es auch eine detaillierte Anleitung zum Upgrade. Dort wird einem verraten, dass es für WordPress 2.6 neue Variablen in der Datei wp-config.php gibt. Der entsprechende Abschnitt in der wp-config-sample.php sieht so aus:

// Ändere jeden SECRET_KEY in eine beliebiege, möglichst einzigartige Phrase. Du brauchst dich später
// nicht mehr daran erinnern, also mache sie am besten möglichst lang und kompliziert.
// Auf der Seite https://www.grc.com/passwords.htm kannst du dir einen Ausdruck generieren lassen.
// Bitte trage für jeden SECRET_KEY eine eigene Phrase ein.
define('AUTH_KEY', 'put your unique phrase here'); // Trage hier eine beliebige, möglichst zufällige Phrase ein.
define('SECURE_AUTH_KEY', 'put your unique phrase here'); // Trage hier eine beliebige, möglichst zufällige Phrase ein.
define('LOGGED_IN_KEY', 'put your unique phrase here'); // Trage hier eine beliebige, möglichst zufällige Phrase ein.

Jetzt ist da eine Seite angegeben, auf der man sich diese Keys erzeugen lassen kann. Das ist für den DAU ganz nett, aber schrieb nicht fefe gerade die Tage:

Man sollte denken, niemand könnte je so unglaublich dämlich sein, sich einen Krypto-Schlüssel von jemand anderem generieren zu lassen

Glücklicherweise gibt es ja noch mehr Möglichkeiten zufällige Zeichenketten zu erzeugen. Eine davon habe ich vor einigen Monaten im Beitrag Kleiner Passwortgenerator in Perl vorgestellt. Was der Beitrag verschweigt: Ich hatte wenige Tage später noch eine kleine Anpassung an dem Skript vorgenommen, die es erlaubt, beim Aufruf die Anzahl der zurückzugebenden Zeichen als Parameter zu übergeben. So war es ein leichtes die nötigen Keys für die Konfigurationsdatei von WordPress zu generieren:

perl genpasswd.pl 64

Das veränderte Skript ist jetzt übrigens auch über Penguineering Tools abrufbar.

CLI siegt

Spontane Erkenntnis: Ich nutze lieber den Kommandozeilenclient als die Shell-Extension im Kontextmenü – jedenfalls wenn es um Subversion geht. Gerade Routineaufgaben wir update und commit gehen damit einfach schneller.

Mögliche Erklärung: In der KDE kommt man aus dem Dateimanager per F4 in ein Konsolenfenster mit dem aktuellen Verzeichnis. Dort muss ich dann nur noch svn up eingeben, mit das Ergebnis anschauen und die Konsole mit Strg+D wieder schließen. Das geht wesentlich schneller, als mit der Maus im Kontextmenü die entsprechende Option zu suchen.

Die HCI-Community spricht hierbei von habit, also der Gewohnheit beziehungsweise Routine. Während man bei der Mausbedienung zuerst den Mauszeiger suchen muss, um ihn dann auf die richtige Position im Dateimanager und im Kontextmenü zu navigieren, ist die Position der Tasten fest, die Tastaturbedienung bedarf also wesentlich weniger Planung und fördert daher eher ein routiniertes Vorgehen. Letztendlich entlastet das das Gehirn und wird deshalb als energiesparende Maßnahme bevorzugt. Aber wer gern Shortcuts benutzt, kennt das ja … 8)

Nachtrag: Da war ich wohl etwas eilig und hab die Abkürzungen nicht erklärt…

CLI = Command Line Interface; eine Form von Kommandozeile, entweder auf der Konsole oder in ein Programm eingebettet.

HCI = Human-Computer-Interaction oder Human-Computer-Interface, also die Schnittstelle beziehungsweise Interaktion zwischen Mensch und Computer.

irssi-Hilight mit Jabber

Seit einigen Jahren läuft in meiner Screen-Session neben ICQ und anderen Tools auch ein irssi, um mich mit der Welt des IRC zu verbinden. In den meisten Channels bin ich einfach nur anwesend, gelegentlich spricht mich dann aber doch jemand an. Dank hilight im irssi wird man darüber ja eigentlich informiert. Nur leider schaue ich viel zu selten in das irssi-Fenster, um das dann letztendlich auch zu sehen. (Ja, screen informiert ueber Pings in anderen Fenstern, aber da guck ich doch erst Recht nicht hin …)

Da irssi eine schicke Perl-API hat, liegt es doch nahe, ein Perl-Script zu schreiben, mit dessen Hilfe ich mich anderweitig informieren lassen kann. Sehr nahe liegt da der Instant Messenger, der sowieso immer läuft, wenn ich am Rechner sitze – konkret Jabber.

Mit dem Perl-Modul Net::Jabber ist das alles kein Problem (abgesehen von den lückenhaften Dokumentationen, insbesondere in der irssi API) und so gibt es nun das Script irssi2jabber.pl, das als irssi-Script geladen werden kann und mir nun bei jedem Hilight oder jeder privaten Nachricht, die auftreten, während ich /away bin, eine Nachricht an meinen Jabber-Account schicken.

Das Script ist etwas kommentiert, die notwendigen Einstellungen stehen ganz am Anfang und müssen in die irssi-Config. Unter der GPLv3 darf es jeder weiterverwenden, natürlich nehme ich auch Patches an, die, wenn sie nützlich sind, eingepflegt werden.