Daily WTF weiß es!
Oder anders gesagt: Ich kann Dir auch eine HTML-Anwendung schreiben, die Deinen Browser lahmlegt 🙂
Daily WTF weiß es!
Oder anders gesagt: Ich kann Dir auch eine HTML-Anwendung schreiben, die Deinen Browser lahmlegt 🙂
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>:
|
1 2 |
<!-- comma separated list: --> <property name="rwfolders.application" value="log/,temp/" /> |
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}
|
1 2 3 4 5 6 7 8 9 10 11 |
<macrodef name="chmodonrwfolders"> <attribute name="basedir"/> <sequential> <for list="${rwfolders.application}" param="rwFolder"> <sequential> <echo message="Setting mode 777 to folder @{basedir}/@{rwFolder}"/> <chmod dir="@{basedir}/@{rwFolder}" perm="777"/> </sequential> </for> </sequential> </macrodef> |
Übrigens: Anders, als in der Doku beschrieben, reicht Attribut "file" nicht, es muss Attribut "dir" sein!
Und schliesslich der Aufruf mit variablem @{basedir}:
|
1 |
<chmodonrwfolders basedir="${dir.dist.production}" /> |
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:
integrateProgressIn 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.
Man liest oft:
|
1 |
ALTER TABLE foo ALTER COLUMN bar SET DEFAULT CURRENT_TIMESTAMP; |
was aber nicht funktioniert. Stattdessen geht (und: ja, die Spalte wird zwei mal aufgeführt #wtf):
|
1 |
ALTER TABLE foo CHANGE bar bar TIMESTAMP DEFAULT CURRENT_TIMESTAMP; |
, 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
TIMESTAMPcolumn per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. AnyTIMESTAMPcolumn definition can have any combination ofDEFAULT CURRENT_TIMESTAMPandON UPDATE CURRENT_TIMESTAMPclauses.
Ihr müsstet eines der beiden Daten dann manuell setzen m(
Tag,
folgendes simples Statement:
|
1 2 |
$sth = $this->dbh->prepare('INSERT INTO tag_per_gif (`gif_name`, `tag_id`) VALUES (':gif', ':id');'); $sth->execute(array(':gif' => $gif, ':id' => $tagId)); |
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:
|
1 2 |
$sth = $this->dbh->prepare('INSERT INTO tag_per_gif (`gif_name`, `tag_id`) VALUES (:gif, :id);'); $sth->execute(array(':gif' => $gif, ':id' => $tagId)); |
funktioniert. Man beachte die fehlenden Hochkommata um :gif und :id.
Der Titel wird dem Inhalt nicht ganz gerecht, aber dieser Post ist eh nur als Erinnerungsstütze für mich gedacht. Also, folgendes Skript:
|
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash # workaround to allow multi-commands: cmd="" for directory in dir1 dir2 dir3 do if [ -d $directory ] then cmd="find $directory -regextype posix-extended -regex ".*.html" -exec sed -i 's:href="../../([a-z]{2})/contact/:href="https://myDomain.com/1/contact/:g' {} ;" eval $cmd fi done |
lehrt uns:
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
Direktlink, siehe auch hier und hier, Danke Holger!