Hallo!
Mein Name ist David Müller, ich arbeite bei der Public Cloud Group und wohne in Frankfurt. Hier geht es hauptsächlich um Webentwicklung.Kategorien
- webdev (131)
- php (84)
- Javascript (32)
- Datenbanken (22)
- Software Engineering (12)
- Performance (8)
- Security (27)
- PHP-WTF (11)
- Best of the Web (13)
- Quicktips (32)
- Linux (4)
- Java (3)
- misc IT (10)
- Persönlich (9)
- webdev (131)
Blogroll
Neueste Kommentare
- Tristan Tate bei Javascript: Arrays kopieren
- Daniel Marschall bei Dealing with Trusted Timestamps in PHP (RFC 3161)
- Login Mit Facebook Tutorial – Logini helper bei Facebook API – Tutorial
- PHP validation/regex for URL - Design Corral bei Why URL validation with filter_var might not be a good idea
- Manuel bei Meine ultimativen Buchempfehlungen
Archiv der Kategorie: webdev
Best-of-the-Web 8
Ding Ding Ding. Runde 8!
- Mozilla wagt neue CSS-Experimente – Kleine Zusammenstellung, was bei Firefox 4 CSS-technisch neu kann.
- 3 Tenets for Implementing a REST API – Versionierung einer REST-API. Sollte man die API-Version über HTTP-Header oder die URL regeln?
- Online HTML5 JSON Report format – JSON lesbar machen.
- The current State of HTML 5 Forms – Welcher Browser unterstützt welches Formelement?
- Kleine Lizenzgeschichte des PHP Handbuchs – Was man bei der Verwendung des Beispielcodes aus dem Manual beachten sollte.
- Software Licenses For Dummies – Den Lizenzdschungel menschenlesbar erklärt.
- MySQL Handbuch zu Indexen – MySQL zwingen, einen Index (nicht) zu benutzen (auch interessant: ist ein WHERE-Index immer sinnvoll und wie man den MySQL Index Optimizer „überlistet“)
- command-line-fu for web developers – Teils sehr abgefahrene, nützliche Shellcommands
Veröffentlicht unter php, Datenbanken, Software Engineering, Best of the Web, webdev
Hinterlasse einen Kommentar
3 nützliche unbekannte PHP Funktionen
Ich hasse ja persönlich Artikel wie diesen (313373 PHP Speed Optimization Tweeks you can not live without … gäähn). Aber beenden wir das Selbstbashing und kommen zum Punkt.
stream_resolve_include_path (php = 5.3.2)
Manchmal kann es nützlich sein zu wissen, wo genau sich eine includete Datei versteckt. Der include_path macht es einem da ja oft nicht einfach.
var_dump(stream_resolve_include_path("fpdf/fpdf.php")); //string(31) "D:\xampp\php\PEAR\fpdf\fpdf.php"
DateTime::createFromFormat (php = 5.3.0)
Zum „entwirren“ von Zeitangaben gehe ich gerne den Weg über strtotime und date. Etwa so:
echo date("d.m.Y H:i:s", strtotime("Mon, 15 Aug 2005 15:12:46 UTC")); //15.08.2005 17:12:46
Das mag noch gehen, da wir ein Datum nach RFC822 in strtotime hereingesteckt haben, mit dem es umgehen kann.… Den ganzen Post lesen
Veröffentlicht unter php, Quicktips, webdev
2 Kommentare
PHP Array Dereferencing ausprobiert
Ich konnte es nicht lassen und hab mir den PHP Trunk draufgemacht, um mal etwas mit dem Dereferencing herumzuspielen. Die Version im Trunk hört auf 5.3.99 und kann für die SVN-faulen als Snapshot hier geladen werden. Gleich mal etwas Konsolenromantik:
dav@david:/var/www$ php --version PHP 5.3.99-dev (cli) (built: Mar 28 2011 21:51:08) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2011 Zend Technologies dav@david:/var/www$ cat dereferencing.php <?php function test() { return array("foo" => "bar"); } print "Output: " . test()["foo"] . "\n"; dav@david:/var/www$ php dereferencing.php Output: bar
Joa, was soll ich sagen? Geht alles genauso, wie man sich das wünscht.… Den ganzen Post lesen
Veröffentlicht unter php, webdev
3 Kommentare
MySQL Limit: Anzahl Ergebnisse ohne LIMIT herausfinden
In einigen Situation ist der geneigte Entwickler interessiert an der Gesamtzahl der Ergebnisse, die eine Abfrage ohne LIMIT – Klausel ergeben hätte. Die Holzhammermethode in so einem Fall ist, die Abfrage einfach nochmal ohne LIMIT abzufeuern. Doch es geht besser. Und zwar mit folgendem Konstrukt:
SELECT SQL_CALC_FOUND_ROWS productid, price, stock FROM products WHERE price > 100 LIMIT 10, 30; SELECT FOUND_ROWS();
Durch das „Einschleusen“ von SQL_CALC_FOUND_ROWS können wir direkt danach mit FOUND_ROWS() die Gesamtzahl an Ergebnissen erfragen. Für den Fall, dass nur ein Attribut selektiert werden soll, kann man auch direkt eine Abfrage draus machen:
SELECT SQL_CALC_FOUND_ROWS productid FROM products WHERE price > 100 LIMIT 10, 30 UNION SELECT FOUND_ROWS();
Auf die Art und Weise wird an das Resultset als letzte Zeile noch die Gesamtzahl an Ergebnissen ohne LIMIT angehangen.… Den ganzen Post lesen
Veröffentlicht unter Datenbanken, Quicktips, webdev
9 Kommentare
Parallel processing in PHP
Since PHP does not offer native threads, we have to get creative to do parallel processing. I will introduce 3 fundamentally different concepts to emulate multithreading as good as possible.
Using systemcalls
If you have some basic linux knowledge, you will know that a background process can be started by adding ampersand to the systemcall (in Windows, it’s the start-command)
dav@david:/var/www$ php index.php & [1] 3229
The PHP script is running silently in the background. What is being printed to the shell (3229) is the process id, so that we are able to kill the process using
kill 3229
A problem with this approach is, that any output of the script is lost, so we have to redirect the output stream to a file, just like this:
php index.php… Den ganzen Post lesen
Veröffentlicht unter php, Performance, webdev, Linux
19 Kommentare
PHP WTF #6
Heute inkrementieren wir mal Strings.
$string = 'Iteration number 0'; $i = 10; while ($i--) echo $string++ . "<br />";
Output:
Iteration number 0 Iteration number 1 Iteration number 2 Iteration number 3 Iteration number 4 Iteration number 5 Iteration number 6 Iteration number 7 Iteration number 8 Iteration number 9
Das war ja schonmal ganz nett zum warmwerden. Aber jetzt: fasten your seatbelts.
for ($i = 'a'; $i <= 'z'; $i++) { echo $i . " "; }
Output:
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz
Wow!… Den ganzen Post lesen
Veröffentlicht unter php, PHP-WTF, webdev
3 Kommentare
Hashverfahren und Sicherheit
Es gehört mittlerweile zum guten Ton, auf md5 herumzuhacken. Dabei fällt immer wieder das Argument, dass in md5 Kollisionen entdeckt wurden. Eine Kollision bedeutet, dass zwei unterschiedliche Strings zum gleichen Hash führen. Dies muss zwangsläufig bei allen Hashverfahren der Fall sein, denn eine Abbildung von viel Text auf wenig Text wird naturgemäß irgendwann eine Überschneidung bei zwei verschiedenen Inputs ergeben. Ein gutes Hashverfahren kommt also mit weniger Kollisionen daher als ein schlechtes.
Zum selbst testen (Unterschiede im Input sind mit einem Ausrufezeichen vermerkt):
$a = md5("\xA6\x64\xEA\xB8\x89\x04\xC2\xAC\x48\x43\x41\x0E\x0A\x63\x42\x54\x16\x60\x6C\x81\x44\x2D\xD6\x8D\x40\x04\x58\x3E\xB8\xFB\x7F\x89\x55\xAD\x34\x06\x09\xF4\xB3\x02\x83\xE4\x88\x83\x25\x71\x41\x5A\x08\x51\x25\xE8\xF7\xCD\xC9\x9F\xD9\x1D\xBD\xF2\x80\x37\x3C\x5B\x97\x9E\xBD\xB4\x0E\x2A\x6E\x17\xA6\x23\x57\x24\xD1\xDF\x41\xB4\x46\x73\xF9\x96\xF1\x62\x4A\xDD\x10\x29\x31\x67\xD0\x09\xB1\x8F\x75\xA7\x7F\x79\x30\xD9\x5C\xEB\x02\xE8\xAD\xBA\x7A\xC8\x55\x5C\xED\x74\xCA\xDD\x5F\xC9\x93\x6D\xB1\x9B\x4A\xD8\x35\xCC\x67\xE3"); $b = md5("\xA6\x64\xEA\xB8\x89\x04\xC2\xAC\x48\x43\x41\x0E\x0A\x63\x42\x54\x16\x60\x6C\x01\x44\x2D\xD6\x8D\x40\x04\x58\x3E\xB8\xFB\x7F\x89\x55\xAD\x34\x06\x09\xF4\xB3\x02\x83\xE4\x88\x83\x25\xF1\x41\x5A\x08\x51\x25\xE8\xF7\xCD\xC9\x9F\xD9\x1D\xBD\x72\x80\x37\x3C\x5B\x97\x9E\xBD\xB4\x0E\x2A\x6E\x17\xA6\x23\x57\x24\xD1\xDF\x41\xB4\x46\x73\xF9\x16\xF1\x62\x4A\xDD\x10\x29\x31\x67\xD0\x09\xB1\x8F\x75\xA7\x7F\x79\x30\xD9\x5C\xEB\x02\xE8\xAD\xBA\x7A\x48\x55\x5C\xED\x74\xCA\xDD\x5F\xC9\x93\x6D\xB1\x9B\x4A\x58\x35\xCC\x67\xE3"); //--------------------------------------------------------------------------------------!-------------------------------------------------------------------------------------------------------!-------------------------------------------------------!-----------------------------------------------------------------------------------------------!-------------------------------------------------------------------------------------------------------!-------------------------------------------------------!------------------ var_dump($a); //string(32) "2ba3be5aa541006b62370111282d19f5" var_dump($b); //string(32) "2ba3be5aa541006b62370111282d19f5" var_dump($a === $b); //bool(true)
Darüberhinaus existieren mittlerweile sogar Generatoren, die zwei völlig verschiedenen exe-Dateien den gleichen md5-Hash verschaffen.… Den ganzen Post lesen
Veröffentlicht unter php, Security, webdev
18 Kommentare
Webtesting mit SimpleTest – Selenium light
SimpleTest führt neben dem übermächtigen PHPUnit ein Schattendasein in der PHP-Community. Vielleicht nicht ganz zu Unrecht, schließlich kommt es mit deutlich weniger Features daher. Eher durch Zufall entdeckte ich beim Durchstöbern der Dokumentation das verdammt coole Webtesting Feature – zwar nicht so mächtig wie Selenium (das ja u.a. einen echten Browser fernsteuern kann), aber für kleine Checks durchaus gut zu gebrauchen. Aber der Reihe nach.
SimpleTest installieren
Die aktuelle Alpha-Version 1.1 herunterladen. Zusätzlich noch das File arguments.php direkt aus dem SVN herunterladen und ins simpletest-Verzeichnis stecken. Das wurde anscheinend in der alpha vergessen und führt sonst zu einem Fehler.
Test anlegen
Auf der selben Ebene des simpletest-Ordners erstellen wir eine Datei:
require_once 'simpletest/autorun.php';… Den ganzen Post lesen
Veröffentlicht unter php, Quicktips, webdev
2 Kommentare
Best-of-the-Web 7
Und erneut gibt es Link-Spaß für die ganze Familie.
- The importance of being versioned – Wie sollte man APIs sinnvoll versionieren, sodass man sie später noch umbauen kann?
- SOLID for packag… err, namespaces – Die SOLID-Prinzipien zusammengestellt und kurz erklärt
- Automate your Projects with Apache Ant – „For Dummies“-Tutorial über Apache Ant und wie das Java-Tool auch für Webentwickler brauchbar sein kann.
- HTML5 tests – inputs – Welcher Browser kommt mit welchem Input klar?
- Pinned Sites with Internet Explorer 9 and Windows 7 – Wie man das IE9 Feature „Pinned Sites“ nutzt.
- How unique – and trackable – is your browser?
Veröffentlicht unter php, Javascript, Software Engineering, Best of the Web, webdev
Hinterlasse einen Kommentar
Javascript: Arrays kopieren
Banale Aufgabe: Erstelle eine unabhängige Kopie von einem Javascript-Array. Was erstmal billig klingt entpuppt sich für unwissende, PHP verwöhnte Entwickler doch als tricky.
var colors = ["red", "blue", "green"]; var copied = colors; copied[0] = "magenta"; console.log(colors); //["magenta", "blue", "green"] console.log(copied); //["magenta", "blue", "green"]
In diesem Beispiel sehen wir also, dass die vermeintliche Kopie eigentlich das gleiche Element ist. Gleiches gilt entsprechend für das Übergeben eines Arrays als Parmeter an eine Funktion.
var colors = ["red", "blue", "green"]; test(colors); console.log(colors); //["magenta", "blue", "green"] function test(arr) { arr[0] = "magenta"; }
Offensichtlich nicht wie von PHP gewohnt By Value sondern By Reference.… Den ganzen Post lesen
Veröffentlicht unter Javascript, webdev
7 Kommentare