OS X: DVD Image mit Bordmitteln

Im Terminal:

via, und.

.bash_history: Duplikate löschen und vermeiden

Duplikate löschen:

Danach bash neu starten.

Duplikate zukünftig vermeiden (Quelle: wie oben, oder mit Erklärung hier), kommt unter OS X aber in die .bash_profile:

PHP auf der Kommandozeile

PHP auf eine andere Version (bsplw. die des MAMP) umbiegen (in der .bash_profile):

Wo liegt die php.ini?

Wo liegt das Verzeichnis für Erweiterungen?

Alle geladenen Module:

Ist ImageMagick verfügbar?

To be completed!

Mail: Doppelte Emails anzeigen

Wer seinen Emailaccount umzieht und nicht aufpasst, hat vielleicht bald dasselbe Problem wie ich es neulich hatte: Einzelne Mails sind doppelt auf dem neuen Server gelandet. Dumm, dass Apple Mail doppelte Mails ausblendet; das macht das Aufräumen so schwierig. Gut dagegen, dass es Michael Tsai gibt, der hat nämlich die Lösung:

hth

Codeigniter: “Undefined index: REMOTE_ADDR” über CLI

Ich habe eine Route

und einen zugehörigen Controller

Das hat die ganze Zeit funktioniert – jetzt bekomme ich

Message:  Undefined index: REMOTE_ADDR

So weit, so klar: Eine Remote-IP habe ich nur, wenn der Aufruf auch von Remote kommt. Jetzt könnte man auf PHP schimpfen, warum der Index nicht trotzdem da ist, bsplw. mit 0.0.0.0, dem leeren String oder meinetwegen NULL gefüllt. Aber viel interessanter finde ich die Frage, warum das plötzlich nicht mehr geht. Wenn man sich den Controller oben ansieht, dann wird das erst mal nicht klar: Die IP wird nicht direkt abgefragt – klar, sonst hätte es auch nicht so lange funktioniert. Es wird aber auch keine Custom Klasse verwendet. Nicht mal indirekt, wie sich herausstellt, denn:

Die Session-Library ist der Übeltäter, die hatte ich vor Kurzem in die Autoload getan. Nun möchte ich an der Framework-Klasse CI_Session nicht herumdoktern, deshalb sieht mein aktueller Hack in der autoload.php so aus:

Irgendwelche besseren Vorschläge?

bash: Suchen und Ersetzen über ganze Verzeichnisse

Der Titel wird dem Inhalt nicht ganz gerecht, aber dieser Post ist eh nur als Erinnerungsstütze für mich gedacht. Also, folgendes Skript:

lehrt uns:

  • während man find $directory -regextype posix-extended -regex “.*.html” direkt aus dem Skript heraus ausführen könnte, muss man für multiple Befehle (wie heißen die eigentlich?) den Umweg über eval und einen String gehen
  • insbesondere kann man auf diese Weise die Schleifenvariable $directory in den Befehlen nutzen!
  • um Warnungen zu vermeiden, würde ich immer prüfen, ob das Zielverzeichnis existiert – und ein Verzeichnis ist: if [ -d $directory ]
  • find nutzt Reguläre Ausdrücke, wie man sie kennt – und wenn ich “man” sage, meine ich mich (und nicht man, haha): “.” ist ein beliebiger Character, für den String muss man escapen (“.”), also liefert “.*.html” alle HTML-Dateien in Unterverzeichnissen
  • sed dagegen funktioniert umgedreht: “.” ist der String, “.” der beliebige Character. Die Verbindung der beiden Versionen macht einen ein wenig schizophren 🙂
  • Deshalb muss man runde Klammern für Gruppen ebenfalls escapen – eckige Klammern unmittelbar darin aber wiederum nicht^^ so richtig durchschaut habe ich das noch nicht; wenn irgendwas nicht geht, würde ich hier anfangen, den Fehler zu suchen
  • Quantifikatoren, Pipes (für logisches OR), geschwungene Klammern, etc. müssen (meistens?) ebenfalls escaped werden
  • Das erste Zeichen nach “s” ist übrigens der Trenner von needle und replacement; man kann im Wesentlichen wohl nehmen, was man will. Der Übersichtlichkeit halber habe ich auf “/” zugunsten von “:” verzichtet. “@” fand ich auch noch ganz gut. Halt irgendwas, nach dem man nicht gerade sucht; andernfalls muss man escapen, so wie oben in “https://”
  • Referenzen sind in sed nicht $1, $2, …, sondern 1, 2, …

Insgesamt soll das obige Skript in allen HTML-Dateien in den Verzeichnissen dir1, dir2 und dir3 (und Unterverzeichnissen) die relativen Pfade “../../de/contact”, “../../en/contact”, usw in absolute URLs ändern, ohne dabei die Sprache zu verlieren

Raspberry Pi als Spotify-Client [UPDATE]

Update Juli 2013: Besser ist die “Pi MusicBox

Der Prozessor des Raspberry ist mit seinen 700 MHz nicht eben schnell – bisher habe ich den Desktop noch nicht ausprobiert, aber ich habe mir sagen lassen, dass schon Surfen keinen Spaß macht. Habe ich aber auch nicht vor 🙂 Denn der Prozessor ist zum Beispiel explizit in der Lage, HD-Videos zu rendern – wohlgemerkt lüfterlos. Das prädestiniert ihn als Media Center. Gut, HD-Videos kann mein Bluray-Player auch, aber ich will mal ausprobieren, wie sich der Raspberry als Spotify-Client schlägt. Das kann mein Bluray-Player (oder irgendwas anderes in meinem Heimkino) nämlich nicht.

Also, ich habe Raspbian “wheezy” installiert, und setze funktionierendes LAN voraus:

Es gibt eine Anleitung von Hexxeh, die funktioniert aber nicht. Zuerst kann ich die angegebenen Pakete nicht installieren – irgendwo ist …/libmpg123-0_1.14.2+svn20120622-1_armhf.deb eingetragen, online ist aber (Stand 5.10.12) nur libmpg123-0_1.14.4-1_armhf.deb 🙁 Für die Akten: Man lade libmpg123-dev_1.14.4-1_armhf.deb und libmpg123-0_1.14.4-1_armhf.deb runter, schiebe sie per FTP-Programm (SFTP-Verbindung wählen; User “pi”/Passwort “raspberry”) auf das Gerät nach “/home/pi/”, und installiere sie manuell:

Aber das genügt nicht; ich einen bekomme fehlende vcos_platform_types.h und vcos_platform.h und ilclient.h. Nach gut zwei Stunden (denn man beachte den Lösungsansatz für das erste Problem: zweistellig viele Files editieren; sowie die Unübersichtlichkeit des zweiten Links) gebe ich auf, und versuche einen anderen Weg – der geht zum Glück ziemlich straight forward:

Zuerst installiere ich Subversion (Quelle):

Dann ziehe ich mir die despotify-Sourcen (Quelle) plus einiger Libs (Quelle: README-Datei) direkt, und compiliere sie:

Im Wesentlichen war es das! Man sollte sich nun mittels

einloggen können.

Achtung #1: Die userid ist nicht der Username! Sondern die Nummer, die man unter anderem hier findet (man sieht sie auch, wenn man eine Support-Anfrage stellt) – Danke, @moritzmoro. Achtung #2: Laut FAQ von despotify geht das nur mit Premium-Accounts! Sowas habe ich nicht (mehr), deshalb breche ich hier bis auf Weiteres ab. In den kommenden Tagen werde ich zwei Dinge updaten: Ich werde mein Raspberry frisch aufsetzen, und die obige Anleitung prüfen – ich habe doch so einiges installiert heute, und möchte vermeiden, dass etwas davon wichtig war, aber hier vergessen wurde. Zweitens werde ich (hoffentlich) meinen Spotify-Account, der momentan mit meinem Facebook-Konto verbunden ist, in einen “richtigen” umwandeln können, und diesen auf Premium upgraden.

UPDATE: Richtig, mit einem Premium-Accoount kann man sich einloggen. Der Login dauert recht lange, aber es geht:

Anmerkungen:

  • Während ich als Nicht-Premium-User tatsächlich die User-ID benutzen musste, um wenigstens brauchbare Fehlermeldungen zu bekommen, kann ich als Premium-User ganz normal meinen Usernamen verwenden
  • Wenn das Passwort Sonderzeichen enthält, können diese mit Backslash (“”) escaped werden
  • Das ganze rockt! Das Raspberry hat überhaupt keine Probleme mit dem Decoding von 320kb
  • Man kann nur sehr unkomfortabel nach etwas anderem als Tracks suchen
  • Mein erster Song war standesgemäß “Tom’s Diner” von Suzanne Vega, dem ersten MP3 🙂
  • Sound geht über HDMI raus, Steuerung läuft nach wie vor über SSH – mit dem passenden Client geht das dann auch vom Handy (für’s Windows Phone nutze ich gerade The SSH Client Pro)
  • Als nächstes brauche ich trotzdem ein Webinterface oder so, für meine Freundin.
  • Außerdem steht ein Langzeit-Test an, mal sehen, wie warm das Raspberry wird
  • Das Raspberry spielt weiter, wenn man bsplw das Notebook mit dem SSH-Terminal in den Ruhezustand fährt. Kehrt man “zurück”, dauert es eine Weile, bis wieder der aktuelle Status angezeigt wird – aber er kommt!
  • UPDATE: Inzwischen gibt es eine Version vom Raspberry mit 512MB RAM – ich habe die mit 256, und es läuft prime. Wie oben erwähnt, habe ich den Desktop aber auch nie gestartet, und für eine Konsolenanwendung genügen 256 dicke
  • UPDATE Februar 2013: Offenbar gab es eine Protokolländerung, die den von Prime beschriebenen “segmentation fault” hervorruft 🙁