ant: Verzeichnis-Operationen auf dynamischen Pfaden

Ich möchte auf einer Menge von Unterordnern (“log/”, “temp/”, später vielleicht weitere) eines dynamischen Über-Ordners beispielhaft die Rechte auf 777 ändern:

Zuerst definiere ich die Unterordner. Das mache ich nicht mit DirSet und <for>, da ich dann den Pfad nicht mehr mit dem Über-Ordner prefixen kann. Stattdessen nehme ich ein kommasepariertes property und <for>:

Dann lagere ich das eigentliche chmod und den Loop in eine macrodef aus, um den Über-Ordner übergeben zu können – hier sieht man, was ich mit “prefixen” meine: Ich setze @{basedir} vor jeden Eintrag @{rwFolder} in ${rwfolders.application}

Übrigens: Anders, als in der Doku beschrieben, reicht Attribut “file” nicht, es muss Attribut “dir” sein!

Und schliesslich der Aufruf mit variablem @{basedir}:

AS3: GreenSock Loader (speziell XMLLoader)

GreenSock bietet primär natürlich Tweening-Krams. Aber auch die Loader sind nicht schlecht – wenn man damit zurecht kommt, dass sie mehr als nur Laden können. Der VideoLoader bsplw. ist quasi auch ein Video-Player.

Ähnlich der XMLLoader: Der lädt erst mal eine XML, aber darüber hinaus parst er diese XML und erzeugt & startet alle darin in der entsprechenden Syntax definierten Loader. Per default! Dazu zwei Anmerkungen:

  • das Flag, um dieses Verhalten zu deaktivieren, lautet integrateProgress
  • in der XML definierte Loader werden nur dann erzeugt, wenn ihre Klasse bekannt ist. Um eine Klasse bekannt zu machen (zu “aktivieren”), gibt es bsplw. LoaderMax.activate()

In Kombination führt dies zu echt mies zu findenden Bugs: “Normalerweise” kenne ich an der Stelle, an der die XML geladen wird, nur den XMLLoader – denn der lädt die XML. Das heißt, in der XML definierte XMLLoader werden immer erzeugt und ausgeführt, denn integrateProgress ist per default true. Alle anderen in der XML definierten Loader werden zwar theoretisch ebenfalls erzeugt, aber nur, wenn ihre Klassen bekannt sind (sie “aktiviert” wurden)! Fügt man in einen jahrealten (sic!) Prozess einen XMLLoader in eine XML ein, dann wird der (und nur der) plötzlich ausgelöst… unschön.

HTH.

SQL: SET DEFAULT CURRENT_TIMESTAMP

Man liest oft:

was aber nicht funktioniert. Stattdessen geht (und: ja, die Spalte wird zwei mal aufgeführt #wtf):

, führt aber ggf. zu einem Fehler, wenn man bereits eine “ON UPDATE CURRENT_TIMESTAMP”-Spalte hat:

Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

Das ist eine dokumentierte Begrenzung in SQL < v5.6:

Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses.

Ihr müsstet eines der beiden Daten dann manuell setzen m(

PHP/PDO: “number of bound variables does not match number of tokens”

Tag,

folgendes simples Statement:

führt auf folgenden Fehler:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Diese Fehlermeldung ist ziemlich irreführend, denn ein Blinder sieht: Zwei Variabeln, zwei Tokens. Der Trick ist: PDO::prepare escaped. Das ist einer der Gründe für prepared statements mit PDO: Dass man sich nicht um Escaping kümmern muss. Das bedeutet aber unübersichtlicherweise auch, dass man nicht selbst escapen darf, und zwar gar nicht:

funktioniert. Man beachte die fehlenden Hochkommata um :gif und :id.

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

SPAM

Was geht denn bitte mit den Spambots? Mein Akismet-Statistik des letzten Jahres:

  • 98 im Juli 2012
  • 1.029 Anfang 2013
  • 762 im Mai
  • 2.714 im Juni!?
  • 3.050 im Juli!?!

OK, davon kommt effektiv nichts durch, aber bei 100 Spam-Comments pro Tag wird es unmöglich, die Falscherkennungen auszufiltern. Wenn ich einen übersehen nicht gesucht habe, dann tut es mir leid.

Update August 2015: 37.285 – nur im August.

Update November 2015: 1.045.819…

Update Dezember 2015: 1.783.809 – das sind 40 pro Minute.