// der php hacker

// archiv

Meine erste „Template-Engine“

Geschrieben am 03. Nov 2010 von Cem Derin

Die Resonanz zum Developers Shame Day war überwältigend (Feedback auf Twitter, Facebook und im restlichen Netz). Ich habe ich mich sehr über das zahlreiche Feedback gefreut, und wenn ihr diesen Beitrag hier lest, werdet ihr wahrscheinlich auch in dem ein oder anderen Blog schon ein Stück Schamcode zu sehen bekommen.

Leider habe ich die Trackback-Funktion noch nicht in die Templates einbauen können, aber wenn ihr einen Kommentar mit einem Link hinterlasst, sollte das ja auch erst einmal reichen (zu mal häufig Trackbacks gar nicht bei mir ankommen).

Natürlich stelle ich mich auch den Geistern der Vergangenheit und hab das älteste Stück PHP aus meiner Feder herausgesucht, dass ich finden konnte. Zu dem Zeitpunkt habe ich schon mit PHP mein Geld verdient, habe angenommen, ich wäre ein „fortgeschrittener Programmierer“ und habe das Stück Code in unzähligen Projekten effektiv eingesetzt. Es handelt sich um eine Template-Engine. Früher war sowas beliebt. Früher wusste ich auch nicht, was eine Klasse ist und habe den Begriff inflationär – und falsch – verwendet!

Ich war früher unglaublich stolz, heute blicke ich selbst nicht mal mehr wirklich durch. Aber genug geredet. Ich verstecke mich und ihr dürft gucken!

<?php
     /*
       Template-Klasse v1.1
       von Cem Derin, 2002-2004
     */

       // Array Funktionen

       // Array für einfachen Parser
       function array_simple($srcarray, $name, $key) {
           // Indexzahl des übergebenen Arrays ermitteln
           $icount = count($srcarray);

           // Neues Item hinzufügen
           $srcarray[$icount]['name'] = $name;
           $srcarray[$icount]['key'] = stripslashes($key);

           // Array wieder ausgeben
           return($srcarray);
       }

       // Array für Schleifen-Parser
       function array_loop($srcarray, $addarray) {
           // Indexzahl des übergebenen Arrays ermitteln
           $icount = count($srcarray);

           //Neues Item hinzufügen
           $srcarray[$icount] = $addarray;

           //Array wieder ausgeben
           return($srcarray);
       }

       // Parser-Funktionen

       // Einfacher Parser
       function parse_simple($source, $replace) {
           // Indexzahl des übergebenen Arrays ermitteln
           $icount = count($replace);

           // Quelle ¸bergeben
           $quelle = $source;

           // Counter initialisieren
           $counter = 0;

           //Schleife starten
           while($counter < $icount) {
               // Variable in Quelle ersetzen
               $quelle = str_replace($replace[$counter]['name'], $replace[$counter]['key'], $quelle);

               // Counter erhöhen
               $counter = $counter + 1;
           }

           // Bearbeitete Quelle ausgeben
           return($quelle);
       }

       // Schleifen Parser
       function parse_loop($source, $replace, $loop) {
           // Die Quelle in Array schreiben
           $quelle = split($loop, $source);

           //Die Einträge zählen
           $q_count = count($quelle);

           // Den Quellen-Pointer initialisieren
           $q_counter = 0;

           // Die Routine für jeden Quelleneintrag wiederholen
           while($q_counter <= $q_count) {
	           // Prüfen, ob die Quellzeile eine Loop-Zeile ist
	           if(grade($q_counter) != 0) {
		           // Die Quellzeile ist eine Loopzeile
		           // Ermitteln, wieviele Datensätze der Loop-Array hat
		           $l_count = count($replace);

		           // Loop-Array-Counter initialisieren
		           $l_counter = 0;

		           // Die Routine für jeden Datensatz wiederholen
		           while($l_counter < $l_count) {
			           // Ermittlen, wieviele Items der Datensatz hat
			           $i_count = count($replace[$l_counter]);

			           // Itemcounter initialisieren
			           $i_counter = 0;

			           // Den Rohling erstellen
			           $rohling = $quelle[$q_counter];

			           // Die Routine für jedes Item wiederholen
			           while($i_counter < $i_count) {
				           // Rohling bearbeiten
				           $rohling = str_replace($replace[$l_counter][$i_counter]['name'], $replace[$l_counter][$i_counter]['key'], $rohling); 

				           // Counter erhoehen
				           $i_counter = $i_counter + 1;
			           }

			           // Den Rohling mit den Vorgängern verbinden
			           $output = $output. $rohling; 

			           // Loop-Array Counter erhöhen
			           $l_counter = $l_counter + 1;
		           }

		           // Die neue Zeile eintragen
		           //$quelle[$q_counter] = $output;
		           $return = $return. $output;
		           $output = $NULL;

	           } else {
		           // Eine Grade Zahl, kein Loop
		           $output = $output. $quelle[$q_counter];
	           }

	           // Quellen-Pointer erhöhen
	           $q_counter = $q_counter + 1;
           }

           // Ausgabe
           return($return);

       }

       // Ist eine Zahl grade
       function grade($zahl) {
	       return($zahl % 2);
       }
?>

Und frei zur Verfügung gestellt hab ich das damals auch schon hier! Da gibts sogar noch ne Anleitung!

Enterprise Development

Geschrieben am 27. Okt 2010 von Cem Derin

Vielleicht schon dem ein oder anderen bekannt: Die Enterprise-Development Tipps, die man sich eventuell nicht ganz so sehr zu Herzen nehmen sollte. Schön: Teilnehmen bzw. neue “Tipps” hinzufügen kann man, in dem man sich bei github an dem Projekt beteiligt. Viel Spaß!

http://enterprise-js.com/

http://enterprise-html.com/

http://enterprise-css.com/

Vielleicht habt ihr ja auch noch ein paar “lustige” Developer-Seiten in petto?

Der “Developers Shame Day”

Geschrieben am 26. Okt 2010 von Cem Derin

Ich schreibe momentan an einem Artikel, in dem ich relativ viel über sehr alten Code von mir referiere. Keine Sorge, im Grunde nutze ich eigenes Getippsel als Negativ-Beispiel. Wenn man anders will, kann man auch sagen, ich zeige, dass man sich durchaus verbessern kann, wenn man nur will.

Während ich also auf alten Backup-CDs nach dem möglichst ältesten Code von mir suchte (was leider nicht so einfach sind, da sich CDs offensichtlich schon nach wenigen Jahren selbst zerstören), fiel mir auf, dass ich selten „Shame Code“ von anderen Leuten sehe. Jedenfalls nicht freiwillig. Arbeitsbedingt sieht man dann und wann 10-Jahre alten Legacy-Code der vermutlich in einer Kaffeegeschwängerten Nachtschicht kurz vor dem Morgengrauen in den Cherry-Klotz gehackt wurde. Aber bewusst, freiwillig und vor allem Öffentlich? Nein, ich kann mich nicht erinnern.

Aus diesem Grund möchte ich eine kleine Aktion unter den Entwickler-Blogs starten: Der Developers Shame Day! Ein Tag, an dem wir mal von unserem oft hohen Ross absteigen und uns bewusst werden, dass auch wir mal Anfänger waren. Ein Tag, an dem wir aller Welt vorführen, dass auch wir schon einmal total Murks fabriziert haben.

Wann soll das sein?

Als Stichtag würde ich den 3.11.2010 vorschlagen. Ich stelle mir vor, dass an diesem Tag alle Entwickler, die ein Blog oder eine Seite betreiben, ein kleines Stück Code präsentieren, dass aus heutiger (oder vielleicht auch damaliger) Sicht total hirnverbrannt ist. Ein Stück Code, dass uns selbst die Schamröte ins Gesicht steigen lässt. Dabei ist egal, ob es sich um PHP, JavaScript, CSS, HTML, Java, C oder sonst etwas handelt. Es muss nur von euch sein und es darf nicht verändert werden (umeventuell doch als total verrückter Hund dazustehen ;) ). Ein kleiner erläuternder Text sollte natürlich auch nicht fehlen.

Weitersagen?

Klar, ich würde mich freuen, wenn sich möglichst viele Leute beteiligen wollen. Insofern fände ich es auch super, wenn die unter euch, die selbst in irgend einer Weise im Netz publizieren, auf meinen kleinen Vorschlag hinweisen könnten! Als Wiedererkennungsmerkmal habe ich eine kleine Grafik gebastelt, die gerne benutzt werden kann!

Zusammengefasst!

  1. Wenn ihr Bock drauf habt, weist auf diese Aktion hin.
  2. Wenn ihr noch mehr Bock drauf habt, macht am 3.11.2010 selbst bei der Aktion mit!
  3. Wenn ihr ganz hart im nehmen seid, verweist auf diesen Artikel, damit andere euren Code finden und euch in der Luft zerreissen können ;)

Zend Framework Captcha erzeugt monströse Bildchen

Geschrieben am 18. Okt 2010 von Cem Derin

Heute habe ich ein (stand alone) Formular schnell und einfach mit dem Image-Captcha aus dem Zend-Framework aufgerüstet. Kein Problem, soweit … wenn man davon absieht, dass man weder Schrift- noch Hintergrundfarbe der Grafik beeinflussen kann. Weitaus nerviger ist da schon die Tatsache, dass man das Ausgabeformat ebenfalls starr vorgesetzt bekommt. Wenn man an diesen Stellen jedoch keinen Anspruch hat, ist das nicht weiter schlimm. Als ich dann aber in das Verzeichnis, in das die Bilddaten geschrieben werden geschaut habe, habe ich nicht schlecht gestaunt: Jedes einzelne CAPTCHA ist um die 900kb groß – viel zu viel für eine 300×50 Pixel große Grafik. Auch ein rumschrauben am Quality- und Filter-Parameter hat nichts gebracht. So ist das ganze leider unbrauchbar für mich.

Ist jemandem das Problem schon mal über den Weg gelaufen? Könnte es an der GD-Version liegen (bundled (2.0.34 compatible))? Für Hilfestellung bin ich dankbar.

XINGs Recruiting Methoden

Geschrieben am 27. Jan 2010 von Cem Derin

Eine sehr nette Idee, um sich fähige Entwickler an Bord zu holen hat XING:

Bildschirmfoto 2010-01-27 um 13.02.25

Auf der anderen Seite: Haben sie derzeit aber auch dringen nötig =)

Wusstest du schon …

Geschrieben am 31. Dez 2009 von Cem Derin

… dass PHP jonglieren kann? Und zwar mit Typen. Type juggling nennt man das, was passiert, wenn man einen String mit dem Inhalt “1″ versucht mit einem Integer zu addieren. Oder wenn man den String “Foo” mit dem Booleschen Wert “true” vergleicht: PHP würfelt die Typen einmal kräftig durch. Das sieht manchmal willkürlich aus, ist es meist aber nicht. Damit man keine bösen Überraschungen erlebt, sollte man sich mal diese Comparison Tables zu Gemüte führen.

Das wird dann auch mein letzter Post für dieses Jahr gewesen sein. Ich denke ich werde dann und wann noch einmal ein paar “wusstest du schon”-Beiträge raushauen. Ich hoffe ich konnte euch die Brückentage etwas verkürzen und vielleicht das ein oder andere neue erzählen. Ich wünsche euch allen einen guten Rutsch ins neue Jahr (… nen Fünfer ins Phrasenschwein – oh Mist. Schon wieder ;) ) und wir sehen uns dann 2010 in alter Frische wieder! Und als kleines Silvestergeschenk noch dieses tolle Video. Über den Song kann man streiten, aber die Performance ist toll. Also dann: Ciao!

Wusstest du schon …

Geschrieben am 30. Dez 2009 von Cem Derin

… dass man mit strtotime wesentlich einfacher und korrekter Zeitenräume addieren oder abziehen kann, als es von Hand überhaupt möglich ist? Denn nicht jeder Tag hat 86400 Sekunden. Außerdem umgeht man auch noch das Antipattern der Magic Numbers.

$nextWeek = strtotime('+1 week');
$twoMonth = strtotime('+2 month');
$reallyScrewed = strtotime('+2 years +1 month +1 day +4 hours +7 minutes');

Sieht doch wesentlich besser aus, oder? Und man weiß genau, was hier passiert. Als zweiten Parameter kann man übrigens einen UNIX-Timestamp angeben, der als Ausgangszeitpunkt verwendet wird.
// mehr lesen

Geschrieben in Entwicklung, PHP 10 Kommentare

Wusstest du schon …

Geschrieben am 29. Dez 2009 von Cem Derin

… dass Type Hints auf Arrays gemacht werden können? Im Gegensatz zu Primitiven Datentypen wie Strings, Integer oder Boolean kann man also in Methoden- und Funktionssignaturen  auch Arrays verlangen.

Type Hints sind eine bequeme und robuste Möglichkeit, die erwarteten Datentypen zu prüfen, bzw von PHP prüfen zu lassen. Dazu wird der Datentyp (bzw. die zu erwartete Klasse) einfach vor den Parameter in die Signatur geschrieben. Verwende ich beispielsweise eine Signatur wie folgende …


     function foo(Array $bar, Foo_Bar $buzz)

… weise ich PHP so an, dass der erste Parameter “bar” vom Typ Array sein muss. Der zweite “buzz” allerdings kann vom Typ “Foo_Bar” sein – oder von diesem abgeleitet sein. Man kann hier also auch jede Kindklasse übergeben.

Während den Tagen bis zum neuen Jahr werde ich immer mal wieder ein bisschen aus dem Trick- und Nähkästchen plaudern. Die arbeiten an Brawler stagnieren derzeit ob des Fresskomas unter dem ich grade leide, aber da mich mein gähnend Leerer Feedreader annervt, will ich wenigstens dazu beitragen, dass ein wenig passiert.

Geschrieben in Entwicklung, PHP 2 Kommentare

Wusstest du schon …

Geschrieben am 28. Dez 2009 von Cem Derin

… dass das schließende PHP Tag nicht zwingen notwendig ist? Im ZF findet man es kaum, PDT lässt es seit ein paar Versionen auch weg und meine Wenigkeit ebenfalls.

Aber warum macht man das? Zwei Gründe: Der erste ist mit Sicherheit eine gewisse Faulheit. Der zweite jedoch hat Hand und Fuß: Man stell sich vor, hinter dem schließenden PHP-Tag befindet sich ein Zeilenumbruch oder Whitespace. Wird nun kein Output-Buffering benutzt, wird man keine Cookies oder Customized Header mehr setzen können. Das wäre natürlich blöd.

Während den Tagen bis zum neuen Jahr werde ich immer mal wieder ein bisschen aus dem Trick- und Nähkästchen plaudern. Die arbeiten an Brawler stagnieren derzeit ob des Fresskomas unter dem ich grade leide, aber da mich mein gähnend Leerer Feedreader annervt, will ich wenigstens dazu beitragen, dass ein wenig passiert.

Von Eastereggs und wie man sie verstecken kann

Geschrieben am 16. Dez 2009 von Cem Derin

Uns Entwicklern wird oftmals abgesprochen, dass wir Kreativ sind. Das erkennt man leider schon oft daran, dass in den meisten Agenturen zwischen „Kreativen“ und „Entwicklern“ unterschieden wird. Dabei ist das alles andere als Gerechtfertigt. So verstehen wir unser Handwerk ebenfalls als eine „Kunstform“, erkennen in schönem Code Ästhetik, wo das ungeschulte Auge nur wirre Zeichenfolgen sieht. Investieren wir doch viel Liebe und Herz in den Aufbau und die Gestaltung unserer Applikationen ist es letztlich am Ende für den Anwender doch nur ein Werkzeug. Mich persönlich stimmt es dann und wann traurig, wenn der Betrachter das Kunstwerk, das man geschaffen hat nicht würdigt – oder würdigen kann. Aber daran wird man wohl auch nie etwas ändern können: Das was für die meisten an Software „schön“ ist, ist in der Regel nicht einmal die Software selbst sondern eben das, was die „Kreativen“ dazu beigetragen haben.

All das soll mich aber nicht daran hindern, meine Signatur unter das zu setzen, was ich schaffe. Damit meine ich nicht meinen Namen in den Kommentaren, damit meine ich auch nicht, dass ich ans Dokumentende ein pubertäres „hacked together by Cem Derin“ klatsche. Oftmals ist das ja auch gar nicht möglich. Nein, ich meine, dass ich meine Handschrift so hinterlasse, dass Sie zwar Sichtbar ist – aber trotzdem auch Unsichtbar. Dazu bediene ich mich dem, was gemeinhin als „Easteregg“ bekannt ist. So stelle ich sicher, dass meine Software von den Leuten gewürdigt werden kann, die dazu auch in der Lage sind.

Viele Seiten beinhalten einen kleinen Scherz, einen Kommentar, einen Witz oder ähnliches, wenn man bestimmte Tastenkombinationen auf einer Seite betätigt. Das hat den Nachteil, das ein gewisser Anteil JavaScript nachgeladen werden muss und man ggf. auch Resourcen einbettet, die kein Mensch freigegeben hat. Da man sowas natürlich auch nicht mit seinem Gewissen vereinbaren kann, hatte dies zur Folge, dass meine Eastereggs so versteckt waren, dass sie keiner Gefunden hat.

Irgendwie hat auch das geschlaucht. Da gab es dann aber noch eine andere Möglichkeit, wie man ein Easteregg unterbringen kann: ASCII-Art. Obwohl, nicht direkt. Im Grunde meine ich nur das hinzufügen von zusätzlichem Whitespace. Man verändert den Inhalt nicht, sondern lediglich die Formatierung, so dass dem Betrachter eine Botschaft ohne jegliche Nebenwirkungen übermitteln kann.

Dazu habe ich ein kleines Programm geschrieben, dass zwar noch alles andere als ausgereift ist, aber seinen Zweck trotzdem schon erfüllt. Zu finden ist es hier. Und wer sich nun fragt, was das Ding macht – der schaue sich den Quelltext dieses Beitrags an =)

Übrigens: Die Textbasis ist derzeit die, die ihr hier grade lest. Das wird sich aber bald ändern. Außerdem stehen die Einstellungsmöglichkeiten noch nicht zur Verfügung – denn um ein halbwegs zufrieden stellendes Ergebnis zu erzielen, muss man ganz schön den Parametern rumjustieren.

theme von mir, software von wordpress, grid von 960 grid system. funktioniert in allen browsern, aber der safari bekommt das mit der schrift am schönsten hin.