.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

Fever mittels Cronjob aktualisieren

Einer der Nachteile von Fever gegenüber dem Google Reader ist, dass es sich erstmal nicht von haus aus selbst aktualisiert. Was auf der Hand liegt; dazu bedarf es zB eines Cronjobs. Die Möglichkeiten dazu bringt Fever mit; ein Aufruf von

http://myfeverdomain.com/?refresh

bzw. über die Kommandozeile:

tut genau das. Dabei werden die eigenen Abos nicht angezeigt, man könnte diesen Aufruf also auslagern. Ideal, wenn man (wie ich) kein Hostingpaket mit Cronjobs hat.

Also: OS X basiert auf Unix. Unix kann Cron. Man könnte jetzt den Job manuell anlegen, das hat hier aber aus irgendeinem Grund nicht geklappt, und leichter geht es sowieso mit Cronnix: Neu -> Einfach -> Bei “Minute” “*/15”, bei allen anderen “*” eintragen, unter “Kommando” den o.g. Kommandozeilenbefehl hinterlegen -> fertig. Wann immer mein Rechner läuft, wird mein Reader alle 15 Minuten aktualisiert. Für alle anderen Clients gibt’s ja immer noch den entsprechenden Button in der Fever-Oberfläche.

Raspberry Pi: Probleme mit USB-Tastatur und LAN

Wer seinen Raspberry grundsätzlich eingerichtet hat, will vermutlich bald in’s Internet. Bei mir stellte sich gerade das Problem, dass meine Tastatur nicht mehr geht, wenn ich LAN einstöpsel… keine Ahnung, woran das liegt, irgendwelche Vorschläge? Vielleicht zieht sie zu viel Strom oder so.

Aber wie dem auch sei: LAN-Kabel wieder ab. Über “sudo raspi-config” öffne ich den Config-Screen und aktivere den SSH-Server. LAN-Kabel wieder dran, Tastatur ab. Über die Heimnetzwerk-Übersicht meines Alice-Routers (ok, über Umwege geht es auch über’s Terminal) finde ich heraus, dass das Rasperry (Netzwerkname “raspberrypi”) die IP 192.168.1.53 hat. Von meinem Macbook aus rufe ich im Terminal “ssh pi@192.168.1.53” auf (und bestätige beim ersten mal den Fingerprint), und gebe das von mir nicht geänderte Passwort “raspberry” ein. Schon bin ich auf dem System, und kann von hier aus so weitermachen, wie ich es eigentlich über die USB-Tastatur machen wollte.

Stellt sich raus: Das muss ich erst mal gar nicht 🙂 Ein “ping www.google.de” funktioniert direkt. DHCP muss im Router natürlich aktiviert sein, sonst wäre hier manuelle Konfigurationsarbeit nötig. Trotzdem ist es nett zu wissen, dass man so einfach per SSH draufkommt, denn schliesslich will man ja irgendwas machen können im LAN, und ohne Tastatur wird das knifflig. Außerdem muss mein Fernseher nicht mehr eingeschaltet sein, und ich kann auf dem Sofa sitzen^^

Raspberry Pi einrichten

Vor inzwischen auch schon wieder einigen Monaten habe ich mir einen Raspberry Pi bestellt (Danke, Tobi!) – jetzt bin ich dazu gekommen, ihn auch mal anzuschließen 🙂 Für’s grundsätzliche Setup sind einige Dinge zu wissen:

Das Board kommt (bzw. kam in meinem Fall) ohne irgendeinen Zubehör. Man benötigt aber mindestens:

  • Eine SD-Karte. Es funktioniert wohl nicht jede, also Obacht. Laut Quick start guide tut es eine Class 4 Karte mit mindestens 4 GB. In meinem Fall funktionierte eine 8GB SanDisk Extreme (Class 10).
  • Stromversorgung über Micro USB (nicht zu verwechseln mit Mini-USB!), und wir reden bei “Stromversorgung” von “mindestens” 700 mA! Der Quick start guide sagt “Do not attempt to power your Raspberry Pi by plugging it into a computer”, und das würde ich unterschreiben, falls ihr euern Computer (bzw. dessen USB-Anschluss) nicht grillen wollt. Ich benutze ein USB-Netzteil vom Kindle meiner Freundin zusammen mit einem Ladekabel meines Handys.
  • eine USB-Tastatur, bei mir eine vom Mac.
  • Einen Monitor/TV/… mit HDMI-Eingang! Bei mir ein Panasonic TX-P42GW30.
  • ggf. eine USB-Maus.
  • ggf. eine LAN-Verbindung.
  • ggf. ein Gehäuse. Ich habe vorerst keines, aber wenn das alles wie gewünscht funktioniert, hole ich mir eins.

Zuerst muss das Betriebssystem auf die SD-Karte installiert werden; im Folgenden die Anleitung für OS X (Sorry, Thore). Dazu gibt es auf der offiziellen Seite verschiedene Downloads; für’s erste habe ich das empfohlene Raspbian “wheezy” image in der Version vom 18.9.2012 verwendet. SD Karte eingesteckt, und im Terminal mittels

den mount point (“Einhängepunkt“) herausgefunden, der bei mir “/dev/disk2” ist. Nun muss man das Image auf diesen mount point schreiben – ich empfehle, hier Vorsicht walten zu lassen, und das Image nicht aus Versehen auf die Systempartition zu schreiben 🙂 Folgendes Kommande

sollte es tun (Quelle). Anmerkung: Eine “Resource busy”-Meldung umgeht man, indem man im “Festplatten-Dienstprogramm” die Partition auf der SD-Karte deaktiviert (Quelle). Nicht “auswerfen”, sonst bekommt man ein “Operation not supported”. Die Karte darf von OS X nicht verwendet werden, muss aber weiterhin unter “diskutil list” aufgeführt werden! Das Schreiben des Images wird eine Weile dauern, bei mir eine gute viertel Stunde.

Dann wird das gute Stück mit Tastatur (und Maus) bestückt, und an’s TV angeschlossen, schlussendlich kommt Strom. Das sollte es im Wesentlichen tun, um den Config-Screen zu sehen zu bekommen:

Dort gibt’s Folgendes zu tun (Quelle):

  • info: blabla 🙂
  • expand_rootfs: Per default werden nur 4 GB verwendet; dieses Tool vergrößert die Partition beim nächsten Reboot auf die volle verfügbare Größe, was durchaus einige Minuten dauern kann! [Anmerkung 1, 5]
  • overscan: Soll schwarze Balken auf dem Bildschirm vermeiden – führt bei einem Flachbild-Fernseher aber nur dazu, dass man die Bash (eigentlich am unteren Bildschirmrand) nicht mehr lesen kann^^ Ich musste das Seitenverhältnis des Fernsehers ändern, um die Bash sehen zu können. Beim nächsten Reboot ggf. einfach wieder disablen [Anmerkung 1, 4]
  • configure_keyboard: Achtung, das Erzeugen der Liste dauert ein paar Sekunden! Dann kann man Tastatur (“Apple Aluminium Keyboard (ANSI)”), plus -Layout (“Other”->”German”->”German”->”Right Alt”->”No compose key”->”No”) auswählen. Das Speichern dauert wieder einige Sekunden [Anmerkung 1, 2, 4]
  • change_pass: Wer das Passwort ändert will [default siehe Anmerkung 6]
  • change_locale: Voreingestellt ist “en_GB.UTF-8 UTF-8”. UTF-8 ist schon OK, aber spaßeshalber habe ich trotzdem mal “de_DE.UTF-8 UTF-8” gesetzt. Achtung, das Erzeugen der Liste und das Speichern dauern ein paar Sekunden!
  • change_timezone: “Europe”->”Berlin”
  • memory_split: Ändert das Verhältnis der Speicherzuweisung zwischen Hauptprozessor und Grafik. Bis auf Weiteres will ich keinen Desktop starten, deshalb wähle ich 240/16.
  • overclock: Will ich bis auf Weiteres nicht
  • ssh: (De-)Aktiviert SSH-Zugriff über’s Netzwerk. Klingt interessant, bis auf Weiteres aber deaktiviert
  • boot_behaviour: Desktop automatisch starten?
  • update: Erlaubt ein Update via Netzwerk.

Anmerkungen:

  1. “Finish” erreicht man über Pfeil links/rechts; danach wird man gefragt, ob man rebooten will.
  2. Mit ESC kann man den Config-Screen verlassen, und die bash öffnen – Achtung, dann wurde nicht gespeichert! Aber in der bash kann man das neue Tastaturlayout ausprobieren 🙂
  3. bash: Mit “sudo shutdown -r now” rebooted man, mit “sudo shutdown -h now” fährt man das System runter (Quelle). Auf der Default-Tastaturbelegung ist “-” auf dem deutschen “ß” 🙂
  4. bash: “sudo raspi-config” öffnet den config-screen erneut. Achtung: Man sollte später möglichst keine Einstellungen mehr ändern!
  5. bash: “df -h” zeigt die Partitionsgrößen an (Quelle)
  6. Default-Login ist “pi”/”raspberry”
  7. Der HDMI-Ausgang zeigt nur Bild, wenn das Kabel schon beim Booten angeschlossen war

Und last but not least: Neue Software kann man per apt-get installieren – wenn man LAN hat^^