PHPhil's Playground http://phphil.ch/index.php Ein deutscher Blog über Webprogrammierung, Webdesign und das Leben als Held de Copyleft - All Rites Reversed Fri, 03 Sep 2010 06:00:05 +0200 Eine Auswahl unglaublich guter Musik - Teil II Seit den letzten Empfehlungen sind bereits zwei Monate vergangen. Höchste Zeit die Entdeckungen aus dieser Zeit weiterzuempfehlen. :] <p><strong>Seit den letzten Empfehlungen sind bereits zwei Monate vergangen. Höchste Zeit die Entdeckungen aus dieser Zeit weiterzuempfehlen. :]</strong></p><p>Irgendwie hab ich die letzten zwei Monate nachgeholt, was ich in meiner Kindheit/frühen Jugend alles verpasst habe. Das hat zur Folge das der Grossteil der heutigen Tipps aus den 90ern/frühen Nullerjahren stammen. Aber schaut und hört einfach selbst... :D</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/AZf9eIw-0y8&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/AZf9eIw-0y8&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>Nathan Gray</strong> (ehemals <strong>boysetsfire</strong>)<br /> Song: <strong>With Every Intention</strong><br /> Album: <strong>Tomorrow Come Today</strong><br /> Erscheinungsjahr: <strong>2003</strong></p> <p>... in einer unglaublich emotionalen und mittreisenden Akustik-Version. :'/</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/MLt0iTAi6tY&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/MLt0iTAi6tY&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>Ween</strong><br /> Song: <strong>Cold Blows the Wind</strong><br /> Album: <strong>The Mollusk</strong><br /> Erscheinungsjahr: <strong>1997</strong></p> <p>Wenn wir schon bei melancholischer Musik sind: <em>Cold Blows the Wind</em> ist <em>Ween</em>'s Interpretation des englischen Folk-Songs <em>The Unquiet Grave</em>. Darin geht es um einen Mann, der ein Jahr und einen Tag um seine wahre Liebe trauert. Nach dieser Zeit beklagt sich die Betrauerte, dass sie deshalb nicht ruhen kann. Er bettelt um einen letzten Kuss und sie entgegnet, dass ihn das töten würde und um ihn dann wegzuschicken.</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/b0wfu3tOrtQ&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/b0wfu3tOrtQ&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>Fastball</strong><br /> Song: <strong>The Way</strong><br /> Album: <strong>All the Pain Money Can Buy</strong><br /> Erscheinungsjahr: <strong>1998</strong></p> <p>Den Refrain dieses Song kennt ihr - jede Wette. Doch kennt ihr auch den Rest um die romantisierte Geschichte eines texanisches Ehepaars, dass sich mit dem Auto auf den Weg zu einem Festival machte, später aber weit entfernt der eigentlich Destination tot aufgefunden wurde? Fastball-Bassist <em>Tony Scalzo</em> dichtet die Geschichte so um, dass die beiden Eheleute nach einer Autopanne zu Fuss weiterreisten und durch die Abgrenzung zu Welt zurück zum Glück fanden.</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/YDAXltfj8-Y&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/YDAXltfj8-Y&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>Marcy Playground</strong><br /> Song: <strong>Sex and Candy</strong><br /> Album: <strong>Marcy Playground</strong><br /> Erscheinungsjahr: <strong>1997</strong></p> <p><em>Sex and Candy</em> ist der Song, der 1997 <em>Oasis' Wonderwall</em> als längsten Nummer-1-Hit in den US-Billboard-Charts ablöste. Ich kannte ihn bis vor kurzem nicht. Und du?</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/Yp1ZGW9MdbI&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Yp1ZGW9MdbI&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>Toad The Wet Sprocket</strong><br /> Song: <strong>Something's Always Wrong</strong><br /> Album: <strong>Dulcinea</strong><br /> Erscheinungsjahr: <strong>1994</strong></p> <p>Den schönsten Refrain in diesem Artikel findet ihr in diesem tollen Song von <em>Four Young Studs and Glen</em>. Sing along!</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/l6nVCZpgT2s&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/l6nVCZpgT2s&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>Janelle Monáe</strong><br /> Song: <strong>Cold War</strong><br /> Album: <strong>The ArchAndroid (Suites II and III)</strong><br /> Erscheinungsjahr: <strong>2010</strong></p> <p>Zum Abschluss jetzt noch etwas ganz anderes. Sowohl musikalisch also auch zeitlich. Von den 90ern direkt zu den Charts. Enjoy! :)</p> http://bigwhoop.ch/artikel/59/2010-08-25/Eine-Auswahl-unglaublich-guter-Musik---Teil-II info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/59/2010-08-25/Eine-Auswahl-unglaublich-guter-Musik---Teil-II Wed, 25 Aug 2010 09:24:00 +0200 Apache 2.2 mit SSL-Unterstützung installieren (Windows) Eine Schritt-für-Schritt-Anleitung zum Installieren und Konfigurieren von Apache 2.2 mit SSL-Unterstützung unter Windows. <p><strong>Eine Schritt-für-Schritt-Anleitung zum Installieren und Konfigurieren von Apache 2.2 mit SSL-Unterstützung unter Windows.</strong></p><p>Neulich habe ich Apache 2.2 mit OpenSSL-Unterstützung auf einem Windows 7-Rechner installiert. Das Ganze hat etwas länger gedauert als erwartet, da es ein paar Stolpersteine aus dem Weg zu kicken galt. Damit es das nächste Mal schneller geht, schreib ich hier mal für mich und natürlich auch euch nieder, wie es am schnellsten geht.</p> <h2>Installation von Apache mit SSL-Unterstützung</h2> <p>Damit ihr HTTP mit SSL (HTTPS) nutzen könnt, braucht ihr einen Apachen mit OpenSSL-Federschmuck. Das passende Packet findet ihr auf http://apache.mirror.testserver.li/httpd/binaries/win32/ (oder nem anderen Mirror). Ihr müsst eine Datei im Stile von <code>httpd-2.2.15-win32-x86-openssl-0.9.8m-r2.msi</code> runterladen.</p> <p>Falls ihr bereits eine Apache-Installation am Laufen habt, empfiehlt es sich, diese jetzt zu deinstallieren.</p> <p>Danach installiert ihr den frisch runtergeladenen Apache. Das kriegt ihr alleine hin - ich glaube an euch!</p> <h2>Zertifikat für <code>localhost</code> generieren</h2> <p>Jetzt öffnet wir erst mal eine Konsole. Falls ihr Windows 7-Nutzer seid, ist es wichtig, dass ihr die Konsole mit Admin-Rechnen öffnet.</p> <p>Danach wechselt ihr ins Installationsverzeichnis von Apache. Zum Beispiel:</p> <pre name="code" class="php">cd "c:\Program Files (x86)\Apache Software Foundation\Apache2.2" </pre> <p>Dann erstellen wir erst mal ein Verzeichnis wo wir unsere Zertifikate aufbewahren wollen:</p> <pre name="code" class="php">mkdir conf\ssl </pre> <p>So. Nun ist alles bereit. Zuerst müssen wir eine Zertifikatsignierungsanfrage plus privaten Schlüssel generieren.</p> <pre name="code" class="php">.\bin\openssl req -config conf\openssl.cnf -new -out conf\ssl\localhost.csr -keyout conf\ssl\localhost.pem </pre> <p><img src="/img/article_pictures/56/ssl01.png" alt="Generierung von Zertifikatsignierungsanfrage und privatem Schlüssel" title="Generierung von Zertifikatsignierungsanfrage und privatem Schlüssel" /></p> <p>Ihr werdet zu folgenden Eingaben aufgefordert:</p> <ul> <li><strong>PEM pass phrase</strong> - Ein längeres, komplexes Passwort</li> <li><strong>Country Name</strong> - z.B. <code>CH</code> für Schweiz oder <code>DE</code> für Deutschland</li> <li><strong>State or Province Name</strong> - Das Bundesland/der Kanton in dem ihr lebt (oder ein Fantasiewert)</li> <li><strong>Locality Name</strong> - Die Stadt in der ihr lebt (oder ein Fantasiewert)</li> <li><strong>Organization Name</strong> - Euer Arbeitgeber/eure Firma (oder ein Fantasiewert)</li> <li><strong>Organizational Unit Name</strong> - Die Abteilung der Firma (oder ein Fantasiewert)</li> <li><strong>Common Name</strong> - Hier müsst ihr nun die Domain eingeben, für die das Zertifikat erstellt werden soll. Also in unserem Falle <code>localhost</code>.</li> <li><strong>Email Address</strong> - Die E-Mail-Adresse für den technischen Kontakt des Zertifikatinhabers. Also eure E-Mail-Adresse (oder ein Fantasiewert).</li> <li><strong>A challenge password</strong> - Dieses Attribut könnt ihr ignorieren indem ihr <em>Enter</em> drückt. Wir werden unser Zertifikat selber signieren.</li> <li><strong>An optional company name</strong> - Ebenfalls ignorieren.</li> </ul> <p>Als nächstes entfernen wir die Passphrase/das Passwort aus dem privaten Schlüssel und speichern ihn in einer eigenen Datei. Das geht so:</p> <pre name="code" class="php">.\bin\openssl rsa -in conf\ssl\localhost.pem -out conf\ssl\localhost.key </pre> <p><img src="/img/article_pictures/56/ssl02.png" alt="Entfernung der Passphrase aus dem privaten Schlüssel" title="Entfernung der Passphrase aus dem privaten Schlüssel" /></p> <p>Zu guter Letzt generieren wir uns noch unseres eigenens Zertifikat. Normalerweise würde dies eine autorisierte Stelle übernehmen, doch für den Selbstgebraucht ist das nicht notwendig.</p> <pre name="code" class="php">.\bin\openssl x509 -in conf\ssl\localhost.csr -out conf\ssl\localhost.crt -req -signkey conf\ssl\localhost.key -days 1825 </pre> <p><img src="/img/article_pictures/56/ssl03.png" alt="Generierung des Zertifikates" title="Generierung des Zertifikates" /></p> <p>Durch die Angabe von <code>-days 1825</code> wird dieses Zertifikat für 5 Jahre gültig sein. Das sollte reichen.</p> <p>Zusammengefasst haben wir nun folgende Dateien erstellt:</p> <ul> <li><code>localhost.crs</code> - Eine Anfrage für eine Zertifikatsignierung</li> <li><code>localhost.pem</code> - Der private Schlüssel</li> <li><code>localhost.key</code> - Die Passphrase des privaten Schlüssels</li> <li><code>localhost.crt</code> - Das eigentliche, signierte Zertifikat</li> </ul> <h2>Konfiguration von Apache mit SSL-Unterstützung</h2> <p>Was wir jetzt noch tun müssen ist unserem Apachen den Federschmuck aufsetzen. Dazu öffnen wir erst mal die <code>httpd.conf</code> im Konfigurationsverzeichnis von Apache. Dort gilt es folgende Schritte durchzuführen:</p> <ul> <li>Die Zeile <code>#LoadModule ssl_module modules/mod_ssl.so</code> auskommentieren</li> <li>Die Zeile <code>#Include conf/extra/httpd-ssl.conf</code> auskommentieren</li> </ul> <p>Nun öffnen wir eben diese <code>httpd-ssl.conf</code> und machen folgendes:</p> <ul> <li>Die Zeile beginnend mit <code>SSLCertificateFile</code> suchen und das Ende des Pfades auf <code>conf/ssl/localhost.crt</code> ändern. Also z.B. <code>SSLCertificateFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/conf/ssl/localhost.crt"</code>.</li> <li>Die Zeile beginnend mit <code>SSLCertificateKeyFile</code> suchen und das Ende des Pfades auf <code>conf/ssl/localhost.key</code> ändern. Also z.B. <code>SSLCertificateKeyFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/conf/ssl/localhost.key"</code>.</li> </ul> <p>Jetzt nur das Speichern nicht vergessen, den Apachen vom Pferden holen und wieder drauf setzen (= geniale Metapher für Neustarten) und schon sollte <a class="DefaultLink" href="https://localhost">https://localhost</a> funktionieren. :]</p> <h3>Wichtig für Windows 7-Benutzer</h3> <p>Falls ihr Apache im Standardverzeichnis installiert habt, beinhaltet euer Pfad bei <code>C:/Program Files (x86)/Apac...</code> runde Klammern. Dies führt zur Fehlermeldung <strong>SSLSessionCache: Invalid argument: size has to be >= 8192 bytes</strong> beim Versuch den Apache zu starten.</p> <p>Abhilfe schafft eine Verknüpfung auf das Apache-Verzeichnis z.B. im Root von <code>C:\</code>. Da es mir wegen den Rechten nicht gelang eine Verknüpfung direkt in <code>C:\</code> zu erstellen, habe ich diese zuerst auf dem Desktop erstellt und danach nach <code>C:\</code> kopiert.</p> <p>Schlussendlich solltet ihr einfach eine Verknüpfung à la <code>C:\Apache2.2</code> nach <code>C:\Program Files (x86)\Apache Software Foundation\Apache2.2</code> haben.</p> <p>Danach sucht ihr im <code>httpd-ssl.conf</code> die Zeile beginnend mit <code>SSLSessionCache</code> und ersetzt den bestehenden Pfad mit dem neuen, klammerlosen Pfad der Verknüpfung. Zum Beispiel <code>SSLSessionCache "shmcb:C:/Apache2.2/logs/ssl_scache(512000)"</code>.</p> <p>Jetzt sollte der Apache mit HTTPS auch unter Windows 7 rocken!</p> http://bigwhoop.ch/artikel/56/2010-01-08/Apache-22-mit-SSL-Unterstuetzung-installieren-Windows info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/56/2010-01-08/Apache-22-mit-SSL-Unterstuetzung-installieren-Windows Fri, 08 Jan 2010 14:10:31 +0100 Eine Auswahl unglaublich guter Musik - Teil I Alle paar Tage entdecke ich Musik, die mich einfach umhaut. Musik die mich berührt - egal in welcher Weise. Hört rein und sagt eure Meinung. <p><strong>Alle paar Tage entdecke ich Musik, die mich einfach umhaut. Musik die mich berührt - egal in welcher Weise. Hört rein und sagt eure Meinung.</strong></p><p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/gbv-yqqmLH0&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/gbv-yqqmLH0&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>Emancipator</strong><br /> Song: <strong>Lionheart</strong><br /> Album: <strong>Soon It Will Be Cold Enough</strong><br /> Erscheinungsjahr: <strong>2006</strong></p> <p>Hinter <em>Emancipator</em> steckt Produzent und Multiinstrumentalist (gibt's dieses Wort?) Doug Appling. In <em>Lionheart</em> findet ihr ein ruhiges, leicht melancholisches Instrumental, das jeden Endzeitfilm aufwerten würde. Zum Entspannen und Träumen.</p> <hr /> <p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/7wKhrEFzLfM&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/7wKhrEFzLfM&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p> <p>Künstler: <strong>Minuit</strong><br /> Song: <strong>Aotearoa</strong><br /> Album: <strong>Find Me Before I Die A Lonely Death.com</strong><br /> Erscheinungsjahr: <strong>2009</strong></p> <p><em>Minuit</em> ist eine Neuseeländische Elektroband die mit <em>Aotearoa</em> einen eher Breakbeatigen Song mit einem tollen Video zur jungen Geschichte ihres Landes.</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/yu6zUwDv-o4&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/yu6zUwDv-o4&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>Tal Wilkenfeld</strong><br /> Song: <strong>Table For One</strong><br /> Album: <strong>Transformation</strong><br /> Erscheinungsjahr: <strong>2007</strong></p> <p><em>Tal Wilkenfeld</em> ist eine blutjunge (Jahrgang 1986!), australische Jazz-Bassistin, die zu den Newcomern der letzten Jahre zählt.</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/Eyz0WraN3LU&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Eyz0WraN3LU&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>The Rolling Stones</strong><br /> Song: <strong>Rip This Joint</strong><br /> Album: <strong>Exile on Main St.</strong><br /> Erscheinungsjahr: <strong>1972</strong></p> <p>Die <em>Rolling Stones</em> kennt jeder. Diesen Song aber nicht. Jahrzehntelang verschwand er gänzlich aus der Setliste der Stones. Tanzt!</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/GxZuq57_bYM&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/GxZuq57_bYM&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>The Winstons</strong><br /> Song: <strong>Amen, Brother</strong><br /> Album: B-Seite von <strong>Color Him Father</strong><br /> Erscheinungsjahr: <strong>1969</strong></p> <p>In diesem Lied gibt es einen kurzen Schlagzeug-Break der keine unwesentliche Rolle in der Entwicklung von Hip-Hop-Musik und Drum 'n Bass spielte, wurde er doch tausendfach wiederverwertet. Man geht davon aus, dass dieser sogenannte <em>Amen Break</em> das am häufigsten genutzte Sample in diesen Musikrichtungen ist. Aber auch sonst <em>funk</em>t <em>Amen, Brother</em> ganz gut. (haha ;-))</p> <hr /> <p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/_9wPvlTBgZw&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/_9wPvlTBgZw&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p> <p>Künstler: <strong>Incubus</strong><br /> Song: <strong>Anna Molly</strong><br /> Album: <strong>Light Grenades</strong><br /> Erscheinungsjahr: <strong>2006</strong></p> <p>Zugegeben, viele werden <em>Incubus</em> und damit wohl auch <em>Anna Molly</em> kennen. An mir ging dieses Lied irgendwie gänzlich vorbei. Wenn es dir auch so erging: Reinhören!</p> <hr /> <p>Einbetten wurde leider deaktiviert. Ein Klick lohnt sich aber auf jeden Fall! <a class="DefaultLink" href="http://www.youtube.com/watch?v=8-8nkkOA_AM">Klick</a>.</p> <p>Künstler: <strong>Mat Weddle</strong> von der Band <strong>Obadiah Parker</strong> (im Original von <strong>OutKast</strong><br /> Song: <strong>Hey Ya</strong><br /> Album: <strong>-</strong><br /> Erscheinungsjahr: <strong>2006</strong> (via YouTube)</p> <p><em>Hey Ya</em> von <em>OutKast</em> (grosses K?) kennt man aus den Charts. Was aber <em>Mat Weddle</em> mit seiner Cover-Version daraus gemacht hat gibt dem Lied ein ganz neue Tiefe. Unglaublich gefühlvoll.</p> http://bigwhoop.ch/artikel/55/2010-06-29/Eine-Auswahl-unglaublich-guter-Musik---Teil-I info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/55/2010-06-29/Eine-Auswahl-unglaublich-guter-Musik---Teil-I Tue, 29 Jun 2010 15:58:37 +0200 Neue Bürger braucht das Land Bekanntlich möchte ja die SVP die Integration von grenznahen Gebieten als neue Schweizer Kantone erleichtern. Abseits der Blödheit dieser Idee schauen wir doch mal, welche neuen Eidgenossen wir dadurch akquirieren könnten. <p><strong>Bekanntlich möchte ja die SVP die Integration von grenznahen Gebieten als neue Schweizer Kantone erleichtern. Abseits der Blödheit dieser Idee schauen wir doch mal, welche neuen Eidgenossen wir dadurch akquirieren könnten.</strong></p><p>Zugegeben, die <a class="DefaultLink" href="http://www.tagesanzeiger.ch/schweiz/standard/SVP-will-der-Schweiz-Nachbargebiete-einverleiben/story/23529806">Meldung</a> ist schon ein paar Tage alt, aber nach dem Ausscheiden unserer Fussballnationalmannschaft könnten ein paar weitere Fussballer gut gebrauchen. :]</p> <h2>Sport</h2> <p><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/dennis-aogo" alt="Dennis Aogo" title="Dennis Aogo" /></p> <p><strong>Dennis Aogo</strong>, geboren am 14. Januar 1987 in Karlsruhe, ist ein deutscher Fussballnationalspieler. Den jungen Defensivmann würde Otti bestimmt irgendwo unterbringen.</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/gianluca-zambrotta" alt="Gianluca Zambrotta" title="Gianluca Zambrotta" /></p> <p><strong>Gianluca Zambrotta</strong>, geboren am 19. Februar 1977 in Como, ist ein italienischer Fussballnationalspieler. Zugegeben, der Herr ist schon etwas alt, könnte aber die nächsten vier Jahre bestimmt noch mitspielen und viel seiner Erfahrung weitergeben.</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/oliver-kahn.jpg" alt="Oliver Kahn" title="Oliver Kahn" /></p> <p><strong>Oliver Kahn</strong>, geboren am 15. Juni 1969 in Karlsruhe, war der beste Fussballtorwart der Welt. Als Motivator würde er Wunder vollbringen. Jawohl.</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/regina-halmich.jpg" alt="Regina Halmich" title="Regina Halmich" /></p> <p><strong>Regina Halmich</strong>, geboren am 22. November 1976 in Karlsruhe, war bis zu ihrem Rücktritt über 12 Jahre hinweg die beste Profiboxerin der Welt. Zur Feier der Einbürgerung dürfte sie in einer pompösen Galashow gegen Blocher in den Ring steigen.</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/arsene-wenger" alt="Arsène Wenger" title="Arsène Wenger" /></p> <p><strong>Arsène Wenger</strong>, geboren am 22. Oktober 1949 in Strassburg, ist einer der renommiertesten Fussballtrainer der Welt.</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/jochen-hecht.jpg" alt="Jochen Hecht" title="Jochen Hecht" /></p> <p><strong>Jochen Hecht</strong>, geboren am 21. Juni 1977 in Mannheim, ist ein deutscher Eishockeynationalspieler. Zurzeit spielt der Stürmer in der weltbesten Eishockeyliga - der NHL.</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/tania-cagnotto.jpg" alt="Tania Cagnotto" title="Tania Cagnotto" /></p> <p><strong>Tania Cagnotto</strong>, geboren am 15. Mai 1985 in Bozen, ist eine italienische Kunst- und Turmspringerin. Hier ist die Vizewelt- und Europameisterin zwar total unbekannt, dies würde sicher aber bestimmt rasch ändern. Und vielleicht zieht sich ja dann auch für den Playboy aus.</p> <div style="clear: left;"></div> <h2>Musik</h2> <p>Zugegeben, die Auswahl ist spärlich, aber die Scorpions kommen halt nicht aus Baden-Württemberg.</p> <p><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/xavier-naidoo.jpg" alt="Xavier Naidoo" title="Xavier Naidoo" /></p> <p><strong>Xavier Naidoo</strong>, geboren am 2. Oktober 1971 in Mannheim, ist ein deutscher Schnulzensänger. Er ist in dieser Liste weil die Masse seine Musik irgendwie mag...</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/max-herre.jpg" alt="Max Herre" title="Max Herre" /></p> <p><strong>Max Herre</strong>, geboren am 22. April 1973 in Stuttgart, ist ein deutscher Musiker, bekannt geworden als Frontmann von Freundeskreis.</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/kool-savas.jpg" alt="Kool Savas" title="Kool Savas" /></p> <p><strong>(King) Kool Savas</strong>, geboren am 10. Februar 1975 in Aachen, ist laut HipHop-Magazin "Juice" einer der besten deutschen MCs. Ausserdem ist er Vegetarierer, wodurch er meinen voll krassen Respekt hat. Yo!</p> <div style="clear: left;"></div> <h2>Sonstige</h2> <p><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/til-schweiger.jpg" alt="Til Schweiger" title="Til Schweiger" /></p> <p><strong>Til Schweiger</strong>, geboren am 19. Dezember 1963 in Freiburg im Breisgau, ist der deutsche Brad Pitt. 'Nuff said.</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/marie-tussaud.jpg" alt="Marie Tussaud" title="Marie Tussaud" /></p> <p><strong>Marie Tussaud</strong>, geboren am 12. Dezember 1761 in Strassburg, war eine einflussreiche Wachsbildnerin. In London gibt's eine bekannte Touristenattraktion die nach ihr benannt wurde. Post mortem könnte man ihr den roten Ehrenpass vergeben.</p> <p><div style="clear: left;"></div><img style="float: left; margin: 0 10px 10px 0;" src="/img/article_pictures/54/albert-schweitzer" alt="Albert Schweitzer" title="Albert Schweitzer" /></p> <p><strong>Albert Schweitzer</strong>, geboren am 14. Januar 1875 in Kaysersberg, war ein französischer Friedensnobelpreisträger über den ich jetzt mal nichts weiter schreibe. So bin ich.</p> <div style="clear: left;"></div> <p>Ergänzungen bitte in die Kommentare. :-)</p> http://bigwhoop.ch/artikel/54/2010-06-26/Neue-Buerger-braucht-das-Land info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/54/2010-06-26/Neue-Buerger-braucht-das-Land Sat, 26 Jun 2010 17:34:56 +0200 Wenn PHP einfach nicht mit dem lokalen MySQL-Server verbinden will (Windows) Als ich mir auf meinem neuen Notebook eine gewohnte WAMP-Umgebung einrichten wollte, stiess ich auf ein Problem, dass ich vorher noch nie hatte: Ich konnte mit PHP einfach keine Verbindung zum lokalen MySQL-Server herstellten. <p><strong>Als ich mir auf meinem neuen Notebook eine gewohnte WAMP-Umgebung einrichten wollte, stiess ich auf ein Problem, dass ich vorher noch nie hatte: Ich konnte mit PHP einfach keine Verbindung zum lokalen MySQL-Server herstellten.</strong></p><p>Folgendes Script ...</p> <pre name="code" class="php">&lt;?php new mysqli('localhost', 'root', '*********'); </pre> <p>... resultierte im Fehler:</p> <blockquote> <p>Warning: mysqli::mysqli(): (HY000/2002): Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat</p> </blockquote> <p>Über die Kommandozeile konnte ich mich aber problemlos mit dem MySQL-Server verbinden.</p> <p>Mr. Guughel riet mir dann anstatt <code>localhost</code> einfach <code>127.0.0.1</code> zu verwenden, <strong>was auch funktionierte</strong>.</p> <p>Das war aber nur Symptombekämpfung und so suchte ich nach der Ursache des Problems. Schlussendlich fand ich raus, dass das Problem bei der Namensauflösung liegt.</p> <p>In der <code>hosts</code>-Datei von Windows 7 steht nämlich:</p> <pre name="code" class="php"># localhost name resolution is handled within DNS itself. #127.0.0.1 localhost </pre> <p>Die Auflösung für <code>localhost</code> wird also nicht in der <code>hosts</code>-Datei gemacht. Das ist kein Problem, <strong>solange man keine eigenen Hosts für <code>127.0.0.1</code> definiert hat</strong>. Denn dann steht die Zuweisung <code>127.0.0.1</code> gleich <code>localhost</code> nicht mehr "an erster Stelle" - und das mag MySQL (oder PHP?) überhaupt nicht.</p> <p>Als einfache Lösung kann man also einfach <strong>den Kommentare für <code>127.0.0.1</code> in der <code>hosts</code>-Datei entfernen</strong> und <strong>seine eigenen Hosts erst danach definieren</strong>.</p> http://bigwhoop.ch/artikel/53/2010-06-25/Wenn-PHP-einfach-nicht-mit-dem-lokalen-MySQL-Server-verbinden-will-Windows info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/53/2010-06-25/Wenn-PHP-einfach-nicht-mit-dem-lokalen-MySQL-Server-verbinden-will-Windows Fri, 25 Jun 2010 07:07:16 +0200 Flattr Invites zu vergeben Der LIKE-Button mit Mehrwert und neuer Stern in der (deutschen) Blogosphäre: Flattr. <p><strong>Der LIKE-Button mit Mehrwert und neuer Stern in der (deutschen) Blogosphäre: Flattr.</strong></p><p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/9zrMlEEWBgY&hl=de_DE&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/9zrMlEEWBgY&hl=de_DE&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p> <p>Über <a class="DefaultLink" href="http://flattr.com">Flattr</a> muss ich gar nicht mehr viele Worte verlieren, dass haben <a class="DefaultLink" href="http://uarrr.org/2010/04/26/von-flattr-facebook-und-fantastischen-visionen/">andere</a> schon zu genüge getan. Jedoch hab ich noch <del>zweieinen</del>keinen <em>Invite Code</em> zu vergeben. <del>Bei Interesse einfach kurz hier einen Kommentar hinterlassen. :-)</del></p> <h3>Update</h3> <p>Alle weg! :-)</p> http://bigwhoop.ch/artikel/50/2010-12-06/Flattr-Invites-zu-vergeben info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/50/2010-12-06/Flattr-Invites-zu-vergeben Mon, 06 Dec 2010 10:00:04 +0100 Webapplikationsupdate trotz Wartungsseite testen Wie man eine Wartungsseite anzeigt, aber als Entwickler trotzdem auf die Webseite zugreifen kann um das Resultat zu überwachen <p><strong>Wie man eine Wartungsseite anzeigt, aber als Entwickler trotzdem auf die Webseite zugreifen kann um das Resultat zu überwachen</strong></p><p>Heute kam die Frage auf, wie wir morgen ein grösseres Update unserer Webapplikation durchführen und testen können, ohne dass unsere Kundschaft in Server-Fehler und Exceptions reinläuft. Schnell war klar, dass wir die Webseite in den Wartungsmodus setzen müssen. Damit wir als Entwickler während dieses Updates aber trotzdem auf die Webseiten zugreifen können, hab ich mir folgende Lösung ausgedacht:</p> <p><strong>Die Entwickler senden einen speziellen HTTP Request Header, wodurch sie nicht auf die Wartungsseite weitergeleitet werden.</strong></p> <p>Manchmal sind Lösung echt simpel ... ;-)</p> <h2>Umsetzung</h2> <h3>Eigenen HTTP Request Header senden</h3> <p>Bestimmt gibt es auch andere Tools, doch wir haben uns für das Firefox-Addon <a class="DefaultLink" href="https://addons.mozilla.org/en-US/firefox/addons/policy/0/967/50889?src=addondetail">Modify Headers</a> entschieden. Dieses Addon ist schlicht gehalten und einfach zu bedienen.</p> <p><img src="http://bigwhoop.ch/img/article_pictures/49/modify-headers-01" alt="Modify Headers Screenshot" /></p> <p>Oben wählt ihr zuerst die Action aus. In unserem Fall ist das <code>Add</code>, da wir einen neuen Header hinzufügen wollen. Danach kommt der Name des Headers, der natürlich eindeutig sein sollte. Also zum Beispiel <code>X-MyProject-Maintenance</code>. Danach folgt der Wert des Headers. Empfehlenswert ist eine längere Zeichenkette, die nicht erraten werden kann. Zum Schluss kommt noch ein Kommentarfeld, dass ihr aber auch leer lassen könnt.</p> <p>Nach dem Klick auf <strong>Save</strong> erscheint der Wert unten in der Liste. Durch einen Doppelklick oder die Buttons rechts, könnt ihr den Header aktivieren, bzw. deaktivieren. <strong>Achtung: Wenn ihr <em>Modify Headers</em> schliesst, wird der erstellte Header nicht mehr mitgeschickt.</strong></p> <h3>Rewriting</h3> <p>Da wir mit Zend Framework arbeiten haben wir eh schon <strong>mod_rewrite</strong> im Einsatz. Deshalb gehe ich jetzt auch nur darauf ein.</p> <p>Was wir jetzt noch wollen sind zwei Dinge:</p> <ol> <li>Alle Requests auf die Wartungsseite weiterleiten</li> <li>Ausnahme: Wenn ein Request mit unserem speziellen Header daher kommt</li> </ol> <p>Ersteres wird mit folgender Rewrite Rule bewerkstelligt:</p> <pre name="code" class="php">RewriteRule ^.*$ maintenance.php [NC,L] </pre> <p>Das Zweite mit der folgenden Rewrite Condition direkt oberhalb der Rewrite Rule:</p> <pre name="code" class="php">RewriteCond %{HTTP:X-MyProject-Maintenance} !^super-secret-key$ </pre> <p>Mit Zend Framework sieht das dann zum Beispiel so aus:</p> <pre name="code" class="php"># Ignore static resources RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] # Show maintenance page RewriteCond %{HTTP:X-MyProject-Maintenance} !^super-secret-key$ RewriteRule ^.*$ maintenance.php [NC,L] # Rewrite everything to the bootstrapper RewriteRule ^.*$ index.php [NC,L] </pre> <h3>Zwischen Wartungs- und Live-Modus hin- und herschalten</h3> <p>Um in den Live-Modus zu wechseln, kommentiert ihr einfach die beiden <code>.htaccess</code>-Zeilen aus. Für den Wartungsmodus entfernt ihr die <code>#</code>s einfach wieder.</p> <p>So, ich hoffe das hilft irgendwem. Für alternative Ideen bin ich natürlich offen. :-)</p> http://bigwhoop.ch/artikel/49/2010-03-06/Webapplikationsupdate-trotz-Wartungsseite-testen info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/49/2010-03-06/Webapplikationsupdate-trotz-Wartungsseite-testen Sat, 06 Mar 2010 12:00:46 +0100 Doctrine Flagable Behavior/Template Eine PHP-Klasse zur einfachen Verwendung von Flags/Bitmasken in Doctrine ORM. <p><strong>Eine PHP-Klasse zur einfachen Verwendung von Flags/Bitmasken in Doctrine ORM.</strong></p><p>Doctrine 1.2 ist mein bevorzugter OR-Mapper für PHP. Durch sogenannte <a class="DefaultLink" href="http://www.doctrine-project.org/projects/orm/1.2/docs/manual/behaviors/en#behaviors">Behaviors</a> lassen sich Models mit Funktionalität, als auch Struktur erweitern. Diese Behaviors werden im Datenbankschema an beliebige Tabellen angehängt und klinken sich dann sowohl bei der Generierung der Datenbankstruktur, also auch zur Script-Laufzeit ein.</p> <h2>Was sind Flags?</h2> <p>Stellen wir uns als Beispiel eine Tabelle <code>messages</code> vor. Diese könnte wie folgt aussehen:</p> <pre name="code" class="php">+----------------------+--------------+ | Feld | Typ | +----------------------+--------------+ | id | INTEGER(6) | | sender_id | INTEGER(3) | | recipient_id | INTEGER(3) | | subject | VARCHAR(255) | | message | TEXT | | sent_at | TIMESTAMP | | read | TINYINT(1) | | favored | TINYINT(1) | | deleted_by_sender | TINYINT(1) | | deleted_by_recipient | TINYINT(1) | +----------------------+--------------+ </pre> <p>Etwas was ich bei Tabellen öfters verwende ist ein <code>flags</code>-Feld. Mit diesem kann ich obige bool'schen Felder in ein einziges Feld packen. Dies geschieht mit Hilfe einer <a class="DefaultLink" href="http://de.wikipedia.org/wiki/Bitmaske">Bitmaske</a>.</p> <pre name="code" class="php">+--------------+--------------+ | Feld | Typ | +--------------+--------------+ | id | INTEGER(6) | | sender_id | INTEGER(3) | | recipient_id | INTEGER(3) | | subject | VARCHAR(255) | | message | TEXT | | sent_at | TIMESTAMP | | flags | INTEGER(6) | +--------------+--------------+ FLAG_READ = 1 FLAG_FAVORED = 2 FLAG_DELETED_BY_SENDER = 4 FLAG_DELETED_BY_RECIPIENT = 8 </pre> <p>Möchte ich nun die Nachricht als gelesen und vom Empfänger gelöscht markieren, setze ich dem <code>flags</code>-Feld den Wert <code>9</code> (<code>1</code> + <code>8</code>). Dieser Wert ist eindeutig für diesen beiden Flags. Er lässt sich mit keiner anderen Kombinationen der Zahlen <code>1</code>, <code>2</code>, <code>4</code> und <code>8</code> bilden.</p> <p>Der grosse Vorteil eines <code>flags</code>-Feldes ist, dass man neue Flags hinzufügen kann, ohne die Datenbankstruktur verändern zu müssen. Per Bit-Operatoren lassen sich die Flags ausserdem auf simple Weise testen. Weiter in die Thematik von Bitmasken möchte ich aber gar nicht eingehen, dafür gibt's genügend gute Ressourcen im Internet. :-)</p> <h2>API</h2> <p>Die <code>PHPhil_Doctrine_Template_Flagable</code>-Klasse bietet das Folgende:</p> <h3>Konfigurationsoptionen</h3> <pre name="code" class="php">+---------+-------------+----------------------+-------------------------------+ | Name | Typ | Standardwert | Beschreibung | +---------+-------------+----------------------+-------------------------------+ | name | string | 'flags' | Name des Feldes | | alias | string|null | null | Name der Klasseneigenschaft | | type | string | 'int' | Typ des Feldes | | length | int | 12 | Grösse des Feldes | | options | array | array( | Sonstige Doctrine-spezifische | | | | 'default' =&gt; 0, | Optionen des Feldes | | | | 'notnull' =&gt; true, | | | | | ) | | +---------+-------------+----------------------+-------------------------------+ </pre> <h3>An Models "vererbte" Methoden</h3> <pre name="code" class="php">+----------------------+-----------------+--------------------------------------------+ | Methode | Rückgabewert | Beschreibung | +----------------------+-----------------+--------------------------------------------+ | getFlags() | int | Gibt den Wert des Feldes zurück | | setFlags(int $flags) | Doctrine_Record | Setzt den Wert des Feldes | | hasFlag(int $flag) | boolean | Prüft ob ein bestimmtes Flag gesetzt wurde | | setFlag(int $flag) | Doctrine_Record | Setzt ein bestimmtes Flag | | unsetFlag(int $flag) | Doctrine_Record | Entfernt ein gesetztes Flag | | getFlagConstants() | array | Gibt alle Klassenkonstanten mit einem | | | | bestimmten Prefix zurück. Komfortfunktion. | +----------------------+-----------------+--------------------------------------------+ </pre> <h2>Anwendungsbeispiel</h2> <h3>Konfiguration im schema.yml</h3> <pre name="code" class="php">Message: tableName: messages columns: id: type: in... actAs: PHPhil_Doctrine_Template_Flagable: </pre> <h3>Model erweitern</h3> <pre name="code" class="php">class Message extends BaseMessage { const FLAG_READ = 1; const FLAG_FAVORED = 2; const FLAG_DELETED_BY_SENDER = 4; const FLAG_DELETED_BY_RECIPIENT = 8; public function isRead() { return $this-&gt;hasFlag(self::FLAG_READ); } public function markAsRead() { $this-&gt;setFlag(self::FLAG_READ) -&gt;save(); return $this; } public function markAsUnread() { $this-&gt;unsetFlag(self::FLAG_READ) -&gt;save(); return $this; } } </pre> <h2>Code</h2> <p>Und hier nun der eigentliche Code. Viel Spass!</p> <pre name="code" class="php">class PHPhil_Doctrine_Template_Flagable extends Doctrine_Template { /** * @var array */ protected $_options = array( 'name' =&gt; 'flags', 'alias' =&gt; null, 'type' =&gt; 'int', 'length' =&gt; 12, 'options' =&gt; array( 'default' =&gt; 0, 'notnull' =&gt; true, ), ); /** * Add field to table */ public function setTableDefinition() { $name = $this-&gt;getOption('name'); if ($this-&gt;getOption('alias')) { $name .= ' as ' . $this-&gt;getOption('alias'); } $this-&gt;hasColumn($name, $this-&gt;getOption('type'), $this-&gt;getOption('length'), $this-&gt;getOption('options')); } /** * Return all flags * * @return int */ public function getFlags() { return (int)$this-&gt;getInvoker()-&gt;get($this-&gt;getOption('name')); } /** * Set the 'flags' property * * @param int flags * @return Doctrine_Record */ public function setFlags($flags) { $this-&gt;getInvoker()-&gt;set($this-&gt;getOption('name'), (int)$flags); return $this-&gt;getInvoker(); } /** * Check if a specifc flag is set * * @param int $flag * @return boolean */ public function hasFlag($flag) { return (bool)($this-&gt;getFlags() &amp; (int)$flag); } /** * Set a specific flag * * @param int $flag * @return Doctrine_Record */ public function setFlag($flag) { $this-&gt;setFlags((int)$flag | $this-&gt;getFlags()); return $this-&gt;getInvoker(); } /** * Delete a specific flag * * @param int $flag * @return Doctrine_Record */ public function unsetFlag($flag) { $this-&gt;setFlags($this-&gt;getFlags() &amp; ~(int)$flag); return $this-&gt;getInvoker(); } /** * Return all constants of the model beginning with a specific needle * * @param string $needle * @return array */ public function getFlagConstants($needle = 'FLAG_') { $flags = array(); $reflection = new ReflectionClass($this-&gt;getInvoker()); foreach ($reflection-&gt;getConstants() as $name =&gt; $value) { if (0 === strpos($name, $needle)) { $flags[$name] = $value; } } return $flags; } } </pre> http://bigwhoop.ch/artikel/48/2010-05-28/Doctrine-Flagable-BehaviorTemplate info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/48/2010-05-28/Doctrine-Flagable-BehaviorTemplate Fri, 28 May 2010 13:55:21 +0200 Kinobar für TV Serien Zugegeben, ich bin ein Serienjunkie! Bei LOST nahm dieses Hobby seinen Höhepunkt, aber schon Jahre zuvor konnte ich alle Friends-Episoden in- und auswendig. Von Begleitern meiner Jungend wie den Simpsons will ich jetzt gar nicht anfangen. Ups. Egal. <p><strong>Zugegeben, ich bin ein Serienjunkie! Bei LOST nahm dieses Hobby seinen Höhepunkt, aber schon Jahre zuvor konnte ich alle Friends-Episoden in- und auswendig. Von Begleitern meiner Jungend wie den Simpsons will ich jetzt gar nicht anfangen. Ups. Egal.</strong></p><p>Willkommen zur neuen Rubrik "Ideen". In dieser möchte ich in Zukunft Hirngespinste aus allen möglichen Bereichen des Lebens zusammenfassen. Los geht's heute mit der "Kinobar für TV-Serien".</p> <h2>Die Idee</h2> <p>Zugegeben, ich bin ein Serienjunkie! Bei LOST nahm dieses Hobby seinen Höhepunkt, aber schon Jahre zuvor konnte ich alle Friends-Episoden in- und auswendig. Von Begleitern meiner Jungend wie den Simpsons will ich jetzt gar nicht anfangen. Ups. Egal.</p> <p>Jedenfalls kenne ich persönliche wenige (bis gar keine) Menschen, die dieses Hobby teilen und erst noch auf das selbe Zeugs stehen wie ich (Testees. Flight of the Conchords. Anyone?). Meistens macht ein gemeinsames Mitfiebern und Lachen aber mehr Spass. Bier und eine Grossleinwand würden ihr Übriges tun.</p> <p>Rechnen wir zusammen: <strong>Grossleinwand</strong> + <strong>Bier</strong> (wahlweise auch Gin Buck) + <strong>TV-Serien</strong><br /> Ergebnis: <strong>Die Kinobar für TV-Serien</strong></p> <h2>Das Lokal</h2> <p>Eine offener, geräumiger Raum mit grosser Kinoleinwand. Es gibt verschiedene Nischen (für konzentrierte Zuschauer, für gesellige Gruppen, etc), normale Steh- und Sitzplätze und eine Theke/Bar wo nebst Getränken natürlich auch Popcorn, Chips, Pizza, etc. serviert wird.</p> <h2>Preis</h2> <p>Eventuell gibt es eine kleine Eintrittsgebühr (so um die CHF 5.-). Hauptfinanzierung soll aber durch den Umsatz von Verpflegung gemacht werden. Als Anreiz gibt es pro gekauftes Nahrungsmittel einen kleinen Zettel mit Barcode/Nummer. Mit dieser lässt sich online (Homepage, Smartphone-App, etc.) abstimmen, welche Serie (evtl. Episode) wann gespielt werden soll.</p> <h2>Die Serien</h2> <p>Bestenfalls werden die Serien vor oder zeitgleich zur TV-Premiere gezeigt. Es gibt aber auch viele alte Klassiker, die auch heute noch Spass machen. Weiter könnte man Themenabende einführen, Serienroulette spielen oder Specials veranstalten, usw. Die Möglichkeiten sind da fast unbegrenzt. "Fast". ;-)</p> <h2>Die Probleme</h2> <p>Das grösste Problem nebst der Finanzierung (wie will man all diese Gebühren bezahlen?!) ist wohl die rechtliche Lage. Da ich mich da überhaupt nicht auskenne, machts auch nicht gross Sinn was Genaueres dazu zu schreiben. Stelle es mir jedenfalls schwierig vor, sich gegen Fernsehstationen und all die verschiedenen Produzenten und Vertriebshäuser zu behaupten.</p> <p>Das war's fürs Erste. Kommentare und haufenweise Zaster sind erwünscht! :-)</p> http://bigwhoop.ch/artikel/47/2010-05-26/Kinobar-fuer-TV-Serien info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/47/2010-05-26/Kinobar-fuer-TV-Serien Wed, 26 May 2010 21:50:18 +0200 WPA Key mit Sonderzeichen unter Ubuntu Das Einrichten eines WLANs mit einem WPA Key mit Umlauten unter Ubuntu machte mir kürzlich zu schaffen. Das Problem: Die Zeichenkodierung. Die Lösung: Gibt's hier! <p><strong>Das Einrichten eines WLANs mit einem WPA Key mit Umlauten unter Ubuntu machte mir kürzlich zu schaffen. Das Problem: Die Zeichenkodierung. Die Lösung: Gibt's hier!</strong></p><p>Nehmen wir an, ich m&ouml;chte folgendes drahtlose Netzwerk einrichten:</p> <p style="padding-left: 30px;">SSID: <code>BlindMelon</code><br />WPA Key: <code>SieSagenDieGr&ouml;sseSpieleKeineRolle</code></p> <p>So weit ich das Problem verstanden habe, liegt der Fehler dort, dass die meisten Router nocht mit ISO 8859-1 arbeiten, Ubuntu aber standardm&auml;ssig mit UTF-8. Dadurch wird der von Hand eingegebene Key aber falsch &uuml;bermittelt.</p> <p>Die L&ouml;sung liegt darin, dass anstelle des lesbaren Keys auch ein 64-stelliger Hexstring genutzt werden kann. Um diesen zu berechnen kann man unter Ubuntu das kleine CLI-Tool <code>wpa_passphrase</code> nutzen.</p> <p>Und so funktionierts ...</p> <ol> <li>Wir &ouml;ffnen erstmal ein Terminal.</li> <li>Danach setzen wir das Encoding des Terminals auf ISO 8859-1.</li> <li>Anschliessen tippen wir <code>wpa_passphrase BlindMelon </code><code>SieSagenDieGr&ouml;sseSpieleKeineRolle</code> ein und erhalten folgende Ausgabe:<br /><code><br />network={<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ssid="BlindMelon"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #psk="SieSagenDieGr&ouml;sseSpieleKeineRolle"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psk=b9a67b4c042a391fc44ba8ad81c2010d41bf699cd5c5f95a60056fda58724ead<br />}<br /><br /></code></li> <li>Die Zeile mit <code>psk=b9a...</code> ist nun der Key von Interesse und welchen wir anstelle des lesbaren Keys verwenden k&ouml;nnen.</li> </ol> http://bigwhoop.ch/artikel/44/2009-02-11/WPA-Key-mit-Sonderzeichen-unter-Ubuntu info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/44/2009-02-11/WPA-Key-mit-Sonderzeichen-unter-Ubuntu Wed, 11 Feb 2009 10:45:21 +0100 Die Ethik der Programmierer Brandon Savage griff soeben ein sehr interessantes Thema in seinem Blog auf: Inwiefern werden die Moralvorstellungen von Programmieren gewertet und beachtet? <p><strong>Brandon Savage griff soeben ein sehr interessantes Thema in seinem Blog auf: Inwiefern werden die Moralvorstellungen von Programmieren gewertet und beachtet?</strong></p><p>Zuerst m&ouml;chte ich das Thema von Programmierern auf einen speziellen Teil der IT ausweiten: Die geliebten Sysadmins.</p> <p>Aus Erfahrung haben Mitarbeiter der IT grunds&auml;tzlich mehr Zugriffsrechte als normale Angestellte. Diese Rechte beziehen sich nicht nur auf "digitale Rechte", sondern z.B. auch auf Zugang zu Bereichen des Firmengel&auml;ndes. Wie soll ein Router gewartet werden, wenn der Techniker keinen Zutritt hat?! Ausserdem haben IT-Mitarbeiter in der Regel Zugriff auf&nbsp; sehr sensible Daten: Buchhaltung, Passw&ouml;rter, E-Mails, etc. Programmierer bringen desweiteren eine grosse Verantwortung mit, wenn sie mit diesen Daten etwas machen sollen. Unsichere Software kann da schon mal gesch&auml;ftskritisch sein.</p> <p>Bei meinem letzten Arbeitgeber wurde eine Buchhalterin per sofort freigestellt, als man sich entschloss, das Arbeitsverh&auml;ltnis aufzul&ouml;sen. Ich lies mir sagen, dass dies in solch kritischen Gesch&auml;ftsbereichen normal ist. Gleichzeitig musste ich aber auch die Stirn runzeln und mich selbst fragen: "Wissen die da oben &uuml;berhaupt, welches Wissen und welche "Macht" ich habe oder ohne weiteres erlangen kann?"</p> <p>Die Frage ist jetzt, ob sich Firmen dieses Risikos nicht bewusst sind, nichts dagegen unternehmen wollen oder schlicht damit Leben m&uuml;ssen? Da mich letzteres schockieren w&uuml;rde tippe ich trotz meiner relativ kurzen Berufserfahrung auf ersteres und hoffe, dass sich dieser Umstand in Zukunft &auml;ndern wird.</p> <p>Brandon Savage bedauert in <a class="DefaultLink" href="http://www.brandonsavage.net/ethics-for-programmers/" target="_blank">seinem Post</a> vor allem, dass Programmierer im Gegensatz zu anderen Branchen kaum auf Ethik geschult werden und es keine Richtlinien gibt. Dies kann ich so nat&uuml;rlich nur unterschreiben.</p> http://bigwhoop.ch/artikel/40/2009-08-13/Die-Ethik-der-Programmierer info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/40/2009-08-13/Die-Ethik-der-Programmierer Thu, 13 Aug 2009 00:39:36 +0200 Wie ich Zend Certified Engineer wurde (mit Gewinnspiel) Zugegeben, der Titel klingt etwas hochgestochen, doch möchte ich in diesem Artikel nur kurz meine Erfahrungen und meine Vorgehensweise auf dem Weg zum Zend Certified Engineer weitergeben. <p><strong>Zugegeben, der Titel klingt etwas hochgestochen, doch möchte ich in diesem Artikel nur kurz meine Erfahrungen und meine Vorgehensweise auf dem Weg zum Zend Certified Engineer weitergeben.</strong></p><h2>Mein Vorwissen</h2> <p>Zur Zeit bin ich 22 Jahre alt. Angefangen PHP zu programmieren habe ich irgendwann zwischen 2001 und 2002, also mit etwa 14/15 Jahren. Es m&uuml;sste demnach eine 4.1.x Version von PHP gewesen sein. Ziemlich lange war dieses Interesse aber sehr oberfl&auml;chlich. W&auml;hrend meiner Ausbildung lernte ich vor allem ASP und C++, wodurch PHP zum Hobby verkam. Nach der Ausbildung und w&auml;hrend meiner ersten beruflichen T&auml;tigkeit begann das Interesse an PHP zu wachsen. Gr&uuml;nde waren die tollen, neuen M&ouml;glichkeiten von PHP 5 und die Tatsache, dass es mein damaliger Arbeitgeber verpasste von ASP (in meinen Augen einfach nur eine Zangengeburt) auf ASP.NET zu wechseln. Unterm Strich war PHP einfach anwenderfreundlich, leistungsstark und ... gratis!</p> <p>Zwar kannte ich objektorientierte Programmierung aus C++ etwas, einen tieferen Einblick erlangte ich aber erst mit PHP 5(.1). In dieser Zeit begann ich auch mich vermehrt mit weiterf&uuml;hrenden Themen der Programmierung zu befassen: Design Patterns (MVC, ARP), Security, Caching, usw.</p> <p>Von Sommer 2007 an arbeitete ich dann zwei Jahre bei einem Arbeitgeber wo ich endlich PHP beruflich programmieren konnte. Durch ein sehr abwechslungsreiches und grosses Projekt und dank meines direkten Mitarbeiters im Backend-Bereich, der mich st&auml;ndig mitzog, konnte ich sehr, sehr viel lernen. Ich lernte das Zend Framework kennen (und damit viele gute Ans&auml;tze in Sachen Webdevelopment), Propel ORM und vor allem all die kleinen Dinge die man nicht auflisten kann. In meiner Freizeit besch&auml;ftigte ich mich ebenfalls stetig mit dem gesamten Spektrum von <a class="DefaultLink" href="http://de.wikipedia.org/wiki/Webwork" target="_blank">Webwork</a> und versuchte mich stetig weiterzuentwicklen.</p> <p style="font-weight : bold;">Zusammenfassend hatte ich ein gutes, umfassendes Vorwissen in PHP und vor allem OOP (in PHP). Wegen der Benutzung von Fremdbibliotheken und Frameworks und der dahingehenden Abstraktion verlor ich mit der Zeit aber etwas den Bezug zu den Basics. Als Beispiel nenne ich da jetzt mal die mysql_*- oder neueren mysqli_*-Funktionen (PDO ist eh das einzige Wahre :P).</p> <h2>Meine Vorbereitung</h2> <p>Anfangs 2009 spielte ich erstmals mit dem Gedanken die Zend Zertifizierung zu machen. Dieser Gedanke wurde aber nie richtig konkret und so ging er in Vergessenheit. Per Ende Juni k&uuml;ndigte ich dann meine damalige Arbeitsstelle und die Idee zur Zertifizierung kam zwecks Stellensuche und sinnvoller Freizeitgestaltung wieder auf.</p> <p>Zuerst begann ich im Internet nach Erfahrungsberichten zu suchen. Diese beinhalteten allerdings meisten nur den Tipp, einfach das PHP Manual Wort f&uuml;r Wort zu lesen. So bl&ouml;d es klingt, dieser Tipp ist in der Tat der beste, um sich das am Testtag gefragte Wissen &uuml;ber PHP anzueignen. Wie sinnvoll dieses Wissen ist, sei dahingestellt. Es ist aber durchaus von Vorteil wenn man z.B. weiss in welcher Reihenfolge bei bekannten String-Funktionen die Parameter erwartet werden oder wann und wie PHP die Datentypen dynamisch wechselt. Viel dieses Wissens ist in der Praxis nicht wirklich von N&ouml;ten, da man z.B. dank Autocomplete nicht alle Funktionen auswendig kennen muss und schon gar nicht, in welcher Reihenfolge die Argumente erwartet werden (PHP ist da ja nicht gerade sehr konsistent).</p> <p style="font-weight : bold;">Dennoch: Manual gut lesen! Man muss die Stream-Funktionen kennen, das PHP 5 OO Model, die Unterschiede zwischen PHP 4 und 5, all die verschiedenen XML Parser und vor allem die gesamten Basics wie Syntax, Datentypen (Arrays!), usw.</p> <p>Damit ich mir ein Bild machen konnte wie die Pr&uuml;fung abl&auml;uft, kaufte ich zehn ZCE Mock Exams (f&uuml;nf davon habe ich noch und werde sie am Ende dieses Artikels als kleines Gewinnspiel ausschreiben). Der Test findet am Computer statt und man wird mit Single Choice-, Multiple Choice- und Freetext-Fragen konfrontiert. Bei Multiple Choice-Fragen steht jeweils wie viele Antworten erwartet werden und bei den Freetext-Aufgaben muss man jeweils nur ein Wort schreiben, z.B. "Singleton". Der Test besteht aus 70 Fragen, wof&uuml;r man 90 Minuten Zeit hat. Man kann jede Frage am Ende des Tests nochmals &ouml;ffnen und &auml;ndern.</p> <p>Diese Probeexamen lernten mich vor allem eines: Man muss an das Undenkbare denken! Es werden Fragen gestellt, die auf absichtlichem Missbrauch von PHP basieren. Ausserdem halfen mir die Teste mich besser auf meine Schw&auml;chen konzentrieren zu k&ouml;nnen und sie gaben mir auch immer wieder Schlagw&ouml;rter, die mich zu neuen Erkenntnissen f&uuml;hrten. Zum Beispiel "Cross-Site Request Forgery". Ein paar <a class="DefaultLink" href="http://bigwhoop.ch/artikel/28/2009-07-07/Some-ZCE-Mock-Exam-Questions" target="_blank">Beispielfragen</a> habe ich in meinem Blog bereits gepostet.</p> <p style="font-weight: bold;">Vom Niveau her fand ich die eigentliche Pr&uuml;fung etwas schwieriger als die Probeexamen. Da diese aber nicht allzu teuer sind, kann ich jedem nur empfehlen, drei bis f&uuml;nf Tests zu kaufen. Mehr braucht's nicht! Ausserdem wiederholen sich die Fragen dann schon ...</p> <p>Etwa zwei Wochen besch&auml;ftigte ich mich intensiv (damit meine ich vielleicht zwei Stunden/Tag) mit der Pr&uuml;fungsvorbereitung. Danach viel ich irgendwie wieder in ein kleines Loch, worauf ich mich spontan in den fr&uuml;hen Morgenstunden (nach einem Samstagabend ...) f&uuml;r den Test anmeldete - f&uuml;r den kommenden Mittwoch. Die n&auml;chsten drei Tage lernte ich deshalb nochmals fleissig, machte noch einen Probeexamen und freute mich dann ganz entspannt auf die Pr&uuml;fung. :P</p> <h2>Meine Pr&uuml;fung</h2> <p>Besagten Mittwoch um 10:30 Uhr stand ich auf der Matte eines Pearson VUE Testcenters in Bern. Pearson VUE f&uuml;hrt f&uuml;r Zend die Examen in zertifizierten Testcentern durch. Dies hat den Vorteil, dass man sogar in jeder gr&ouml;sseren Schweizer Stadt die Zertifizierung machen kann. Sehr praktisch, da man sich Ort, Datum und Zeit ziemlich flexibel aussuchen kann.</p> <p>Nach einem Schluck Wasser und meiner Unterschrift unter dem Antrittsformular wurde ich auch schon in einen Raum voller Computer gef&uuml;hrt. Nebst mir waren nur etwa zwei weitere Personen anwesend, die aber (ziemlich sicher) eine andere Zertifizierung machten. Ein Aufseher war nicht im Raum, jedoch wurde der Raum Kamera&uuml;berwacht. Ich fand die Atmosph&auml;re allerdings sehr entspannt und ich konnte mich gut konzentrieren.</p> <p>Was mir etwas Probleme bereitete, war, dass ich den Test auf Deutsch machte, obwohl ich mich ganzheitlich auf Englisch vorbereitete. Gewisse Fachbegriffe klangen einfach komisch und ich &uuml;bersetzte mir die Fragen des&ouml;fteren ins Englische, damit ich ein besseres Verst&auml;ndnis erlangte. Je nach Englischkenntnissen w&uuml;rde ich also empfehlen, den Test auf Englisch zu machen.<br />Ausserdem gab es eine Multiple Choice-Frage die laut Fragestellung drei Antworten erwartete, man aber nur zwei ausw&auml;hlen konnte. Die etwas &uuml;berforderte Angestellte des Testcenters konnte mir dabei auch nicht wirklich helfen (nach dem Motto: "Reboot tut immer gut").</p> <p>Die 90 Minuten waren - wie schon bei den Probeexamen - mehr als gut berechnet und so konnte ich ohne Probleme nochmals alle Fragen durchgehen und trotzdem fr&uuml;hzeitig beenden (etwa nach 70 - 75 Minuten). Die Schwierigkeit des Tests w&uuml;rde ich als "fortgeschritten" einstufen. Man muss sicher kein Profi sein, wer sich jedoch nicht tiefer mit der Sprache besch&auml;ftigt, wird kaum eine Chance haben.</p> <p>Und ja, erfreulicherweise bestand ich und seit dem 22. Juli darf ich mich offiziell "Zend Certified Engineer" nennen. :-)</p> <p>@See: <a class="DefaultLink" href="http://www.zend.com/zce.php?c=ZEND011434&amp;r=231232923" target="_blank">Mein ZCE Profil</a></p> <p>Fragen beantworte ich nat&uuml;rlich gerne in den Comments!</p> <h2>Gewinnspiel</h2> <p><del>Wie geschrieben habe ich noch f&uuml;nf offene Testexamen zu verschenken.</del> Per Twitter (@phphil) m&ouml;chte ich deshalb gerne wissen, an welchem Wochentag ich mich f&uuml;r den Test angemeldet (nicht teilgenommen) habe. Sobald ein paar Teilnahmen eingegangen sind, werde ich einen Gewinner auslosen. Viel Gl&uuml;ck!</p> <p style="font-weight: bold;">Herzlichen Glückwunsch an <a class="DefaultLink" href="http://twitter.com/benni3005">Benni Hofmann</a>! Die richtige Antwort war natürlich <em>Sonntag</em>.</p> http://bigwhoop.ch/artikel/39/2009-12-08/Wie-ich-Zend-Certified-Engineer-wurde-mit-Gewinnspiel info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/39/2009-12-08/Wie-ich-Zend-Certified-Engineer-wurde-mit-Gewinnspiel Tue, 08 Dec 2009 18:01:25 +0100 Meine Lieblingsmomente aus Film und Serie Szenen die mir in Erinnerung blieben und ich immer wieder gerne schaue. Kommen bestimmt noch ein paar dazu. Später. <p><strong>Szenen die mir in Erinnerung blieben und ich immer wieder gerne schaue. Kommen bestimmt noch ein paar dazu. Später.</strong></p><p> <script src="/js/swfobject.js" type="text/javascript"></script> </p> <h2>Die Tanzszene aus NAPOLEON DYNAMITE</h2> <div id="player1">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/napoleon_dynamite_dance.flv&dock=false'); so.write('player1'); // --></script> </p> <h2>Die Tanzszene aus HOT ROD und der anschliessende Fall</h2> <div id="player2">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/hot_rod_dance_and_fall.flv&dock=false'); so.write('player2'); // --></script> </p> <h2>Eine weitere klitzekleine Tanzeinlage in HOT ROD</h2> <div id="player3">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/hot_rod_little_dance.flv&dock=false'); so.write('player3'); // --></script> </p> <h2>Jim Carries Andy Kaufman Interpretation in MAN ON THE MOON</h2> <div id="player4">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/man_on_the_moon_mighty_mouse.flv&dock=false'); so.write('player4'); // --></script> </p> <h2>Barneys Video R&eacute;sum&eacute; aus HOW I MET YOUR MOTHER</h2> <div id="player5">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/barneys_video_resume.flv&dock=false'); so.write('player5'); // --></script> </p> <h2>Die Verfolgungsjagd aus OBSERVE AND REPORT</h2> <div id="player6">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/observe_and_report_chase_scene.flv&dock=false'); so.write('player6'); // --></script> </p> <h2>Der Smalltalk in ZACK AND MIRI MAKE A PORNO</h2> <div id="player7">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/zack_and_miri.flv&dock=false'); so.write('player7'); // --></script> </p> <h2>Der Tod spielt Bass in BILL AND TED'S BOGUS JOURNEY</h2> <div id="player8">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/death_in_bill_and_ted.flv&dock=false'); so.write('player8'); // --></script> </p> <h2>Der Drill am Anfang von FULL METAL JACKET</h2> <div id="player9">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/full_metal_jacket_thrill.flv&dock=false'); so.write('player9'); // --></script> </p> <h2>Das Ende von ESCAPE FROM LA</h2> <div id="player10">Loading ...</div> <p> <script type="text/javascript"><!-- var so = new SWFObject('/swf/mediaplayer/player.swf','mpl','740','440','9'); so.addParam('allowscriptaccess','always'); so.addParam('allowfullscreen','true'); so.addParam('flashvars','&file=http://pub.bigwhoop.ch/fav-vids/escape_from_la_ending.flv&dock=false'); so.write('player10'); // --></script> </p> http://bigwhoop.ch/artikel/36/2009-06-08/Meine-Lieblingsmomente-aus-Film-und-Serie info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/36/2009-06-08/Meine-Lieblingsmomente-aus-Film-und-Serie Mon, 08 Jun 2009 18:03:35 +0200 FizzBuzz, Baby!!! ... etwas woran viele, viele Programmierer scheinbar scheitern. <p><strong>... etwas woran viele, viele Programmierer scheinbar scheitern.</strong></p><p>Das Thema ist zwar schon etwas &auml;lter, hat mich aber erst jetzt erreicht.</p> <p>Eine These besagt, dass Programmierer die einfache Probleme nicht l&ouml;sen k&ouml;nnen, auch ihre M&uuml;he mit komplexe(re)n Problemen haben - selbst wenn sie seit langem programmieren und als erfahren gelten. Dies soll sich vorallem durch lange Entwicklungszeit ausdr&uuml;cken.</p> <p>Da sich auf ausgeschriebene Stellen scheinbar viele Interessenten bewerben (keine Ahnung inwiefern man dies auf Europa und speziell aufs Webdevelopment &uuml;bertragen kann), hat <a class="DefaultLink" href="http://imranontech.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/" target="_blank">ein gewitzer, junger Herr namens Imran</a> ein Kinderspiel f&uuml;r die Softwareentwicklung adaptiert: Die sogenannten FizzBuzz Fragen.</p> <p>Dazu nennt er ein Beispiel, welches von einem Bewerber w&auml;hrend des Vorstellungsgespr&auml;ches gel&ouml;st werden soll:</p> <blockquote>Write a program that prints the numbers from 1 to 100. But for multiples of three print &ldquo;Fizz&rdquo; instead of the number and for the multiples of five print &ldquo;Buzz&rdquo;. For numbers which are multiples of both three and five print &ldquo;FizzBuzz&rdquo;.</blockquote> <p>Frei &uuml;bersetzt ...</p> <blockquote>Schreibe eine Anwendung, welche die Nummern 1 bis 100 ausgibt. Anstelle von Vielfachen von 3 soll aber das Wort "Fizz", anstelle von Vielfachen von 5 das Wort "Buzz" und anstelle von Vielfachen von 3 und 5 das Wort "FizzBuzz" ausgegeben werden.</blockquote> <p>Laut mehreren Posts in der Blogosph&auml;re scheinen an dieser doch relativ einfachen Aufgabe viele, viele Anw&auml;rter zu scheitern, bzw. mehr als 10 Minuten zu brauchen. Klingt aus meiner Sicht unglaublich ...</p> <p>Auf der 2. Seite gibt's meine L&ouml;sung. Nun viel Spass beim Knobbeln! ;-)</p><h2>Meine L&ouml;sung</h2> <pre name="code" class="php">foreach (range(1, 100) as $i) { switch (0) { case $i % 15 : echo 'FizzBuzz'; break; case $i % 3 : echo 'Fizz'; break; case $i % 5 : echo 'Buzz'; break; default : echo $i; break; } echo '&lt;br /&gt;'; }</pre> <p>Erzeugt folgende Ausgabe ...</p> <pre>1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 ...</pre> http://bigwhoop.ch/artikel/35/2009-07-29/FizzBuzz-Baby info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/35/2009-07-29/FizzBuzz-Baby Wed, 29 Jul 2009 11:00:52 +0200 Der Unterschied zwischen <em>valid</em> und <em>well-formed</em> Das W3C bietet einen tollen Dienst zum Validieren von (X)HTML Dokumenten. Doch was heisst eigentlich <em>valid</em>? Anhand von XHTML, bzw. XML möchte ich da etwas Klarheit schaffen. <p><strong>Das W3C bietet einen tollen Dienst zum Validieren von (X)HTML Dokumenten. Doch was heisst eigentlich <em>valid</em>? Anhand von XHTML, bzw. XML möchte ich da etwas Klarheit schaffen.</strong></p><p>Ein Beispiel erleichtert wie immer den Einstieg.</p> <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;root /&gt;</pre> <p>Entgegen weitverbreiteter Annahme ist dieses XML Snippet nicht <em>valid</em>, sondern "nur" <em>well-formed</em> (wohlgeformt). Dies bedeutet, dass zwar die Regeln der XML Syntax eingehalten wurden und ein Parser problemlos mit dem Code umgehen k&ouml;nnte, aber die verwendete Struktur und deren Elemente nicht einer bestimmten Grammatik unterliegen. Man kann dies durchaus mit der Grammatik der deutschen Sprache vergleichen. In dieser ist zum Beispiel definiert, dass Nomen gross geschrieben werden. Ergo ist die Grammatik falsch, sobald ein Nomen klein geschrieben wird.</p> <p>Da XML eine Form der Darstellung ist (als Vergleich k&ouml;nnen die lateinischen Zeichen herhalten), enh&auml;lt sie per se keine grammatikalischen Regeln. Genauso wie ich mit den lateinischen Zeichen sowohl deutsche, also auch englische Texte schreiben kann. Will ich einen Satz auf deutsche Grammatik &uuml;berpr&uuml;fen, muss da irgendwie ein Bezug bestehen. Bei der Sprache ist dieser durch Metadaten (z.B. sagt mir jemand der folgende Text ist Deutsch) oder durch Erraten (wenn ich einen Text lese, erkenne ich grunds&auml;tzlich in welcher Sprache er geschrieben ist, solange ich die Sprache "kenne") gegeben.</p> <p>Bei XML muss dieser Bezug aber explizit hergestellt werden. Und dazu gibt es zwei M&ouml;glichkeiten:</p> <ul> <li>per Document Type Definition (DTD)</li> <li>per XML Schemas</li> </ul> <p>Da letztere M&ouml;glichkeit f&uuml;r unser Beispiel nicht von Relevanz ist, m&ouml;chte ich auch nicht n&auml;her darauf eingehen.</p> <h2>Document Type Definition</h2> <blockquote>Eine Dokumenttypdefinition (englisch Document Type Definition, DTD, auch Schema-Definition oder DOCTYPE) ist ein Satz an Regeln, der benutzt wird, um Dokumente eines bestimmten Typs zu deklarieren. [...] Die Dokumenttypdefinition besteht dabei aus Elementtypen, Attributen von Elementen, Entit&auml;ten und Notationen. Konkret hei&szlig;t das, dass in einer DTD die Reihenfolge, die Verschachtelung der Elemente und die Art des Inhalts von Attributen festgelegt wird - kurz gesagt: die Struktur des Dokuments.</blockquote> <p>Soviel zur Wikipedia-Definition. Auch hier sagt ein Beispiel wieder mehr als lange, kryptische S&auml;tze. Vergleichen wir die DTD f&uuml;r <a class="DefaultLink" href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" target="_blank">XHTML 1.0 Strict</a> und <a class="DefaultLink" href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">XHTML 1.0 Transitional</a> bez&uuml;glich der erlaubten Attribute des <code>a</code>-Elements (Anchor).</p> <pre>&lt;!ATTLIST A id ID #IMPLIED class CDATA #IMPLIED style %StyleSheet; #IMPLIED title %Text; #IMPLIED lang %LanguageCode; #IMPLIED xml:lang %LanguageCode; #IMPLIED dir (ltr|rtl) #IMPLIED onclick %Script; #IMPLIED ondblclick %Script; #IMPLIED onmousedown %Script; #IMPLIED onmouseup %Script; #IMPLIED onmouseover %Script; #IMPLIED onmousemove %Script; #IMPLIED onmouseout %Script; #IMPLIED onkeypress %Script; #IMPLIED onkeydown %Script; #IMPLIED onkeyup %Script; #IMPLIED accesskey %Character; #IMPLIED tabindex %Number; #IMPLIED onfocus %Script; #IMPLIED onblur %Script; #IMPLIED charset %Charset; #IMPLIED type %ContentType; #IMPLIED name NMTOKEN #IMPLIED href %URI; #IMPLIED hreflang %LanguageCode; #IMPLIED rel %LinkTypes; #IMPLIED rev %LinkTypes; #IMPLIED shape %Shape; "rect" coords %Coords; #IMPLIED &gt; </pre> <p>Dies ist der Auszug aus der DTD von XHTML 1.0 Strict. Die Definition f&uuml;r XHTML 1.0 Transitional unterscheidet sich nur in einer zus&auml;tzlichen Zeile:</p> <pre>target %FrameTarget; #IMPLIED </pre> <p>Diese erlaubt, wie man sich denken kann, die Verwendung des <code>target</code>-Attributes in XHTML 1.0 Transitional.</p> <pre name="code" class="html">&lt;!-- Nicht valid in XHTML 1.0 Strict --&gt; &lt;!-- Valid in XHTML 1.0 Transitional --&gt; &lt;a href="http://example.org" target="_blank"&gt;Test&lt;/a&gt;</pre> <p>Zur Erinnerung: Der Code ist auch <em>well-formed</em>, allerdings hat dies nichts mit der DTD zu tun, sondern mit der XML Syntax.</p> <h2>Fazit</h2> <p>Da der Unterschied zwischen <em>well-formed</em> und <em>valid</em> jetzt klar ist, muss man sich nur selbst etwas an der Nase nehmen und im Kontext stehts den richtigen Ausdruck verwenden. Aus Erfahrung passiert der Fehler meist in Gespr&auml;chen und aus der Tatsache, dass f&uuml;r eigene XML Strukturen keine DTD geschrieben werden.</p> http://bigwhoop.ch/artikel/34/2009-07-27/Der-Unterschied-zwischen-emvalidem-und-emwell-formedem info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/34/2009-07-27/Der-Unterschied-zwischen-emvalidem-und-emwell-formedem Mon, 27 Jul 2009 11:39:35 +0200 Namenskonvention von Interfaces und abstrakten Klassen in PHP 5.3 Durch die Verwendung von Namespaces traf ich auf ein Problem hinsichtlich der Benennung meiner Interfaces und abstrakten Klassen. <p><strong>Durch die Verwendung von Namespaces traf ich auf ein Problem hinsichtlich der Benennung meiner Interfaces und abstrakten Klassen.</strong></p><p>Als &uuml;berzeugter Zend Framework-Nutzer folge ich beim Programmieren auch dessen Coding Guidelines. Dies bedeutet f&uuml;r Interfaces und abstrakte Klassen folgende Konvention:</p> <pre name="code" class="php">// Interface in Zend/View/Interface.php interface Zend_View_Interface {} // Abstrakte Klasse in Zend/View/Abstract.php abstract class Zend_View_Abstract {}</pre> <p>Diese Konvention hat den Vorteil, dass man durch das Ersetzen des Unterstrichs durch den Verzeichnisseparator auf einfache Art auf den Speicherort der Klasse/des Interfaces schliessen kann.</p> <p>Da wir aber mittlerweile alle wissen, dass in PHP 5.3 Namespaces eingef&uuml;hrt wurden, &auml;ndert sich diese Konventionen grundlegend.</p> <pre name="code" class="php">// Interface in Zend/View/Interface.php namespace Zend\View; interface Interface {} // Abstrakte Klasse in Zend/View/Abstract.php namespace Zend\View; abstract class Abstract {}</pre> <p>Wie ihr bestimmt bemerkt hab ist obiges Beispiel unbrauchbar. Da <code>interface</code> und <code>abstract</code> reservierte W&ouml;rter sind, k&ouml;nnen wir sie nicht f&uuml;r Deklarationen verwenden.</p> <p>Als L&ouml;sungansatz schweben mir da mehrere Varianten vor.</p> <h2>"Hungarische Notation"</h2> <p><code>I</code> f&uuml;r Interface und <code>A</code> f&uuml;r abstrakte Klassen.</p> <pre name="code" class="php">// Interface in Zend/View/IView.php namespace Zend\View; interface IView {} // Abstrakte Klasse in Zend/View/AView.php namespace Zend\View; abstract class AView {}</pre> <p>... oder ohne das Package ...</p> <pre name="code" class="php">// Interface in Zend/IView.php namespace Zend; interface IView {} // Abstrakte Klasse in Zend/AView.php namespace Zend; abstract class AView {}</pre> <h2>Als Teil des Subpackages</h2> <pre name="code" class="php">// Interface in Zend/ViewInterface.php namespace Zend; interface ViewInterface {} // Abstrakte Klasse in Zend/ViewAbstract.php namespace Zend; abstract class ViewAbstract {}</pre> <p>... oder in umgekehrter Schreibweise ...</p> <pre name="code" class="php">// Interface in Zend/InterfaceView.php namespace Zend; interface InterfaceView {} // Abstrakte Klasse in Zend/AbstractView.php namespace Zend; abstract class AbstractView {}</pre> <h2>Beschreibende Interface-Namen</h2> <p>Wie in der SPL: <code>Countable</code>, <code>Traversable</code>, etc.</p> <pre name="code" class="php">// Interface in Zend/View/Viewable.php namespace Zend\View; interface Viewable {}</pre> <p>Jetzt seid ihr dran: Welche Idee bevorzugt ihr? Habt ihr gar einen anderen Vorschlag?</p> http://bigwhoop.ch/artikel/33/2009-07-19/Namenskonvention-von-Interfaces-und-abstrakten-Klassen-in-PHP-53 info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/33/2009-07-19/Namenskonvention-von-Interfaces-und-abstrakten-Klassen-in-PHP-53 Sun, 19 Jul 2009 13:53:32 +0200 Mathematik revisited: Umrechnen von Zahlensystemen Momentan bin ich dabei gewisse schulische Grundlagen wieder etwas aufzufrischen. Dazu gehört auch das Umrechnen von Zahlensystemen im Kopf. Hier ein kleiner Spickzettel. <p><strong>Momentan bin ich dabei gewisse schulische Grundlagen wieder etwas aufzufrischen. Dazu gehört auch das Umrechnen von Zahlensystemen im Kopf. Hier ein kleiner Spickzettel.</strong></p><h2>Hexadezimal <code>0xE6FA</code> nach Oktal</h2> <p>Zur erfolgreichen Umrechnung muss das Hexadezimalsystem bekannt sein. D.h. man muss wissen, dass A = 10, B = 11, ... F = 15 ist. Zur Umrechnung ins oktale Zahlensystem gehen wir den Umweg &uuml;ber das Dezimalsystem.</p> <h3>1. Hexadezimal nach Dezimal (= Basis 16)<br /></h3> <pre>E/14 * 16 * 16 * 16 = 57344 6 * 16 * 16 = 1536 F/15 * 16 = 240 A/10 = 10 ------------------------------- = 59130 </pre> <p>Die Basis ist austauschbar. Wenn man vom Oktal- ins Dezimalsystem rechnen m&ouml;chte, m&uuml;sste man einfach mit 8 multiplizieren.</p> <h3>2. Dezimal nach Oktal (= Basis 8)<br /></h3> <pre>59130 / 8 = 7391 Rest 2 7391 / 8 = 923 Rest 7 923 / 8 = 115 Rest 3 115 / 8 = 14 Rest 3 14 / 8 = 1 Rest 6 1 / 8 = 0 Rest 1 ------------------------- -&gt; 0163372 </pre> <p>Das Result ergibt sich hier aus den zusammengefassten Restzahlen. Auch hier kann man die Basis einfach austauschen. M&ouml;chte man vom Dezimal- ins Hexadezimalsystem umrechnen, w&uuml;rde man durch 16 teilen (und nat&uuml;rlich Rest = 13 noch in Rest = D umwandeln).</p> http://bigwhoop.ch/artikel/32/2009-07-16/Mathematik-revisited-Umrechnen-von-Zahlensystemen info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/32/2009-07-16/Mathematik-revisited-Umrechnen-von-Zahlensystemen Thu, 16 Jul 2009 02:42:30 +0200 Zend Extensions in PHP 5.3 laden Ein kleiner, aber wichtiger Change in PHP 5.3, der mich ein paar Stunden kostete ... <p><strong>Ein kleiner, aber wichtiger Change in PHP 5.3, der mich ein paar Stunden kostete ...</strong></p><p>Gestern r&auml;umte ich meine lokale Entwicklungsumgebung auf. XAMPP flog raus, Apache 2.2 und PHP 5.3 kamen "standalone" rein (MySQL l&auml;uft bei mir auf einem Heimserver). Mir war das ganze Gewurstel einfach zu un&uuml;bersichtlich geworden.</p> <p>Jedenfalls kam ich im Zuge dieser Neuinstallationen-/konfigurationen auch an den Punkt, wo ich mein geliebtes Xdebug installieren wollte. Aus irgendeinem Grund wollte sich dieses jedoch nicht als Zend Extension laden lassen. Eine Fehlermeldung erhielt ich nicht und als normale Extension klappte es wunderbar.</p> <p>Heute konnte mir der Twitter-Channel von Xdebug die einfache L&ouml;sung mitteilen: <strong>Anstatt <code>zend_extension_ts</code> muss in PHP 5.3 nur noch <code>zend_extension</code> verwendet werden. </strong>Die Direktiven <code>zend_extension_ts</code> und <code> </code><code>zend_extension_debug</code> werden seit PHP 5.3 ignoriert.</p> <p>Leider findet sich zu diesem Change weder im <a class="DefaultLink" href="http://ch.php.net/manual/en/ini.core.php#ini.zend-extension-ts" target="_blank">PHP Manual</a>, noch im <a class="DefaultLink" href="http://xdebug.org/docs/install" target="_blank">Xdebug Installation Guide</a> ein Hinweis. Ich hoffe, dies &auml;ndert sich noch ... :-)</p> <p>Den einzigen Hinweis fand ich im <a class="DefaultLink" href="http://ch.php.net/manual/en/migration53.ini.php" target="_blank">Migration Guide f&uuml;r PHP 5.3</a>: <em>"zend_extension_debug and zend_extension_ts have been removed. Use the zend_extension directive to load all Zend Extensions."</em></p> <h2>Nachtrag</h2> <p>Derick hat soeben die Xdebug Dokumentation geupdatet. Wunderbar. :-)</p> http://bigwhoop.ch/artikel/31/2009-12-07/Zend-Extensions-in-PHP-53-laden info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/31/2009-12-07/Zend-Extensions-in-PHP-53-laden Mon, 07 Dec 2009 10:47:37 +0100 PHP Arrays - Eine All-In-One Lösung Wer ausschliesslich mit PHP programmiert hat eine etwas eigene Sicht auf Arrays. In diesem Artikel möchte ich da ein wenig Aufklärung leisten. <p><strong>Wer ausschliesslich mit PHP programmiert hat eine etwas eigene Sicht auf Arrays. In diesem Artikel möchte ich da ein wenig Aufklärung leisten.</strong></p><p>Das PHP Array ist ein enorm m&auml;chtiges Konstrukt. Es ist - wie PHP auch - sehr flexibel gebaut und auf viele, unterschiedliche Arten verwendbar. Im Folgenden setze ich das Grundwissen voraus, wie Arrays in PHP angewandt werden. Sicherheitshalber noch einmal ein paar Fakten:</p> <ul> <li>Indexe (Keys) k&ouml;nnen vom Typ Integer oder String sein. Floats werden zu einem Integer gecastet</li> <li>Arrays oder Objekte k&ouml;nnen nicht als Index verwendet werden</li> </ul> <pre name="code" class="php">// Array mit numerischen Indexen $a = array('Eins', 'Zwei', 'Drei'); // Assoziatives Array $a = array('Null' =&gt; 'Eins', 'Eins' =&gt; 'Zwei', 'Zwei' =&gt; 'Drei'); // Mixed Array $a = array(4 =&gt; 'Eins', 'F&uuml;nf' =&gt; 'Zwei', 'Drei');</pre> <p>Der interne Zeiger wird bei jedem numerischen Key um eins hochgez&auml;hlt. Im letztem Beispiel hat das Element <code>Drei</code> deshalb den Index <code>5</code>.</p> <p>In den meisten Programmiersprachen gibt es mehrere Konstrukte zur Haltung von Daten. Dies hat vor allem den Vorteil, dass die Daten klarer strukturiert und je nach Anwendung auf definierte Art und Weise gehandhabt werden. Im Folgenden m&ouml;chte ich auf ein paar dieser Konstrukte eingehen, sie auf einfache Art erkl&auml;ren und anschliessend zeigen, wie sie mittels SPL auch in PHP verwendet werden k&ouml;nnen.</p> <h2>Hashtable</h2> <p>Eine Hashtable, oder auch Hashmap, kann man sich als klassisches, assoziatives PHP Array vorstellen. Allerdings ohne besagte Limitierungen hinsichtlich Indexe. Die Definition ist ein bisschen w&auml;sserig, da es in PHP keine strenge Typisierung gibt. In vielen anderen Programmiersprachen ist ein Array immer von nur einem Typ (String-Array, Byte-Array, etc.).</p> <pre name="code" class="php">class Hashtable implements ArrayAccess { protected $_data = array(); public function offsetSet($key, $value) { $key = $this-&gt;_normalizeKey($key); $this-&gt;_data[$key] = $value; } public function offsetGet($key) { $key = $this-&gt;_normalizeKey($key); return $this-&gt;_data[$key]; } public function offsetUnset($key) { $key = $this-&gt;_normalizeKey($key); unset($this-&gt;_data[$key]); } public function offsetExists($key) { $key = $this-&gt;_normalizeKey($key); return isset($this-&gt;_data[$key]); } &nbsp; protected function _normalizeKey($key) { if ($key instanceof stdClass) { $key = spl_object_hash($key); } elseif (is_array($key)) { $key = md5(serialize($key)); } return $key; } } $h = new Hashtable(); $o1 = new stdClass(); $o2 = new stdClass(); $h[$o1] = $o2;</pre> <p>In der sogenannten Standard PHP Library (SPL) gibt es eine Klasse zum Speichern von Objekten. Da diese fest in PHP integriert ist, hat sie klare Geschwindigkeitsvorteile gegen&uuml;ber einer eigenen L&ouml;sung in PHP. Etienne Kneuss hat dazu in <a class="DefaultLink" href="http://www.colder.ch/news/01-08-2009/34/splobjectstorage-for-a-fa.html" target="_blank">seinem Blog</a> weitere, interessante Informationen.</p> <pre name="code" class="php">$s = new SplObjectStorage(); $o1 = new stdClass(); $o2 = new stdClass(); // Seit PHP 5.1 $s-&gt;attach($o1); $s-&gt;detach($o1); // Seit PHP 5.3 $s[$o1] = $o2;</pre> <h2>Queue</h2> <p>Eine Queue iteriert im sogenannten FIFO-Modus (First In, First Out) &uuml;ber die Elemente. Dies bedeutet, dass die Elemente zuerst zur&uuml;ckgegeben werden, die auch zuerst zuerst hinzugef&uuml;gt wurden. Dies entspring dem Standard-Iterierungsverfahren von Arrays in PHP (z.B. bei <code>foreach()</code>).</p> <pre name="code" class="php">class Queue { protected $_data = array(); public function enqueue($value) { $this-&gt;_data[] = $value; return $this; } public function dequeue() { return array_shift($this-&gt;_data); } } $q = new Queue(); $q-&gt;enqueue('Eins') -&gt;enqueue('Zwei') -&gt;enqueue('Drei'); echo $q-&gt;dequeue(); // Eins echo $q-&gt;dequeue(); // Zwei echo $q-&gt;dequeue(); // Drei</pre> <p>Auch hier kann die SPL <strong>seit PHP 5.3</strong> helfen:</p> <pre name="code" class="php">$q = new SplQueue(); $q[] = 1; $q[] = 2; $q[] = 3; // 1, 2, 3 foreach ($q as $e) { echo $e; }</pre> <h2>Stack</h2> <p>Der Stack ist sowas wie das Gegenst&uuml;ck zu einer Queue. Er verwendet das LIFO-Verfahren (Last In, First Out), welches die Element zuerst zur&uuml;ckgibt, die zuletzt angeh&auml;ngt wurden.</p> <pre name="code" class="php">class Stack { protected $_data = array(); public function push($value) { $this-&gt;_data[] = $value; return $this; } public function pop() { return array_pop($this-&gt;_data); } } $s = new Stack(); $s-&gt;push('Eins') -&gt;push('Zwei') -&gt;push('Drei'); echo $s-&gt;pop(); // Drei echo $s-&gt;pop(); // Zwei echo $s-&gt;pop(); // Eins</pre> <p>Und wieder kann uns die SPL helfen. Wiederum ist <strong>PHP 5.3</strong> Kriterium.</p> <pre name="code" class="php">$q = new SplStack(); $q[] = 1; $q[] = 2; $q[] = 3; // 3, 2, 1 foreach ($q as $e) { echo $e; }</pre> <h2>Dictionary</h2> <p>Den Dictionary kann man sich als assoziatives Array mit fest definierten Typen f&uuml;r Key und Value vorstellen. Hier eine sehr abstrakte Implementierung.</p> <pre name="code" class="php">class Dictionary { protected $_keyType = null; protected $_valueType = null; protected $_data = array(); public function __construct($keyType, $valueType) { $this-&gt;_keyType = $keyType; $this-&gt;_valueType = $valueType; } public function add($key, $value) { if (!$this-&gt;_assert($this-&gt;_keyType, $key)) { throw new Exception('Key must be of type "' . $this-&gt;_keyType . '"'); } if (!$this-&gt;_assert($this-&gt;_valueType, $value)) { throw new Exception('Value must be of type "' . $this-&gt;_valueType . '"'); } // Adding key/value pair // ... } protected function _assert($type, $value) { if (function_exists('is_' . $type)) { return call_user_func('is_' . $type, $value); } return $value instanceof $type; } } $d = new Dictionary('int', 'stdClass'); $d-&gt;add(1, new stdClass()); // Success $d-&gt;add('1', new stdClass()); // Fail $d-&gt;add(1, 'foobar'); // Fail</pre> <p>Hierzu gibt es leider keine Klasse in der SPL.</p> <h2>Weitere Datenstrukturen in der SPL</h2> <p>Die SPL kennt noch weitere Konstrukte zur Datenhaltung, wie SplHeap, SplPriorityQueue, etc. Hier m&ouml;chte ich aber nur noch auf eine bestimmte Struktur eingehen: <strong>SplFixedArray</strong>.</p> <p>Das SplFixedArray gibt es ebenfalls erst seit PHP 5.3 und unterscheidet sich in folgenden Punkten vom klassischen PHP Array:</p> <ol> <li>Das Array hat eine feste Gr&ouml;sse, wird also nicht dynamisch erweitert</li> <li>Das Array kann nur numerische Indexe haben</li> <li>Das SplFixedArray ist eine viel schnellere und schlankere Implementierung als herk&ouml;mmliche Arrays</li> </ol> <pre name="code" class="php">$a = new SplFixedArray(2); $a[0] = 'Eins'; $a[1] = 'Zwei'; // Triggert eine RuntimeException, da die Gr&ouml;sse des Arrays &uuml;berschritten wurde $a[2] = 'Drei'; // Folgendes geht aber $a-&gt;setSize(3); $a[2] = 'Drei';</pre> <p>Ich empfehle als Lekt&uuml;re die <a class="DefaultLink" href="http://ch2.php.net/spl" target="_blank">PHP Dokumentation zur SPL</a>. Ausserdem findet ihr im Entwicklerblog von studiVZ eine <a class="DefaultLink" href="http://developer.studivz.net/2009/03/18/php-spl-data-structures-benchmark/" target="_blank">interessante Benchmark betreffend SplQueue und SplStack</a>, und im Blog von IDONTPLAYDARTS eine <a class="DefaultLink" href="http://www.idontplaydarts.com/2009/06/benchmarking-splfixedarray-access-speed/">Benchmark zu SplFixedArray</a>.</p> <p>Haut rein, in die Tasten! :)</p> http://bigwhoop.ch/artikel/29/2009-09-07/PHP-Arrays---Eine-All-In-One-Loesung info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/29/2009-09-07/PHP-Arrays---Eine-All-In-One-Loesung Mon, 07 Sep 2009 07:16:17 +0200 Some ZCE Mock Exam Questions Some questions from the Zend Certified Engineer (ZCE) Mock Exams <p><strong>Some questions from the Zend Certified Engineer (ZCE) Mock Exams</strong></p><p>You'll find my (!) answers on the next page. Have fun!</p> <h3>Question 1</h3> <p>What are the primary benefits of object oriented programming?</p> <p>Answers: (choose 3)</p> <ul> <li>Maintainability</li> <li>Execution Speed</li> <li>Encapsulation</li> <li>Code Reuse</li> </ul> <hr /> <h3>Question 2</h3> <p>The <code>_____</code> keyword is used to block any overriding of a class/method by a subclass.</p> <p>Answers:</p> <ul> <li>static</li> <li>None of the above</li> <li>protected</li> <li>final</li> <li>private</li> </ul> <hr /> <h3>Question 3</h3> <p>Event-based XML parsing is an example of which parsing model?</p> <p>Answers:</p> <ul> <li>SAX</li> <li>DOM</li> <li>XML Object Mapping</li> <li>XPath</li> <li>XQuery</li> </ul> <hr /> <h3>Question 4</h3> <p>Which functions would be needed to translate the following string:</p> <pre>I love PHP 5</pre> <p>to the following?</p> <pre>5 PHP EVOL I </pre> <p>Answers: (choose 2)</p> <ul> <li>mirror()</li> <li>strtoupper()</li> <li>toupper()</li> <li>str_reverse()</li> <li>strrev()</li> </ul> <hr /> <h3>Question 5</h3> <p>Which two internal PHP interfaces provide functionality which allow you to treat an object like an array?</p> <p>Answers: (choose 2)</p> <ul> <li>iteration</li> <li>arrayaccess</li> <li>objectarray</li> <li>iterator</li> <li>array</li> </ul> <hr /> <h3>Question 6</h3> <p>Consider the following code snippet:</p> <pre name="code" class="php">$query = "INSERT INTO mytable (myinteger, mydouble, myblob, myvarchar) VALUES (?, ?, ?, ?)"; $statement = mysqli_prepare($link, $query); if(!$statement) { die(mysqli_error($link)); } /* The variables being bound to by MySQLi don't need to exist prior to binding */ mysqli_bind_param($statement, "idbs", $myinteger, $mydouble, $myblob, $myvarchar); /* ???????????? */ /* execute the query, using the variables as defined. */ if(!mysqli_execute($statement)) { die(mysqli_error($link)); }</pre> <p>Assuming this snippet is a smaller part of a correctly written script, what actions must occur in place of the ????? in the above code snippet to insert a row with the following values: 10, 20.2, foo, string ?</p> <p>Answer...</p> <ul> <li> A transaction must be begun and the variables must be assigned</li> <li> Each value must be assigned prior to calling mysqli_bind_param(), and thus nothing should be done</li> <li> Use mysqli_bind_value() to assign each of the values</li> <li> Assign $myinteger, $mydouble, $myblob, $myvarchar the proper values </li> </ul> <hr /> <h3>Question 7</h3> <p>Given the string:</p> <pre name="code" class="php">$var = "john@php.net";</pre> <p>Which of the following will extract the TLD (top level domain) of ".net" from the string?</p> <p>Answer...</p> <ul> <li>strstr($var, strpos($var, "."));</li> <li>substr($var, strpos($var, "@"));</li> <li>substr($var, strstr($var, "."));</li> <li>substr($var, strpos($var, ".") + 1);</li> <li>substr($var, strpos($var, ".")); </li> </ul> <hr /> <h3>Question 8</h3> <p>The ____ construct is particularly useful to assign your own variable names to values within an array.</p> <p>Answer...</p> <ul> <li>array_get_variables</li> <li>current</li> <li>each</li> <li>import_variables</li> <li>list </li> </ul> <hr /> <h3>Question 9</h3> <p>Given the following XML document in a SimpleXML object:</p> <pre name="code" class="xml">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt; &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; &lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt; &lt;head&gt; &lt;title&gt;XML Example&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;p&gt; Moved to &amp;lt;&lt;a href="http://example.org/"&gt;http://www.example.org/&lt;/a&gt;.&amp;gt; &lt;br/&gt; &lt;/p&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Select the proper statement below which will display the HREF attribute of the anchor tag.</p> <p>Answer...</p> <ul> <li>$sxe-&gt;body-&gt;p[0]-&gt;a[1]['href']</li> <li>$sxe-&gt;body-&gt;p-&gt;a-&gt;href</li> <li>$sxe-&gt;body-&gt;p-&gt;a['href']</li> <li>$sxe['body']['p'][0]['a']['href']</li> <li>$sxe-&gt;body-&gt;p[1]-&gt;a['href']</li> </ul> <hr /> <h3>Question 10</h3> <p>Consider the following script:</p> <pre name="code" class="php">$dom = new DOMDOcument(); $dom-&gt;load("myxmlfile.xml"); foreach($dom-&gt;documentElement-&gt;childNodes as $child) { if(($child-&gt;nodeType == XML_ELEMENT_NODE) &amp;&amp; $child-&gt;nodeName == "item") { foreach($child-&gt;childNodes as $item) { if(($item-&gt;nodeType == XML_ELEMENT_NODE) &amp;&amp; ($item-&gt;nodeName == "title")) { print "$item-&gt;firstChild-&gt;data\n"; } } } }</pre> <p>Assuming the referenced XML document exists and matches the parsing logic, what should be displayed when this script is executed?</p> <p>Answer...</p> <ul> <li>None of the above</li> <li>The XML of each 'title' node</li> <li>The XML of each 'item' node</li> <li>"Title" for every title node in the document</li> <li>The contents of every 'title' node which exists under an 'item' node </li> </ul> <hr /> <h3>Question 11</h3> <p>Which of the following is the best way to split a string on the "-=-" pattern?</p> <p>Answer...</p> <ul> <li>They all are equally proper methods</li> <li>str_split($string, strpos($string, "-=-"))</li> <li>preg_split("-=-", $string);</li> <li>explode("-=-" $string); </li> </ul> <hr /> <h3>Question 12</h3> <p>SimpleXML objects can be created from what types of data sources?</p> <p>Answers: (choose 3)</p> <ul> <li>A String</li> <li>An array</li> <li>A DomDocument object</li> <li>A URI</li> <li>A Database resource </li> </ul> <hr /> <h3>Question 13</h3> <p>Which of the following are valid PHP variables?</p> <p>Answers: (choose 4)</p> <ul> <li>@$foo</li> <li>&amp;$variable</li> <li>${0x0}</li> <li>$variable</li> <li>$0x0 </li> </ul> <hr /> <h3>Question 14</h3> <p>When implementing a permissions system for your Web site, what should always be done with regards to the session?</p> <p>Answer...</p> <ul> <li>None of the above</li> <li>You should not implement permission systems using sessions</li> <li>Sessions should be cleared of all data and re-populated</li> <li>The session key should be regenerated</li> <li>The session should be destroyed </li> </ul> <hr /> <h3>Question 15</h3> <p>SQL Injections can be best prevented using which of the following database technologies?</p> <p>Answers: (choose 1)</p> <ul> <li>All of the above</li> <li>Prepared Statements</li> <li>Persistent Connections</li> <li>Unbuffered Queries</li> <li>Query escaping </li> </ul> <hr /> <h3>Question 16</h3> <p>When attempting to prevent a cross-site scripting attack, which of the following is most important?</p> <p>Answer...</p> <ul> <li>Not writing Javascript on the fly using PHP</li> <li>Filtering Output used in form data</li> <li>Filtering Output used in database transactions</li> <li>Writing careful Javascript</li> <li>Filtering all input </li> </ul> <hr /> <h3>Question 17</h3> <p>What three special methods can be used to perform special logic in the event a particular accessed method or member variable is not found?</p> <p>Answers: (choose 3)</p> <ul> <li>__get($variable)</li> <li>__call($method, $params)</li> <li>__get($method)</li> <li>__set($variable, $value)</li> <li>__call($method) </li> </ul> <hr /> <h3>Question 18</h3> <p>When running PHP in a shared host environment, what is the major security concern when it comes to session data?</p> <p>Answer...</p> <ul> <li>Sessions on shared hosts are easily hijacked by outside malicious users</li> <li>All of the above</li> <li>You cannot use a custom data store in shared hosts</li> <li>Session data stored in the file system can be read by other scripts on the same shared host</li> <li>Users outside the shared host can access any site which created a session for them </li> </ul> <hr /> <h3>Question 19</h3> <p>A fingerprint of a string can be determined using which of the following?</p> <p>Answer...</p> <ul> <li>md5()</li> <li>hash()</li> <li>fingerprint()</li> <li>None of the above </li> </ul> <hr /> <h3>Question 20</h3> <p>When embedding PHP into XML documents, what must you ensure is true in order for things to function properly?</p> <p>Answer...</p> <ul> <li>Disabling of the short_tags PHP.ini directive</li> <li>Enabling the asp_tags PHP.ini directive</li> <li>That you have XPath support enabled in PHP 5</li> <li>That your XML documents are well-formed</li> <li>None of the above, PHP can be embedded in XML in all cases. </li> </ul> <hr /> <h3>Question 21</h3> <p>What is the output of the following code?</p> <pre name="code" class="php">$string = "111221"; for($i = 0; $i &lt; strlen($string); $i++) { $current = $string[$i]; $count = 1; while(isset($string[$i + $count]) &amp;&amp; ($string[$i + $count] == $current)) $count++; $newstring .= "$count{$current}"; $i += $count-1; } print $newstring;</pre> <p>Answer...</p> <ul> <li>312211</li> <li>3312212</li> <li>11221221</li> <li>221131</li> <li>3211122 </li> </ul> <hr /> <h3>Question 22</h3> <p>When working with a database, which of the following can be used to mitigate the possibility of exposing your database credientials to a malicious user?</p> <p>Answers: (choose 3)</p> <ul> <li>Moving all database credentials into a single file</li> <li>Moving all database credentials outside of the document root</li> <li>Restricting access to files not designed to be executed independently</li> <li>Setting creditial information as system environment variables</li> <li>Using PHP constants instead of variables to store credentials </li> </ul> <hr /> <h3>Question 23</h3> <p>Consider the following code:</p> <pre name="code" class="php">session_start(); if(!empty($_REQUEST['id']) &amp;&amp; !empty($_REQUEST['quantity'])) { $id = scrub_id($_REQUEST['id']); $quantity = scrub_quantity($_REQUEST['quantity']) $_SESSION['cart'][] = array('id' =&gt; $id, 'quantity' =&gt; $quantity) } /* .... */</pre> <p>What potential security hole would this code snippet produce?</p> <p>Answer...</p> <ul> <li>Cross-Site Scripting Attack</li> <li>There is no security hole in this code</li> <li>Code Injection</li> <li>SQL Injection</li> <li>Cross-Site Request Forgery </li> </ul> <hr /> <h3>Question 24</h3> <p>Which statement will return the third parameter passed to a function?</p> <p>Answer...</p> <ul> <li>$argv[3];</li> <li>$argv[2];</li> <li>func_get_args(3);</li> <li>func_get_arg(2);</li> <li>func_get_arg(3); </li> </ul> <hr /> <h3>Question 25</h3> <p>When is it important to validate data coming from an HTML form?</p> <p>Answer...</p> <ul> <li>Only when the fields are required</li> <li>Only when accepting file uploads</li> <li>Everywhere, except cookies</li> <li>Only when accepting forms using an input type of text or a &lt;textarea&gt; field</li> <li>None of the above </li> </ul> <hr /> <h3>Question 26</h3> <p>Which of the following extensions are no longer part of PHP 5 and have been moved to PECL?</p> <p>Answers: (choose 2)</p> <ul> <li>tidy</li> <li>mysql</li> <li>w32api</li> <li>curl</li> <li>dio</li> </ul> <hr /> <h3>Question 27</h3> <p>The following is a common XML structure used in service oriented architectures, what does it represent?</p> <pre name="code" class="php">&lt;?xml version="1.0"?&gt; &lt;methodCall&gt; &lt;methodName&gt;myMethod&lt;/methodName&gt; &lt;params&gt; &lt;param&gt; &lt;value&gt;&lt;string&gt;HI!&lt;/string&gt;&lt;/value&gt; &lt;/param&gt; &lt;/params&gt; &lt;/methodCall&gt;</pre> <p>Answer...</p> <ul> <li>None of the above</li> <li>A fragment of a complete SOAP request</li> <li>XML-RPC</li> <li>REST</li> <li>SOAP</li> </ul> <hr /> <h3>Question 28</h3> <p>Which of the following functions could be used to break a string into an array?</p> <p>Answers: (choose 3)</p> <ul> <li>array_split()</li> <li>split()</li> <li>string_split()</li> <li>preg_match_all()</li> <li>explode() </li> </ul> <hr /> <h3>Question 29</h3> <p>Which PCRE regular expression will match the string <code>PhP5-rocks?</code></p> <p>Answer...</p> <ul> <li>/^[hp1-5]*\-.*/i</li> <li>/[hp1-5]*\-.?/</li> <li>/[hp][1-5]*\-.*/</li> <li>/[PhP]{3}[1-5]{2,3}\-.*$/</li> <li>/[a-z1-5\-]*/ </li> </ul><p>I struck the wrong answers, according to my knowledge. Please drop me some lines if you find a mistake. Thx! :-)</p> <h3>Question 1</h3> <ul> <li>Maintainability</li> <li><span style="text-decoration: line-through;">Execution Speed</span></li> <li>Encapsulation</li> <li>Code Reuse</li> </ul> <hr /> <h3>Question 2</h3> <ul> <li><span style="text-decoration: line-through;">static</span></li> <li><span style="text-decoration: line-through;">None of the above</span></li> <li><span style="text-decoration: line-through;">protected</span></li> <li>final</li> <li><span style="text-decoration: line-through;">private</span></li> </ul> <hr /> <h3>Question 3</h3> <ul> <li>SAX</li> <li><span style="text-decoration: line-through;">DOM</span></li> <li><span style="text-decoration: line-through;">XML Object Mapping</span></li> <li><span style="text-decoration: line-through;">XPath</span></li> <li><span style="text-decoration: line-through;">XQuery</span></li> </ul> <hr /> <h3>Question 4</h3> <ul> <li><span style="text-decoration: line-through;">mirror()</span></li> <li>strtoupper()</li> <li><span style="text-decoration: line-through;">toupper()</span></li> <li><span style="text-decoration: line-through;">str_reverse()</span></li> <li>strrev()</li> </ul> <hr /> <h3>Question 5</h3> <ul> <li><span style="text-decoration: line-through;">iteration</span></li> <li>arrayaccess</li> <li><span style="text-decoration: line-through;">objectarray</span></li> <li>iterator</li> <li><span style="text-decoration: line-through;">array</span></li> </ul> <hr /> <h3>Question 6</h3> <ul> <li><span style="text-decoration: line-through;"> A transaction must be begun and the variables must be assigned</span></li> <li><span style="text-decoration: line-through;"> Each value must be assigned prior to calling mysqli_bind_param(), and thus nothing should be done</span></li> <li><span style="text-decoration: line-through;"> Use mysqli_bind_value() to assign each of the values</span></li> <li> Assign $myinteger, $mydouble, $myblob, $myvarchar the proper values </li> </ul> <hr /> <h3>Question 7</h3> <ul> <li><span style="text-decoration: line-through;">strstr($var, strpos($var, "."));</span></li> <li><span style="text-decoration: line-through;">substr($var, strpos($var, "@"));</span></li> <li><span style="text-decoration: line-through;">substr($var, strstr($var, "."));</span></li> <li><span style="text-decoration: line-through;">substr($var, strpos($var, ".") + 1);</span></li> <li>substr($var, strpos($var, ".")); </li> </ul> <hr /> <h3>Question 8</h3> <ul> <li><span style="text-decoration: line-through;">array_get_variables</span></li> <li><span style="text-decoration: line-through;">current</span></li> <li><span style="text-decoration: line-through;">each</span></li> <li><span style="text-decoration: line-through;">import_variables</span></li> <li>list </li> </ul> <hr /> <h3>Question 9</h3> <ul> <li><span style="text-decoration: line-through;">$sxe-&gt;body-&gt;p[0]-&gt;a[1]['href']</span></li> <li><span style="text-decoration: line-through;">$sxe-&gt;body-&gt;p-&gt;a-&gt;href</span></li> <li>$sxe-&gt;body-&gt;p-&gt;a['href']</li> <li><span style="text-decoration: line-through;">$sxe['body']['p'][0]['a']['href']</span></li> <li><span style="text-decoration: line-through;">$sxe-&gt;body-&gt;p[1]-&gt;a['href']</span></li> </ul> <hr /> <h3>Question 10</h3> <ul> <li><span style="text-decoration: line-through;">None of the above</span></li> <li><span style="text-decoration: line-through;">The XML of each 'title' node</span></li> <li><span style="text-decoration: line-through;">The XML of each 'item' node</span></li> <li><span style="text-decoration: line-through;">"Title" for every title node in the document</span></li> <li>The contents of every 'title' node which exists under an 'item' node </li> </ul> <hr /> <h3>Question 11</h3> <ul> <li><span style="text-decoration: line-through;">They all are equally proper methods</span></li> <li><span style="text-decoration: line-through;">str_split($string, strpos($string, "-=-"))</span></li> <li><span style="text-decoration: line-through;">preg_split("-=-", $string);</span></li> <li>explode("-=-" $string); </li> </ul> <hr /> <h3>Question 12</h3> <ul> <li>A String</li> <li><span style="text-decoration: line-through;">An array</span></li> <li>A DomDocument object</li> <li>A URI</li> <li><span style="text-decoration: line-through;">A Database resource </span></li> </ul> <hr /> <h3>Question 13</h3> <ul> <li>@$foo</li> <li>&amp;$variable</li> <li>${0x0}</li> <li>$variable</li> <li><span style="text-decoration: line-through;">$0x0 </span></li> </ul> <hr /> <h3>Question 14</h3> <p>I'm pretty unsure here!</p> <ul> <li><span style="text-decoration: line-through;">None of the above</span></li> <li><span style="text-decoration: line-through;">You should not implement permission systems using sessions</span></li> <li><span style="text-decoration: line-through;">Sessions should be cleared of all data and re-populated</span></li> <li>The session key should be regenerated</li> <li><span style="text-decoration: line-through;">The session should be destroyed </span></li> </ul> <hr /> <h3>Question 15</h3> <ul> <li><span style="text-decoration: line-through;">All of the above</span></li> <li>Prepared Statements</li> <li><span style="text-decoration: line-through;">Persistent Connections</span></li> <li><span style="text-decoration: line-through;">Unbuffered Queries</span></li> <li><span style="text-decoration: line-through;">Query escaping </span></li> </ul> <hr /> <h3>Question 16</h3> <p>When attempting to prevent a cross-site scripting attack, which of the following is most important?</p> <p>Answer...</p> <ul> <li><span style="text-decoration: line-through;">Not writing Javascript on the fly using PHP</span></li> <li><span style="text-decoration: line-through;">Filtering Output used in form data</span></li> <li><span style="text-decoration: line-through;">Filtering Output used in database transactions</span></li> <li><span style="text-decoration: line-through;">Writing careful Javascript</span></li> <li>Filtering all input </li> </ul> <hr /> <h3>Question 17</h3> <ul> <li>__get($variable)</li> <li>__call($method, $params)</li> <li><span style="text-decoration: line-through;">__get($method)</span></li> <li>__set($variable, $value)</li> <li><span style="text-decoration: line-through;">__call($method) </span></li> </ul> <hr /> <h3>Question 18</h3> <p>Not very sure here, neither.</p> <ul> <li><span style="text-decoration: line-through;">Sessions on shared hosts are easily hijacked by outside malicious users</span></li> <li><span style="text-decoration: line-through;">All of the above</span></li> <li><span style="text-decoration: line-through;">You cannot use a custom data store in shared hosts</span></li> <li>Session data stored in the file system can be read by other scripts on the same shared host</li> <li><span style="text-decoration: line-through;">Users outside the shared host can access any site which created a session for them </span></li> </ul> <hr /> <h3>Question 19</h3> <ul> <li>md5()</li> <li><span style="text-decoration: line-through;">hash()</span></li> <li><span style="text-decoration: line-through;">fingerprint()</span></li> <li><span style="text-decoration: line-through;">None of the above </span></li> </ul> <hr /> <h3>Question 20</h3> <ul> <li>Disabling of the short_tags PHP.ini directive</li> <li><span style="text-decoration: line-through;">Enabling the asp_tags PHP.ini directive</span></li> <li><span style="text-decoration: line-through;">That you have XPath support enabled in PHP 5</span></li> <li><span style="text-decoration: line-through;">That your XML documents are well-formed</span></li> <li><span style="text-decoration: line-through;">None of the above, PHP can be embedded in XML in all cases. </span></li> </ul> <hr /> <h3>Question 21</h3> <ul> <li>312211</li> <li><span style="text-decoration: line-through;">3312212</span></li> <li><span style="text-decoration: line-through;">11221221</span></li> <li><span style="text-decoration: line-through;">221131</span></li> <li><span style="text-decoration: line-through;">3211122</span> </li> </ul> <hr /> <h3>Question 22</h3> <p>Not sure about the last option.</p> <ul> <li><span style="text-decoration: line-through;">Moving all database credentials into a single file</span></li> <li>Moving all database credentials outside of the document root</li> <li>Restricting access to files not designed to be executed independently</li> <li><span style="text-decoration: line-through;">Setting creditial information as system environment variables</span></li> <li>Using PHP constants instead of variables to store credentials </li> </ul> <hr /> <h3>Question 23</h3> <p>Pretty unsure here ... where is the problem with the code?</p> <ul> <li><span style="text-decoration: line-through;">Cross-Site Scripting Attack</span></li> <li>There is no security hole in this code</li> <li><span style="text-decoration: line-through;">Code Injection</span></li> <li><span style="text-decoration: line-through;">SQL Injection</span></li> <li><span style="text-decoration: line-through;">Cross-Site Request Forgery </span></li> </ul> <hr /> <h3>Question 24</h3> <ul> <li><span style="text-decoration: line-through;">$argv[3];</span></li> <li><span style="text-decoration: line-through;">$argv[2];</span></li> <li><span style="text-decoration: line-through;">func_get_args(3);</span></li> <li>func_get_arg(2);</li> <li><span style="text-decoration: line-through;">func_get_arg(3); </span></li> </ul> <hr /> <h3>Question 25</h3> <p>My answer to "When is it important to validate data coming from an HTML form?" would be: <strong>Always </strong>...</p> <ul> <li><span style="text-decoration: line-through;">Only when the fields are required</span></li> <li><span style="text-decoration: line-through;">Only when accepting file uploads</span></li> <li>Everywhere, except cookies</li> <li><span style="text-decoration: line-through;">Only when accepting forms using an input type of text or a &lt;textarea&gt; field</span></li> <li>None of the above </li> </ul> <hr /> <h3>Question 26</h3> <ul> <li><span style="text-decoration: line-through;">tidy</span></li> <li><span style="text-decoration: line-through;">mysql</span></li> <li>w32api</li> <li><span style="text-decoration: line-through;">curl</span></li> <li>dio</li> </ul> <hr /> <h3>Question 27</h3> <ul> <li><span style="text-decoration: line-through;">None of the above</span></li> <li><span style="text-decoration: line-through;">A fragment of a complete SOAP request</span></li> <li>XML-RPC</li> <li><span style="text-decoration: line-through;">REST</span></li> <li><span style="text-decoration: line-through;">SOAP</span></li> </ul> <hr /> <h3>Question 28</h3> <ul> <li>array_split()</li> <li>split()</li> <li><span style="text-decoration: line-through;">string_split()</span></li> <li>preg_match_all()</li> <li>explode() </li> </ul> <hr /> <h3>Question 29</h3> <p>I went with the last one, but the first two work as well.</p> <ul> <li>/^[hp1-5]*\-.*/i</li> <li>/[hp1-5]*\-.?/</li> <li><span style="text-decoration: line-through;">/[hp][1-5]*\-.*/</span></li> <li><span style="text-decoration: line-through;">/[PhP]{3}[1-5]{2,3}\-.*$/</span></li> <li>/[a-z1-5\-]*/ </li> </ul> http://bigwhoop.ch/artikel/28/2009-07-07/Some-ZCE-Mock-Exam-Questions info@phphil.ch (Philippe Gerber) http://bigwhoop.ch/artikel/28/2009-07-07/Some-ZCE-Mock-Exam-Questions Tue, 07 Jul 2009 11:01:52 +0200