Firefox Erweiterung – Timestamps in phpMyAdmin umwandeln

Hallo allerseits,

heute habe ich etwas ganz besonderes. Meine erste Firefox-Erweiterung, die ich veröffentliche.
Ich habe zwar in der Vergangenheit schon die eine oder andere geschrieben, aber eher für meinen persönlichen Gebrauch.

Was macht die Erweiterung?

  • Blendet bei allen phpMyAdmin-Installationen links oben eine kleine Box ein, die es ermöglicht schnell UNIX-Timestamps in ein lesbares Format umzuwandeln und umgekehrt
  • Erkennt mögliche Timestamps auf der Seite und hebt diese farblich hervor
  • Bei einem Klick auf einen erkannten Timestamp wird dieser in der Box im lesbaren Format angezeigt
  • Wenn man die Maus über einen erkannten Timestamp bewegt wird das lesbare Format sofort im Titel angezeigt

Wer braucht diese Erweiterung?
Ich. Und evtl. ja noch jemand… ;)

Hier ein kleiner Screenshot, wie das ganze aussieht:

pmatimestamp.png

Download

Hier gibts pmaTimestamp zum Download.

Diese Erweiterung ist unter der GPL veröffentlich.

Feedback
Über Feedback würde ich mich sehr freuen. Ihr habt bestimmt noch die ein oder andere Idee, wie man das Teil noch verbessern kann.

FavIcons im Firefox entfernen

Tach,

Bestimmt hatte der einer oder andere von euch schon mal das Problem, dass der Firefox bei seinen Lesezeichen gar kein oder ein falsches FavIcon mit abgespeichert hat. Ich hatte da so ein paar Fälle, war aber bis her immer zu faul diese Fehler zu beheben. Jetzt habe ich mich jedoch endlich aufgerafft und mich schlau gemacht. Ich habe eine nette kleine Erweiterung gefunden, die einem unter die Arme greift.

Der Favicon Picker bietet einem nicht nur die Möglichkeit an FavIcons zu entfernen, man kann sogar eigene Bildchen hinzufügen. Nette Sache.

PHP: Array-Benchmark

Hiho,

heute hab ich mich ein bisschen mit Arrays in PHP beschäftigt. Speziell ging es mir darum herauszufinden, welche Methode am schnellsten ist um einen neuen Wert ans Ende eines Arrays zu speichern.

Dabei habe ich 4 Möglichkeiten untersucht:

  1. Der []-Operator
    $a = array();
    $a[] = "foobar";
    
  2. Die Funktion array_push()
    $a = array();
    array_push($a,"foobar");
    
  3. Via Index und count()
    $a = array();
    $a[count($a)] = "foobar";
    
  4. Direkt via Index
    (setzt voraus, dass der nächste Index bekannt ist)

    $a = array();
    $a[0] = "foobar";
    

Ich habe in meinem Benchmark 10.000 mal einen 1000 Byte-Wert an das Array angehängt. Was dabei herausgekommen ist, zeigt dieses Diagramm.
(Achtung: logarithmische x-Achse!)

PHP Array Benchmark

Fazit:

  • Der Gewinner ist mit knappem Vorsprung Methode 1, der []-Operator.
  • Methode 4 liefert einen nahezu identischen Wert, da ja der selbe Operator benutzt wird.
  • Den 3. Platz hat sich array_push() gesichert. Das Geschwindigkeitsdefizit gegenüber Methode 1 lässt sich durch den zusätzlichen Overhead erklären, da hier bei jedem Durchlauf eine Funktion aufgerufen wird.
  • Und, nicht überraschend, weit abgelegen die Kombination aus count() und Index-Zugriff. Der Grund ist offensichtlich. Das wiederholte Aufrufen der count()-Methode, die das Array vermutlich jedes mal mit einem Aufwand von O(n) durchläuft um die Größe/Länge zu ermittlen, erzeugt eine deutliche Zeitverzögerung.
  • Eine kleine Vermutung meinerseits: Arrays sind in PHP als Liste implementiert, was das Mischen von assoziativen und numerischen Arrays erleichert, allerdings anscheinend auch das Zählen der Elemente verlangsamt. Ich würde mich aber wundern, wenn die interne Datenstruktur des PHP-Arrays keine Zähl-Variable enthielte, welche die aktuelle Größte speichert. Mein Ergebnis spricht nicht dafür. Weiß es jemand genau?

Das wars auch schon mit meinem kleinen Benchmark. Eventuell werde ich in Zukunft noch ein paar weitere durchführen. Hat jemand Vorschläge?

Google Maps und der Internet Explorer

Guten Abend,

Gerade hatte ich ein kleines Problem beim Zusammenspiel von Google Maps und dem Internet Explorer.
Beim Aufruf meiner Seite, in die ich eine Karte eingebunden habe, flog mir folgende Fehlermeldung um die Ohren:

Die Seite „blabla“ enthält Fehler. Der Vorgang wurde abgebrochen

Des Rätels Lösung ist eigentlich ganz einfach.
Ich hatte meinen JavaScript-Code, der die API von Google Maps ansteuert direkt im HTML-Code stehen.
Das mag der IE anscheinend nicht.

Lösung:

Die JavaScript Anweisungen in eine Funktion packen, hier „googleStuff()“ und dann den body-Tag ergänzen:

<body onload="googleStuff()" onunload="GUnload()">
</body>

So klappts bei mir wunderbar!

Subversion und .htaccess

Und weil wir grad beim Thema Subversion und Apache sind. Ich bin letztens auch über etwas anderes gestolpert.
Wenn sich euer Subverion Client weigert eure .htaccess Datei auszuchecken, dann liegt das vermutlich an der Konfiguration eures Apaches.

Standardmäßig ist folgendes eingestellt:

<FilesMatch "^\.ht">
        Order allow,deny
        Deny from all
</FilesMatch>

Ändert das global(keine gute Idee) oder für euren vhost in:

<FilesMatch "^\.ht">
        Order allow,deny
        Allow from all
</FilesMatch>

Und schon flutscht auch Subversion.

Subversion und das „out of date“ Problem

Hiho,

heute bin ich wieder auf einen sehr nervenden Fehler gestoßen. Da es eine Weile gedauert hat, bis ich eine Lösung gefunden hatte, will ich sie euch nicht vorenthalten.

Folgendes Szenario:

  • du checkst dir ein Repository aus
  • bearbeitest eine Datei
  • updatest deine Arbeitskopie
  • commitest deine Änderungen

Bis hier sollte alles ohne Probleme funktionieren.
Wiederholt man aber die Schritte kann es bei einem bestimmten Szenario zu folgendem Problem kommen.

svn: Commit failed (details follow)
svn: Your file or directory ‚bla.txt‘ is probably out of date
svn: The version resource does not correspond to the resource within the transaction. Either the requested version resource is out of date (needs to be updated), or the requested version resource is newer than the transaction root (restart the commit).

Der Übeltäter ist die Datei „all-wcprops“ im entsprechenden .svn-Verzeichnis, in der sich die Datei befindet.
Eine Lösung wäre diese Datei einfach zu löschen und danach ein Update auszuführen. Das hat aber 2 Nachteile.

  1. Man sollte NIE manuell im .svn-Verzeichnis rumbauen – geht meistens schief
  2. Es ist verdammt nervig, denn der Fehler tritt ständig auf
  3. Damit lindert man nur die Schmerzen, bekämpft aber nicht die Krankheit

Der Grund des Übels liegt nämlich nicht lokal, sondern beim Apache-Server.

Bug: http://subversion.tigris.org/issues/show_bug.cgi?id=1851

Workaround:
Do not put your repository at
i.e. https://svn.myhost.cno/repos/
not https://svn.myhost.cno/

Quelle: http://svn.haxx.se/users/archive-2004-09/0210.shtml

Tja, so einfach kanns manchnal sein.

Ich hoffe, ich konnte jemandem damit helfen.

Apache, mod_authn_dbd, SHA1 und MySQL

Hi,

wie bereits im vorherigen Eintrag angekündigt, will ich euch natürlich mitteilen, wie ich den Apache dazu gebracht habe sich an einem MySQL-Server zu authentifizieren.

An sich ist das ja kein Problem, solange man sich aussuchen kann in welcher verschlüsselten Form die Passwörter in der Datenbank abgespeichert sind. Will man aber ein bereits bestehendes System nutzen kann es unter Umständen schon heikler werden. In meinem Fall lagen die Passwörter als SHA1-Hash vor.

Wie bereits erwähnt, mangelt es MySQL an Funktionen für die Base64 De-/Kodierung. Hat man diese aber nachgerüstet, lässt sich der Apache relativ einfach dazu bewegen auch SHA1 zu schlucken.

Es hat eine Weile gedauert bis ich auf diese Seite gestoßen bin, die genau erklärt, in welchem Format mod_authn_dbd die Passwörter erwartet.

Danach war es nur noch eine Kleinigkeit und herausgekommen ist:

AuthDBDUserPWQuery "SELECT CONCAT('{SHA}',BASE64_ENCODE(UNHEX(hashed_password))) AS pass FROM users WHERE login=%s"

Ich hoffe, ich konnte dem ein oder anderen ein paar Stunden Suche ersparen!

MySQL und Base64

Tach,

Vor ein paar Tagen wollte ich eine an MySQL gebundene Authentifizierung meines Apache Webservers an ein bereits bestehendes System koppeln. Dazu mehr in einem anderen Beitrag.
Jedenfalls brauchte ich dazu eine Funktion direkt in MySQL, die mir einen String in base64 kodiert.

Leider bietet MySQL von Haus aus keine Base64 Implementation. Nach etwas googlen habe ich aber eine brauchbare Lösung gefunden. Ian Gulliver hat sich aufgeopfert und die Funktionen nachgerüstet.

Base64 Funktion für MySQL

Einfach das SQL-File importieren und schon kanns losgehen!

Viel Spaß damit!