PHP-Journal Newsfeed



      PHP-Journal Newsfeed
http://www.phpjournal.eu

Typ/Viewer: RSS/ RSS-ReaderAktualisiert: 24.05.2012Aufrufe: 1048

Kategorie: Computer, Technik > PHP

Aktuelle News, Trends, Tipps und Tricks aus der Welt von PHP, präsentiert vom PHP-Journal

Nachrichten aus dem RSS-Feed: PHP-Journal Newsfeed
Station 1 des großen ElePHPanten: Kassel
(Mon, 21 May 2012 07:15:08 GMT)  Die Bewerbungsfrist für die Reise ist um, der erste Zwischenstop steht fest und führt nach: Kassel! Ungefähr 150 Kilometer liegen vor ihm bis er die drittgrößte Stadt Hessens erreicht.Etwas aufgeregt ist er auf jeden Fall, und wenn alles nach Plan läuft wird er bereits am Mittwoch sein Ziel erreichen. Ich hoffe dass wir bald von Sacha (bzw. Sascha) Neuigkeiten in Form von Fotos, Videos oder Geschichten erfahren, entweder in seinem Blog oder hier.Der Gewinner wurde mit Hilfe des folgenden Scripts ermittelt. Übergeben wurden die Namen der 23 Teilnehmer:<?php$names = array();$md5Names = array();foreach ($names as $name) { $md5Names[$name] = md5('ElePHPantenGewinner2012'.$name);}asort($md5Names);echo 'The winner is: '.key($md5Names);Frage nebenbei: Damit ich die Route hier geografisch darstellen kann würde ich am liebsten eine fertige Karte nehmen und dort dann die Route darstellen mittels Pfeilen und ähnlichem. Kennt jemand von euch dafür eine entsprechende Grafik- oder Javascript-Bibliothek mit der das einfach zu machen ist? Also einfach eine Liste von Städten übergeben und die Karte wird dann automatisch richtig skaliert und die Wege (Direktverbindung, keine Autorouten) hübsch eingezeichnet? Ähnliche Artikel:Die Reise des großen ElePHPantenGewinner der großen GeburtstagsverlosungElePHPanten zu Weihnachten?
Amazon: Elastic Beanstalk jetzt in Europa verfügbar
(Fri, 18 May 2012 13:30:03 GMT)  Amazons Platform as a Service (PaaS) Elastic Beanstalk steht jetzt auch Entwicklern in Europa zur Verfügung. Damit sollen es Programmierer leichter haben, ihre Anwendungen in der AWS-Cloud einzurichten und zu verwalten. Unterstützt werden Anwendungen in Java, PHP und .NET.Amazon hatte seinen Cloud-Dienst bereits im Frühjahr 2011 angekündigt. Elastic Beanstalk soll den Aufwand bei der Entwicklung neuer Applikationen reduzieren, ohne dabei die Flexibilität einzuschränken. Entwicklern werden außerdem verschiedene Software Development Kits sowie Tools für die IDEs Eclipse und Visual Studio zur Verfügung gestellt.
Xdebug 2.2 unterstützt PHP 5.4
(Tue, 15 May 2012 16:05:04 GMT)  Zehn Jahre nach Veröffentlichung der ersten Version ist nun die Version 2.2 von Xdebug erschienen. Damit wird erstmals PHP 5.4 unterstützt, außerdem wurden weitere Features überarbeitet und ergänzt. So wurde die Shell um ANSI-Farbausgabe erweitert, und Fehlermeldungen liefern dem Anwender nun mehr Informationen. Darüber hinaus wurde die Kompatibilität zu KCacheGrind sowie die Performance im Allgemeinen verbessert. Zahlreiche Bugfixes runden das Update ab.Xdebug ist ein Profiling- und Debugging-Tool für PHP. Die erste Version 0.7.0 wurde 2002 von Derick Rethans veröffentlicht. Herunterladen lässt sich das Tool auf der Produkt-Homepage, dort findet sich auch ein ausführliches Changelog mit allen Änderungen und Verbesserungen.
Ticket für die Developer Conference 2012 in Hamburg zu gewinnen!
(Tue, 15 May 2012 08:20:08 GMT)  Am 8. und 9. September 2012 findet die jährliche Developer Conference in Hamburg statt, und ich kann ein Ticket an euch verquizzen!Was müßt ihr dafür tun? Beantwortet einfach die folgenden drei kurzen Fragen bis zum 30.05.2012 23:59:=========================================DevConQuiz Name * E-Mail-Adresse * </form>=========================================Jeder darf natürlich nur einmal teilnehmen.Der Gewinner wird dann hier im Blog veröffentlicht und bekommt auch eine E-Mail mit dem Amiando-Aktionscode.Aktuell gilt der Early-Bird-Preis (25% Ersparnis!) bis Ende Juni. Für Interessierte gibt es auf der Webseite der Konferenz auch Bilder, Informationen der Vorträge sowie des Rahmenprogramms des letzten Jahres. Einige Speakerslots werden noch freigehalten, bei Interesse könnt ihr einfach die Orga anschreiben.Vielen Dank an Tarek und das Orga-Team für die Bereitstellung des Preises! Und nun viel Glück bei der Teilnahme! Keine ähnlichen Artikel.
[UPDATE] PHP 5.3.12 und 5.4.2: Update wegen Sicherheitslücke
(Wed, 09 May 2012 13:05:03 GMT)  Erst vor wenigen Tagen wurden die Updates auf PHP 5.3.11 und PHP 5.4.1 veröffentlicht. Doch schon wartet die nächste Version. Grund dafür ist eine kritische Sicherheitslücke in PHP, die bei Wartungsarbeiten aus Versehen an die Öffentlichkeit gedrungen ist.Betroffen von der Lücke sind PHP-Server, die im CGI-Modus betrieben werden: Über den Aufruf bestimmter URLs lassen sich Kommandozeilenparameter und sogar Code in das PHP-CGI-Programm einschleusen und ausführen.Eigentlich sollte das Problem zunächst behoben und dann bekanntgegeben werden. Versehentlich wurde der Eintrag in der PHP-Fehlerdatenbank jedoch als öffentlich markiert und kurz darauf sogar auf der Webseite reddit.com gepostet.Zwar haben die PHP-Entwickler inzwischen die Versionen PHP 5.3.12 und PHP 5.4.2 veröffentlicht, die eingefügten Sicherheitsvorkehrungen sollen sich aber relativ leicht wieder umgehen lassen. Am sichersten wäre es, so die Entdecker der Sicherheitslücke, entsprechende Filterregeln einzusetzen, beispielsweise mit Hilfe eines Wrapper-Skripts. Weiterführende Informationen finden sich hier.UPDATE: Das PHP-Entwicklerteam bemüht sich erneut, die CGI-Sicherheitslücke zu beheben. Die jetzt veröffentlichten Updates auf die Versionen 5.3.13 und 5.4.3 sollen endlich Abhilfe schaffen; 5.4.3 behebt außerdem einen Buffer-Overflow in den apache request headers. Herunterladen lassen sich die Updates auf der Download-Seite, die Windows-Binaries finden sich unter windows.php.net/download. Außerdem gibt es ein Changelog mit einer vollständigen Liste aller Änderungen.
include oder require?
(Wed, 09 May 2012 00:05:02 GMT)  Was soll der PHP-Entwickler benutzen, include oder require bzw. include_once oder require_once?Und wo liegt da eigentlich der Unterschied?Die Frage kommt oft, deshalb an dieser Stelle mal ganz klipp und klar und kurz:require bzw. require_once benutzen, denn: Sowohl include wie auch require binden eine Datei ein, aber, sollte ein Fehler in der includierten Dateie sein, so bricht require mit einem E_COMPILE_ERROR ab, während include fröhlich mit einer WARNING weitermacht.Im Sinne der Vermeidung von code-smells fällt eure Wahl also auf require bzw. require_once.
Kryptische Fehlermeldungen in PHP
(Tue, 08 May 2012 08:20:09 GMT)  Mit den Jahren der Programmierung stößt man unwiderruflich auch auf komische Fehlermeldungen in PHP, die auch nach dem 3. Mal lesen unverständlich sind und die Fehlerquelle unklar bleibt. Hier möchte ich einige Fehlermeldungen auflisten an die ich mich erinnern kann, und auch kurz notieren wann und wieso sie auftreten.Ich nehme mich da selbst nicht aus, in meinen Applikationen sind die Fehlermeldungen auch nicht immer sehr aussagekräftig, vor allem wenn sie sehr selten oder “nie” auftreten sollten, von daher wird hier niemand an den Pranger gestellt, es soll nur helfen einige interessante Meldungen zu verstehen: Fatal error: Exception thrown without a stack frame in Unknown on line 0 Mein Favorit wenn es darum ging an Fehlermeldungen zu verzweifeln. Die Fehlermeldung sagt also dass PHP in der Datei Unknown in Zeile 0 keinen Stack-Frame erstellen konnte als eine Exception geworfen wurde. Prima! Der Fehler trat auf wenn PHP noch nicht richtig, bzw. nicht mehr richtig läuft oder sich in einigen magischen Methoden befindet. PHP konnte anscheinend nicht feststellen wo im Programmfluss es gerade steckte. Untersuchen sollte man die Stellen wo in einem Konstruktor, einem Destruktor oder einem Exception-/Error-Handler eine Exception geworfen wird. Entweder man entfernt die Exceptions und löst das Problem anders, oder fügt dort jeweils einen try-catch-Block hinzu, sodass die Exception nicht geworfen wird. Ich habe diese 3 Möglichkeiten gerade nochmal versucht nachzustellen mit PHP 5.3.8, aber mittlerweile kommen da aussagekräftige Fehlermeldungen mit Datei- und Zeilenangaben. Die kryptische Fehlermeldung scheint also irgendwann (vielleicht zum 5.3.0 Release?) ersetzt worden zu sein. Schade ;-)Fatal error: Can’t use function return value in write context Dieser Fehler ist auch etwas schwer zu verstehen wenn man noch nicht jahrelang programmiert, aber kann nur in 2 mir bekannten Fällen auftreten, und zwar bei der Verwendung von isset() oder empty().if (empty(isWorkDone())) { echo "done";}Beiden Funktionen müssen als Parameter jeweils Variablen übergeben werden. Wenn man ihnen einen Funktionsaufruf übergibt (was ja normalerweise kein Problem ist) spucken sie die oben genannte Fehlermeldung aus. Man muss also das Ergebnis des Funktionsaufrufs erst in eine Variable speichern und dann an isset() oder empty() übergeben. Es gibt ein RFC von Nikita Popov mit dem Vorschlag diese Einschränkung aufzuheben, das Voting läuft noch.Fatal error: Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM Dieser Fehler trat früher auf wenn man eine nicht-statische Methode statisch aufgerufen hat, also mit einem ::. Und damit ist das Rätsel auch quasi schon gelöst, denn PAAMAYIM_NEKUDOTAYIM ist hebräisch und heißt “Doppel-Doppelpunkt” und steht damit für den Scope-Resolution-Operator. Warum schreibe ich früher? Weil diese Meldung mittlerweile geändert wurde, in aktuellen Versionen von PHP erhält man die aussagekräftigere Fehlermeldung Non-static method Audi::drive() should not be called staticallyclass Audi{ public function drive() { echo 'brumm brumm'; }}Audi::drive();Mit wirklich falschem Code kann man ihn aber nach wie vor hervorlocken, beispielsweise:$var = &nbsp;;Fatal error: Parse error: syntax error, unexpected ‘;’, expected T_PAAMAYIM_NEKUDOTAYIMHeutzutage zeigen gute IDEs alle diese Fehler bereits beim Programmieren an, vor wenigen Jahren war das noch nicht der Fall. Oder kann jemand für aktuelle Versionen von Netbeans, Eclipse, Zend Studio oder Komodo etc. sagen dass diese Fehler nicht erkannt werden?Ihr habt ja wahrscheinlich auch schon so einiges gesehen an Fehlermeldungen. Was sind eure kuriosesten oder unverständlichsten Fehlermeldungen aus dem Webentwickler-Umfeld? Keine ähnlichen Artikel.
Linkpool Nummer 30
(Sun, 06 May 2012 10:30:08 GMT)  Hier einige Links die ich in den letzten 3 Wochen aufgeschnappt habe:Einblicke hinter die Kulissen bei Draw Something, der am schnellsten wachsenden App:http://www.gamasutra.com/view/news/168799/Scale_Something_How_Draw_Something_rode_its_rocket_ship_of_growth.phpVerbesserung der Disk-IO in Smarty:http://blog.rodneyrehm.de/archives/12-Improving-Disk-IO-in-PHP-Apps.htmlGoogle HTML/CSS Style Guide: http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xmlTips on Writing an API for a Smartphone App:http://www.lornajane.net/posts/2012/tips-on-writing-an-api-for-a-smartphone-appWarum readfile(), fread(), fpassthru() und stream_copy_to_stream() sich sehr ähnlich sind bzgl. Speicherverbrauch:http://www.garfieldtech.com/blog/readfile-memoryDie zweite Ausgabe des Web & PHP magazine:http://webandphp.com/issue-2Das Problem mit eigenen Session-Handlern und Destruktoren:http://phpbloke.de/article/destruktoren-und-session-daten-in-der-datenbankMayflower Podcast #0004: Was haltet ihr von HTML5-Apps?http://blog.mayflower.de/archives/864-Mayflower-Podcast-004.html Ähnliche Artikel:Linkpool Nummer 28Linkpool Nummer 29Linkpool Nummer 27 + Adventskalenderartikel 10.12. – 24.12.
PHP 5.3.12 und 5.4.2: Update wegen Sicherheitslücke
(Fri, 04 May 2012 14:50:03 GMT)  Erst vor wenigen Tagen wurden die Updates auf PHP 5.3.11 und PHP 5.4.1 veröffentlicht. Doch schon wartet die nächste Version. Grund dafür ist eine kritische Sicherheitslücke in PHP, die bei Wartungsarbeiten aus Versehen an die Öffentlichkeit gedrungen ist.Betroffen von der Lücke sind PHP-Server, die im CGI-Modus betrieben werden: Über den Aufruf bestimmter URLs lassen sich Kommandozeilenparameter und sogar Code in das PHP-CGI-Programm einschleusen und ausführen.Eigentlich sollte das Problem zunächst behoben und dann bekanntgegeben werden. Versehentlich wurde der Eintrag in der PHP-Fehlerdatenbank jedoch als öffentlich markiert und kurz darauf sogar auf der Webseite reddit.com gepostet.Zwar haben die PHP-Entwickler inzwischen die Versionen PHP 5.3.12 und PHP 5.4.2 veröffentlicht, die eingefügten Sicherheitsvorkehrungen sollen sich aber relativ leicht wieder umgehen lassen. Am sichersten wäre es, so die Entdecker der Sicherheitslücke, entsprechende Filterregeln einzusetzen, beispielsweise mit Hilfe eines Wrapper-Skripts. Weiterführende Informationen finden sich hier.
Sicherheitsupdate für PHP bei CGI-Verwendung
(Fri, 04 May 2012 08:20:08 GMT)  Gestern wurden neue Versionen für PHP 5.4 und 5.3 released, namendlich: 5.4.2 und 5.3.12. Grund für diese neuen Versionen ist eine gravierende Sicherheitslücke bei der Verwendung von PHP im CGI-Modus.Aber erstmal Entwarnung: Wahrscheinlich nutzt ihr kein CGI mehr sondern FastCGI oder mod_php, dann seid ihr nicht gefährdet. Wer aber noch auf die alte CGI-Schnittstelle setzt sollte sich schleunigst informieren und updaten um schlimmeres zu vermeiden, denn dank dieser leicht auszunutzenden Lücke ist es jedermann möglich, die Quelltexte euer PHP-Dateien im Document-Root anzuschauen oder auch beliebigen eingeschleusten PHP-Code auszuführen.Wer seine alte Installation nicht anfassen darf oder kann, für den gibt es Hilfe in Form einer Rewrite-Regel:RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]RewriteRule ^(.*) $1? [L]Weitere Informationen befinden sich auf der Seite des US-CERT, viele Details bei den Findern der Lücke, im Bugtracker oder natürlich bei Heise im Forum ;-)Achso, interessanterweise hat Stefan Esser folgendes getweetet:@i0n1c: The security emergency release to fix the PHP CGI RCE (that was tested for days…) does not fix anything at all.Wir dürfen also gespannt sein ob er Recht behält. Man mag ihn mögen oder hassen, aber von Sicherheit im PHP-Bereich versteht er einiges. Wir werden es erleben…Edit: Auf der Seite der Hacker befinden sich folgende Sätze:The new PHP release is buggy. You can use their mitigation mod_rewrite rule, but the patch and new released versions do not fix the problem. At the bottom we have added a version of the PHP patch that fixes the obvious problem with the patch merged in the recently released security update.Vielleicht wäre es hilfreich wenn sich die 3 Parteien zusammensetzen und einen funktionierenden Patch entwickeln und veröffentlich? So ist’s etwas peinlich… Keine ähnlichen Artikel.
Unbekannte und nützliche MySQL-Funktionen
(Thu, 03 May 2012 08:20:11 GMT)  Auf der Suche nach einer schnelleren Möglichkeit Daten aus einer MySQL Tabelle auszulesen bin ich auf die MySQL-Funktion GROUP_CONCAT() gestossen. Wenn man beispielsweise eine kommaseparierte Liste aller Usernamen benötigt würde man normalerweise folgendes tun:$usernames = array();$result = mysql_query('SELECT Username FROM users ORDER BY UserId');while ($row = mysql_fetch_assoc($result)) { $usernames[] = $row["Username"];}echo join(',', $usernames);Mit GROUP_CONCAT() kann man sich die Schleife sparen und erhält direkt einen kommaseparierten String (der Trenner kann natürlich geändert werden, siehe übernächstes Beispiel):$result = mysql_query('SELECT GROUP_CONCAT(Username) AS ConcatUsernames FROM users ORDER BY UserId');$row = mysql_fetch_assoc($result);echo $row['ConcatUsernames'];Bei sehr großen Tabellen kann es auch etwas Traffic zwischen MySQL-Server und Webserver sparen, ebenso ist die zweite Lösung deutlich schneller.GROUP_CONCAT() funktioniert auch, wie es der Name schon erahnen lässt, wenn GROUP BY verwendet wurde, also beispielsweise von allen Benutzern alle Login-IP-Adressen aufgelistet werden sollen:SELECT Username,GROUP_CONCAT(DISTINCT IpAddress ORDER BY LoginDate DESC SEPARATOR ' ')FROM loginsGROUP BY Username;Welche MySQL-Funktionen nutzt ihr die eher weniger bekannt sind? Womit habt ihr die größten Performancegewinne erzielt? Ähnliche Artikel:Info über MySQL Zertifizierungen?Gewinner des Tickets für die UnconfPraxis-Workshop PHP Basics: Web-basierte Systeme mit PHP und MySQL
Microsoft macht PHP-Framework Symfony2 fit für die Cloud
(Mon, 30 Apr 2012 10:30:08 GMT)  Die frisch gegründete Microsoft Open Technologies hat in Kooperation mit Microsoft Deutschland, dem Münchner PHP-Dienstleister Mayflower und den Kölner Entwicklern von Symfony, ...
PHP 5.3.11 und 5.4.1: Sicherheitsrelevante Updates
(Fri, 27 Apr 2012 15:45:03 GMT)  Die Skriptsprache PHP hat unlängst gleich zwei Updates spendiert bekommen: Version 5.4.1 enthält mehr als 60 teils sicherheitsrelevante Bugfixes. So führt die unzureichende Validierung des Upload-Namens  nun nicht mehr zu fehlerhaften $_FILES-Indizes. Aaußerdem wurden open_basedir-Checks zur readline_write_history und readline_read_history hinzugefügt.Die PHP-Version 5.3.11 enthält größtenteils die gleichen Neuerungen. Beide Releases verfügen nun außerdem über einen Debug-Info-Handler für DOM-Objekte und unterstützen den Apache-Webserver 2.4.Weitere Änderungen lassen sich dem offiziellen Changelog entnehmen. Die Sourcecodes sind über die PHP-Download-Seite erhältlich, die Windows-Binaries finden sich unter windows.php.net/download. Das Update wird allen PHP-Nutzern aus Sicherheitsgründen dringend empfohlen.
PhpStorm 4.0 unterstützt PHP 5.4
(Thu, 26 Apr 2012 15:15:03 GMT)  Nach WebStorm folgt PhpStorm: Hersteller JetBrains hat Version 4.0 der PHP-Entwicklungsumgebung veröffentlicht. Zu den wichtigsten Neuerungen gehört die Unterstützung von PHP 5.4 sowie für den kommenden ECMAScript-Standard Harmony.Ebenfalls neu sind der PHP Code Sniffer, ein Tool zur Codeüberprüfung, sowie Codeabdeckung für PHPUnit. Außerdem unterstützt PhpStorm den Code-Standard des Content-Management-Systems Drupal.PhpStorm ist eine klassische IDE mit Standard-Features wie Auto-Vervollständigung, Analyse- und Navigationsfunktionen. Eine vollständige Übersicht der Neuerungen in der aktuellen Version findet sich auf der Herstellerwebsite. Außerdem bietet JetBrains eine kostenlose Testversion. Eine Entwicklerlizenz ist für 94 Euro erhältlich, Firmen und Organisationen zahlen 189 Euro. Open-Source-Projekte und Lehrinstitutionen können freie Lizenzen anfordern.
PHP 5.4: Die neue Funktion header_register_callback()
(Thu, 26 Apr 2012 08:20:11 GMT)  Neben den vielen größeren Änderungen und neuen Features in PHP 5.4 gibt es auch eine kleine, aber vielleicht nützliche Funktion, mit der man noch an den HTTP-Headern rumpfuschen kann bevor sie an den Browser geschickt werden: header_register_callback().Gerade bei älteren Applikationen, bei denen die Header mittels header() an x-beliebigen Stellen manipuliert werden, kann man mittels dieser Funktion an einer zentralen Stelle noch welche hinzufügen, ändern oder entfernen.Der Callback, der an die Funktion übergeben wird, wird genau dann aufgerufen wenn die Header an den Browser geschickt würden, also bei der ersten Ausgabe des Skripts. Ich kopiere mal als Beispiel schnell den Code aus dem Manual, daran ist ersichtlich was die Funktion machen kann:<?header('Content-Type: text/plain');header('X-Test: foo');function foo() { foreach (headers_list() as $header) { if (strpos($header, 'X-Powered-By:') !== false) { header_remove('X-Powered-By'); } header_remove('X-Test'); }}$result = header_register_callback('foo');echo "a";Man benötigt es wahrscheinlich nicht jeden Tag und in jedem Projekt, aber vielleicht ist es mal nützlich bei einem älteren Projekt sich genau da einzuhängen. Ähnliche Artikel:Die Reporting-Funktion der Content-Security-Policy (CSP)Bug in PHP 5.3.0′s mail() FunktionNeue PHP 5.3 Zertifizierung: Beta Tester gesucht
Schneller in PHP und MySQL mit JOIN
(Wed, 25 Apr 2012 15:50:02 GMT)  Mittels einfacher Kentnisse seiner Datenbank kann der Entwickler auch aus Legacy-Anwendungen sehr viel mehr Geschwindigkeit herausholen, als er vielleicht weiß.Der Grund ist simpel: Meist bleibt der Code gleich, aber die Server Software wird aktualisiert. Während die Erstellung noch im guten alten PHP4 + MySQL4 von Statten ging, rennt der Code heute mit PHP5 + MySQL5 zwar immer noch, könnte aber dank kleiner Kniffe sehr viel schneller sein.Ich möchte euch einen Weg dazu zeigen, die JOINs in MySQL. Es gibt sicherlich noch mehr Möglichkeiten, aber das sind auch andere Themen. Fangen wir heute mal mit alten Querys an.Zunächst versuchen wir eine Stelle zu finden, an der wir ansetzen. Bei den meisten Legacy Codes wurde mit solch einem oder einem ähnlichen Konstrukt die Daten für "Zeige neue Blogbeiträge mit Namen des Autors" abgerufen, wobei "autor" und "blog" zwei verschiedene Tabellen sind.$_res = mysql_query("SELECT * FROM blog ORDER BY datum DESC");while ($row = mysql_fetch_array($_res)) {  $_resAutor = mysql_query("SELECT * FROM autor WHERE autorid = ".$row['autorid']);  $autor = mysql_fetch_array($_resAutor);  // Stelle Blogbeitrag mit Autor dar}Das ist nicht nur in der Hinsicht des Datenabrufes schlechter Code und vor lauter "code-smells" könnte einem glatt schlecht werden. Trotzdem gibt es sowas "da draussen" und dummerweise funktioniert das leider immer noch.Was kann man verbessern? Zum einen fällt auf, dass es zwei Querys sind. Das muss nicht nur nicht sein, dass ist auch noch ganz schlecht, denn jede Verbindung zur Datenbank braucht Zeit und die sollten wir uns sparen. Argumente wie "mysqli / PDO benutzen" lasse ich ganz bewusst aussen vor, es soll um Prinzip gehen (sicher wäre die Verwendung eines PDO oder ORM wie Doctrine besser, ganz klar).Sparen wir uns also den zusätzlichen Query:$_res = mysql_query("SELECT b.*, a.* FROM blog b, autor a WHERE b.autorid = a.autorid ORDER BY b.datum DESC");while ($row = mysql_fetch_array($_res)) {  // Stelle Blogbeitrag mit Autor dar}Schon viel besser, aber noch nicht gut genug. Was passiert, wenn ein Blogbeitrag existiert, aber der Autor nicht? Bei so einer Legacy-Anwendung fast schon der Normalfall. Der ganze Beitrag fehlt. Doof, also brauchen wir eine Mechanik, die trotz fehlendem Autor den Blog Beitrag noch anzeigt.Ganz kurz: Das machen JOINs - und ehe ich nun von vielen gesteinigt werde: JOINs machen noch viel mehr, aber das würde hier den Rahmen sprengen und außerdem möchte ich dazu noch mehr schreiben.Das ganze nun mit einem LEFT JOIN:$_res = mysql_query("SELECT b.*, a.* FROM blog b LEFT JOIN autor a ON (b.autorid = a.autorid) ORDER BY b.datum DESC");while ($row = mysql_fetch_array($_res)) {  // Stelle Blogbeitrag mit Autor dar}Es ändert sich nicht viel, aber nun erscheinen auch alle Blogbeiträge ohne Autor und als kleines Extra arbeitet der letzte Query auch noch etwas schneller als der zweite; super für Legacy-Code, der schon ähnlich wie in Beispiel Zwei aufgebaut ist, denn dort muss man nicht - oder nur wenig - an den PHP Code ran und kann sich auf die reine SQL-Optimierung konzentrieren.Diese Art der Optimierung alter Legacy-Anwendungen macht relativ wenig Arbeit und bringt dafür recht viel. Vor allem im Bereich von SQL-Code, wo Beispiel eins mehrfach vorkommt (Grundquery, dannach werden viele Querys gestartet die Detaildaten zum Grundquery abrufen, dannach wird gerechnet und wieder neue Querys abgerufen usw.) und damit die Anwendung an dieser Stelle nur sehr langsam ist, kann ein Umstieg auf JOINs und u.a. Verlagerung von Arbeit von PHP in den Query sehr viel Geschwindigkeit herausholen.Allerdings - und das sollte ganz klar sein - kann dies keine schlechte Architektur ersetzen. Legacy Code kommt irgendwann an den Punkt, an dem ein Optimieren keinen Sinn mehr macht und man sich lieber auf die Neukonzeption konzentrieren sollte. Als Hilfsmittel, um z.B. langsame Bereiche zu beschleunigen, sollte man die Kentnisse allerdings auffrischen. Vor allem, da bei modernen Methoden (PDO, OML, ...) die JOINs eine zentrale Rolle spielen.
Nginx: Stabile Version 1.2.0 erhältlich
(Tue, 24 Apr 2012 14:25:02 GMT)  Der kostenlose russische Webserver Nginx ist in der stabilen Version 1.2.0. erschienen. Diese enthält vor allem Bugfixes, neue Funktionen haben die Entwickler nicht integriert. Für die Version 1.3.0 sind weitere Verbesserungen geplant, unter anderem Unterstützung für Googles SPDY-Protokoll sowie für IPv6 und Websockets.Nginx ist ein ursprünglich auf die russische Suchmaschine Rambler zugeschnittener modularer Webserer und Reverse Proxy, der aufgrund seiner hohen Leistung auch bei anderen großen Services wie GitHub oder Golem verwendet wird.Anfang des Jahres hatte Nginx in einem Ranking der Firma Netcraft sogar Microsofts Internet Information Services (IIS) knapp abgehängt und läuft demnach auf etwa 24 Millionen aktiven Domains. Stärkster Konkurrent ist nach wie vor der ebenfalls freie Webserver Apache.Nginx ist als kostenloser Download über die Projekthomepage erhältlich.
PHP: Symfony2 läuft auf Windows Azure
(Fri, 20 Apr 2012 12:30:02 GMT)  Microsoft Open Technologies hat in Kooperation mit Microsoft Deutschland, dem Premium PHP-Dienstleister Mayflower und den Entwicklern von Symfony, Sensio Labs Deutschland, die aktuelle Version Symfony2 fit für Azure gemacht. Die Verknüpfung von Microsofts Cloud-Plattform mit Symfony2 soll Softwareentwicklern neue Möglichkeiten der Erstellung komplexer, offener Webanwendungen in der Cloud ermöglichen. Die Integration von Symfony2 und Azure soll dabei stark vereinfacht werden, um eventuelle Einstiegshürden zu minimieren.Zwei gemeinsame Abendveranstaltungen von Microsoft und Sensio Labs Deutschland in Köln (diese fand bereits am 19. April statt) und München (folgt am 2. Mai) widmen sich der Entwicklung von Symfony2-Anwendungen für Windows Azure sowie dem Potenzial von Platform as a Service-Angeboten für PHP-Anwendungen. Die Veranstaltungen sind kostenlos und finden in den jeweiligen Geschäftsstellen in Köln und München von Microsoft Deutschland statt. Nähere Informationen sowie die Möglichkeit zur Anmeldung finden Interessierte unter http://www.meetup.com/sfcloud/.
iBuildings Challenge: Mein Sismo Notifier für C2DM
(Fri, 20 Apr 2012 08:20:10 GMT)  iBuildings hat wieder eine Challenge veranstaltet, und ich habe wieder mitgemacht. Letztes Jahr galt es eine Vier-Gewinnt-Spieler-KI zu erstellen, diesmal ging es darum einen Notifier für den Continuous Testing Server Sismo von Fabien Potencier zu schreiben, sprich eine Klasse die sich darum kümmert das Ergebnis eines Builds zu veröffentlichen.Ich habe mich dafür entschieden einen Notifier für Android Apps zu schreiben, der den Commit via Googles Cloud auf ein Android-Handy pushen kann, auf dem dann eine einfache App das Ergebnis anzeigen kann. Noch gibt es keine solche App, wenn ich das richtig gelesen habe ist das nur eine Sache von wenigen Stunden. Die Klasse mit der ich teilgenommen habe gibt es auf GitHub, bin gespannt ob der Pull-Request angenommen wird.Gewonnen haben die folgenden Notifier:Wallpaper Notifier by Javier Eguiluz – Ein Notifier der die Ergebnisse als Balken auf dem Wallpaper des Desktops darstellt (Aktuell nur auf einem Mac)Eggdrop Notifier by Andrew Graham – Ein Notifier um das Ergebnis in einem IRC-Chat zu postenHouston Notifier by Andreas Hucks – Ein Notifier der im Fall eines Problem den bekannten Satz spricht, indem eine Audio-Datei abgespielt wird (aktuell nur auf einem Mac)Weitere Details gibt es im Blogartikel bei iBuildings mit den Ergebnissen.Freue mich schon auf die nächste Challenge! Ähnliche Artikel:Der Vier Gewinnt Server zur iBuildings ChallengePush Notifications in Android Apps via C2DMMein Pagerank
Algorithmus gesucht: Strings in String suchen
(Wed, 18 Apr 2012 08:20:10 GMT)  Ich habe eine kleine Aufgabe für euch: Gegeben ist ein String, sowie eine Menge kürzerer Strings die darauf geprüft werden ob sie im Ausgangsstring vorkommen und an welcher Stelle. Normalerweise gibt es dafür die PHP-Funktion strpos(). Nehmen wir an sie steht nicht zur Verfügung. Wie würdet ihr das Problem bestmöglich lösen, es gibt ja ziemlich viele Ansätze und Lösungen? Interessant dabei ist dass es exakt einen String gibt den es zu durchsuchen gilt, und sehr viele (hier im Beispiel 10.000) kürzere Strings die es zu suchen gilt. Je nachdem wie man den Algorithmus baut macht es eventuell Sinn einen Index oder ähnliches aufzubauen, sprich anfangs etwas mehr Rechenarbeit zu leisten damit man später die Suche sehr schnell erledigen kann?Also die Grundstruktur soll wie folgt aussehen (siehe auch bei GitHub):<?php$longText = 'Lorem Ipsum dolor sit Amet, consetetur sadipscing elitr, sed diam nonumy eirmod Tempor invidunt ut labore et dolore magna Aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum Dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et Accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam Voluptua. At vero eos et accusam et Justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum';$searchTexts = array( ' elitr, sed diam nonumy eirmod', 'vero eos et accusam et justo duo', 'diam nonumy eirmod tempor invid', 'o duo dolores et ea reb', 'er adipiscin', 'dio dignissim qui blandi', 'h euismod tincidunt ut laoreet', 'accusam et justo duo dolores et ea ', 'acer possim assum. Lorem ip', 'ipsum dolor sit ', 'e te feugait nulla facilisi. Lorem', 'd diam nonumy eirm', 'quam erat volutpat', 'ing elitr, sed diam nonumy e', ' magna ali', 'a. At vero eos et', 'a commodo consequat. Duis aute', 'cerat facer possim assum. ', ' elitr, sed diam nonumy eirmod', 'At vero eos et accusam et ', 'usto odio dignissim qui blandi', 'ugait nulla facilisi. Nam libe', 'um iriure dolor in hendrerit in vul', ' nonumy eirm', ' euismod tin', 'ut aliquip ex ea commodo consequat', ' at vero eros et ac', ' duis dolore te feug', 'lor in hendrerit in v', 'sum dolor sit amet. Lorem ipsum ', 't justo duo dolores et ea ', 'rtis nisl ut aliqu', ' erat volutpat. Ut wisi en', ' erat volutpat. ', 'vel illum dolore eu feugia', 'nim ad minim veniam, quis ', 'um. Stet clita kasd', 'um dolor sit amet. Lorem ipsum do', 'kimata san', 'ctus est Lo', 'sis at vero eros et ', ' in vulputate velit ess', ' clita kasd gubergren, no ', 'g id quod mazim pl', 'utate velit esse moles', 'rebum. Stet clita kasd gubergren,', 'sea takimata ', 'e feugait nulla', ' nisl ut aliquip ex', 'tetur sadipscing elitr, sed d', 'olor in hendrerit ', 't labore et dolore mag', 'dolor sit amet, consetetur sadi', 'it in vulputate velit esse moles', 'o eos et accusam et justo duo dolor', ' At vero eos et accusam et justo', 'ore et dolore magna aliq', 'ng id quod mazim placerat facer pos', ' sed diam nonumy eirmod tempor', 'gna aliquyam ', 'obis eleifend optio', 'eniam, quis nostrud exerci tati', 'ipsum dolor sit amet, c', 'diet doming id quod mazim placerat ', 'nostrud exerci tation ullamcorper s', ' duo dolores ', 'dipiscing elit, sed diam nonummy n', ' molestie conseq', 'at nulla faci', 'iam voluptua. At vero eos et', 'consequat, vel illum dolore eu', 'or in hendrerit in vulput', 'uyam erat, sed diam volup', 'psum dolor sit am', 'aesent luptatum zzril delenit a', ', no sea takimata sanctus est ', ' et ea rebum.', 'ie consequat, vel illum d', 'estie consequat, vel illum do', 'endrerit in vulputate veli', 'sequat, vel illum dol', 'ng elitr, sed diam n', 'orem ipsum dolor sit', 'eum iriure dolor in hendrerit in', '. Stet clita kasd ', ' commodo consequat. D', ' amet. Lorem ipsum dol', 'o sea takimata', '. At vero eos et accusa', 'olor sit amet, consete', 'tetur sadipscing elitr, sed ', 'sed diam nonumy eir', 'uptua. At vero eos et accusam', ' velit esse mole', 'at, sed diam voluptua. At vero eo', 'nsequat, vel i', ' ea rebum. Stet clita kasd gube', ' ad minim veniam, quis ', 'quip ex ea commodo consequat.', 'uod mazim placerat', 'lor sit amet, conset', 'uer adipisc', 'ea rebum. ', 'nulla facilisis. At vero e', 't justo duo dolore', 'ure dolor in hendrerit i', ' accusam et justo duo ', 'gue duis dolore te feugait nul', 're et dolore magn', 'ren, no sea takimata sanctus e', 'res et ea rebum. Stet clita kasd ', 'h euismod tincidunt ut l', 'lit esse mo', 'r sit amet, consectetuer', 'psum dolor sit amet. Lorem ipsum do', 'ipsum dolor sit amet. Lorem ', '. Ut wisi enim ad m', 'iscing elit, sed diam n', 'magna aliquyam erat, s', 'setetur sadipscing elitr, sed diam ', 'rebum. Stet clita kasd gubergren, n', 't, consetetur sadipsci', ' esse molesti', 'lputate veli', 'in hendrerit in vulputate v', ' et accusam et ', ' suscipit lobortis nisl ut al', ' tation ullamcorper suscipit lo', 'ta sanctus est', 'et clita kasd gubergr', 'ion congue ', 't. Duis autem vel eum iriure dolor', 'et clita kasd g', 'ignissim qui blandit praesent lu', 'consetetur sadipscing elitr, s', 'ugue duis dolo', 'bergren, no sea takimat', 'etetur sadipscing ', 'accumsan et iusto odio dign', 'lum dolore eu feu', 'modo consequat. Duis autem vel eum', ' erat volutpat. Ut wisi', ' facer possim assum. Lo', 'cilisi. Nam liber tempor cum soluta', 'i blandit pra', 'nsectetuer adi', 'eleifend o', 'aliquip ex ', 'iscing elit, sed diam nonummy nib', ' nulla facil', ' no sea takimata sanctus est Lorem ', 'aliquyam erat, s', 'a sanctus est Lorem ipsum dolor si', 't in vulpu', 'rerit in vul', 'consequat. Duis au', 'ata sanctus', 'etur sadipscing elitr, sed ', 'r invidunt ut', 'a sanctus ', 'it esse molestie consequat, vel ill', 'ud exerci tation ullamcorper su', 'no sea takimata sanctus est Lore', 'usto duo do', ' magna aliquyam erat, ', 'um iriure dolor', 'trud exerc', 'iscing elit, se', 'olor sit amet. L', 'ng elitr, sed diam nonumy', 'iquyam erat, sed di', ' feugiat nulla f', ' rebum. Stet', 'est Lorem ipsum dolor sit am', 't luptatum zzril delenit a', 'orem ipsum dolor sit amet, conset', 'sto duo dolores et ea rebum.', 'vidunt ut labore e', 'ud exerci tation ullamcor', 'uptatum zzril delenit augue duis ', 'clita kasd gubergren, no sea takim', 'o dignissim qu', 'lestie consequat, vel illum dolore ', 'bum. Stet c', 'mazim placerat facer ', ', sed diam', 'tus est Lorem ipsum dol', 'ccusam et j', '. At vero eos et accusam et justo d', 'i enim ad minim veniam, qu', 'ilisi. Nam', 'vulputate velit esse molest', 'giat nulla facilis', ' sea takimata sanctus est Lo', 'ita kasd guber', 'bh euismod tincidunt ut lao', 't amet, consetet', 'nim ad min', 'hendrerit in vulputate velit e', 're et dolore magna aliquyam e', ', vel illum dolore eu ', ' sit amet, consect', 're eu feugiat nulla faci', 'ex ea commodo consequat. Duis', ' volutpat. Ut wisi enim ad mi', ' qui blandit praesen', ' ipsum dolor sit', 'nvidunt ut labore ', 'r cum soluta nobis eleifend opt', 're et dolore magna aliquyam erat, ', 'tum zzril delenit augue du', 'unt ut labore et ', 'dolore eu feugiat nul', 'olor sit amet. Duis autem vel', 'lores et ea rebum. Ste', 'is autem vel eum ir', 'erit in vulputate ve', 'a facilisis at vero eros', 'en, no sea takimata s', 'ore magna aliquya', 'lit esse molestie c', 'erit in vul', 'iriure dolor in hend', 'rat, sed diam voluptua. At vero', 'olore magna al', ' suscipit lo', 'res et ea rebum. Stet clita kasd gu', 'diam nonumy eirmod tempor invi', 'ita kasd gubergren, no ', ' nonumy eirmod temp', ' dolore ma', 'dolores et ea rebum. Stet clita', 'e magna aliqua', 'te velit esse molestie co', 'od tempor invidu', 'o consequat. Duis autem vel ', 'it esse molestie consequat, vel i', 'amet, consectetuer adipis', 'bore et dolore magn', 'm qui blandit pr', 'sit amet. Lorem ipsu', 'mmy nibh eui', 'er suscipit lob', 'n hendrerit i', 'e dolor in hendrerit i', ' quis nostrud exerci tation ull', ' elit, sed diam nonumm', 'nvidunt ut la', 'pat. Ut wisi enim ad minim venia', 'lore magna aliquam erat ', 'quip ex ea commodo consequat. Dui', 'uismod tin', 'anctus est Lorem ', ' augue dui', 'i tation ullamco', 'a kasd gubergren, no se', 'ro eos et accusam et ju', 'rem ipsum dolor sit amet. Lorem ips', 'accusam et justo ', 'Lorem ipsum dolor s', ' aliquyam erat, se', 'd gubergren, n', 'rgren, no sea takimata sanctus', 'endrerit in vulputa', 'nulla facilisis. At ', 'agna aliquam erat v', 'e velit esse molestie', 'am erat volutpa', 'bum. Stet clita kasd gub', 'lore magna aliquam', 'e duis dol', ' Lorem ipsum dolor sit amet', 'ssum. Lorem ipsum dolor', 'od tincidunt ut laoreet dolor', 'ero eos et accus', 'orem ipsum dolor sit a', 'a kasd gub', 'dolor sit amet, cons', 'uptua. At vero eos et accusam et j', 'im qui blandit praese', 'il delenit augue duis dolore te', 'e consequat', 'pit lobortis nisl ut aliquip ex', ' amet, consectet', 'exerci tation ullamcorper su', 'agna aliquam erat volu', ' doming id quod mazim plac', 'equat. Duis autem vel eum i', 'lisi. Nam liber tem', 'liquip ex ea commod', 'is nostrud e', ' no sea takimata sanct', 's autem vel eum iriure do', ' et accumsan et iusto o', ' sit amet,', 'cilisis at vero eros', ' Ut wisi enim', 'n et iusto odio dignissim ', 'setetur sadi', 'tpat. Ut wisi ', 'ore magna aliquyam erat, sed', 'tie consequat, vel illu', 'velit esse mo', 'olor sit amet, consectetu', 'nvidunt ut l', ' voluptua. At vero eos et accusa', 'ed diam voluptua. At vero eos e', 'rebum. Stet clita k', ' euismod ti', 'issim qui blandit prae', 'lor in hendrerit in vulputate veli', 'st Lorem ipsum d', 'et clita kasd gub', ' nonummy nib', ' et accusam et j', 'bergren, no sea takimata sanctus es', 'esse molestie consequat, ', 'imata sanctus est Lo', 'a facilisis at vero ero', 'abore et dolore mag', 'tion congue nihil imperdiet ', 'rem ipsum dolor ', 'lisis at vero eros e', 'm et justo d', 'a kasd gubergren, n', ' vel eum iriure do', '. Ut wisi enim ad minim veniam', 'ero eos et accusam et justo duo do', ' no sea takimata s', 'gna aliquyam erat, s', ' vel eum iriure d', 'ipsum dolor sit amet, conse', 'equat. Duis autem v', 'to duo dolores ', 'lutpat. Ut wisi enim ad minim', 'sent lupta', 't ut laoreet d', 'vero eos et accusam et ', 'illum dolore eu feugiat nulla fac', 'ent luptatum zzril delenit a', 'cer possim assum. Lorem ', 'sadipscing ', 're eu feugiat nulla f', 'mod tincidunt ut laoree', 'si. Lorem ipsum ', 'iquyam erat, sed diam vol', 'm voluptua. At ', 'accusam et just', 'option con', 'magna aliquyam erat, sed diam vo', ' Duis autem vel eum iriure dolor', 'e te feugait nulla faci', 'sit amet, consetetur sad', 'at. Duis autem vel eum iri', ' sed diam nonumm', 'Ut wisi enim ad', 'uismod tincidunt ut laoree', 'na aliquyam erat, sed diam ', ' iriure do', 'akimata sanctus est Lorem ipsum dol', ' amet. Lore', 'at vero eros et accumsan et', 'olor sit amet. Lorem ipsum dolor si', 'it amet, consectetuer adip', 'et clita kasd gubergren', ' ipsum dolor sit ame', 'mazim placerat facer possim assu', 'ergren, no sea takimata sanctus e', 'o dolores et ea rebum. Stet cl', 'am erat volutpat. Ut wisi ', 'vidunt ut labore et d', 'dipiscing elit, sed diam', 'sd gubergren, no sea taki', ' ea rebum. St', 'r tempor cum soluta n', ' voluptua. At vero', 'sit amet, consetetur sadipsc', 'sed diam voluptua. At ver', 'si enim ad minim veniam, q', 'ugiat nulla facilisis at vero eros', 'i tation ullamcorper suscipit lob', 'il imperdiet doming id quod maz', 'eirmod tempor invidunt ut lab', 'isl ut aliquip ', 'my eirmod tempor invidunt ut labo', 'nsetetur sadipscing eli', 's at vero eros et accums', 'elit esse molestie consequat, ', ' consetetur sadipscin', 'r sit amet. Lorem ipsu', 'os et accumsan et iusto odio ', 'sum. Lorem ipsum dolor ', 'my nibh euismod t', 'm voluptua. At vero e', 'tus est Lorem ', 'r tempor cum ', ' Ut wisi enim ', 'm. Stet clit', ', sed diam voluptua. A', 'met, consetetur sa', 'ion ullamcorper suscipit loborti', 'at. Ut wisi enim ', 'lla facilisis at vero e', 'lor in hendrerit in vulputate vel', 'am erat, sed ', ' nonumy eirmod tempor invidu', 'smod tincidunt ut laoreet dolore m', ' consequat. Duis autem vel', 'y eirmod tempor invidunt ut ', 'san et iusto ', 'am erat volutpat. Ut wis', 'lputate velit ', 'n vulputate velit ', ' laoreet dolore m', 'nt luptatum z', ' ut laoreet dolore ', 'nibh euismod tincidunt ut lao', 'e dolor in hendrerit in vulputate', 'r, sed diam nonumy ', 'ming id quod mazim placerat facer', ' tempor cum soluta nobis ele', 'ccumsan et iusto odio dignissim', 'Lorem ipsu', 'smod tincidunt ut laoreet', 'm dolore eu feugiat nulla facilisis', 'vero eos et accusam et just', 'gren, no sea takimata sanctus es', 'io dignissim', 'olestie consequat,', ' velit esse molest', 'ctus est Lorem ipsum dolor', 't nulla facilisi', 'et. Lorem ipsum dolor ', 't ea rebum. Stet clit', ' Lorem ipsu', 'lisi. Lorem ipsum dolor sit am', 'quat, vel illu', 'gubergren, no sea takimata san', 'olutpat. Ut wisi enim ad minim ven', 'dolor in hendrerit i', 'olore eu feugi', ' et accusam e', 'irmod temp', 'liquip ex ea commodo consequat. D', 'n congue nihil ', 'el eum iriure d', ', consetetur sadipscing elitr, sed ', 'um zzril d', 'uam erat vo', 'ed diam nonumy eirmod tempor in', 'el eum iriure dolor in hend', ' consequat. Duis autem ', 'eugiat nulla facilisis', 'eum iriure dolor in hendre', 'nt ut labore et dolore magna ', ' clita kasd g', 'aoreet dolore m', 'm erat volutpat. Ut w', 'Stet clita ', 't iusto odio dignissim qu', 'clita kasd gubergren, no sea takima', ' no sea ta', 'agna aliquam era', ' ea rebum. Stet clita kasd ', 'olor in hendrerit in vul', 'tet clita k', 're dolor in h', 't ea rebum. S', 'do consequat. Duis autem ve', 'tie consequat, vel ', 'it esse molestie cons', 'to odio dignissim qui blandi', 'accusam et ju', 'duis dolore te feugait nul', 'litr, sed diam nonumy eirmod tempo', 'nostrud exerc', 'et accusam et justo duo do', 'gnissim qui blandit praesen', 'ua. At vero eos et ', ' takimata sanct', ' kasd gubergren, no sea takimata ', 'putate velit es', 'm dolor sit amet, cons', 'usam et justo duo dolores ', 'at, vel illum dolore eu feugi', 'rat volutpat. Ut wisi enim ad minim', 'ex ea comm', 'm vel eum iriu', 'gait nulla facilisi. Nam liber te', 'duo dolores et ea rebum. Ste', 'duo dolores et ea rebum. Ste', 'vulputate velit esse mole', ' aliquyam era', 'e et dolore mag', 'l delenit augue dui', 't doming id quod mazim pl', 'labore et dol', 'trud exerci tat', ', consectetuer adipiscing el', 'iam voluptua. At vero eos et accusa', 'rat, sed diam voluptua. At v', 'sanctus est Lorem ips', 'iat nulla facilisis. ', ' luptatum zzril delenit', 'liber tempor cum soluta n', ' lobortis nisl ut aliquip e', ' sed diam nonummy n', 'os et accusam et justo duo dolor', 'putate velit esse moles', 'ur sadipscing elitr, sed d', 'm dolor sit amet', 'am nonummy nibh euismod tincidun', 'ipsum dolor sit ', ' invidunt ut', 'lor sit amet. Lorem ipsum dolo', 'onummy nibh euis', 'exerci tation ullamcorpe', 'm. Lorem ipsum dolor sit amet,', 'olore eu feugiat nulla facili', 'ie consequat, vel illum dolo', 'takimata sanc', 'is nisl ut aliquip ex ', ' et accusam et justo duo dolores ', 'drerit in v', 'is autem vel eum iriure dolor ', 'Lorem ipsum dolor sit amet. Duis ', 'ure dolor in hendrerit in vulputate', 'at vero er', 'sis. At vero eos', 'tion ullamcorper suscipit lobor', 'rem ipsum dolor sit amet. Lor', 'uer adipiscing elit', 'etur sadipscing ', 'h euismod ', 'd option congue nihil imperdiet do', 'iet doming id quod mazim place', 'is nisl ut aliquip ex ea', 'um. Stet clita', 'tetuer adipiscing ', ' et dolore m', 'em ipsum dolor sit amet. Lorem ips', ' et ea rebum', ' et dolore magna aliquyam ', 'iquyam erat', 'utem vel eum', 'onsequat, vel illum do', 'acilisi. Lorem ipsum dolo', 'itr, sed diam nonu', 'nim veniam, quis nostrud exerci', 'ea rebum. St', 'cusam et j', 'to duo dolores et ea rebum. S', 'orem ipsum dolor sit amet, conse', 'si. Nam liber tempor cum solu', 'diam voluptua. At vero eo', ' kasd guber', 'kasd gubergren, no sea takimata sa', 'at, sed diam ', 'liquam erat ', ' et accusam et justo duo dolores e', 't ea rebum. Stet clita kasd gub', 'sanctus est Lorem ipsum dolor sit a', 'akimata sanctus es', 'uis autem vel e', 'dolore te feugait', 'sit amet. Lo', ' invidunt ut labore et dolore magn', 't dolore magna aliquam er', ', sed diam', 'is nostrud exe', 'olor sit amet. Lorem ipsum do', ' Lorem ipsum dolor sit amet, co', 'ccusam et justo duo dolores et ', 'ulla facil', 'd exerci tation ullamc', 'tet clita kasd gubergren, no', ' velit esse molestie ', 're magna aliquyam e', ', no sea takimata sanctus est Lor', 'amet. Lorem ipsum dolor sit amet, ', 'assum. Lorem ipsum dolor ', 'umy eirmod tempor invidunt ut labo', 'rem ipsum dolor sit amet, con', 'em ipsum dolor si', 'e velit ess', 'ubergren, no sea takima', 'a aliquyam erat, sed diam volu', 'erci tation ullamcorper', 'enim ad minim veniam, qui', ', consectetuer adipiscing elit,', 't. Lorem ipsum dolor sit amet', 'nctus est Lorem ips', 'a sanctus est Lorem ipsum dolor si', 'rem ipsum dolor sit amet. ', 'nostrud exerci tati', 'facilisi. Lorem ipsum do', ' eros et accumsan et iusto odi', 'luptatum zzril delenit augu', 'eniam, quis nostrud e', 'liquam erat volutpat. Ut wisi eni', 's at vero eros et accumsan et iusto', 'ren, no sea takimata sanctus', 'nctus est Lorem ipsum dolor', ' imperdiet d', 'consequat, vel i', ' tempor cum soluta nob', 'sed diam nonumy eirmod tempor in', 'rem ipsum dolor sit amet, consete', 's at vero eros et', 'u feugiat nulla facilisis. At', 'isi. Nam liber tempor cum so', 'gubergren, ', 'ore te feugait nulla facilisi. L', 'o consequat. Dui', 'ismod tinc', 'cidunt ut laoreet d', ' et dolore magna aliquyam erat', 'e feugait nulla facilisi. Lore', ' ut labore et dolore m', 're et dolore magna aliq', 'nsequat, vel illum dolore eu ', 'o eos et a', ' aliquyam erat, sed diam voluptu', 'lputate velit ess', 'psum dolor sit amet, co', ' aliquip ex ea commodo conseq', 'ea rebum. Stet clita kasd gubergre', 'ortis nisl ut aliquip', 'riure dolor in hendrerit in vul', 'uat. Duis autem vel eum iriur', 'dipscing elitr, sed d', 'vel eum iriure dolor in hen', 'erat, sed diam volupt', 'akimata sanctus est Lorem ip', 's dolore te f', 'ita kasd gubergren, no sea taki', 'sum dolor sit', 't ut labore et dolore', ' dolore te feugait nulla faci', 'unt ut labore et dolore ', 'qui blandit praesent lupta', 'diam voluptua. At vero eos', 'ipit lobor', 'et accusam et justo duo dol', 't praesent luptatum zzril d', 'quam erat vo', 'orper suscipit lobortis nisl ', 'ptua. At vero eos et accusam et j', 'tum zzril ', ' sanctus est Lorem ipsu', 'irmod tempor invidunt ut l', 'ummy nibh euismod tincidunt ut laor', 'd gubergren, no sea ', 'consequat, vel illum dolore ', 'is autem vel eum iriur', 'sed diam voluptua. At vero e', ' sed diam nonumy eirmod t', ' commodo consequat. ', 'corper suscipit lobortis nisl ut al', 'ed diam voluptua. At vero eos ', 'tation ullamcorper ', 'mcorper suscipit l', 'et accusam et justo duo dolores et', 'dolor in hendrerit in vulputate vel', 'ui blandit praesent l', 'lisi. Lorem ipsu', 'zzril delen', 'ero eos et ', 'mcorper suscipit loborti', 'anctus est Lorem ipsum dolor sit ', 'sequat. Duis', 'olutpat. Ut wisi enim ad min', 'rgren, no sea takimata', 't vero eos', 'et accusam et justo duo dolores', 'olutpat. Ut wisi enim ad minim', 'in vulputate velit esse molestie c', 'us est Lorem ipsum d', 'quat, vel illum dolore eu feugiat n', ', no sea takimata sanctus est Lore', 'l ut aliquip ex ea commodo c', 'rem ipsum dolor sit amet. Lore', 'g elitr, sed diam ', 'm dolor sit amet. Lorem ipsum dolor', ' erat, sed diam voluptua', 'it praesent luptatum zzril deleni', 'oreet dolore magna aliqua', 'ber tempor cum soluta nobi', 'dolore magna al', 'um iriure dolor in hend', 'tum zzril delenit augue ', 'd tempor invidunt ut labor', 'am voluptua. At vero', ' Lorem ipsum dolor s', 'et. Lorem ipsum dolor sit amet, co', 'landit praesent luptatum zzril', 'bergren, no sea takimata sanctus ', 'm dolor sit amet', 'duo dolores et ea rebu', 'umsan et iusto odio dignissim ', 'quat, vel illum dolor', 'lore eu feugiat nulla facilisis', ' veniam, quis nostrud exerci tation', 'rem ipsum dolor sit ', 'r sit amet. Lorem ipsum dolor s', 't accusam et justo duo dolores et', 't laoreet dol', 'ulputate velit esse', 't. Duis autem vel eum iriure', 'e eu feugiat nul', 'tum zzril delenit augue duis ', 'quat, vel illum dolore', 'ctus est Lorem ipsum dolor sit ame', 'aliquip ex ea commodo co', ' consetetur sadipscing ', 'lenit augue duis dolo', 'el eum iriure d', 'um dolor sit amet, consect', ' ea rebum. Stet', ' molestie c', ' vero eos et accu', 'r in hendrerit', 'at, sed diam voluptua. At ', 't. Duis autem vel eum iriure dolor ', 'ing elitr, sed diam nonumy eirmod ', 'tum zzril delenit augue duis dolore', 'na aliquyam erat, sed', 'asd gubergr', 'or sit amet. Lorem ipsum dolor s', 'doming id quod mazim placerat', 'os et accusam et just', 'l illum do', ' imperdiet doming id quod mazim ', ' sit amet. Lorem ', 'ption congue nihil ', 'giat nulla facilisis at ', 'am nonummy nibh euismod ti', 'to duo dolores et ', 'a aliquyam erat, sed diam voluptua', 'perdiet doming id quod', 'voluptua. ', 't amet. Duis autem vel e', 'tetur sadipscing elitr, sed diam no', ' dignissim qui blandit ', 'nsequat. Duis autem vel eum', 'Lorem ipsum dolor sit amet, con', 'rem ipsum dolor', 't vero eos et accusam', 'rgren, no sea takim', 'ip ex ea commodo consequat. Dui', 'em vel eum iriure d', 'ore et dolore magna aliquyam erat, ', '. Stet clita kasd gubergren, no ', 'iure dolor in hend', 'ugiat nulla fa', ' sanctus est Lorem ipsum dolor s', 'a nobis eleifend option congue nih', 'acilisis at', ' takimata sanctus est', ' placerat facer possim assum. Lo', 'm iriure dolor in ', 'lit esse molestie consequat, v', 'ros et accumsan et iusto odio di', 'psum dolor sit amet. Lorem ip', 'er suscipit lobortis nisl ut ', 'is nostrud exerc', 'illum dolore eu', 'oreet dolore mag', ' magna aliquam erat volutpat. Ut wi', 'es et ea rebum.', 'ut labore et dolo', 'a commodo co', 'nibh euismod tincidunt ut laor', '. At vero eos et acc', ' vero eos et accusam et justo', 'ebum. Stet ', 'm nonumy eirmod tempor invidunt ', 'e molestie consequat, vel', 'um dolor sit amet. L', 'dolore eu feugiat nulla facilisis', 'inim venia', 'it esse molestie conseq', ' At vero eos et accusam et justo du', 'olores et ea rebum.', 'tus est Lorem ipsum dolor sit amet.', 'hendrerit in vulputate velit esse ', 'or invidunt ut l', ' lobortis nisl ', 'ent luptatum zzril del', 'ren, no sea takimata sanct', 'eirmod tempor invidunt ut labore e', 'bore et dolore', 'invidunt ut labor', ' amet, consetetur', 'lla facilisis at vero eros et ', 'tet clita kasd gubergren, no sea ta', 'sse molestie c', 'e molestie consequat, vel i', 'uip ex ea commodo consequ', 'olore te feugait nul', 'sed diam voluptua. At vero eos ', 'Stet clita kasd gubergren', 'e consequat,', 'os et accusam e', 'takimata sa', 'acerat facer possim assum. L', 'erit in vulputate velit esse molest', ' Lorem ipsum ', 'e magna aliquyam erat, se', 'r possim assum. Lorem ipsum dolo', 'sanctus est ', 'r sadipscing elitr, sed diam nonu', 'vel illum dolo', 'a nobis eleifend option cong', ' dolor sit a', 'olor sit amet. Du', 'm iriure dolor in hendre', 'estie conseq', 'iam nonumy eirmod tempor invid', ' blandit pr', ' elitr, sed diam nonumy', 'am erat volutpat. Ut wisi en', 't luptatum zzril delenit augue dui', 't wisi enim ad minim veniam, quis ', 't praesent luptatum zzril del', 'eum iriure dolor ', 'stie consequat, ', 'trud exerci tation ullamcorp', 'erdiet domi', 'm et justo duo dolores et ', 'cing elitr, sed diam n', 'onsequat, v', 'duo dolores et', 'asd gubergren, no sea ', 'itr, sed diam nonumy', 'sed diam nonummy nibh euismod t', 'cumsan et iusto odio dignissim ', 'uis dolore te feugait nu', 'o odio dignissim qui blandit ', 'dipiscing elit, sed diam no', 'i tation ullamcorper suscipit ', 'in vulputate velit esse mo', 'bergren, no sea ', 'psum dolor sit amet', 'en, no sea takimata sanctus est', ' dolore magna aliquya', 't iusto odio dignissim qui b', ' eirmod tempor invidunt ut l', 'nonumy eirmod tempor invidu', 't, vel illum dolore eu feugia', 'sum. Lorem ipsum dolor sit amet,', 'irmod tempor invidunt', 'akimata san', 'us est Lorem ipsu', 'consetetur sadipscing', 'um dolor sit ame', 't wisi enim ad minim veniam,', 'litr, sed diam nonumy eirmod te', 'lputate velit ', 'liquam erat volutpat. Ut wisi enim', 'o duo dolores et ea re', 'pscing elitr', 'dignissim qui blandit praesent ', 'magna aliquyam e', 'at. Duis a', 'o sea takimata sanctus est Lorem', 'nsequat, vel il', 'ipscing elitr, sed diam nonumy ei', 'itr, sed diam', 'ing elitr, sed diam nonumy eirmo', ', no sea takimata sanctus est Lorem', 'erat volutpat. Ut wisi enim ', 'delenit augue duis dolo', 'od tincidunt ut laoreet dolore m', 'um. Stet clita kasd gubergren, no ', ' Stet clita kasd gu', ' diam voluptua. At vero eos et accu', 'tis nisl ut aliquip ex ea ', ' consequat. Duis autem vel eum ', 'zzril delenit augue duis d', 'lla facilisis at', ' consequat, vel illum dolore eu ', 'at. Duis autem vel e', ' eum iriure dolor', 'nostrud exe', 'sis at vero eros et', 'ostrud exerci tation', 'ulputate ve', 'te feugait null', 'm nonumy eirmod tempor invidunt', 'ulputate velit esse moles', 'tetur sadipscing elitr, sed', 'olestie consequat, ', ' minim veni', '. Lorem ipsum dolor sit amet', 'ptatum zzril delenit augue duis d', ' vulputate velit es', 'ta sanctus est Lorem ipsum do', 'ctetuer adipiscing elit', 'olor sit amet. Lorem ip', 'ata sanctus est Lorem ipsum dolor', 'ebum. Stet clita kasd guberg', 'onumy eirmod tempor invidunt ', ' est Lorem ipsum', ' lobortis nisl ut aliquip ex ', 'y eirmod tempor invidunt u', 'sto duo dolor', '. At vero eos et accusam et just', 'iure dolor in hendrerit in', 'sed diam voluptua.', 'd diam nonumy eirmod t', 's autem vel', 'et accusam et just', 'l illum dolore eu feugi', ' amet, consectetuer ad', 'mata sanctus est Lorem ips', 'ismod tincidunt ut laoree', 't amet. Lorem ipsum dolor sit amet', ' dolor sit amet. Duis autem vel e', ' vero eos et accus', 'vulputate veli', 'et dolore magna al', 'dolor in hendrerit in vu', ' ipsum dolor sit amet. Lorem ipsu', ' amet. Lorem ipsum dolor sit a', 'lputate velit esse mol', 'iquyam erat,', 'amet. Lorem ', 'cing elitr, sed', 'Lorem ipsum d', 'sl ut aliquip ex e', 'ita kasd gubergren, no sea', 'a. At vero eos', 'aoreet dol', ' wisi enim ad minim veniam, quis no', 'e velit esse mole', 'rat facer possim assu', ' invidunt ut labore et dolore mag', ' eos et accusam et justo duo do', 'dunt ut labore et dolore magna ', ' sea takimata sanctus est Lore', 'rem ipsum dolor sit ame', 'duo dolores et ea rebum. ', 'r sadipscing elitr, sed diam nonumy', 'nit augue duis dolore te feugait n', 'lisis at vero eros et accu', 'ure dolor i', 'duo dolores et ea rebu', ' sanctus est Lorem ipsum d', 'At vero eo', 'et iusto odio dignissim qui bland', 'akimata sanct', 'ng elitr, sed diam nonumy ', 'llum dolore eu feug', 'commodo consequat. Duis autem vel e', 'zril delenit augue duis do', ' dolores et ea rebum. Stet ', 's dolore te feugait n', 'imata sanctus est Lorem ipsum dolor', 'or invidunt ut labore et dolo', 'ut labore et dolore magn', 'olor sit a', 'eifend option congue nihil', ' vero eos et acc', 'sed diam nonumy eirmod tempor invi', 'olore te feugait nulla facilisi.', 'Duis autem vel eum iriure do', 'a facilisis. At vero eos et acc', ' eirmod tempor invidunt ut ', 'consequat, vel illum dolore', 'ed diam vo', 'tetur sadipscing e', 'm, quis nostrud exerc', 's et accusam et ', 'um iriure dolor', 'eu feugiat nulla fac', 'rem ipsum ', 'eros et accumsan ', 'sea takimata', ' qui blandit praesent luptatum z', ' vero eos et a', 'it amet, consetetur sadip', 'uis dolore te feugai', ' sadipscing elitr, se', 'olore eu feugiat nulla fa', ' diam nonummy nibh euismod tinci', 's nisl ut aliquip ex ea commodo c', 'msan et iusto odio dignissim qui', 'm dolore eu ', 'uam erat volutpat. Ut wisi enim a', 'od tempor invidunt', 'ccusam et justo duo dolores et ea ', 'nt luptatum zzril d', 'Lorem ipsum dolor si', 'bergren, no sea takim', 'uam erat volutpat. ', 'nctus est Lorem ', 'sequat, vel il', ' accumsan et iusto odio dignissim q', 'ergren, no sea takimata sanctus e', 'aliquyam erat, sed d', 'lore magna aliquyam erat, sed diam', 'llum dolore eu feugiat nulla', 'rem ipsum dolor s', ' dolore eu feugiat nulla ', 'setetur sadipscing el', 'diam voluptua. At ', 't clita kasd guber', 'lit, sed diam nonummy nibh', ' At vero eos et accus', 'ta kasd gubergren, no sea t', 'et, consectetuer adipiscing ', 'it esse molest', 'usto duo dolores et ea rebu', 'or sit amet, consect', 'iquyam erat, se', 'oluptua. At', 'dignissim qui blandit praesent l', 'ta sanctus est Lore', 'olestie consequat, vel il', '. Lorem ipsum dolor sit amet, conse', 'ctus est Lorem ipsum dolor sit a', 'ad minim veniam', 'nctus est Lorem ipsum dol', 'ait nulla facilisi. Nam libe', 'dolor sit amet, c', 'm. Stet clita kasd gubergren,', 'erit in vulputate velit esse moles', ' vero eos ', 'pit lobort', 'rem ipsum dolor sit amet, co', 'ng elit, sed diam non', 'issim qui blandit praesen', 'im qui blandit praesent lupt', 'dunt ut labore et dolore magna a', 'bum. Stet clita kasd gubergren', 'a takimata sanct', 'raesent lupta', 'ion congue nihil imperdiet doming ', 'psum dolor sit amet, consetet', 'mod tempor invidunt ut labor', 't accusam e', ' et ea rebum. Stet clita kas', ' vel eum ir', 'ctus est Lorem ipsum dolor s', 'lor in hendrerit', ' suscipit lobortis nisl ut aliqui', 'et clita kasd gubergren', 'et ea rebu', 'rat, sed diam volupt', 'gubergren, no sea', 'm vel eum iriure dolor in hendr', 'bortis nisl ut aliqu', 'uyam erat, sed di', 'onsetetur sadipscing elit', 'ipsum dolor sit amet, consect', 'kimata sanctus est Lorem', 'et, consetetur sadipscing el', 'o duo dolores et ea rebu', ' nihil impe', 'rit in vulputate ', ' erat, sed diam vo', ' labore et dolore magna aliquyam er', 'utpat. Ut wisi enim ad', 'sd gubergren, no s', 't ut laoreet dolore magna aliquam e', 'vulputate velit esse mol', 'isis. At vero eos et accusam ', 'uptua. At vero eos e', 'd diam nonumy eirm', 'et accumsan ', 't accumsan et iusto odio di', 'im ad minim venia', 'ui blandit prae', 'cusam et justo du', 'feugait nulla facilisi. Lorem ipsu', 'magna aliquam erat volutpat. ', 'um. Stet clita kas', 'equat. Duis autem vel eum iriure ', ' ipsum dolor sit a', 'mcorper suscipit lobor', 'lisis. At vero eos e', 'minim veniam, quis nostrud e', 'Lorem ipsum dolor sit am', 'lore eu feugiat n', 'et doming id quo', 'tum zzril delenit aug', 'ulla facilisis. At ve', ' ipsum dolor sit amet, consetetur', 'adipscing elitr, sed diam', 'o eos et accusam et justo duo do', 'quip ex ea commodo consequa', 'ctus est Lo', 'et. Lorem ipsu', ' kasd gubergren, no sea taki', 'res et ea ', 'ihil imperdiet doming id', 'n et iusto odio dignissim qu', 'cing elitr, sed diam nonumy e', 'nvidunt ut labor', 'r in hendre', 'x ea commo', ' clita kasd gubergren, no se', 'er suscipit ', 'et justo duo dolores', 'esent luptatum zzril delenit au', 'luptatum zzril del', 'usto duo dolores ', 'it amet, consecte', 'sectetuer adipiscing elit, sed di', 'it praesent luptatum', 'lum dolore eu feugiat nul', 'em ipsum dolor sit ame', 'o eos et accusam et justo duo dol', 'lutpat. Ut wisi enim ad min', 'ebum. Stet clita kasd gubergre', 'id quod mazim placerat facer', 'dolore magna aliquam erat vo', 'ut aliquip ex ea commodo conseq', 'ommodo consequat. Duis au', 'm dolor sit amet, consectetue', 'itr, sed diam nonumy eirmod tempor ', 'veniam, quis nostrud exerci', 'At vero eos et accusam et just', 'na aliquam erat vol', 'm zzril delenit augue ', ' eu feugiat nulla facilisis at vero', 'r sit amet.', 'quat, vel illum ', 'ation ullamcorper suscipit lobortis', 'uis autem vel eum iri', 'tem vel eum iri', 'ata sanctus est', ' vel illum dolor', 'cing elitr, sed diam nonumy eir', 'm ipsum do', 'modo consequat. Duis autem vel eum ', 'm. Stet clita kasd gubergren, no se', 'smod tincidunt ut laoreet dolore ', 'iquyam erat, ', ' est Lorem ipsum ', 'no sea takimata sanctus est Lorem i', 'st Lorem ipsum dolor', ' justo duo dolores e', ' feugiat nulla facilisis at vero e', 'sam et justo duo dolores et ea reb', 'ero eos et a', 'laoreet dolore magna al', 's nisl ut aliquip ex ea c', 'iure dolor in hendrerit in', 'utpat. Ut wisi enim ad minim', 'acerat facer poss', ' diam nonumm', 'numy eirmod tempor invidunt ut l', 'ulla facilisis at vero eros et accu', 'ng elit, sed diam n', 'm nonumy eirm', 'ie consequat, vel ', 'e duis dolore te feugait nul', 'sis at vero eros et accum', 'tempor invidunt ut lab', 'justo duo dolores et ea rebum', '. Lorem ipsum dolor sit am', ' est Lorem ipsum dolor sit a', 'ostrud exerci tation ullamcorper', 'bis eleifend option congue nihil i', 'gnissim qui blandit p', 'rit in vulputate vel', 'olor sit am', 'kasd gubergren, no sea tak', 'eu feugiat nulla facilisis at vero ', 'it amet, consectetuer a', 'os et accusam et justo duo dolo', 'n et iusto odio digniss', 'ing elit, sed diam nonummy nibh e', 'orem ipsum dolor sit amet, c', 'diam nonummy nibh euismod tincidu', 'cipit lobortis nisl u', 'sed diam v', 'adipiscing elit, sed diam non', 'uat, vel i', 'i blandit pr', ' cum soluta', ' feugiat nulla facili', ' vero eos et accusam et justo duo ', 'tempor invidunt ', 'ing elit, sed diam nonummy nib', 'tetur sadipscing elitr', 'on congue nihil impe', 'sto duo dolores et ea rebu', 'psum dolor sit amet, consetetur sad', ' delenit augue duis dolore ', 'giat nulla fac', 'es et ea r', 'tis nisl ut aliqu', 'd minim veniam, quis nostru', ' feugiat n', 't. Ut wisi en', 'is autem vel eum iriure ', 'tua. At vero eos e', 't, vel illum dolore eu feug', 'lore te feugait nulla facilis', 'dolore magna aliquam er', 'mmodo consequat. Du', 'la facilisis at vero eros et acc', ' lobortis nisl ut aliquip', 't clita kasd gubergren, no sea ta', 'iam nonumy eirmod temp', ' iusto odio digniss', 'ptatum zzril delenit a', 'onummy nibh euismod t', ', consetetur sadipscin', 'od mazim placerat facer possim as', 'ing elitr, ', 'sse molestie consequat, vel illum ', ' lobortis ni', 'um. Stet clita ka', 'ut labore et ', ' facilisis at', 'm ipsum dolo', 't accusam et j', ' elitr, sed diam nonum', 'rat, sed diam voluptua. At v', 'ta sanctus est ', 'sto duo dolores et e', ' Stet clita kasd gubergren, no', 'akimata sanctus est Lo', 'iam voluptua. ', ' sanctus est Lorem ipsum do', 'nisl ut aliquip ex ea commodo c', 'uismod tincidun', ', no sea takimata sanctus est', ', vel illum dolore eu feugiat', 't nulla facilisi. Lo', 'ed diam nonumy eirmod tem', 'e te feugait nulla facilisi.', 're dolor in hendreri', ' minim veniam,', ' dolor in hendrerit ', 'is nostrud exerci tation ullam', 'ut aliquip ex ea c', 'm, quis nostrud exerci tation ullam', 'iscing elit, sed dia', 's est Lorem ipsum dolor sit ', ' rebum. Stet clita', 'bum. Stet clita kasd gu', 'cipit lobortis nis', 'lor sit amet. Lor', 'suscipit lobo', ' dolore magna aliquyam ', 'cing elitr, sed diam nonumy eirmod', '. Stet clita ka', 'facilisis at vero eros', 'il delenit augue duis dolore t', 'r suscipit lobortis nisl ut aliquip', 'cing elitr, sed ', 'gren, no sea ', ' kasd guber', 'strud exerci t', 'r adipiscing e', ' vero eos et accusam et justo d', 'praesent lu', 's eleifend option ', 'equat, vel illum dolore eu ', 'andit praesent lupt', 't Lorem ipsum dolor sit', 'ur sadipscing', 'orper suscipit lobortis ', 't accusam et justo d', 'ming id quod maz', 'accusam et justo duo', ', no sea takimata sanctus', 'tus est Lorem ipsum dolor sit ', 'mpor cum soluta nobis eleifend opti', 'onumy eirmod tempor invidunt ut', ' nulla facilisi. Nam ', ' vel illum dolo', 'lisis at vero eros et', 'sit amet, conse', 'ie consequat, vel illum dolore eu ', 'sequat. Duis autem ve', 'iquyam erat, sed dia', 's autem vel eum ', 'uptua. At vero eos et accusam e', 'bortis nisl ut a', 'nsequat, vel illum dolore ', 'sse molestie consequat, vel ', 'tincidunt ut laoreet dolore ma', 'rit in vulputate v', 'm soluta nobis eleifend option ', ' ea rebum. Stet cli', 'amet, consetetur sadipscin', 'rerit in vulputate vel', 'ipsum dolor sit amet, consete', ' tempor invidunt ut labore et dolo', 't wisi enim ', 'ndit praesent luptatu', 'dolor sit amet', 'nsequat. Duis a', 'na aliquyam erat, sed diam voluptu', 'y eirmod tempor invidunt ut labore', 'usto odio dignissim qui blandit', 'rem ipsum dolor sit amet, consete', 'nsequat, vel illum dolore eu feu', 'um iriure dolor in hendrerit ', 'ea takimata sanctus est', 'scing elitr, sed diam nonumy ', 'praesent luptatum zzril del', 'dolor sit amet, consetetur', 'm soluta nobis eleifend option co', 's et accumsan et iusto o', 'ero eos et ac', 'se molestie conse', ' sed diam voluptua. At vero eo', 'orem ipsum ', 'agna aliquam erat volutpat. Ut wi', ' ullamcorper suscipit l', 'ation ullamcorper suscipit loborti', 'zril delenit augue duis dolore te ', 'uis nostrud exerci tation ullam', 'onummy nibh', 'corper susc', 'volutpat. U', 'd option congue nihil impe', 'us est Lorem ipsum dolor s', 'quam erat volutpat. Ut wisi enim a', 'ea rebum. S', 'ebum. Stet', 'm soluta n', 'met, consectetuer ', 'it amet. Lorem ipsum dolor si', ' diam nonumy eirmod tempor inv', 'em ipsum dolor sit amet, consectetu', ' consequat, vel illum dolore eu f', 'uyam erat, sed diam voluptua. At ', 'ulla facilisis at vero eros', 'm nonumy eirmod', 'tus est Lorem ipsum dol', 'erat facer poss', 'empor invidunt ut lab', 'um. Stet clita kasd gub', 'e et dolore magna aliquyam erat,', 't Lorem ipsum dolor s', 'imata sanctus est Lorem ipsum ', 'nulla facilisis at vero er', 'ua. At vero eos et accusam e', 'm ipsum dolor sit a', ' in hendrerit in vulput', 'nsectetuer adipis', 'diam nonummy nibh euismod tin', 'nonummy nibh euismod tincidu', ' eum iriure dolor i', 'olestie consequat', 'i. Lorem ipsum dolor sit amet, ', ' At vero eos et ', 't ea rebum. ', 'erci tation ullam', 'tur sadipscing elitr, sed ', ' diam nonummy nibh euismod ', 'x ea commodo consequa', 't amet, conse', 'uer adipiscing elit, sed diam nonu', 'm iriure dolor in hendrerit in ', 'ea commodo co', 'ssim qui blandit praese', 'duo dolores et ea rebu', 'kimata sanctus est L', 'lla facilisi. Nam liber tempor cum ', 'magna aliquyam ', 'ipsum dolo', 'ming id quod ', 't amet, consetetur sadipsci', 't nulla facilisis at vero eros et ', 't Lorem ipsum dolo', 'ut labore et dolore magna aliqu', 'riure dolor in hendrerit in vulputa', 'et accusam et justo du', ' eos et accu', 't nulla facili', 'on congue nihil imperdiet ', 'ipsum dolor sit amet, con', 'Lorem ipsum ', ' eos et accusam et justo duo dolor', 'ore eu feugiat nulla ', ' ut laoreet dolore magna aliquam er', 'hendrerit in', 'incidunt ut laoreet dolore magna ', 'it praesent ', 'nulla facilisis at ve', ' et ea rebum. Stet clita kasd gu', ' iusto odio dignissim qui bland', ' invidunt ut labore', '. Lorem ipsum dolor sit amet', 'amet, conset', ' soluta nobis eleife', 'n, no sea ', ' velit esse molestie con', 'uismod tincidunt ut laor', 'nsequat, vel illum d', 'et, consectetuer adipiscing e', 'liquam erat volutpat. Ut wi', 'sit amet. L', 'rem ipsum dolor sit amet', 'l eum iriure dolor i', ' sit amet, consetetur sadipscin', 'eugiat nulla fac', 'a kasd gubergren, no sea ta', 'am erat, sed diam voluptua', 'lita kasd gubergren, no sea tak', 't justo duo dolores et ea rebum. St', ' gubergren, no sea tak', 'isl ut aliquip e', 'ue duis dolore te f', 't, sed diam voluptua. At vero eos', 't amet. Lorem ipsum dolor si', 'o dolores et ea rebum. Stet clita k', 'olores et ea re', 't. Lorem ipsum dolor sit amet, c', 'dolore magna', 'velit esse molestie cons', 'est Lorem ip', 'm nonumy eirmod tempor i', ' aliquip ex ea commod', 'cusam et justo duo dolores et ', 'aliquam erat volutpat. Ut wisi ', 'ur sadipscing elitr, sed dia', ' clita kasd gubergren', 'llamcorper suscipit', 'nisl ut ali', 'et clita kasd', 'ea rebum. Stet clita kasd gubergr', 'r adipiscin', 'ita kasd gubergren, no sea', 'e velit esse molestie co', 'takimata sanctus est Lo', 'bortis nisl ut aliquip ex ', 'uip ex ea commod', ' Lorem ipsum dolor sit amet,', ' elitr, sed', ' Nam liber tempor cum soluta n', ' Lorem ipsum dolor sit amet', ' dolores et ea rebu', 'ulla facilisi. Na', 'acilisis. At vero e', 'equat, vel illum dolore eu', 'utate velit esse', 'o dignissim qui blandit praesent l', 'm dolor si', 'sea takimata sanctus est Lorem ips', 'el eum iriure', 'dipiscing elit, sed diam nonum', 'lestie consequat, vel il', 'et accusam et ju', 'kasd gubergren, no sea takima', 'nonummy nibh euismod tin', 'm iriure dolor in hendrerit ', 'laoreet dolore magna', ' euismod tincidunt ut laoreet do', 'raesent lu', 'odio dignissim ', 't justo duo ', 'quat, vel illum', 'd diam nonummy nibh euismod tinci', 'n ullamcorper suscipit lobortis ', ' dolor in he', 'scing elit, sed diam non', 'iber tempor cum soluta nobis eleif', ', sed diam voluptua', 'la facilisis ', ' exerci tation ullamcorper ', 'erat volutpat. Ut wisi enim ad min', ' consequat. Duis autem', 'g elit, se', 'ebum. Stet clita', 'rper suscipit lobortis ni', ' adipiscing elit, sed diam nonummy', ' hendrerit in vulputa', 'erci tation', 'uta nobis eleifend option co', 't ut laoreet dolore magn', ', consectetue', 'met, consetetur sadipscing elitr,', 'iam nonumy eirmod tempor invidunt u', 'per suscip', 'ulputate velit esse molestie cons', 'illum dolore eu feugi', 'n, no sea taki', 'uismod tincid', 'obortis nisl ut aliqui', 'dunt ut laoreet dolore ', 'et accusam ', ', sed diam nonumy eirmod', 'por invidunt ut labore et ', ' sea takimata sanctus est Lore', ' vero eos et accusam', 'scipit lobort', ' facer poss', 'vel eum iriu', 't nulla facilisi. Nam liber temp', 'rmod tempor invidunt ut l', 'rat facer possim assum. ', 'e consequat, ', 'orem ipsum dolor ', 'quam erat volutpat. Ut wis', ' eirmod tempor invidunt ut labor', 'lita kasd gubergren, no se', 'vero eos et accusam ', 'et, consete', 'usto duo dolores et ea rebum', ', consetetur sadipsc', ' eirmod tempor invidunt ut labore ', 'rud exerci tation ullamco', 'putate velit esse molestie conse', ' sadipscing el', 'um. Lorem ipsum dolor sit a', 'lobortis n', 'rem ipsum d', 'ta sanctus est Lorem ipsum', ' nonumy eirmod te', 'la facilisi', 'llamcorper s', 'd tempor invidunt ut labor', 'voluptua. At vero eos et a', 'et. Duis autem vel eu', 'imperdiet doming id quod ma', 'dolore magna aliquyam erat, sed ', 'drerit in vulputate', 'e eu feugiat nulla facilisis at ve', 'e consequat, vel illum ', 'orem ipsum d', 'm et justo duo dol', 'piscing elit, sed ', 'ex ea commodo consequ', 'o duo dolor', 'm qui blandit ', 'dolore te feugait ', 'liquyam erat, s', 'ren, no sea takimata sa', 'ncidunt ut laoreet dolore ma', 's est Lorem ipsum dolor sit', 'ore magna aliquam erat', ' dolores et ea ', 'es et ea rebum. Stet clita k', 'sea takimata ', 't, sed diam', 'sum dolor sit amet, consectetuer ', 'r sit amet, consetetur sadipscin', 'ncidunt ut laoreet dol', 'on ullamcorper suscipit lobo', ' wisi enim ad minim', 'pit lobortis nisl ut aliquip ex ea', 'rud exerci tation ull', 'ate velit esse', 'dunt ut labore et', 'h euismod tincidunt ut laor', 'ergren, no sea takimata sanctu', ' dolore te feu', ' ipsum dolor sit amet', 'iat nulla facilisis at vero eros', 'lla facilisis. A', 'nim ad minim veniam, q', 'd diam nonumy eirmod temp', '. At vero eos et', 'nulla facilisi. Lorem ip', 'ore eu feugiat nulla facilisis. ', 'tr, sed diam nonumy eir', 'rper suscipit lobortis n', 'ipsum dolor sit amet. ', 'lamcorper ', 'takimata sanctus est Lorem ipsum ', 'lore magna aliquyam era', 't ea rebum. Stet clita kasd gu', 'r sit amet. Lorem ipsum dolor', ' velit esse molestie con', ' autem vel eum iriure dolor in hen', 'tur sadipscing ', 'luptatum zzril delenit augue d', 'n vulputate ve', ' doming id quod mazim p', 'aoreet dolore magna al', 'ilisis at vero eros et accumsan ', 'lor sit amet. Duis autem', 'cing elit, ', ' amet, consetetur s', 'in hendrerit in vulputate veli', 'volutpat. Ut wisi en', 'onsequat, vel il', 't accusam et justo duo dol', ' invidunt ut la', ' sed diam voluptua. At ', 'cum soluta nobis eleifend option', ' tempor cu', 'am et justo duo dolores et ea rebum', ' eirmod tempor invidunt ut', 'ui blandit praesent luptatu', 'lores et ea rebum', 'facer possim assum. Lorem ips', 'iam, quis nostrud exer', 'olore magna aliquam e', 'idunt ut laor', 'ommodo consequat. D', ' est Lorem ipsum dolor sit ame', 'invidunt ut labore et dolore ma', ' diam voluptua. At v', 'andit praesent luptatum ', 'lita kasd gubergren', 'is. At vero eos et accusam ', 'issim qui blandit praesent lu', 't ea rebum', ' dolore magna aliquam erat volutpa', 'orem ipsum dolor sit amet. L', 'm placerat facer possim assum. Lore', ' ipsum dolor sit amet. ', 'ent luptatum zzr', 'acilisis. At vero eos et ac', ' dolore magna aliquyam erat, s', 'n et iusto odio dignissim qui bl', 'isi enim ad', 'eet dolore magna a', 'usto odio ', ' sit amet. Lorem ipsum dolor ', 'commodo cons', 'idunt ut laoreet do', ' sit amet, consete', 'gubergren, no sea takimata sanctus', 'vel illum dol', ' iusto odio dignissim qui ', 'giat nulla facilisis. A', ' kasd gubergre', 'elit esse molestie consequat, vel', 'a facilisi. Nam liber tempor c', 'ua. At vero eos et', 'sum dolor sit a', 'psum dolor sit', 'e molestie consequat, vel i', ' dolore magna aliquam ', 'vidunt ut labore et dolore magn', 'er adipiscing elit, sed diam', 'psum dolor sit amet, consectetuer ', 'ilisi. Nam liber tempor cum so', ' sanctus est Lorem ipsum dol', 'et accumsan et ', 'a nobis eleifend opt', 'it nulla facilisi. Lorem ipsum dol', 'm et justo duo dolores et e', ' adipiscing elit, sed', 'bortis nisl ut aliquip ex ea c', 'bortis nisl ut aliquip ex ea', 'At vero eos et accusa', 'at, sed diam vo', ' eu feugiat nulla facilisis at v', ' ipsum dolor sit amet, consectet', 'cipit lobortis nisl ut aliquip', ' eos et accusa', 'Ut wisi enim ad min', 'diam nonummy ', 'dolor sit amet. Lore', 'ore et dolore ', 'or invidunt', 'tie consequat, v', 'u feugiat nu', 'te feugait nulla facilisi. Lorem', 'ndrerit in vulputate velit ', 'o sea takimata sanctus est Lorem ip', 'setetur sadipscing elitr', 'met. Duis au', 'pscing elitr, sed diam nonumy eirmo', 'iure dolor i', ' amet. Duis autem vel eum', ' nobis eleifend option ', 'at volutpat. Ut wisi enim a', 'em ipsum dolor sit', 'm vel eum iriure dolor in hendreri', 'dolore magna aliquyam erat, sed dia', ' kasd gubergren, no sea t', 'e te feugait nulla fa', 'velit esse molesti', 'erat volutpat.', 'labore et dolore mag', 'r sit amet, c', 'la facilisi. Nam liber t', 'oluptua. At vero eos et accusam', 'setetur sadipscing elitr, sed diam', 'it amet. Duis a', 'na aliquam erat v', ' possim assum. Lorem ipsum do', 'olestie consequat, vel illum dol', 'lores et ea rebum. S', 'etetur sadipscing e', 'odio dignissim qui blandit ', 'diam nonumy eirmod tempor invidunt ', 'l eum iriure dolor in ', 'setetur sadipscing eli', 'volutpat. Ut wisi ', 'xerci tatio', 'nsetetur sadip', ' vero eros et accums', 'psum dolor sit amet, c', 'lestie consequat, vel illum do', 'ifend option co', 'o dolores et ea rebum. Stet clit', 'lore magna aliquyam erat, sed di', ' gubergren, no sea takimata sanctu', 'unt ut labore et do', 'd diam nonumy eirmod tempor', 'acilisis at vero', 'ait nulla facilis', ' at vero eros et acc', 'dolor sit amet. Lorem ', ' illum dolore eu fe', ' kasd gubergren, no sea ', 'te velit es', 'nctus est Lor', 'rci tation ullamcorper suscipit lob', 'm vel eum iriure dolor', 'gue duis dol', 'et. Lorem ipsum do', 'lores et ea rebum. Stet clita k', 'facilisis. At vero eos et accusa', ' aliquip ex ea ', 'r adipiscing elit, sed diam non', ' ad minim veniam, quis nost', 'el illum dolore eu fe', 'llamcorper susc', ' gubergren, no sea t', 'Lorem ipsum dolor', 'sit amet. Lorem ipsum dolor sit a', 'a aliquyam erat, sed diam volup', 'blandit praesent luptatum zzr', 're dolor in hendrer', 'met, consect', 'obortis nisl ut aliquip ex ea c', 't ut labore et dolore magna', 'm ipsum dolor sit amet. Lor', 'sed diam nonumy eirmod temp', ' volutpat. Ut wisi enim ad minim ', 'usto odio dignissim qui blandit ', 't, sed dia', 'm et justo duo dolore', ' facilisis at vero eros et accums', 'rper suscipit', 'a rebum. St', 'e eu feugiat n', 'na aliquam erat volutp', 'azim placerat f', 'amcorper suscipit loborti', 'lor sit amet. Lorem ipsu', 'eos et accusam et jus', 'ores et ea rebum. Stet clita kas', 'eugiat nulla facilis', 'congue nihil imperd', 'irmod tempor invidunt u', 'at nulla facilisis. At vero eo', ' facilisis. At ', 'e molestie consequa', '. Ut wisi enim ad min', 't vero eros et accumsan et ius', ', sed diam voluptua. At vero', ' nulla facilisis ', 'nim veniam', 'sto duo dolores et ea reb', 'tur sadipscing elitr, sed dia', 'bortis nisl ut aliquip ex ea comm', 't nulla facilisis. At vero eos et ', ' Lorem ipsum dolor sit amet, conse', 'veniam, qu', 's dolore te feugait nulla facilisi', 'lobortis nisl ut aliquip ex ea comm', 'exerci tation ullamcorper', 'uptua. At vero e', 'uptatum zzril', 'vel eum iriure dolor in hendreri', ' vero eros et acc', 'met, consectetue', 'amcorper suscipit', 'ata sanctus est Lore', ' diam nonumy eirmod tempor invi', 'uo dolores et ea rebum. Stet ', 'sanctus est ', ' et dolore magna ', ' dolore eu feugiat nulla facilisi', 'quis nostrud exerci ta', ' ut labore et dolor', 'eos et accusam et', 'suscipit loborti', 'ore magna aliqu', 'it amet. Lorem ipsum dolor sit', 'am erat, sed d', 'tur sadipscing elitr, sed di', ' id quod mazim placerat fac', ', no sea takim', 'rem ipsum dolor sit amet, c', 'en, no sea takimata sanctus est Lo', 'putate velit esse molestie', ' nobis eleifend', 'sectetuer adipiscing el', 'ores et ea rebum. Stet clita', 'ectetuer adipiscing elit, sed d', 'azim placerat facer possim ', 'lit esse molestie conse', 'Stet clita kasd gubergren, no s', 'na aliquam', ' feugiat nulla fac', 'uis autem vel eum i', 'or sit amet. Lorem ipsum dolor sit', 'gubergren, no sea takimata sanctus ', 'm ipsum dolor sit amet, consetetu', 'pscing elitr, sed diam nonumy e', 'onummy nibh euismod tincidunt ut ', 'ea rebum. Stet clita', ' cum soluta no', 'Lorem ipsum dolor sit amet', 'Duis autem vel eum i', 're magna al', 'is nostrud exerci tation ullamco', 'mata sanctus est Lorem ip', 'um soluta nobis ', ' accusam et justo duo dolore', 'est Lorem ipsum dolor sit ame', 'numy eirmod tempor i', 'consequat. D', 'gna aliquam e', 'umy eirmod tempor invid', ' eros et accumsan et iusto odio', 'diet doming id quod mazim plac', 'iam nonumy', 'ta kasd gu', 'or sit amet, consetetur sa', 'consequat, vel illum dolore eu feug', 'et accusam et ', 'sed diam voluptua. At vero eos et ', 'accumsan et iusto odio d', 'ipit lobortis nisl ut a', 'et justo duo dolo', 'et iusto o', 'o duo dolores et e', 'o duo dolore', 'ie consequat, ', 'eugiat nul', ' minim veniam, quis nostrud e', 'o eos et accusam et jus', 'p ex ea commodo consequ', ' veniam, quis nostrud exerci ', 'ut aliquip ex ea commod', 'enim ad minim veniam,', 'obis eleifend', 'elitr, sed diam nonumy eirmod te', 'dipscing elitr, sed ', ' amet. Duis autem vel eum ir', 'usto duo dolores et ea rebum.', '. Duis autem v', 'od mazim plac', 'o eros et ', 'r in hendrer', 'ores et ea rebum. St', 'rat volutpat. Ut wisi e', 'um. Lorem ip', 'onsequat, vel illum dolore eu feu', 't ea rebum. Stet c', 'ta sanctus est L', 'Lorem ipsum dolor sit amet, co', 'vel eum iriure dolor in hendrerit i', 's est Lorem ipsum dolor sit', 'en, no sea t', ' sit amet, consetetur sadipsc', 'it lobortis', 't esse molestie', 'enim ad minim veniam, quis nost', 'e molestie consequat, vel ill', 'nctus est Lorem ipsum dolor sit ', 'anctus est Lorem ipsum dolo', 'nit augue duis', 'iam, quis nostrud exerci ', 'o consequat. D', 'dit praesent luptatum zzril de', 'it augue duis dolore te feugait ', ', sed diam nonummy nibh euismod tin', 't nulla facilisis at vero er', 'm et justo duo dolo', 'erat, sed diam voluptua. At', 'ummy nibh euismod tincidunt', 'nt luptatum zzri', ' ex ea commo', 'ta nobis eleifend o', 'ssum. Lorem ipsum do', ' praesent luptatum zzri', ' amet, consetetur sadipscing e', 'isi. Lorem ipsum dolor sit ', 'nt ut labore et dolore magna aliqu', 'idunt ut labore e', 'm et justo du', 'dolores et ea rebum', 'm ad minim ', 'ores et ea rebum. ', 'molestie consequat, vel illum dolo', 'et, consetetu', 'onumy eirmod tempor in', 'la facilisi. Nam l', 'ugiat nulla facilisis at vero ero', 'nonumy eirmod tempor invidunt ', ' amet. Lorem ipsum dolor sit amet', 'aliquyam er', 'r invidunt ut labore et dolore', 'onsequat. Du', 'st Lorem ipsum', 'a takimata sanctu', 'i tation ullamcorpe', 'xerci tation ullamcorper sus', 'm ipsum do', ' in hendrerit in vulputate vel', ' ipsum dolor sit am', ' clita kasd gubergren,', 'nt ut labore ', 'Stet clita kasd ', 'ores et ea rebum. Stet c', 'usto duo dol', 'quat. Duis autem v', ', sed diam nonumy eirm', 'aoreet dolore magna aliquam', 'u feugiat nulla fac', 'm voluptua. At ve', 'eu feugiat nul', 'a. At vero eos et acc', 'erat, sed diam voluptua. At vero eo', 'bore et dolore magna aliquyam e', 'diam nonumy e', ' clita kasd gubergren, no s', 't. Ut wisi enim ad minim ve', ' wisi enim ad minim veniam,', 'ita kasd gub', 'eum iriure ', 'ectetuer adipisci', 'ipit lobortis nisl ut al', 'it amet. Duis autem vel eum i', 'acilisi. Nam liber t', 'it, sed diam nonummy n', ' Duis autem vel e', 'ctus est Lorem ipsum dolor sit ame', 'diam voluptua. At ve', 'abore et dol', ' ea rebum. Stet clita k', 'iam voluptua. At ve', 'am erat, sed diam voluptua. At v', 'el eum iriure dolor in hendrer', ' voluptua. A', 'r tempor cum soluta nobis elei', 'accusam et justo duo d', 'aliquyam erat, sed', 'a facilisis. At vero eos et ', ' clita kasd gubergren, no sea taki', 'ipsum dolo', 'm voluptua. At vero eos', 'isi enim ad m', 'gna aliquyam erat, sed di', 'ad minim veniam,', 't laoreet d', 'uod mazim pl', 'liber tempor cum solut', 'my nibh euismod tincidunt ut laor', 's nisl ut aliquip ex ea commo', 'dignissim qui blandi', 's dolore te feugait', 'sse molestie consequat, vel i', 'o sea takimata s', ' et accumsan et iusto odio di', 'tua. At vero eos et accusam et just', 'el illum dolore eu feug', ' duo dolores et ea r', 'y eirmod tempor invidunt ut labo', 'or in hendre', 'na aliquyam erat, sed diam voluptua', 'dipscing elitr, sed diam nonumy ei', ' et iusto odio dignissim', 'etuer adipiscing elit', ' sanctus est Lorem ipsum dolor s', ' labore et dolore magna ', 'es et ea rebum. Stet cli', 'uat. Duis autem vel eum iriure', 's nostrud exerci tation ullamcorp', 't nulla fac', ' Lorem ipsum dolor sit ame', 'vero eros et accumsan et iusto o', 'msan et iusto odio dignissim qui ', 'uis dolore te ', 'n ullamcorper suscipit', 't vero eros et accumsa', 'feugiat nulla facilisis ', 'el eum iriure dolor in hend', 'ebum. Stet clita kasd gubergren, ', ' eros et accumsan', 'tion ullamcorper suscipit l', ' amet. Lorem ipsu', 'uis nostrud exerci tation', ' takimata sa', 'iquip ex ea commodo consequat. Dui', 'ui blandit praesent luptatum ', 'et. Lorem ipsum dolo', 'iscing elit, sed diam nonum', 'o eos et accu', 'ipsum dolor sit amet. Lorem ips', 'ore eu feugiat nulla facilisis. At ', 't in vulputate velit esse mo', 'ie consequ', 'nisl ut aliquip e', 'lit esse mol', 't accusam ', 'por invidunt ut lab', 'andit praesent luptatum zzril de', 'a takimata sanctus est ', 'sanctus est Lorem', 'nim ad minim veniam, quis nostru', 'ate velit esse mo', ' sea takim', 'nobis eleifend opt', 'ostrud exerci tat', 'amet, consetetur sa', 'uis autem vel eum ', 'voluptua. At vero eos et accusam', 'r adipiscing elit, ', 'nobis eleifend option congue n', ' iusto odio di', 'kimata sanctus est Lorem i', 't. Lorem ipsum dolor sit amet, co', 'empor invidunt ut ', 'gue nihil imperdie', 'us est Lorem ipsum ', ' iriure dolor in hendrerit', 'a aliquyam erat, sed diam vol', 'ores et ea rebum. Stet c', 't justo duo dolores et ea rebum.', 'amet. Lorem ipsum', 'nt ut laoreet dolore magna al', 'cusam et justo duo dolor', 'm ipsum dolor sit amet, consetet', 'my eirmod tempor invidunt', 'clita kasd gu', 'rebum. Stet c', 'endrerit in ', 'm zzril delenit aug', 'ipsum dolor sit amet. Lorem', ' id quod mazim placerat facer possi', 'lobortis nisl ut a', 'ore et dolore mag', 'n, no sea ', 'cilisis. At vero eos et accusam et', 're magna aliquyam', 'ismod tincidu', 'lore magna', 'utate velit esse molestie c', 'usto odio dignissim qui bland', 'giat nulla facilisis at ver', 'uscipit lobortis nis', 'onsequat. Duis autem vel eum iriur', 'e magna aliquyam erat', 'aliquyam erat, sed diam vol', 'nit augue duis dolore te feugait', 't, consetetur sadipscing', 's nisl ut ali', 'tation ullamcorper suscipit lob', 't esse molestie', ' consequat, vel', 'm dolore eu feugiat null', 'lla facilisis at vero eros et acc', ' et iusto odio', 'sd gubergren, no sea takim', 'sit amet, consetetur sa', 'lore eu feugiat nulla facil', 'ud exerci tation ullamc', ' dolore magna aliquyam erat', 'ores et ea rebum. Stet clit', 'r sadipscing elitr, sed diam non', 'dunt ut laoreet dolore magna aliqu', ' in hendrerit in vulputate velit es', 'lor sit amet. Lorem ipsum dolor', ' tempor invidun', 'm et justo duo do', ' elitr, sed diam n', 'psum dolor sit amet. Duis aut', ' duis dolore te feugait', 'et ea rebum. St', 'sequat, vel illum dolor', 'usam et justo', 'ur sadipscing elitr, se', 'eu feugiat nulla facil', 't aliquip ex ea ', 'um dolor sit amet, consectetue', 'obis eleifend option congue nihil', 'end option congue nihil imperdiet', 'rmod tempor invi', 'met. Lorem ipsum dol', 'ip ex ea commodo conseq', ' Lorem ipsum do', 'rem ipsum dolor sit', 'um zzril delenit augue duis do', 'sea takima', 'ion ullamcor', 'psum dolor sit a', 'at, vel illum dolore eu fe', 'acer possim ass', ' accumsan et iusto ', ' adipiscing elit, sed diam ', 'am nonumy eirmod tempor invid', 'erci tation ullamcorper suscipit', '. At vero eos et accusam et j', 'erat volutpat. Ut wis', ' Lorem ipsum dolor sit amet, co', 'od tincidunt ut laoreet dol', 't wisi eni', 'takimata sanctus', 'lla facilisis. At vero eos ', 'm vel eum iriure dol', 'sit amet. Lorem ipsum dolor sit ', '. At vero eos et accusam et just', 'dit praese', 'equat. Duis autem vel eum iriur', ' amet, conse', 'onummy nib', ' et accumsan et iusto odi', 'sectetuer adipiscing elit, ', 'elitr, sed diam nonum', 'is at vero eros et acc', 'velit esse mol', 'isi enim ad minim veniam, q', 'n, no sea takimata sanctus ', 'rtis nisl ', 'consectetuer adipiscin', 't, consectetuer adipiscing', 'sim assum. Lorem ipsum ', 'consetetur sadipsc', 'dolore eu feugiat', ' autem vel eum ir', 'r sadipscing elitr, sed diam', 'ril delenit aug', 'sd gubergren, no s', 't amet. Duis autem ', 't. Duis aut', 'tatum zzril delenit ', 'adipiscing elit, se', 'diam nonummy nibh euismod', 'd tincidunt ut l', 'umsan et iusto odio dignis', 'm ipsum dolor', 'minim veniam, quis nostrud ex', 'ctetuer adi', 'ptatum zzril delenit augue ', ' ea rebum. Stet clit', 'it amet. Lorem ipsum dolor', ' ipsum dolor si', 'ipiscing elit, se', ' consequat. Duis autem vel eum iri', ' ea rebum. Stet clita kasd guberg', 'ed diam voluptua. At ve', 't justo duo dol', 'erat facer possim ass', 'on ullamcorper susc', 'sam et justo duo dolores et', 'san...
Twitter stellt MySQL-Anpassungen zur Verfügung.
(Mon, 16 Apr 2012 10:35:03 GMT)  Bei Twitter abgespeicherte Daten (wie Nutzerdaten, Timelines und Tweets) landen über kurz oder lang in einer MySQL-Datenbank. Bei derzeit rund 340 Millionen Tweets pro Tag fallen hier beträchtliche Datenmengen an. Um diese verarbeiten zu können, hat Twitter eine ganze Reihe von Anpassungen an der Datenbank vorgenommen. Diese stellt das Unternehmen nun via GitHub unter der BSD New license quelloffen zur Verfügung.Zu den Anpassungen gehören unter anderem neue Statusmeldungen für das System-Monitoring, eine verbesserte Speicherallokation auf großen NUMA-Systemen (Non-Uniform Memory Access) sowie eine Option zum serverseitigen Abbruch von Queries, die ein vorgegebenes Intervall überschreiten. Außerdem ist es möglich, den InnoDB-Buffer-Pool zu exportieren oder wiederherzustellen, und die MySQL-Datenbank lässt sich nun besser auf Systemen mit SSD-Speichern einsetzen.MySQL ist ein Open-Source-Datenbankverwaltungssystem und bildet die Grundlage für viele dynamische Webauftritte. Einen Überblick zu allen Änderungen, die Twitter vorgenommen hat, finden sich in der Change History des Projekts. In Zukunft sollen auch weitere Anpassungen mit der Community geteilt werden.
deCHK 2.1 ist da
(Sun, 15 Apr 2012 12:40:02 GMT)  deCHK Version 2.1 ist erschienen.Ein kritischer Fehler konnte eine Wiederherstellung bekannter Dateitypen verhindern. Dies ist nun behoben, darüberhinaus wurden nur interne Verbesserungen durchgeführt.Zur Homepage und zum Download: http://www.techcrawler.de/dechk/
Linkpool Nummer 29
(Sun, 15 Apr 2012 11:35:08 GMT)  Ein paar interessante Links gegen den verregneten Sonntag:Sehr interessante Serie über die PHP Source-Code-Interna, für PHP Entwickler:http://blog.ircmaxell.com/2012/03/phps-source-code-for-php-developers.htmlTeil 2, Teil 3, Teil 4XSS, und wie man htmlspecialchars NICHT benutzt:http://blog.astrumfutura.com/2012/03/a-hitchhikers-guide-to-cross-site-scripting-xss-in-php-part-1-how-not-to-use-htmlspecialchars-for-output-escaping/Audioaufnahme eines Vortrags von  Lorna Jane Mitchell über OAuth:http://techportal.ibuildings.com/2012/02/08/dpc-radio-implementing-oauth/CSS3 und HTML5 Features in älteren Browsern mit Polyfills:http://addyosmani.com/polyfillthehtml5gaps/slides/#1Carsten Eilers im PHP Magazin mit einem 9-teiligen Artikel über OAuth:http://it-republik.de/php/artikel/Sicherer-Zugriff-auf-Web-APIs-durch-das-OAuth-Protokoll-4510.htmlDer Mayflower Podcast Folge 2 und 3 über QA, CI und oTranCehttp://blog.mayflower.de/archives/858-Mayflower-Podcast-002.htmlhttp://blog.mayflower.de/archives/859-Mayflower-Podcast-003.htmlDateien als Download zum Browser senden:http://philsturgeon.co.uk/blog/2012/03/hijacking-headers-to-force-downloadsErschreckende Zahlen von “Webmastern” und “ihren” Webseiten nach einem Einbruch:http://www.1337core.de/2012/03/63-der-webmaster-haben-keine-ahnung.htmlWie man aus PHP heraus Musik an einen Icecast/Shoutcast Server streamt mit einer eigenen Extension:http://www.adayinthelifeof.nl/2012/03/24/phpshout-a-shoutcast-streamer-in-php-part-1/Bericht über einen Besuch beim Facebook Release Engineering Team:http://arstechnica.com/business/news/2012/04/exclusive-a-behind-the-scenes-look-at-facebook-release-engineering.ars Ähnliche Artikel:Linkpool Nummer 28Linkpool Nummer 21Linkpool Nummer 27 + Adventskalenderartikel 10.12. – 24.12.
Wie viele interne Funktionen hat PHP?
(Fri, 13 Apr 2012 08:20:08 GMT)  Tja, das ist nicht so leicht zu beantworten, die Antwort lautet: Kommt drauf an.Zählt man nur die Funktionen in der sogenannten Standard-Extension und der SPL-Extension sind es 526. Das ist also die Anzahl die jede PHP Installation auf jeden Fall bietet.Zählt man auch die Methoden der Klassen mit die mit ausgeliefert werden kommt man zusammen auf 1402. Darin sind jedoch auch viele “doppelte” Methoden vorhanden die durch Ableitung entstehen.Doch jede PHP-Installation wird normalerweise mit zusätzlichen Extensions kompiliert bzw. werden weitere geladen, sodass die Anzahl der zur Verfügung stehenden Funktionen deutlich höher ist:Zählt man alle internen Funktionen hier in dieser PHP-Version von Xampp dann sind dies 1605. Darin sind nun auch die Funktionen aller installierten Extensions enthalten, z.B. die mysql_* Funktionen durch die mysqli-Extension oder die xdebug_* Funktionen der xdebug-Extension.Zählt man alle Funktionen und Methoden zusammen kommt man auf stolze 3825 Funktionen und Methoden.Ich habe für diese Zählungen die folgenden Scripte verwendet, die jeweils alle gefundenen Funktionen und Methoden inklusive Parametern ausgibt, man erhält also eine lange Liste die ungefähr so aussieht:...is_uploaded_file($path)move_uploaded_file($path, $new_path)gethostbyaddr($ip_address)gethostbyname($hostname)gethostbynamel($hostname)gethostname()dns_check_record($host, $type)checkdnsrr($host, $type)dns_get_mx($hostname, &$mxhosts, &$weight)getmxrr($hostname, &$mxhosts, &$weight)dns_get_record($hostname, $type, &$authns, &$addtl)intval($var, $base)floatval($var)doubleval($var)strval($var)gettype($var)settype(&$var, $type)is_null($var)...Hier das Script für die Zählung der Funktionen in der Standard- und SPL-Extension:<?$countFunctions = 0;$extensions = array('standard' ,'spl');foreach ($extensions as $extension) { $reflectionExtension = new ReflectionExtension($extension); foreach ($reflectionExtension->getFunctions() as $reflectionFunction) { /** @var $reflectionFunction ReflectionFunction */ $params = array(); foreach ($reflectionFunction->getParameters() as $reflectionParameter) { /** @var $reflectionParameter ReflectionParameter */ $paramString = ''; if ($reflectionParameter->isPassedByReference()) { $paramString = '&'; } if ($reflectionParameter->getName() != '...') { $paramString .= '$'; } $paramString .= $reflectionParameter->getName(); $params[] = $paramString; } echo $reflectionFunction->getName() ."(".join(', ', $params).")\n"; $countFunctions++; }}echo $countFunctions;Das Script das alle zur Verfügung stehenden Funktionen auflistet (incl. aller geladenen Extensions):<?$definedFunctions = get_defined_functions();$definedInternalFunctions = $definedFunctions["internal"];foreach ($definedInternalFunctions as $functionName) { $reflectionFunction = new ReflectionFunction($functionName); $params = array(); foreach ($reflectionFunction->getParameters() as $reflectionParameter) { /** @var $reflectionParameter ReflectionParameter */ $paramString = ''; if ($reflectionParameter->isPassedByReference()) { $paramString = '&'; } $paramString .= '$' . $reflectionParameter->getName(); $params[] = $paramString; } echo $functionName ."(".join(', ', $params).")\n";}echo count($definedInternalFunctions);Hiermit werden alle Methoden der Standard- und SPL-Extension gezählt:<?$countMethods = 0;$extensions = array('standard' ,'spl');foreach ($extensions as $extension) { $reflectionExtension = new ReflectionExtension($extension); foreach ($reflectionExtension->getClasses() as $reflectionClass) { /** @var $reflectionClass ReflectionClass */ foreach ($reflectionClass->getMethods() as $reflectionMethod) { /** @var $reflectionMethod ReflectionMethod */ $params = array(); foreach ($reflectionMethod->getParameters() as $reflectionParameter) { /** @var $reflectionParameter ReflectionParameter */ $paramString = ''; if ($reflectionParameter->isPassedByReference()) { $paramString = '&'; } if ($reflectionParameter->getName() != '...') { $paramString .= '$'; } $paramString .= $reflectionParameter->getName(); $params[] = $paramString; } echo $reflectionClass->getName() . '::' . $reflectionMethod->getName() ."(".join(', ', $params).")\n"; $countMethods++; } }}echo $countMethods;Und zu guter letzt alle Methoden aller PHP-Klassen die zur Verfügung stehen:<?$countMethods = 0;$declaredClasses = get_declared_classes();foreach ($declaredClasses as $declaredClass) { $reflectionClass = new ReflectionClass($declaredClass); foreach ($reflectionClass->getMethods() as $reflectionMethod) { /** @var $reflectionMethod ReflectionMethod */ $params = array(); foreach ($reflectionMethod->getParameters() as $reflectionParameter) { /** @var $reflectionParameter ReflectionParameter */ $paramString = ''; if ($reflectionParameter->isPassedByReference()) { $paramString = '&'; } if ($reflectionParameter->getName() != '...') { $paramString .= '$'; } $paramString .= $reflectionParameter->getName(); $params[] = $paramString; } echo $reflectionClass->getName() . '::' . $reflectionMethod->getName() ."(".join(', ', $params).")\n"; $countMethods++; }}echo $countMethods;Im PHP Manual gibt es auch eine Liste aller PHP-Funktionen die im PHP Manual einen Eintrag haben. Dabei sind aber auch teils Funktionen von exotischen PECL-Extensions. Ähnliche Artikel:PHP 5.4.0 released! Neue FunktionenGefährliche PHP-Funktionen ausschaltenSubdomain-Service: Wie erstelle ich dynamisch viele Subdomains?
Testdaten generieren mit dem Projekt “Faker”
(Tue, 10 Apr 2012 08:20:08 GMT)  Auf der Suche nach einem Namensgenerator bin ich auf das Projekt “Faker” von Francois Zaninotto gestossen. Basierend auf den Fakern aus der Perl- und Ruby-Welt kann man damit nicht nur Namen generieren, sondern auch Straßen, Ortsnamen, Telefonnummern, Zahlen, Firmennamen, E-Mail-Adressen, IP-Adressen, URLs, Datumsangaben, und das ganze lokalisiert. Französische Daten sind also andere als italienische oder österreichische.Sinnvoll sind solche Daten für die Testumgebung, um keine echten Daten nehmen zu müssen bzw. sich keine hunderte eigene Daten auszudenken, oder für Unit-Tests. Die generierten Daten kann man dann beispielsweise nutzen um eine Datenbank zu füllen, Objekte zu erstellen, XML-Dokumente zu generieren oder JSON-Requests abzufeuern. Die Readme des Projekts ist umfangreich und zeigt sehr schön was alles möglich ist.Ein schönes und nützliches Projekt wie ich finde. Von Christoph Schaefer gibt es auch einen Fork mit einem de_DE Provider, leider ist die Vornamenliste noch etwas kurz, aber man kann gut darauf aufbauen.Welche Daten nutzt ihr für Testumgebungen, wie generiert ihr eure Testdaten? Ähnliche Artikel:PDFs dynamisch generieren: viele MöglichkeitenDas Test-Fax-Projekt kurz vorgestellt
PHP Easter Eggs
(Thu, 05 Apr 2012 14:50:09 GMT)  In vielen Softwareprodukten verstecken die Entwickler kleine Gimmicks, sogenannte Easter-Eggs. Es gibt sie in vielen Microsoft-Produkten, unter anderem ein Flipper in Word oder ein Flugsimulator in Excel, aber auch auf Webseiten und manchmal auch in Hardware gegossen.In PHP gibt es auch einige kuriose Bilder, die normalerweise dazu gedacht waren am 1. April auf der phpinfo Seite angezeigt zu werden, die aber auch so abrufbar sind wenn man die Einstellung expose_php in der php.ini eingeschaltet hat.Man kann diese Bildchen sehen indem man an ein beliebiges PHP Script einen bestimmten Query-String anhängt.Das erste Logo zeigt je nach PHP Version ein anderes Bild. Man kann daran also die Major-Version erkennen und manchmal auch die Minor-Version. http://www.zend.com/zend/products.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42 http://www.zend.com/zend/products.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 http://www.zend.com/zend/products.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42http://www.zend.com/zend/products.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42Falls man selbst keinen Zugriff auf die expose_php Einstellung hat kann man mit einer Rewrite-Regel die Bilder verstecken und weiterleiten auf die Startseite:RewriteEngine OnRewriteBase /RewriteCond %{QUERY_STRING} PHP[^&]+RewriteRule ^(.*)$ http://www.meine-domain.com/? [R=302,L]Welche kuriosen Easter Eggs kennt ihr? Habt ihr schon einmal selbst welche eingebaut oder gefunden?Ich wünsch euch frohe Ostern! Keine ähnlichen Artikel.
Termine 2012
(Tue, 03 Apr 2012 08:20:10 GMT)  Einige Konferenzen gab es dieses Jahr bereits, und es wird noch einige geben bei denen wir dabei sein können. Hier die aktuelle Liste die ich mir gemacht habe, falls ihr noch weitere PHP oder PHP-verwandte Konferenzen kennt die es noch 2012 geben wird und die ihr besuchen werdet, sagt bitte kurz Bescheid. Denkt dran, euch stehen einige Tage Bildungsurlaub zu, also mal den Chef fragen wie es mit der Weiterbildung dieses Jahr aussieht!18. – 19. Mai 2012 phpDay 2012 in Verona, Italien22. – 25. Mai 2012 php|tek12 in Chicago03. – 06. Juni 2012 International PHP Conference + Webinale 2012 – Spring Edition in Berlin07. – 08. Juni 2012 Symfony Live Paris07. – 09. Juni 2012 Dutch PHP Conference 2012 in Amsterdam15. – 16. Juni 2012 deSymfony 201225. – 27. Juni 2012 Velocity 2012 in Santa Clara29. – 30. Juni 2012 Lone Star PHP, Dallas Texax11. – 12. August 2012 Northeast PHP, Boston18. – 19. August 2012 PHP Unconference 2012 Hamburg25. – 26. August 2012 FrOSCon 7 in Bonn07. – 08. September 2012 Developer Conference Hamburg 201217. – 18. September 2012 Web Developer Conference 2012 in HamburgOktober 2012 ZendCon in Santa ClaraOktober 2012 International PHP Conference + Webinale 2012 Main Conference22. – 23. November 2012 Symfony Live BerlinEnde 2012 möglicherweise eine Neuauflage der Velocity Europe 2012 Weiß jemand etwas über die schon für letztes Jahr geplante Bavarian PHP Unconference? Ähnliche Artikel:Präsentationen der PHPBenelux Konferenz 2012Slides der PHP UK Conference 2012IPC 2011, Very Early Bird, 200 Euro sparen + Netbook
Fabric Engine ermöglicht JavaScript in HPC-Umgebungen
(Mon, 02 Apr 2012 16:00:03 GMT)  Softwarehersteller Fabric Engine hat seine gleichnamige quelloffene Plattform vorgestellt. Diese ist auf die multithread-optimierte Ausführung von Skriptsprachen ausgelegt und unterstützt aktuell Python und JavaScript - später sollen auch Ruby und PHP dazukommen. Benchmark-Tests zeigten, dass Anwendungen auf Grundlage der Fabric Engine offenbar ebenso schnell laufen wie vergleichbare C++-Anwendungen und damit auch für High Performance Computing eignen.Die Engine ist sowohl für Windows als auch für Mac OS X und Linux verfügbar, kann aber laut Herstellerangaben auch in Cloud-Umgebungen, serverseitig und im Browser genutzt werden. Eine spezielle Schnittstelle macht HPC-Kenntnisse oder C++-Erfahrung bei der Entwicklung multithread-basierter Anwendungen überflüssig.Die Fabrix Engine Plattform ist Open Source und steht unter der GNU Affero general Public License zum Download bereit. Eine kommerzielle Lizensierung ist ebenso möglich.
APC “Potential cache slam averted for key XXX”
(Sat, 31 Mar 2012 10:30:11 GMT)  Erst gestern bin ich wieder auf den folgenden “Bug” (bzw. Feature) gestossen und musste den Workaround raussuchen, deshalb schreibe ich ihn jetzt hier nieder, vielleicht stösst ja auch jemand von euch mal darauf.Es geht um die allseits beliebte APC Extension. Seit Version 3.1.3 (von August 2009) gibt es in APC einen Schutz gegen potentielle Race-Condition-Probleme bzw. einem Deadlock bzw. einem Cache-Slam (so genau weiß ich das auch nicht ;-) ). Es geht jedenfalls darum dass viele parallele bzw. aufeinander folgende APC-Schreibbefehle (apc_add()/apc_store()…) ein Problem auslösen können, und deshalb wurde eine Sperre eingebaut sodass auf einen Key nicht innerhalb kurzer Zeit mehrfach schreibend zugegriffen werden kann. Doch je nach Last auf der Maschine bzw. dem eingesetzten Script kann das durchaus vorkommen, und dann gibt es den Fehler:Warning: Potential cache slam averted for key XXXXXXXBeheben kann man diesen Fehler indem man auf eine ältere Version (3.1.2 sollte es tun) downgraded, sein Script ändert und die multiplen Schreibzugriffe auf einen Key entfernt bzw. begrenzt, oder die folgenden 2 Zeilen in die php.ini bzw. apc.ini einträgt:apc.write_lock = 1apc.slam_defense = 0Gefolgt von einem Apache restart, und der Fehler ist weg.Weitere Informationen sind verfügbar, es gibt sehr viele Leute die auf dieses Problem gestossen sind, also einfach nach der Fehlermeldung suchen falls man mehr darüber wissen möchte. Keine ähnlichen Artikel.
IntelliJ IDEA 11.1 unterstützt Subversion und Gradle
(Fri, 30 Mar 2012 14:30:03 GMT)  Die neue Version 11.1 der Entwicklungsumgebung IntelliJ IDEA ist nun erhältlich. Das Release punktet mit Features, die es nicht mehr rechtzeitig oder nur unvollendet in die letzte größere Version geschafft hatten. So wird nun Subversion 1.7 unterstützt, und auch das Groovy-basierte Build-System Gradle lässt sich nun besser integrieren. Ebenfalls überarbeitet wurde die Oberfläche für Git-Branches und die Integration des Codeanalyse-Tools Android Lint.IntelliJ IDEA ist eine integrierte Entwicklungsumgebung für PHP und Java und wurde vom Softwarehersteller JetBrains entwickelt. Die kostenpflichtige Ultimate Edition soll außerdem mit ECMAScript 6 umgehen können und die SQL-Dialekte von DB2 und Sybase unterstützen. Daneben existiert noch eine kostenlose und quelloffene Community Edition. Beide Versionen sind über die Herstellerwebsite erhältlich.
Script zur Entfernung von schliessenden PHP Tags
(Wed, 28 Mar 2012 08:20:08 GMT)  Nach wie vor gibt es viele Diskussionen ob das schliessende PHP-Tag am Ende einer PHP-Datei weggelassen werden sollte oder nicht. In vielen großen Projekten wird das Weglassen mittlerweile vorgeschrieben (Zend Framework, Symfony, Doctrine), in einigen muss es zwingend vorhanden sein (Lithium), aber in noch mehr Projekten ist es nicht festgelegt und wird mal weggelassen mal eingefügt, je nachdem welcher Entwickler die Datei erstellt bzw. als letztes geändert hat.Besonders in Projekten mit gemischtem Vorgehen sollte eine einheitliche Lösung gefunden werden, und falls das die Löschung der End Tags bedeutet, dann nutze ich mein kleines Script hier um alle Dateien von schliessenden PHP Tags am Ende zu befreien:<!DOCTYPE html><html> <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# githubog: http://ogp.me/ns/fb/githubog#"> <meta charset='utf-8'> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Server Error · GitHub</title> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" /> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub" /> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> <meta content="authenticity_token" name="csrf-param" /><meta content="y/YCmcMPAlAR1Kn/6ygf1CJaCdPElX94ppZiWxyQqSI=" name="csrf-token" /> <link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github-61ae1d367be26efd3260c8a23fc81353611bfa47.css" media="screen" rel="stylesheet" type="text/css" /> <link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github2-8e705cfff4a1ea8c33dd5a68bcbb57553cb4fbaa.css" media="screen" rel="stylesheet" type="text/css" /> <script src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/frameworks-31b6b84bca1e7d3f3907f63a4dd7f9bbda3a0eda.js" type="text/javascript"></script> <script defer="defer" src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/github-88c09a33a6ebba4abecc6d3381fddeeb6b55fb13.js" type="text/javascript"></script> </head> <body class="logged_out env-production " data-blob-contribs-enabled="yes"> <div id="wrapper"> <div id="header" class="true clearfix"> <div class="container clearfix"> <a class="site-logo" href="https://github.com/"> <!--[if IE]> <img alt="GitHub" class="github-logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7.png?1334862346" /> <img alt="GitHub" class="github-logo-hover" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7-hover.png?1334862346" /> <![endif]--> <img alt="GitHub" class="github-logo-4x" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x.png?1334862346" /> <img alt="GitHub" class="github-logo-4x-hover" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x-hover.png?1334862346" /> </a> <!-- make sure to use fully qualified URLs here since this nav is used on error pages on other domains --> <ul class="top-nav logged_out"> <li class="pricing"><a href="https://github.com/plans">Signup and Pricing</a></li> <li class="explore"><a href="https://github.com/explore">Explore GitHub</a></li> <li class="features"><a href="https://github.com/features">Features</a></li> <li class="blog"><a href="https://github.com/blog">Blog</a></li> <li class="login"><a href="https://github.com/login">Login</a></li> </ul> </div> </div> <div class="site clearfix"> <div id="site-container" class="container" data-pjax-container> <div class="markdown-body standard"> <div class="center"><img alt="Unicorn is angry" height="205" src="https://a248.e.akamai.net/assets.github.com/images/error/angry_unicorn.png?1334862345" width="200" /></div> <h1>Page did not respond in a timely fashion.</h1> <p><a href="http://status.github.com/">Check our status site for alerts.</a></p> <p> Either you found a page that took too long to render or<br /> we're getting more requests right now than we can handle. </p> <ul> <li> You can try <a href="javascript: window.location.reload()">refreshing the page,</a> the problem may be temporary. </li> <li> <a href="http://github.s3.amazonaws.com/misc/down.html"> Learn how to deal with GitHub outages and other access problems. </a> </li> </ul></div> </div> <div class="context-overlay"></div> </div> <div id="footer-push"></div><!-- hack for sticky footer --> </div><!-- end of wrapper - hack for sticky footer --> <!-- footer --> <div id="footer" > <div class="upper_footer"> <div class="container clearfix"> <!--[if IE]><h4 id="blacktocat_ie">GitHub Links</h4><![endif]--> <![if !IE]><h4 id="blacktocat">GitHub Links</h4><![endif]> <ul class="footer_nav"> <h4>GitHub</h4> <li><a href="https://github.com/about">About</a></li> <li><a href="https://github.com/blog">Blog</a></li> <li><a href="https://github.com/features">Features</a></li> <li><a href="https://github.com/contact">Contact & Support</a></li> <li><a href="https://github.com/training">Training</a></li> <li><a href="http://enterprise.github.com/">GitHub Enterprise</a></li> <li><a href="http://status.github.com/">Site Status</a></li> </ul> <ul class="footer_nav"> <h4>Tools</h4> <li><a href="http://get.gaug.es/">Gauges: Analyze web traffic</a></li> <li><a href="http://speakerdeck.com/">Speaker Deck: Presentations</a></li> <li><a href="https://gist.github.com/">Gist: Code snippets</a></li> <li><a href="http://mac.github.com/">GitHub for Mac</a></li> <li><a href="http://mobile.github.com/">Issues for iPhone</a></li> <li><a href="http://jobs.github.com/">Job Board</a></li> </ul> <ul class="footer_nav"> <h4>Extras</h4> <li><a href="http://shop.github.com/">GitHub Shop</a></li> <li><a href="http://octodex.github.com/">The Octodex</a></li> </ul> <ul class="footer_nav"> <h4>Documentation</h4> <li><a href="http://help.github.com/">GitHub Help</a></li> <li><a href="http://developer.github.com/">Developer API</a></li> <li><a href="http://github.github.com/github-flavored-markdown/">GitHub Flavored Markdown</a></li> <li><a href="http://pages.github.com/">GitHub Pages</a></li> </ul> </div><!-- /.site --> </div><!-- /.upper_footer --><div class="lower_footer"> <div class="container clearfix"> <!--[if IE]><div id="legal_ie"><![endif]--> <![if !IE]><div id="legal"><![endif]> <ul> <li><a href="https://github.com/site/terms">Terms of Service</a></li> <li><a href="https://github.com/site/privacy">Privacy</a></li> <li><a href="https://github.com/security">Security</a></li> </ul> <p>© 2012 <span title="s from fe13.rs.github.com">GitHub</span> Inc. All rights reserved.</p> </div><!-- /#legal or /#legal_ie--> <div class="sponsor"> <a href="http://www.rackspace.com/" class="logo"> <img alt="Dedicated Server" height="36" src="https://a248.e.akamai.net/assets.github.com/images/modules/footer/rackspaces_logo.png?1334862346" width="38" /> </a> Powered by the <a href="http://www.rackspace.com/ ">Dedicated Servers</a> and<br/> <a href="http://www.rackspacecloud.com/">Cloud Computing</a> of Rackspace Hosting<span>®</span> </div> </div><!-- /.site --></div><!-- /.lower_footer --> </div><!-- /#footer --> <div id="keyboard_shortcuts_pane" class="instapaper_ignore readability-extra" style="display:none"> <h2>Keyboard Shortcuts <small><a href="#" class="js-see-all-keyboard-shortcuts">(see all)</a></small></h2> <div class="columns threecols"> <div class="column first"> <h3>Site wide shortcuts</h3> <dl class="keyboard-mappings"> <dt>s</dt> <dd>Focus site search</dd> </dl> <dl class="keyboard-mappings"> <dt>?</dt> <dd>Bring up this help dialog</dd> </dl> </div><!-- /.column.first --> <div class="column middle" style='display:none'> <h3>Commit list</h3> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>c <em>or</em> o <em>or</em> enter</dt> <dd>Open commit</dd> </dl> <dl class="keyboard-mappings"> <dt>y</dt> <dd>Expand URL to its canonical form</dd> </dl> </div><!-- /.column.first --> <div class="column last" style='display:none'> <h3>Pull request list</h3> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>o <em>or</em> enter</dt> <dd>Open issue</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt> <dd>Submit comment</dd> </dl> </div><!-- /.columns.last --> </div><!-- /.columns.equacols --> <div style='display:none'> <div class="rule"></div> <h3>Issues</h3> <div class="columns threecols"> <div class="column first"> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>x</dt> <dd>Toggle selection</dd> </dl> <dl class="keyboard-mappings"> <dt>o <em>or</em> enter</dt> <dd>Open issue</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt> <dd>Submit comment</dd> </dl> </div><!-- /.column.first --> <div class="column last"> <dl class="keyboard-mappings"> <dt>c</dt> <dd>Create issue</dd> </dl> <dl class="keyboard-mappings"> <dt>l</dt> <dd>Create label</dd> </dl> <dl class="keyboard-mappings"> <dt>i</dt> <dd>Back to inbox</dd> </dl> <dl class="keyboard-mappings"> <dt>u</dt> <dd>Back to issues</dd> </dl> <dl class="keyboard-mappings"> <dt>/</dt> <dd>Focus issues search</dd> </dl> </div> </div> </div> <div style='display:none'> <div class="rule"></div> <h3>Issues Dashboard</h3> <div class="columns threecols"> <div class="column first"> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>o <em>or</em> enter</dt> <dd>Open issue</dd> </dl> </div><!-- /.column.first --> </div> </div> <div style='display:none'> <div class="rule"></div> <h3>Network Graph</h3> <div class="columns equacols"> <div class="column first"> <dl class="keyboard-mappings"> <dt><span class="badmono">←</span> <em>or</em> h</dt> <dd>Scroll left</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="badmono">→</span> <em>or</em> l</dt> <dd>Scroll right</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="badmono">↑</span> <em>or</em> k</dt> <dd>Scroll up</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="badmono">↓</span> <em>or</em> j</dt> <dd>Scroll down</dd> </dl> <dl class="keyboard-mappings"> <dt>t</dt> <dd>Toggle visibility of head labels</dd> </dl> </div><!-- /.column.first --> <div class="column last"> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">←</span> <em>or</em> shift h</dt> <dd>Scroll all the way left</dd> </dl> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">→</span> <em>or</em> shift l</dt> <dd>Scroll all the way right</dd> </dl> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">↑</span> <em>or</em> shift k</dt> <dd>Scroll all the way up</dd> </dl> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">↓</span> <em>or</em> shift j</dt> <dd>Scroll all the way down</dd> </dl> </div><!-- /.column.last --> </div> </div> <div style='display:none'> <div class="rule"></div> <div class="columns threecols"> <div class="column first" style='display:none'> <h3>Source Code Browsing</h3> <dl class="keyboard-mappings"> <dt>t</dt> <dd>Activates the file finder</dd> </dl> <dl class="keyboard-mappings"> <dt>l</dt> <dd>Jump to line</dd> </dl> <dl class="keyboard-mappings"> <dt>w</dt> <dd>Switch branch/tag</dd> </dl> <dl class="keyboard-mappings"> <dt>y</dt> <dd>Expand URL to its canonical form</dd> </dl> </div> </div> </div> <div style='display:none'> <div class="rule"></div> <div class="columns threecols"> <div class="column first"> <h3>Browsing Commits</h3> <dl class="keyboard-mappings"> <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt> <dd>Submit comment</dd> </dl> <dl class="keyboard-mappings"> <dt>escape</dt> <dd>Close form</dd> </dl> <dl class="keyboard-mappings"> <dt>p</dt> <dd>Parent commit</dd> </dl> <dl class="keyboard-mappings"> <dt>o</dt> <dd>Other parent commit</dd> </dl> </div> </div> </div></div> <div id="markdown-help" class="instapaper_ignore readability-extra"> <h2>Markdown Cheat Sheet</h2> <div class="cheatsheet-content"> <div class="mod"> <div class="col"> <h3>Format Text</h3> <p>Headers</p> <pre># This is an <h1> tag## This is an <h2> tag###### This is an <h6> tag</pre> <p>Text styles</p> <pre>*This text will be italic*_This will also be italic_**This text will be bold**__This will also be bold__*You **can** combine them*</pre> </div> <div class="col"> <h3>Lists</h3> <p>Unordered</p> <pre>* Item 1* Item 2 * Item 2a * Item 2b</pre> <p>Ordered</p> <pre>1. Item 12. Item 23. Item 3 * Item 3a * Item 3b</pre> </div> <div class="col"> <h3>Miscellaneous</h3> <p>Images</p> <pre>![GitHub Logo](/images/logo.png)Format: ![Alt Text](url)</pre> <p>Links</p> <pre>http://github.com/ - automatic![GitHub](http://github.com)</pre><p>Blockquotes</p> <pre>As Kanye West said:> We're living the future so> the present is our past.</pre> </div> </div> <div class="rule"></div> <h3>Code Examples in Markdown</h3> <div class="col"> <p>Syntax highlighting with <a href="http://github.github.com/github-flavored-markdown/" title="GitHub Flavored Markdown" target="_blank">GFM</a></p> <pre>```javascriptfunction fancyAlert(arg) { if(arg) { $.facebox({div:'#foo'}) }}```</pre> </div> <div class="col"> <p>Or, indent your code 4 spaces</p> <pre>Here is a Python code examplewithout syntax highlighting: def foo: if not bar: return true</pre> </div> <div class="col"> <p>Inline code for comments</p> <pre>I think you should use an`<addr>` element here instead.</pre> </div> </div> </div></div> <div class="ajax-error-message"> <p><span class="mini-icon exclamation"></span> Something went wrong with that request. Please try again. <a href="javascript:;" class="ajax-error-dismiss">Dismiss</a></p> </div> <div id="logo-popup"> <h2>Looking for the GitHub logo?</h2> <ul> <li> <h4>GitHub Logo</h4> <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip"><img alt="Github_logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/github_logo.png?1334862345" /></a> <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip" class="minibutton btn-download download"><span><span class="icon"></span>Download</span></a> </li> <li> <h4>The Octocat</h4> <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip"><img alt="Octocat" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/octocat.png?1334862345" /></a> <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip" class="minibutton btn-download download"><span><span class="icon"></span>Download</span></a> </li> </ul> </div> </body></html>Ein Beispielaufruf steht in der README im GitHub Projekt, es gibt nur einen optionalen Parameter: Das Verzeichnis. Falls der Parameter nicht angegeben wird wird das aktuelle Verzeichnis genommen.Das Script ist nicht perfekt und aktuell nicht für Projekte geeignet die mit Windows-Umbrüchen arbeiten, aber bisher hat es mir gute Dienste geleistet. Wer Lust hat kann es gern noch um die angesprochene Windows-Umbruch-Unterstützung erweitern oder anders verbessern, man kann sicher mit einem komplizierteren Regex arbeiten und sich die rtrim()s sparen. Würd mich sehr freuen.Ich habe auch ein schönes kurzes Bash-Script gefunden, das aber nur auf Unix-Rechnern mit installiertem pcregrep, awk, wc und sed funktioniert, und genau das selbe tut. Ähnliche Artikel:Ein PHP-Script als Windows-Dienst starten
Slides der Confoo 2012 Konferenz
(Sat, 24 Mar 2012 11:30:07 GMT)  Whao, Ende Februar fand die diesjährige Confoo statt, unglaubliche 167 Sessions an 5 Tagen.  Da hätte ich auch mal Lust nach Australien zu fliegen bei solch einem Programm. Wenn das Lesematerial mal nicht für 2 Wochenenden reicht… Viel Spass!27. Februar 2012Training: Advanced PHP Development Sebastian Bergmann, Arne Blankerts, Stefan PriebschTraining: HTML5 Benoit PietteTraining: Diving into Symfony2 Advanced Features Hugo HamonTraining: Sécurité web PHP Jonathan MarcilTraining: PHP Web security Jonathan Marcil28. Februar 2012The HTML5 Landscape Andrew LombardiMashing up JavaScript Bastian HofmannHow to Design a Mobile Friendly API Fred BrunelGit for beginners Mike McQuaidDevelop & deploy using hybrid cloud strategies Thijs FerynPHP Content Repository Specification Lukas Kahwe SmithPostgreSQL Performance Tuning Bruce MomjianContinuous Delivery at Speed Joseph Wilk NotizenIntroduction aux langages dynamiques avec Python Sébastien DoucheLa qualité au-delà du code Jean-Marc FontaineJVM Internals for Dummies Charles NutterHTML5 : mode déconnecté et “push” Raphaël RougeronReal-time voice call and mobile integration Michael PeacockSilex – The Symfony2 microframework Igor WiedlerEffective Collaboration in a Sprint Steffan SurdekLes 10 Risques sur les smartphones Sebastien GIORIAAn advanced tour of the python language and stdlib Alexis MetaireauLinked Data Life Cycles Sarven CapadisliDéveloppement de solutions SharePoint pour Office 365 ♫ Nik Charlebois ♫ ♬TDD and Getting Paid Rowan MerewoodWeb Security David MirzaMigrating MVC to the front-end using Backbone JS Martin DrapeauDealing with continuous data processing Michael PeacockActionscript: du web au mobile Martin ArvisaisGraphs, Edges & Nodes: Untangling the Social Web Joël PerrasProgramming the SQL Way with Common Table Expressions Bruce MomjianBack alleys of Ruby Marc-André LafortuneHow CMS architectures affect dev. communities Julian EgelstaffLe Partenariat Informatique Simon TremblayLook beyond PHP Fabien PotencierDRYing CSS for brevity, unity and maintainability Jeremy ClarkeScaling with MongoDB Richard CopelandDrupal as a programmer friendly CMS Suzanne KennedyAsynchronous Ruby with EventMachine Joshua HullBuilding Your Software Development A-Team Keith CaseyCorriger le Web un bug à la fois Karl DubostRESTful Web Services with Python Juozas KaziukėnasThreat modeling sur une application web: étude de cas (2012) Antonio FontesCreating a universal app for iOS device Satish TallapakaRealtime Web Apps with WebSockets Igor WiedlerElasticSearch [R]evolution: Welcome. Andrei ZmievskiDIY Incident Response David MirzaUsing Javascript to Build Native iOS Applications Andrew LombardiIntroduction to PostgreSQL Ilia AlshanetskySurvivre a Agile Fancis BlondeauRails 3.1 Lori M OlsonUnit testing with Python Andy McKayImplanter l’AOP… comment partir du bon pied? Félix-Antoine BourbonnaisStackbox: Next-Generation Content Management Vance LucasBuilding a Website to Scale to 100 Million Page Views Per Day and Beyond (open to the public) Eric Pickup01. März 2012Scalable high-performance architectures Stefan PriebschBuilding Mobile Experiences That Don’t Suck Frédéric HarperSEO for Developers Brian RotszteinThe power of Neo4j Hanneli TavanteSymfony2 by code Lukas Kahwe SmithFaîtes face à la demande Louis-Philippe Carignan100% de couverture de code par les tests Vincent TencéLes navigateurs au service de vos applications WEB Philippe GamacheIs what you get what you expect to get? Philip TellisWriting a Django e-commerce framework David WinterbottomNode, and the Future of the Web James A. DuncanPerforming security audits Arne BlankertsLiving with Legacy Code Rowan MerewoodConcevoir un plugin pour jQuery 1.5 et plus Mathieu ROBINThe Five Dysfunctions of a Distributed Team Steffan SurdekTesting is fun! Gourav TiwariTesting Android app Francis TothÀ la découverte de FLOW3 Mehdi Guermaziolap4j – Online Analytical Processing for Java Luc BoudreauThe WebCore Web Framework & Contentment CMS Alice Bevan-McGregorEstimation or “How to Dig your own Grave” Rowan MerewoodHTML5 as a game console Michal BudzynskiIntegrate Your PHP Project with Jenkins Sebastian BergmannA Knapsack of Geotools: More than Just Google Maps Andrei ZmievskiContinuous Integration for Android apps Anthony DahanneArtisan développeur Franck SIMONDécouvrez Scala Raphaël RougeronVoIP Drupal Overview Keith CaseyRuby as She is Spoke Joey deVillaTachyon: Sloppiness is Bliss Gabriel TremblayProfiling PHP Applications Derick RethansMake your project SOLID! Tobias SchlittDevelopment Testing for Code Quality Rutul DaveScaling in the Cloud with AWS Eli WhiteUntangling the resourceful web with Renee Joshua HullUne introduction au Lean Software Development Louis-Philippe CarignanjQuery Spaghetti! Cedric DugasCreating Custom View’s in Android Martin LegrisRDF and SPARQL: The peanut butter and jam Sarven CapadisliConstuire un site web avec django-cms Benoit DomingueYour Code is Collapsing – Refactoring Can Save You Olivier GourmentBuild more with LESS CSS Jake SmithExtending Vega to Secure your Web App and More David MirzaDependency Management with Composer Jordi BoggianoWriting Simple Testable Code Felix-Etienne TrepanierORMs don’t kill your database, developers do! Guilherme BlancoPyramid, minimalisme sans compromis! Blaise LaflammeJava et Javascript Franck SIMONOpen Data as the Engine for Innovation Nik GarkushaCMS 2.0: are we there yet? Julian EgelstaffIntro to Performant PHP Pages Paul ReinheimerVirtualize your Development Sean Coates Web Security and You Eli WhiteDefining User Identity: True Identity VS Anonymity Jonathan LeBlancReal time web apps using Python Andy McKayIntroducing PHP 5.4 Ilia AlshanetskySécurité et Ruby on Rails, une introduction Sebastien GIORIATable ronde CMS: le futur des Systèmes de Gestion de Contenu Marc LaporteLe développement des affaires sur le web en 2012 Martin HandfieldGetting Started With Web Accessibility Sean Yo02. März 2012Varnish, the easy way to speed up your websites Fabien PotencierBeware of the dark side, Luke! Arne BlankertsCryptographie 101 pour les programmeurs Philippe GamacheCare and Feeding of a MySQL database Dave StokesLarge-Scale Data Processing with Hadoop and PHP David ZülkePersonal Branding for Developers Susan VartyDu développement web au mobile Martin ArvisaisUnderstanding Regular Expressions Jakob WesthoffMo’ Money, Less Problems with ActiveMerchant Joey deVillaSo You Want to Build a Community Project Marc TardifXdebug Derick RethansRedis – Your advanced in-memory key-value store Jordi BoggianoOpenSocial 2.0 – Viva La OpenAppRevolution! Bastian HofmannWeb Application Security Trends Christian WenzDIY Private Cloud w/ VirtualBox and Chef Wil Moore IIIDoing More With Less: Large-Scale Apps with Flask Joël PerrasPOO et Javascript, une notion trop incomprise Mathieu ROBINJRuby: A New Way to Run Ruby Charles Nutter NotizenReprise sur incident Jean-Marc FontainePHP Performance & High Availability w Oracle 11g Kuassi MensahDesigning HTTP Interfaces and RESTful Web Services David ZülkeHigh traffic website search with Apache Solr Satish TallapakaPHP through the eyes of a hoster Thijs FerynMigrating from PHP to Python and Django David WinterbottomIterators in PHP Jake SmithAutomatiser les tests à tous les niveaux Vincent TencéEmpowering IT with Real Users Analytics Francis PiérautMicrosoft Security Development Lifecycle ? Sebastien GIORIALTTng 2.0: Tracing for everyone Yannick BrosseauA NodeJS bag of goodies for analysing web traffic Philip TellisThe PHP Tester’s Toolbox Sebastian BergmannPerformance 101: More Responsive Web Sites Christian WenzChanging the Face of Open Identity in Ecommerce Jonathan LeBlancMySQL — using EXPLAIN to perfect your queries Dave StokesModular application architecture Tobias SchlittLearn to use and develop with jQuery-UI Jakob WesthoffEasily Out Market & Out Sell The Competition Michael MichalowiczHomebrew: the missing package manager for OSX Mike McQuaidPropulsez votre architecture grâce aux mocks Félix-Antoine BourbonnaisLes outils indispensables au développeur Python Sébastien DouchePainless, version-controlled database refactoring Wil Moore IIIDoctrine 2 Juozas KaziukėnasTrouvez la faille! Antonio FontesHierarchical MVC (HMVC) – What, Why, and How Vance LucasAcceptance testing in the land of the startup Joseph WilkWeb accessibility Development Tools In Action Sean YoThe web with flair: CoffeeScript, SASS & Haml Marc-André LafortuneAdvanced SOA architectures using Open Source Heath KeslerOracle In-database Hadoop: When MapReduce Meets RDBMS Kuassi Mensah Ähnliche Artikel:Präsentationen der PHPBenelux Konferenz 2012Slides der PHP UK Conference 2012Confoo 2011, die Mega Konferenz
PHP-Programmierung gehört zu den Hauptskills auf den Projektplattformen
(Thu, 22 Mar 2012 09:20:08 GMT)  Gastartikel von Wojciech DziedzicWojciech Dziedzic hat an der Humboldt Universität zu Berlin Germanistische Linguistik, Anglistik und Polonistik im Magisterstudiengang abgeschlossen. Jetzt arbeitet er im Online Marketing bei twago – einer Projektvermittlungsplattform für Freelancer und KMU’s.Die Projektvermittlungsplattformen oder Online-Marktplätze wachsen jeden Monat, weil immer mehr Spezialisten und Auftraggeber von solcher Art der Zusammenarbeit überzeugt sind. Zielgruppe dieser Anbieter sind vor allem Freelancer und KMU’s. Programmierer, Webdesigner, Übersetzer, SEO- und IT-Experten, Grafikdesigner und viele mehr gehören zu tausenden registrierten Dienstleistern bei den Projektplattformen. Einer der Hauptskills, sprich die Anzahl der registrierten Nutzer mit dieser Fähigkeit, ist die PHP-Programmierung. Das spiegelt sich auch in der Anzahl der ausgeschriebenen Projekte, für die dieser Skill benötigt wird. Plattform, Projekt, Skills – das sind nur Begriffe, aber wie das ganze Verfahren funktioniert, das wird im Folgenden kurz beschrieben.Ein PHP-Programmierer kann sich kostenlos als Dienstleister anmelden und sein eigenes Profil erstellen. Mit einem Standard-Account kann er leider seine Referenzen nicht hochladen, aber er hat die Möglichkeit, alle seine Skills einzugeben. Das sollte er auf jeden Fall tun, weil er nur somit passende Projektangebote bekommen kann. Je genauer die Angaben, desto besser werden die Angebote in den E-Mail-Benachrichtigungen gefiltert. Ein Unternehmen oder ein Auftraggeber kann sich daher auch kostenlos als Kunde anmelden und sein Projekt kostenlos ausschreiben. Wenn dieses vom Webseitenbetreiber freigeschaltet wird – die Überprüfung erfolgt, um sogenannte Fake-Projekte, die leider ab und zu vorkommen, oder doppelte Projekte, die durch den unbewußten Fehler des Nutzers entstanden sind,  zu eliminieren – bekommen alle Freelancer mit benötigten Skills eine Benachrichtigung per Mail. Es wird immer das maximale Budget des Projekts angezeigt. Jeder Freelancer kann sein Angebot abgeben bzw. auf der Seite des Projekts Fragen stellen. Der Kunde schaut sich die Angebote an und setzt sich in Verbindung mit dem gewünschten Provider. Ein Vorteil der Projektplattformen besteht darin, dass die Entfernung zwischen den Kooperationspartnern überhaupt keine Rolle spielt. Sie können tausende Kilometer voneinander entfernt sein. Meistens “sehen” sie sich nur über das Netz. Ein Provider aus Indien kann für einen Auftraggeber aus Brasilien arbeiten – dank den Projektplattformen ist das nicht nur möglich sondern wird auch durchgesetzt.Ist solche Zusammenarbeit sicher? Bekommt der Dienstleister am Ende sein Honorar? Die Projektplattformen funktionieren schon seit einigen Jahren. Selbst das ist schon ein  Signal, dass es gut funktioniert, den Auftraggeber und den Provider miteinander zu verbinden. Außerdem verfügen diese Webseiten über verschiedene Bewertungs- und Zahlungssysteme, die für höchste Sicherheit und Qualität sorgen. Das Berliner Start-up twago zum Beispiel wurde neulich mit dem Innovationspreis-IT der Initiative Mittelstand für sein safePay-Zahlungssystem ausgezeichnet. All das spricht für die Qualität dieser Dienste. Alle Anbieter verfügen auch über kostenpflichtige Mitgliedschaften, jedoch kann man mit einem kostenlosen Account auch ziemlich viele Funktionen der Plattform testen und bei Interesse sich eventuell für eine Premium-Mitgliedschaft entscheiden.Bist du Freelancer? Wo suchst du nach neue Projekten? Ähnliche Artikel:Kleinere Änderungen/Erweiterungen im Blog2-Klick-Empfehlungsbuttons von Heise und Plugin
Erste Symfony User Group in München
(Tue, 20 Mar 2012 17:40:03 GMT)  Die erste Münchner Symfony User Group trifft sich erstmals am Mittwoch, dem 21. März, in den Räumen der Mayflower GmbH in der Mannhardtstraße 6. Zu Gast sind unter anderem Freerich Bäthge, CTO der Sensio Labs Deutschland, und Alexandra Sticht, Chief Sales Officer der Sensio Labs Deutschland. Neben einem offenen Vortrag zu Symfony 2.1 stehen weitere Gespräche rund um die Symfony-Einsatzbereiche - u.a. im Business-Umfeld - auf der Tagesordnung. Symfony ist ein in PHP 5 geschriebenes MVC-Framework für die Entwicklung von Web-Applikationen. Die aktuelle Version Symfony 2.0.10 ist am 6. Februar 2012 erschienen, unterstützt Namespaces und benötigt PHP 5.3 oder höher.Für das leibliche Wohl sorgt der Gastgeber, das Softwareunternehmen Mayflower. Die 25 Plätze für die Auftaktveranstaltung wurden innerhalb kürzester Zeit gebucht, so dass die Plätze nochmals aufgestockt werden. Reservierungen sind unter http://www.meetup.com/sfugmunich/ möglich.
ApacheCamel bekommt Zugriff auf WebSocket und Twitter
(Tue, 20 Mar 2012 13:35:03 GMT)  Das freie Integrations-Framework Apache Camel bekommt ein Update: Version 2.10 wird neue Komponenten enthalten, die den Einsatz des WebSocket-Protokolls und den Zugriff auf Twitter ermöglichen sollen. Die WebSocket-Komponente erlaubt den Nachrichtenaustausch via WebSocket durch entsprechende WebSocket-Endpoints, während die angekündigte Twitter-Komponente auf der Twitter4J-Java-Bibliothek basiert und das Auslesen und Veröffentlichen von Tweets ermöglicht. Bereits im Februar gab es eine erste Vorschau auf die angekündigten neuen Funktionen: Im Rahmen eines Vortrags auf der schwedischen Java-Konferenz Jfocus 2012 stellten Claus Ibsen und James Strachan von FuseSource die neuen Features von Apache Camel 2.10 vor. Das Framework basiert auf bekannten Enterprise Integration Patterns und ermöglicht es Entwicklern, Routing- und Konvertierungsregeln deklarativ, beispielsweise in Java oder mittels XML-Konfiguration, zu definieren. Derzeit wird noch an der neuen Version gearbeitet; der Quellcode steht neben älteren Releases auf der Projektwebseite zum Download bereit. Dort findet sich auch eine ausführliche Übersicht aller geplanten Features und Bugfixes.
Push Notifications in Android Apps via C2DM
(Tue, 20 Mar 2012 09:20:08 GMT)  Seit Android 2.2 gibt es in Android Apps die Möglichkeit auf Push-Nachrichten zu reagieren. Dieser Dienst wird Cloud to Device Messaging oder kurz C2DM genannt.Die App registriert sich dazu bei den C2DM Servern an und bekommt dafür eine DeviceRegistrationID. Ab dann wird die Verbindung zwischen dem Android Market (neuerdings Google Play genannt) und den Google-Servern genutzt um die Push-Nachrichten auf das Handy zu bekommen.Die DeviceRegistrationID muss die App dann an unseren Server melden, und alle Nachrichten an diese DeviceRegistrationID kommen dann auf genau diesem Handy an. Sollte das Handy ausgeschaltet sein werden die Nachrichten zugestellt sobald das Handy (und die App) wieder gestartet sind. Falls alle Nachrichten den selben “Collapse Key” haben wird nur die neueste zugestellt.Der Server, der eine Nachricht senden möchte, sendet dazu einen POST Request an Googles C2DM Dienst. Der Text der Nachricht ist auf maximal 1024 Byte beschränkt, sollte also nur für kurze “Aufweckpings” bzw. Nachrichten a la “Es gibt Neuigkeiten vom Typ X, frag beim Server nach” geeignet sein.Hier das ganze Verfahren nochmal grafisch dargestellt:Die App meldet sich beim C2DM Dienst anDie App bekommt eine Device Registration IDDie App meldet diese Device Registration ID an den Applikationsserver der diese dann einem Benutzer zuordnet und abspeichertWenn auf dem Applikationsserver ein Event passiert über das das Handy benachrichtig werden soll…… wird diese Nachricht bzw. die Eventbenachrichtung an den C2DM Dienst übergebenGoogle sendet dann diese Nachricht an das entsprechende Handy und die App kann auf die Nachricht reagierenIch möchte hier den Serverteil vorstellen, der die Nachrichten an Googles Gateway übergibt und die dann in der App ankommen sollen. Dazu benötigen wir einen Google-Account den wir beim C2DM Dienst registrieren. Etwas vorsichtig muss man sein was man dort angibt: Die Role E-Mail ID muss ein Google-Account sein der nicht auf einem Handy registriert ist, am besten legt man dafür also einen separaten Account ein, denn diese E-Mail-Adresse ist im App eingetragen und das Passwort dieses Accounts wird auch im Quelltext auf dem Server abgelegt.Danach hat man einen Google-Account der Nachrichten an den C2DM Dienst senden kann (anfangs “nur” 200.000 pro Tag, das kann man aber erhöhen lassen). Für die Authentifizierung am C2DM Dienst benötigen wir einen AuthCode den wir mittels des sogenannten ClientLogin Dienstes bei Google bekommen.function getGoogleAuthCodeHelper($username, $password, $source='Company-AppName-Version', $service='ac2dm'){ // get an authorization token $ch = curl_init(); if(!$ch){ return false; } curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); $postFields = "accountType=" . urlencode('HOSTED_OR_GOOGLE') . "&Email=" . urlencode($username) . "&Passwd=" . urlencode($password) . "&source=" . urlencode($source) . "&service=" . urlencode($service); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // for debugging the request //curl_setopt($ch, CURLINFO_HEADER_OUT, true); // for debugging the request $response = curl_exec($ch); //var_dump(curl_getinfo($ch)); //for debugging the request //var_dump($response); curl_close($ch); if (strpos($response, '200 OK') === false) { throw new Exception('Error occurred'); } // find the auth code preg_match("/(Auth=)([\w|-]+)/", $response, $matches); if (!$matches[2]) { throw new Exception('Error occurred'); } return $matches[2];}Mit Hilfe dieser Funktion können wir uns einen AuthCode besorgen den wir für die eigentliche Sendefunktion benötigen:function send($message, $authCode, $deviceRegistrationId, $msgType){ $headers = array('Authorization: GoogleLogin auth=' . $authCode); $data = array( 'registration_id' => $deviceRegistrationId, 'collapse_key' => $msgType, 'data.message' => $message ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send"); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); curl_close($ch); // Check the response. If the exact error message is needed it can be parsed here $responseArray = preg_split('/=/', $response); if (!isset($responseArray[0]) || !isset($responseArray[1]) || strtolower($responseArray[0]) == 'error') { throw new Exception('Error occurred'); }}Das war es eigentlich schon, mit diesen beiden Requests kann man Push Notifications an die App senden. Wie genau die App aussieht um die Notifications zu empfangen und anfangs die DeviceRegistrationID zu beantragen möge man sich bei Google nachlesen.Zusatzinfo: Das ganze ist zu Testzwecken auch mit dem curl-Kommando auf Shellebene machbar:curl https://www.google.com/accounts/ClientLogin -d Email=**theEmailYouWhitelisted**-d Passwd=**password** -d accountType=HOSTED_OR_GOOGLE -d source=Google-cURL-Example-d service=ac2dm curl --header "Authorization: GoogleLogin auth=**authFromRegistrationAbove**""https://android.apis.google.com/c2dm/send" -d registration_id=**deviceRegistrationId**-d "data.message=StringToPass" -d collapse_key=something -kÄhnliche Artikel:PayPal-Integration: Instant Payment Notifications (IPN) einbauenVerschiedene Möglichkeiten, mit PHP zu twittern
Local File Inclusion: Einige Beispiele
(Fri, 16 Mar 2012 09:20:07 GMT)  Ich habe schon länger keine sicherheitsrelevanten Probleme mehr gepostet, heute schauen wir uns ein paar häufig gemachte und exisierende Fehler an. Schaut euch diesen Code-Schnipsel an:<?$url = $_POST['imageUrl'];$content = file_get_contents($url);// Put the content of that URL into a database for later use/displayDer Benutzer der Webseite kann also in ein Formular eine URL eintippen, beispielsweise die URL eines Bildes, einer XML-Datei oder einer Webseite. Das Script ruft diese Resource (z.B. ein Avatar Bildchen) ab und speichert es auf der Festplatte oder in einer Datenbank.Auf einer anderen Seite kann der Benutzer (und vielleicht alle anderen Besucher der Webseite) dieses Bild dann abrufen.Gibt es hier ein Sicherheitsloch? Ja, gleich mehrere! Was passiert wenn der Benutzer zum Beispiel folgende URLs eingibt:http://192.168.0.1/monitoring.phpfile://admin/config.phpssh2.exec://root:password@paymentserver:22/sbin/shutdownJe nachdem welche Wrapper zur Verfügung stehen kann man da ziemlich böse Dinge tun. Man sollte also auf jeden Fall prüfen ob die gegebene URL eine HTTP(S) URL ist die man auch erwartet und die ins Internet führt und nicht auf interne Systeme zugreift. Es sollte auch geprüft werden ob der Inhalt ein gültiges Bild (oder XML…) ist. Eventuell sollte auch geprüft werden ob curl eine bessere Lösung ist denn da stehen die PHP-Wrapper nicht zur Verfügung, wobei die Zugriffe auf interne Server via HTTP oder FTP auch damit möglich sind.Ein ähnlicher Fall ist der folgende Skriptausschnitt:<?$page = $_POST['p'];require_once $page.'.php';Normalerweise wird mittels des Parameters p gesteuert welche Seite angezeigt werden soll, beispielsweise das “menu” (menu.php), “home” (home.php) etc. Man darf sich nicht einreden dass ein angehängtes “.php” die Sicherheit erhöht, denn dieses kann durch ein einfaches Null-Byte oder geschickt gewählte Parameter auch umgangen werden.Ein Angreifer könnte damit jetzt auch seinen Spass haben indem er beispielsweise folgende Werte für p übergibt:confighttp://192.168.1.1/admininterface../../../../etc/passwd\0/kunden/web001/htdocs/useruploads/avatars/justuploaded/tmp/sess_324g234u2z34g/var/log/apache/access.logZweiteres geht natürlich nur wenn allow_url_include aktiviert ist. Die dritte Zeile zeigt die Null-Byte-Variante (je nachdem ob man via Telnet arbeitet oder via Browser muss man eventuell %00 nehmen statt \0). Das “.php” wird dadurch abgeschnitten. Die 4. Zeile zeigt den Zugriff auf ein PHP-Script das der Angreifer kurz vorher normal hochgeladen hat, darin könnte beispielsweise ein system() Aufruf sein oder eine Reverse Shell. Die 5. und 6. Variante laden auch Dateien die der Angreifer vorher mit entsprechenden Referrern, User-Agent-Werten oder Session-Werten gefüllt hat mit PHP-Code: <? system(‘….’); ?> Die erste Zeile ist relativ unspannend da die Seite weiß bleiben wird, denn in der config.php steht ja PHP Code. Der wird zwar ausgeführt, aber nicht ausgegeben und demnach wird nichts angezeigt. Aber man kommt trotzdem an den Quelltext, mit diesem kleinen Trick:php://filter/convert.base64-encode/resource=configDie Ausgabe könnte dann beispielsweise so aussehen:PD9waHANCiRwd2QgPSAnYWJjMTIzJzs=und wenn man das wiederum Base64-decodiert hat man den Quelltext der config.php Datei.Alles hier beschriebene gehört in den großen Bereich Remote File Inclusion und Local File Inclusion, d.h. der Benutzer hat Zugriff und Einfluss auf eingebundene Dateien. An allen Stellen wo ein Benutzer das Laden oder Abrufen von Dateien beeinflussen kann muss höchste Vorsicht geboten sein und alles geprüft werden, am besten gegen Whitelists (letztes Beispiel) oder reguläre Ausdrücke.Das Aktivieren von open_basedir hilft natürlich auch dabei dass der Angreifer nicht aus dem Projektverzeichnis herauskommt, /etc/passwd wird damit beispielsweise geschützt, aber im Projektverzeichnis oder auf anderen Servern kann der Angreifer nach wie vor tun was er will.Wie ladet ihr Dateien von fremden Servern herunter die der User bestimmen kann? Keine ähnlichen Artikel.
Slides der PHP UK Conference 2012
(Thu, 15 Mar 2012 09:20:07 GMT)  Und wieder ist eine hochkarätige PHP Konferenz zu Ende gegangen, die PHP UK Conference 2012 in London im Business Design Centre. Hier eine Übersicht der Talks und der Präsentationen:24. Februar 2012Opening Address Ciaran RooneyPHP in 2012 Rasmus LerdorfPowering Your Website with Realtime Data Bert Van HauwaertThe Journey towards Continuous Integration Sebastian MarekBig Data web – Big Data science – Big Data mining James LittlejohnThe Lean Scrum Linus NortonAPI Client Libraries for Payments David Haywood SmithThe Cookie Law Ian BarberPHP 5.4: The New Bits Davey ShafikDevelop & deploy using hybrid cloud strategies Thijs FerynData Abstraction In Large Web Applications Brandon SavageDeliberate Practice Marcello DuarteGit Plus Jenkins: The Great DDOS Client Laura Beth DenkerTo a thousand servers and beyond: scaling a massive PHP application Nikolay BachiyskiCreative Coding – why ?doing nothing? doesn?t mean you?re not working June HenriksenSecurity audits as integral part of PHP application development Sijmen RuwhofOrganizing a Conference Rick OgdenProfiling PHP Applications Derick RethansScaling Communication with Continuous Integration Laura Beth DenkerDistribute the workload Helgi Þormar ÞorbjörnssonUser Experience Forum/Q&A Steph TroethShort Introduction to BDD with Behat Jakub ZalasTeaching Your Machine To Find Fraudsters Ian BarberBuilding and deploying applications with Phing Michiel RookTry { Getting People To Come To A Talk About Exceptions } Ed van BeinumCreating Moblie Web Apps with Sencha Touch Martin de KeijzerSecure Cross Domain Forms Using Encrypted Callbacks James and AndriesPHP at Scale Ian Barber25. Februar 2012Opening Address Ciaran RooneyChallenges at scale: extreme data and platforms at eBay Hugh WilliamsSecurity audits as integral part of PHP application development Sijmen RuwhofMasterizing PHP Data Structure 102 Patrick AllaertPHP 5.4: The New Bits Davey ShafikMonitoring your backend for speed and profit Andrew “Bob” BrockhurstOpen Source Search: An Analysis Justin FinkelsteinTo a thousand servers and beyond: scaling a massive PHP application Nikolay BachiyskiRunning an Open Source Project Lorna MitchellGit Submodules: The Good and the Bad Paul MatthewsCheat your way with UX Stephanie TroethMySQL Update Dave StokesRecognizing smelly code Harrie VerveerAPI Design: More Than the REST Dave IngramIntro to SOLID PHP Neel UpadhyayaDistribute the workload Helgi Þormar ÞorbjörnssonHTML5 for PHP developers Andrew BettsIntroduction: MongoDB with PHP Derick RethansEmperor’s New Clothes Kevinjohn GallagherVirtualization and Vagrant & more AnonPHP Under The Hood Johannes SchlüterThe Misguided Manager Zoe SlatteryPowering Your Website with Realtime Data Bert Van HauwaertUX Q&A Part 2 Steph TroethInsight into a Cloud PaaS AnonSQL vs NoSQL Johannes SchlüterClosing Address Ciaran Rooney Ähnliche Artikel:Präsentationen der PHPBenelux Konferenz 2012Slides der PHPBenelux Conference 2011Slides der Dutch PHP Conference 2011
2-Faktor-Authentifizierung mit dem Google Authenticator
(Tue, 13 Mar 2012 09:20:05 GMT)  Viele größere Webdienste bieten mittlerweile die 2-Faktor-Authentifizierung an, PayPal, Amazon, Facebook und nicht zuletzt Google. Mit der 2-Faktor-Authentifizierung muss neben dem Benutzernamen und Passwort auch noch ein Einmal-Passwort, ein sogenanntes One-Time-Token eingegeben werden, das von einem Gerät unabhängig vom PC generiert wird und nur einmal gültig ist. Sollte es also jemand schaffen und das Passwort erraten oder mitschneiden, hilft es dem Angreifer wenig denn er muss auch noch Zugriff auf das Hardwaregerät bekommen, und das sollte schwierig sein.Die Generierung von solchen Codes ist nicht sonderlich schwer, beide Parteien (das Gerät und die Webseite) müssen nur ein gemeinsames “shared secret” kennen (auch Seed genannt), und aufbauend auf diesem dann sich immer ändernde Codes generieren können. Dazu gibt es RFCs, beispielsweise RFC 4226.Ich habe ja bereits letztes Jahr den Yubikey vorgestellt, heute möchte ich den Google Authenticator vorstellen und zeigen wie man seine eigene Webseite um diesen 2-Faktor-Login erweitern kann mittels PHP.Der Google Authenticator ist als App für Handys konzipiert, man muss also keine Hardware kaufen sondern einfach nur ein App installieren, den Google Authenticator gibt es für Android, IPhone/iPad, Blackberry und weiteren Plattformen. Es gibt auch Umsetzungen für Windows, Java und Palm OS. Es ist Open Source.Die Installation des Google Authenticators ist denkbar einfach und kann bei Google nachgelesen werden. Normalerweise geht das ganz einfach über den Market/AppStore.Es gibt schon einige Umsetzungen in PHP da draußen, aber ich wollte meine eigene haben ;-) . Und habe mir eine Klasse gebaut (GoogleAuthenticator auf Github) die alles kann was ich brauche:Ein neues Secret generierenDen aktuellen Code errechnen für ein gegebenes SecretEinen Code gegenchecken für ein gegebenes Secret (inklusive variabler Zeit-Abweichungs-Toleranz)Eine QR-Code-URL zurückgeben für ein QR-Code-Bild für ein gegebenes Secret<!DOCTYPE html><html> <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# githubog: http://ogp.me/ns/fb/githubog#"> <meta charset='utf-8'> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Server Error · GitHub</title> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" /> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub" /> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> <meta content="authenticity_token" name="csrf-param" /><meta content="XgUQKzVgQSLUR1DI3Y4T8KgWirJIWrqBa3n4PzRtmNc=" name="csrf-token" /> <link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github-d0d5634eea380fa8d044f9708f924fbaf8a66bbd.css" media="screen" rel="stylesheet" type="text/css" /> <link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github2-38c7af2c552de8b11f823b74f3100116457140a1.css" media="screen" rel="stylesheet" type="text/css" /> <script src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/jquery-5b140862bd914d3619171dece9be92269c2b1fe1.js" type="text/javascript"></script> <script src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/github-e43651db684df3f69ffa5a4469a9878cd3174b28.js" type="text/javascript"></script> </head> <body class="logged_out env-production " data-blob-contribs-enabled="yes"> <div id="header" class="true clearfix"> <div class="container clearfix"> <a class="site-logo" href="https://github.com/"> <!--[if IE]> <img alt="GitHub" class="github-logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7.png?1323882804" /> <img alt="GitHub" class="github-logo-hover" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7-hover.png?1324325453" /> <![endif]--> <img alt="GitHub" class="github-logo-4x" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x.png?1323882804" /> <img alt="GitHub" class="github-logo-4x-hover" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x-hover.png?1324325453" /> </a> <!-- make sure to use fully qualified URLs here since this nav is used on error pages on other domains --> <ul class="top-nav logged_out"> <li class="pricing"><a href="https://github.com/plans">Signup and Pricing</a></li> <li class="explore"><a href="https://github.com/explore">Explore GitHub</a></li> <li class="features"><a href="https://github.com/features">Features</a></li> <li class="blog"><a href="https://github.com/blog">Blog</a></li> <li class="login"><a href="https://github.com/login">Login</a></li> </ul> </div> </div> <div class="site clearfix"> <div class="container"> <div class="markdown-body standard"> <div class="center"><img alt="Unicorn is angry" height="205" src="https://a248.e.akamai.net/assets.github.com/images/error/angry_unicorn.png?1259026914" width="200" /></div> <h1>Page did not respond in a timely fashion.</h1> <p><a href="http://status.github.com/">Check our status site for alerts.</a></p> <p> Either you found a page that took too long to render or<br /> we're getting more requests right now than we can handle. </p> <ul> <li> You can try <a href="javascript: window.location.reload()">refreshing the page,</a> the problem may be temporary. </li> <li> <a href="http://github.s3.amazonaws.com/misc/down.html"> Learn how to deal with GitHub outages and other access problems. </a> </li> </ul></div> </div> <div class="context-overlay"></div> </div> <!-- footer --> <div id="footer" > <div class="upper_footer"> <div class="container clearfix"> <!--[if IE]><h4 id="blacktocat_ie">GitHub Links</h4><![endif]--> <![if !IE]><h4 id="blacktocat">GitHub Links</h4><![endif]> <ul class="footer_nav"> <h4>GitHub</h4> <li><a href="https://github.com/about">About</a></li> <li><a href="https://github.com/blog">Blog</a></li> <li><a href="https://github.com/features">Features</a></li> <li><a href="https://github.com/contact">Contact & Support</a></li> <li><a href="https://github.com/training">Training</a></li> <li><a href="http://enterprise.github.com/">GitHub Enterprise</a></li> <li><a href="http://status.github.com/">Site Status</a></li> </ul> <ul class="footer_nav"> <h4>Tools</h4> <li><a href="http://get.gaug.es/">Gauges: Analyze web traffic</a></li> <li><a href="http://speakerdeck.com/">Speaker Deck: Presentations</a></li> <li><a href="https://gist.github.com/">Gist: Code snippets</a></li> <li><a href="http://mac.github.com/">GitHub for Mac</a></li> <li><a href="http://mobile.github.com/">Issues for iPhone</a></li> <li><a href="http://jobs.github.com/">Job Board</a></li> </ul> <ul class="footer_nav"> <h4>Extras</h4> <li><a href="http://shop.github.com/">GitHub Shop</a></li> <li><a href="http://octodex.github.com/">The Octodex</a></li> </ul> <ul class="footer_nav"> <h4>Documentation</h4> <li><a href="http://help.github.com/">GitHub Help</a></li> <li><a href="http://developer.github.com/">Developer API</a></li> <li><a href="http://github.github.com/github-flavored-markdown/">GitHub Flavored Markdown</a></li> <li><a href="http://pages.github.com/">GitHub Pages</a></li> </ul> </div><!-- /.site --> </div><!-- /.upper_footer --><div class="lower_footer"> <div class="container clearfix"> <!--[if IE]><div id="legal_ie"><![endif]--> <![if !IE]><div id="legal"><![endif]> <ul> <li><a href="https://github.com/site/terms">Terms of Service</a></li> <li><a href="https://github.com/site/privacy">Privacy</a></li> <li><a href="https://github.com/security">Security</a></li> </ul> <p>© 2012 <span title="s from fe4.rs.github.com">GitHub</span> Inc. All rights reserved.</p> </div><!-- /#legal or /#legal_ie--> <div class="sponsor"> <a href="http://www.rackspace.com/" class="logo"> <img alt="Dedicated Server" height="36" src="https://a248.e.akamai.net/assets.github.com/images/modules/footer/rackspaces_logo.png?1329521040" width="38" /> </a> Powered by the <a href="http://www.rackspace.com/ ">Dedicated Servers</a> and<br/> <a href="http://www.rackspacecloud.com/">Cloud Computing</a> of Rackspace Hosting<span>®</span> </div> </div><!-- /.site --></div><!-- /.lower_footer --> </div><!-- /#footer --> <div id="keyboard_shortcuts_pane" class="instapaper_ignore readability-extra" style="display:none"> <h2>Keyboard Shortcuts <small><a href="#" class="js-see-all-keyboard-shortcuts">(see all)</a></small></h2> <div class="columns threecols"> <div class="column first"> <h3>Site wide shortcuts</h3> <dl class="keyboard-mappings"> <dt>s</dt> <dd>Focus site search</dd> </dl> <dl class="keyboard-mappings"> <dt>?</dt> <dd>Bring up this help dialog</dd> </dl> </div><!-- /.column.first --> <div class="column middle" style='display:none'> <h3>Commit list</h3> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>c <em>or</em> o <em>or</em> enter</dt> <dd>Open commit</dd> </dl> <dl class="keyboard-mappings"> <dt>y</dt> <dd>Expand URL to its canonical form</dd> </dl> </div><!-- /.column.first --> <div class="column last" style='display:none'> <h3>Pull request list</h3> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>o <em>or</em> enter</dt> <dd>Open issue</dd> </dl> </div><!-- /.columns.last --> </div><!-- /.columns.equacols --> <div style='display:none'> <div class="rule"></div> <h3>Issues</h3> <div class="columns threecols"> <div class="column first"> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>x</dt> <dd>Toggle selection</dd> </dl> <dl class="keyboard-mappings"> <dt>o <em>or</em> enter</dt> <dd>Open issue</dd> </dl> </div><!-- /.column.first --> <div class="column middle"> <dl class="keyboard-mappings"> <dt>I</dt> <dd>Mark selection as read</dd> </dl> <dl class="keyboard-mappings"> <dt>U</dt> <dd>Mark selection as unread</dd> </dl> <dl class="keyboard-mappings"> <dt>y</dt> <dd>Remove selection from view</dd> </dl> </div><!-- /.column.middle --> <div class="column last"> <dl class="keyboard-mappings"> <dt>c</dt> <dd>Create issue</dd> </dl> <dl class="keyboard-mappings"> <dt>l</dt> <dd>Create label</dd> </dl> <dl class="keyboard-mappings"> <dt>i</dt> <dd>Back to inbox</dd> </dl> <dl class="keyboard-mappings"> <dt>u</dt> <dd>Back to issues</dd> </dl> <dl class="keyboard-mappings"> <dt>/</dt> <dd>Focus issues search</dd> </dl> </div> </div> </div> <div style='display:none'> <div class="rule"></div> <h3>Issues Dashboard</h3> <div class="columns threecols"> <div class="column first"> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>o <em>or</em> enter</dt> <dd>Open issue</dd> </dl> </div><!-- /.column.first --> </div> </div> <div style='display:none'> <div class="rule"></div> <h3>Network Graph</h3> <div class="columns equacols"> <div class="column first"> <dl class="keyboard-mappings"> <dt><span class="badmono">←</span> <em>or</em> h</dt> <dd>Scroll left</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="badmono">→</span> <em>or</em> l</dt> <dd>Scroll right</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="badmono">↑</span> <em>or</em> k</dt> <dd>Scroll up</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="badmono">↓</span> <em>or</em> j</dt> <dd>Scroll down</dd> </dl> <dl class="keyboard-mappings"> <dt>t</dt> <dd>Toggle visibility of head labels</dd> </dl> </div><!-- /.column.first --> <div class="column last"> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">←</span> <em>or</em> shift h</dt> <dd>Scroll all the way left</dd> </dl> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">→</span> <em>or</em> shift l</dt> <dd>Scroll all the way right</dd> </dl> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">↑</span> <em>or</em> shift k</dt> <dd>Scroll all the way up</dd> </dl> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">↓</span> <em>or</em> shift j</dt> <dd>Scroll all the way down</dd> </dl> </div><!-- /.column.last --> </div> </div> <div style='display:none'> <div class="rule"></div> <div class="columns threecols"> <div class="column first" style='display:none'> <h3>Source Code Browsing</h3> <dl class="keyboard-mappings"> <dt>t</dt> <dd>Activates the file finder</dd> </dl> <dl class="keyboard-mappings"> <dt>l</dt> <dd>Jump to line</dd> </dl> <dl class="keyboard-mappings"> <dt>w</dt> <dd>Switch branch/tag</dd> </dl> <dl class="keyboard-mappings"> <dt>y</dt> <dd>Expand URL to its canonical form</dd> </dl> </div> </div> </div></div> <div id="markdown-help" class="instapaper_ignore readability-extra"> <h2>Markdown Cheat Sheet</h2> <div class="cheatsheet-content"> <div class="mod"> <div class="col"> <h3>Format Text</h3> <p>Headers</p> <pre># This is an <h1> tag## This is an <h2> tag###### This is an <h6> tag</pre> <p>Text styles</p> <pre>*This text will be italic*_This will also be italic_**This text will be bold**__This will also be bold__*You **can** combine them*</pre> </div> <div class="col"> <h3>Lists</h3> <p>Unordered</p> <pre>* Item 1* Item 2 * Item 2a * Item 2b</pre> <p>Ordered</p> <pre>1. Item 12. Item 23. Item 3 * Item 3a * Item 3b</pre> </div> <div class="col"> <h3>Miscellaneous</h3> <p>Images</p> <pre>![GitHub Logo](/images/logo.png)Format: ![Alt Text](url)</pre> <p>Links</p> <pre>http://github.com/ - automatic![GitHub](http://github.com)</pre><p>Blockquotes</p> <pre>As Kanye West said:> We're living the future so> the present is our past.</pre> </div> </div> <div class="rule"></div> <h3>Code Examples in Markdown</h3> <div class="col"> <p>Syntax highlighting with <a href="http://github.github.com/github-flavored-markdown/" title="GitHub Flavored Markdown" target="_blank">GFM</a></p> <pre>```javascriptfunction fancyAlert(arg) { if(arg) { $.facebox({div:'#foo'}) }}```</pre> </div> <div class="col"> <p>Or, indent your code 4 spaces</p> <pre>Here is a Python code examplewithout syntax highlighting: def foo: if not bar: return true</pre> </div> <div class="col"> <p>Inline code for comments</p> <pre>I think you should use an`<addr>` element here instead.</pre> </div> </div> </div></div> <div class="ajax-error-message"> <p><span class="icon"></span> Something went wrong with that request. Please try again. <a href="javascript:;" class="ajax-error-dismiss">Dismiss</a></p> </div> <div id="logo-popup"> <h2>Looking for the GitHub logo?</h2> <ul> <li> <h4>GitHub Logo</h4> <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip"><img alt="Github_logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/github_logo.png?1306884373" /></a> <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip" class="minibutton btn-download download"><span><span class="icon"></span>Download</span></a> </li> <li> <h4>The Octocat</h4> <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip"><img alt="Octocat" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/octocat.png?1306884373" /></a> <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip" class="minibutton btn-download download"><span><span class="icon"></span>Download</span></a> </li> </ul> </div> </body></html>Die Webseite generiert nun also auf Anfrage ein Secret für einen Kunden, speichert dieses in einer Datenbank, und präsentiert dem Kunden dann entweder direkt das Secret das er dann abtippen muss, oder zeigen ihm den QR-Code der das Secret beinhaltet. Dieser QR-Code kann mit dem Google Authenticator bequem eingescannt werden, und schon werden auf dem Handy Codes angezeigt.Die Webseite muss nun natürlich für einen aktivierten Benutzer noch ein weiteres Formular(feld) beim Login anzeigen in den ein gültiger Code einzugeben ist. Wenn dieser gültig war muss er unbedingt gespeichert werden und darf nicht erneut genutzt werden, denn sonst könnte ihn ein Mithörer in den nächsten Sekunden nutzen und sich damit auch anmelden. Nach einigen Minuten (je nach Einstellung der Toleranzgrenze) können diese alten benutzten Codes gelöscht werden.Secret/Seed: OQB6ZZGYHCPSX4AKJe nach Sicherheitslevel muss der Code bei jedem Login eingegeben werden, oder es wird ein Cookie gespeichert sodass nur alle X Tage der Code eingegeben werden muss. Auf einem neuen PC oder in einem anderen Browser wird der Code natürlich anfangs wieder benötigt. Je nachdem wie sicher bzw. bequem man es haben möchte. Man kann das ganze optional anbieten, sodass nur Benutzer die es eingerichtet haben, nutzen können, oder verpflichtend für alle Benutzer einfordern. Auch hier ist das abhängig von der Sicherheitsstrategie der Seite/Firma.Mögliche Fallstricke bzw. wichtige Dinge an die man denken sollte:Wichtig bei der Umsetzung des Google Authenticators ist die Zeitsynchronisierung. die Uhren von Server und Client dürfen nicht allzuweit auseinander liegen, sonst schlägt die AUthentifizierung immer fehl. Aus diesem Grund sollte man nicht nur die standardmäßig erlaubten 30 Sekunden Toleranz bieten sondern eventuell 1:30 oder 4:00 Minuten. Dazu berechnet der Server einfach die vorherigen und nächsten Codes und nimmt diese alle zum Vergleich.Wie oben bereits geschrieben müssen Replay-Attacken vermieden werden. Einmal benutzte Codes müssen also für den Benutzer auf eine Blacklist, sodass sie in den nächsten Minuten nicht nochmals verwendet werden können.Allgemein gilt natürlich auch hier ein Schutz gegen Brute-Force. Falls man 6 Zeichen Länge nimmt wie Google sind das nicht allzuviele Möglichkeiten die man durchprobieren müsste. Man muss also zwingend die Versuche pro Minute begrenzen.Falls das Handy verloren geht oder gestohlen wird, sollte man natürlich trotzdem noch eine Möglichkeit haben sich in den Account einzuloggen und das Secret zu widerrufen. Dazu kann man entweder ein zweites Mal auf einem Ersatzhandy den Google Authenticator einrichten, oder andere Wege wie Notfall-Codes festlegen, das Handy eines Freundes angeben um sich per SMS ein neues Passwort zuschicken zu lassen, oder oder.Eine interessante Seite um etwas mit dem Secret, dem QR-Code und dem Code herumzuspielen ist diese Javascript-Umsetzung.Für WordPress gibt es ein Plugin für die Google Authenticator Unterstützung, ich nehme an dass es für die (anderen) großen CMS etc. auch welche gibt. Ähnliche Artikel:Mit Wetterdaten arbeiten: Google Weather APIGoogle’s Cloud kostenlos als CDN nutzenVerteiltes Rechnen mit Javascript und Google Gears
Web-Applikationen optimieren
(Mon, 12 Mar 2012 13:40:04 GMT)  Es gibt verschiedene Methoden, die Performance von Web-Applikationen zu steigern und Lade- und Reaktionszeiten zu minimieren. In zwei Schwerpunktartikeln von Carsten Möhrke und Timo Krotzky werden unter anderem das Caching bei PHP-Applikationen, aber auch andere Tuning-Maßnahmen zur Verbesserung des Zeitverhaltens von Webanwendungen untersucht.Außerdem erfahren Sie in Ausgabe 04/2012 unter anderem, wie Sie per PHP und JSON Daten zwischen Client und Server austauschen und wie Sie mit Hilfe von PHP Dateien und Verzeichnisse in Web-Applikationen manipulieren können.Weitere Themen im aktuellen Heft:- Gefährdungslage durch Malware- Test Driven Development,- CM Studio 2012- Apache Cassandra NoSQL Datenbank- User Experience beim Webdesign… und vieles mehr. Die neueste Ausgabe der web-developer ist seit letztem Donnerstag am Kiosk erhältlich.
Linkpool Nummer 28
(Sat, 10 Mar 2012 10:25:09 GMT)  Einige Links zur Lektüre am Wochenende:Die verschiedenen Möglichkeiten des Packaging, unter anderem PEAR, frameworkeigene Lösungen und Composer:http://philsturgeon.co.uk/blog/2012/03/packages-the-way-forward-for-phpSehr schöner Artikel zum Localstorage und der aktuellen Diskussion dass man ihn nicht benutzen soll aus Performancegründen:http://www.nczonline.net/blog/2012/03/07/in-defense-of-localstorage/Erklärung zur aktuellen Diskussion zu Scalaren Typehints, und warum das eine schwere Aufgabe ist:http://nikic.github.com/2012/03/06/Scalar-type-hinting-is-harder-than-you-thinkEin umfangreicher Artikel über die Neuerungen in PHP 5.4:http://net.tutsplus.com/tutorials/php/php-5-4-is-here-what-you-must-know/5 Möglichkeiten bzw. Design Pattern, um in PHP-Projekten eine Plugin-Struktur aufzubauen:http://blog.ircmaxell.com/2012/03/handling-plugins-in-php.htmlEin deutscher Podcast von Mayflower, erste Ausgabe. Bin sehr gespannt ob es noch weitere Folgen gibt!http://blog.mayflower.de/archives/847-Mayflower-Podcast-001.htmlKostenloses E-Book von IBM zu IPv6:http://entwickler.de/zonen/portale/psecom,id,99,news,61988.html Ähnliche Artikel:Linkpool Nummer 14Linkpool Nummer 27 + Adventskalenderartikel 10.12. – 24.12.Linkpool Nummer 25
Passworte/Strings untersuchen: Links- oder Rechtshänder?
(Thu, 08 Mar 2012 09:20:06 GMT)  Mich interessierte kürzlich ob die Wahl des Passwortes davon abhängt ob man Rechts- oder Linkshänder ist, oder ob es einfach nur davon abhängt wo die am häufigsten genutzten Buchstaben auf der Tastatur liegen. Dazu habe ich mir ein kleines Script gebaut dass zu einem gegebenen String ausrechnet welche Finger bzw. welche Hand für das Tippen benutzt werden.Dabei gibt es jedoch einige Annahmen die nicht immer auf alle Personen zutreffen. Ich teile die Tastatur exakt in 2 Hälften, es gibt jedoch viele Leute die die Tastatur anders aufteilen, oder gar nicht (alles mit dem rechten Zeigefinger ;-) ) Des weiteren habe ich Großbuchstaben nicht mit beachtet da ich nicht genau weiß wie da die gängige Vorgehensweise ist. Nutzt ihr immer die linke Shift-Taste, oder wovon hängt es ab welche der beiden ihr nutzt? Ich habe es erstmal rausgelassen.Eine Beispielausgabe des Skripts:# php stringhandiness.phpThis is a small script to calculate the handiness of strings.1 means left hand only, -1 means right hand only.String Value========================================password 0.5123456 1facebook1 0.33phpgangsta 0.2passwort 0.512345678 0.5michael -0.14kliewe 0z13ml1chkr455espa55w0rt 0.39Done. (C) by Michael KlieweDas Script habe ich dann für 100 meist genutzte Passworte laufen lassen. Im Endeffekt jedoch kann man daraus nicht viel ablesen, die linke Hand scheint bevorteilt zu sein, das mag aber auch daran liegen dass “aesrtd” häufig vorkommende Buchstaben sind und die niedrigen Zahlen links liegen.Wie dem auch sei, leider keine wirklich neuen Erkenntnisse erhalten. Oder seht ihr da eine Chance dem Ganzen etwas interessantes abzugewinnen?Achso, Script liegt als Projekt String Handiness auf Github, falls es jemand mal benötigt. Keine ähnlichen Artikel.
Zend Developer Cloud mit PHP-5.4-Unterstützung
(Tue, 06 Mar 2012 14:45:03 GMT)  Zend Technologies hat seine PHP-Cloud-Plattform Zend Developer Cloud nun um die aktuelle PHP-Version 5.4 erweitert. Gleichzeitig wurden noch weitere Verbesserungen vorgenommen: so arbeitet die Plattform nun auf Basis des aktualisierten Anwendungsservers Zend Server 5.6, der neben einer höheren Performance auch mehr Zuverlässigkeit und schnelleres Troubleshooting verspricht.Außerdem wurde der Zend Developer Cloud eine neue Tracing-Engine verpasst, die Tracing auf Container-Ebene sowie auf globaler Ebene erlaubt und es möglich machen soll, mehr Einfluss auf einzelne Traces zu nehmen. Die Anwendungscontainer für die Content Management Systeme WordPress, Drupal und Joomla wurden ebenfalls aktualisiert.Die Zend Developer Cloud ist eine PHP-Cloud-Umgebung, mit der sich Anwendungen in Container kapseln und später auf anderen Cloud-Plattformen (wie Rackspace, IBM SmartCloud oder AWS CloudFormation) wieder ausrollen lassen.Derzeit lässt sich der Service nur in Form einer kostenlosen Technology Preview und auf Einladung der Entwickler testen. Wann und zu welchen Konditionen die Zend Developer Cloud schließlich nutzbar sein wird, ist bislangnoch nicht bekannt.
PHP 5.4: Trait-Unterstützung, dafür Safe Mode abgeschafft
(Mon, 05 Mar 2012 18:20:03 GMT)  Vor wenigen Tagen wurde die Version 5.4 der Skriptsprache PHP offiziell freigegeben. Diese läuft dank neu überarbeitetem Interpreter wesentlich performanter als die Vorgängerversionen und glänzt außerdem mit einer effizienteren Speicherauslastung. Darüber hinaus bietet PHP 5.4 Entwicklern zahlreiche neue Werkzeuge und Funktionen zur objektorientierten Programmierung.So unterstützt das aktuelle Release nun Short Array Syntax und die Verwendung von Traits, einem Mechanismus zur einfachen Wiederverwendung von Methoden. Ebenfalls enthalten ist ein integrierter Webserver für Testzwecke. Dafür wurden auch viele alte Funktionen - sogenannte Legacy-Features – entfernt; so fehlen nun beispielsweise der Safe Mode und alle dazu gehörenden ini-Optionen.Dies schränkt voraussichtlich die Kompatibilität von PHP 5.4 zu wesentlich älteren Releases ein - für PHP 5.3 gibt es jedoch einen Migrationspfad.Neben dem offiziellen Changelog hat der Entwickler Artur Graniszewski in seinem Blog php.webtutor.pl eine detaillierte Liste mit Änderungen und neuen Features veröffentlicht. PHP 5.4 steht als kostenloser Download zur Verfügung und ist auch als Binärpaket für Windows erhältlich.
No reference from table X to table Y
(Mon, 05 Mar 2012 16:55:02 GMT)  Referenzen der Datenbank im Zend Framework über das Model abzubilden ist ja eine gute Idee. Schnell ist das entsprechende Skelett des Model erstellt und die Doku lehrt uns: "Definier die $_referenceMap und alles wird gut.". Dachte ich auch ... aberWer das schon einmal ausprobiert hat, der weiß: Im aber steckt der Wurm im Apfel bzw. die Titelmeldung auf dem Schirm. Aber langsam und zum mitmachen:Gegeben sind 2 Datenbanktabellen "news" und "author", news hat u.a. ein Feld authorId. Den Rest könnt ihr euch vorstellen.class myApp_Model_News extends Zend_Db_Table_Abstract { protected $_name = 'news'; protected $_primary = 'id'; protected $_referenceMap = array( 'TrouperId' => array( 'columns' => array('author_id'), 'refTableClass' => 'author', 'refColumns' => array('id') ) );}Instinktiv benutzt man das und hier meldet sich auch gleich eine Fehlermeldung:"No reference from table myApp_Model_News to table myApp_Model_Author"Aber warum? Wir haben doch alles richtig gemacht.Prinzipiell ja, laut Doku, aber nicht laut programmiertem Code, dafür muss man nämlich nicht den Tabellennamen in die $_referenceMap eintragen, sondern den Namen des Models!!!Also so:class myApp_Model_News extends Zend_Db_Table_Abstract { protected $_name = 'news'; protected $_primary = 'id'; protected $_referenceMap = array( 'TrouperId' => array( 'columns' => array('author_id'), 'refTableClass' => 'myApp_Model_Author', 'refColumns' => array('id') ) );}Besonders mal auf "refTableClass" sehen, dort steht nun nicht mehr der Tabellenname wie er in der Datenbank steht, sondern der Name des Models, dass für diese Tabelle zuständig ist.Und nun funktioniert das ganze auch mit$news = new myApp_Model_News();$myNews = $news->fetchRow();$newsauthor = $myNews->findDependentRowset('myApp_Model_Author');
PayPal-Integration: Instant Payment Notifications (IPN) einbauen
(Mon, 05 Mar 2012 09:20:07 GMT)  Über PayPal gibt es unterschiedlichste Meinungen, die Sperrungen von Accounts sind teilweise willkürlich, in wie weit die amerikanische Regierung die Finger im Spiel hat mag man sich auch ausmalen. Nichtsdestotrotz ist es der aktuell am meisten verbreitete Online-Zahlungsdienst und man kann nahezu überall damit bezahlen. Kein Shop kann sich erlauben keine PayPal Zahlungen anzunehmen, einige Studien sprechen von 18% mehr Umsatz bei Einkäufen wenn PayPal angeboten wird.Wenn man selbst PayPal Zahlungen entgegen nehmen möchte und diese automatisiert abarbeiten möchte benötigt man die Funktion Instant Payment Notification von PayPal. Im deutschen PayPal wird es “Sofortige Zahlungsbestätigung” genannt. Ich nehme immer die Abkürzung IPN.IPN ist ein einfaches Feature: Wann immer eine Transaktion auf dem eigenen Konto stattfindet wird eine bestimmte URL aufgerufen die wir spezifizieren können. Eine Transaktion ist beispielsweise eine erfolgte Zahlung, ein Abonnement, eine Rückzahlung, Rückbuchung, offene oder abgelehnte Zahlung.Um das IPN-Feature zu aktivieren geht man im PayPal Interface auf “Mein Profil -> Mehr -> Einstellungen für sofortige Zahlungsbestätigung” und trägt dort eine URL ein, beispielsweise http://www.meinshop.de/payment/paypalipn.phpDort legen wir dann ein Script hin, und PayPal schickt uns dorthin via POST die Details zum Zahlungsvorgang. Diese können wir dann verifizieren, eigene Prüfungen auf Korrektheit, Sinnhaftigkeit und Vollständigkeit machen, und dann die Zahlung im Shop als bezahlt markieren.Für die Verifizierung bietet PayPal einen kleinen Dienst an, dorthin kann man die Daten einer Transaktion schicken und sich bestätigen lassen dass sie alle korrekt sind und es diese Zahlung wirklich gegeben hat. Sonst könnte jemand, der die URL herausfindet, gefälschte Daten an unser paypalipn.php Script schicken. Dann ist also sichergestellt dass es die Transaktion bei PayPal gegeben hat, wir prüfen als nächstes ob die Empfänger-E-Mail-Adresse eine unserer E-Mail-Adressen ist, denn ein findiger Mensch könnte ja einfach die Transaktionsdaten an unser Script schicken wie er sich selbst Geld geschickt hat. Als letztes prüfen wir noch den Betrag sowie die eventuell vorhandene Anzahl von gekauften Waren etc.Wenn das alles geprüft wurde können wir sicher sein dass es eine reguläre Zahlung war und die Bestellung im Shop als bezahlt markieren, eine nette E-Mail an den Kunden schicken dass wir das Geld erhalten haben und die Ware verschicken, bzw. den gekauften Artikel zum Download anbieten, oder was auch immer man machen muss wenn der Kunde bezahlt hat.Um diese Validierung gegen die PayPal Server und die weiteren Prüfungen etwas zu vereinfachen habe ich eine Klasse geschrieben die die Arbeit auf das notwendigste beschränkt. Ihr findet sie auf GitHub unter dem Namen “PayPal IPN”.Dort sind Beispieldateien hinterlegt wie die Klasse zu benutzen ist. Meine Basisklasse PHPGangsta_PayPalIPN sollte dazu erweitert werden und mit den nötigen Dingen versehen werden, wie beispielsweise dem E-Mail-Check und den Dingen die bei erfolgter Zahlung passieren sollen (Datenbankeintrag, E-Mail…).So sieht dann die Benutzung aus. Hier ein Beispiel des Hauptscripts, das nur die Klasse benutzt und die $_POST Daten übergibt:<!DOCTYPE html><html> <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# githubog: http://ogp.me/ns/fb/githubog#"> <meta charset='utf-8'> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Server Error · GitHub</title> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" /> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub" /> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> <meta content="authenticity_token" name="csrf-param" /><meta content="OeZDhJxcjmpCvxRO5ZzdlSoyQjdmmQwaAIxViJEJh+0=" name="csrf-token" /> <link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github-d0d5634eea380fa8d044f9708f924fbaf8a66bbd.css" media="screen" rel="stylesheet" type="text/css" /> <link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github2-38c7af2c552de8b11f823b74f3100116457140a1.css" media="screen" rel="stylesheet" type="text/css" /> <script src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/jquery-5b140862bd914d3619171dece9be92269c2b1fe1.js" type="text/javascript"></script> <script src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/github-e43651db684df3f69ffa5a4469a9878cd3174b28.js" type="text/javascript"></script> </head> <body class="logged_out env-production " data-blob-contribs-enabled="yes"> <div id="header" class="true clearfix"> <div class="container clearfix"> <a class="site-logo" href="https://github.com/"> <!--[if IE]> <img alt="GitHub" class="github-logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7.png?1323882799" /> <img alt="GitHub" class="github-logo-hover" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7-hover.png?1324325436" /> <![endif]--> <img alt="GitHub" class="github-logo-4x" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x.png?1323882799" /> <img alt="GitHub" class="github-logo-4x-hover" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x-hover.png?1324325436" /> </a> <!-- make sure to use fully qualified URLs here since this nav is used on error pages on other domains --> <ul class="top-nav logged_out"> <li class="pricing"><a href="https://github.com/plans">Signup and Pricing</a></li> <li class="explore"><a href="https://github.com/explore">Explore GitHub</a></li> <li class="features"><a href="https://github.com/features">Features</a></li> <li class="blog"><a href="https://github.com/blog">Blog</a></li> <li class="login"><a href="https://github.com/login">Login</a></li> </ul> </div> </div> <div class="site clearfix"> <div class="container"> <div class="markdown-body standard"> <div class="center"><img alt="Unicorn is angry" height="205" src="https://a248.e.akamai.net/assets.github.com/images/error/angry_unicorn.png?1259026890" width="200" /></div> <h1>Page did not respond in a timely fashion.</h1> <p><a href="http://status.github.com/">Check our status site for alerts.</a></p> <p> Either you found a page that took too long to render or<br /> we're getting more requests right now than we can handle. </p> <ul> <li> You can try <a href="javascript: window.location.reload()">refreshing the page,</a> the problem may be temporary. </li> <li> <a href="http://github.s3.amazonaws.com/misc/down.html"> Learn how to deal with GitHub outages and other access problems. </a> </li> </ul></div> </div> <div class="context-overlay"></div> </div> <!-- footer --> <div id="footer" > <div class="upper_footer"> <div class="container clearfix"> <!--[if IE]><h4 id="blacktocat_ie">GitHub Links</h4><![endif]--> <![if !IE]><h4 id="blacktocat">GitHub Links</h4><![endif]> <ul class="footer_nav"> <h4>GitHub</h4> <li><a href="https://github.com/about">About</a></li> <li><a href="https://github.com/blog">Blog</a></li> <li><a href="https://github.com/features">Features</a></li> <li><a href="https://github.com/contact">Contact & Support</a></li> <li><a href="https://github.com/training">Training</a></li> <li><a href="http://enterprise.github.com/">GitHub Enterprise</a></li> <li><a href="http://status.github.com/">Site Status</a></li> </ul> <ul class="footer_nav"> <h4>Tools</h4> <li><a href="http://get.gaug.es/">Gauges: Analyze web traffic</a></li> <li><a href="http://speakerdeck.com/">Speaker Deck: Presentations</a></li> <li><a href="https://gist.github.com/">Gist: Code snippets</a></li> <li><a href="http://mac.github.com/">GitHub for Mac</a></li> <li><a href="http://mobile.github.com/">Issues for iPhone</a></li> <li><a href="http://jobs.github.com/">Job Board</a></li> </ul> <ul class="footer_nav"> <h4>Extras</h4> <li><a href="http://shop.github.com/">GitHub Shop</a></li> <li><a href="http://octodex.github.com/">The Octodex</a></li> </ul> <ul class="footer_nav"> <h4>Documentation</h4> <li><a href="http://help.github.com/">GitHub Help</a></li> <li><a href="http://developer.github.com/">Developer API</a></li> <li><a href="http://github.github.com/github-flavored-markdown/">GitHub Flavored Markdown</a></li> <li><a href="http://pages.github.com/">GitHub Pages</a></li> </ul> </div><!-- /.site --> </div><!-- /.upper_footer --><div class="lower_footer"> <div class="container clearfix"> <!--[if IE]><div id="legal_ie"><![endif]--> <![if !IE]><div id="legal"><![endif]> <ul> <li><a href="https://github.com/site/terms">Terms of Service</a></li> <li><a href="https://github.com/site/privacy">Privacy</a></li> <li><a href="https://github.com/security">Security</a></li> </ul> <p>© 2012 <span title="s from fe3.rs.github.com">GitHub</span> Inc. All rights reserved.</p> </div><!-- /#legal or /#legal_ie--> <div class="sponsor"> <a href="http://www.rackspace.com/" class="logo"> <img alt="Dedicated Server" height="36" src="https://a248.e.akamai.net/assets.github.com/images/modules/footer/rackspaces_logo.png?1329521041" width="38" /> </a> Powered by the <a href="http://www.rackspace.com/ ">Dedicated Servers</a> and<br/> <a href="http://www.rackspacecloud.com/">Cloud Computing</a> of Rackspace Hosting<span>®</span> </div> </div><!-- /.site --></div><!-- /.lower_footer --> </div><!-- /#footer --> <div id="keyboard_shortcuts_pane" class="instapaper_ignore readability-extra" style="display:none"> <h2>Keyboard Shortcuts <small><a href="#" class="js-see-all-keyboard-shortcuts">(see all)</a></small></h2> <div class="columns threecols"> <div class="column first"> <h3>Site wide shortcuts</h3> <dl class="keyboard-mappings"> <dt>s</dt> <dd>Focus site search</dd> </dl> <dl class="keyboard-mappings"> <dt>?</dt> <dd>Bring up this help dialog</dd> </dl> </div><!-- /.column.first --> <div class="column middle" style='display:none'> <h3>Commit list</h3> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>c <em>or</em> o <em>or</em> enter</dt> <dd>Open commit</dd> </dl> <dl class="keyboard-mappings"> <dt>y</dt> <dd>Expand URL to its canonical form</dd> </dl> </div><!-- /.column.first --> <div class="column last" style='display:none'> <h3>Pull request list</h3> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>o <em>or</em> enter</dt> <dd>Open issue</dd> </dl> </div><!-- /.columns.last --> </div><!-- /.columns.equacols --> <div style='display:none'> <div class="rule"></div> <h3>Issues</h3> <div class="columns threecols"> <div class="column first"> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>x</dt> <dd>Toggle selection</dd> </dl> <dl class="keyboard-mappings"> <dt>o <em>or</em> enter</dt> <dd>Open issue</dd> </dl> </div><!-- /.column.first --> <div class="column middle"> <dl class="keyboard-mappings"> <dt>I</dt> <dd>Mark selection as read</dd> </dl> <dl class="keyboard-mappings"> <dt>U</dt> <dd>Mark selection as unread</dd> </dl> <dl class="keyboard-mappings"> <dt>y</dt> <dd>Remove selection from view</dd> </dl> </div><!-- /.column.middle --> <div class="column last"> <dl class="keyboard-mappings"> <dt>c</dt> <dd>Create issue</dd> </dl> <dl class="keyboard-mappings"> <dt>l</dt> <dd>Create label</dd> </dl> <dl class="keyboard-mappings"> <dt>i</dt> <dd>Back to inbox</dd> </dl> <dl class="keyboard-mappings"> <dt>u</dt> <dd>Back to issues</dd> </dl> <dl class="keyboard-mappings"> <dt>/</dt> <dd>Focus issues search</dd> </dl> </div> </div> </div> <div style='display:none'> <div class="rule"></div> <h3>Issues Dashboard</h3> <div class="columns threecols"> <div class="column first"> <dl class="keyboard-mappings"> <dt>j</dt> <dd>Move selection down</dd> </dl> <dl class="keyboard-mappings"> <dt>k</dt> <dd>Move selection up</dd> </dl> <dl class="keyboard-mappings"> <dt>o <em>or</em> enter</dt> <dd>Open issue</dd> </dl> </div><!-- /.column.first --> </div> </div> <div style='display:none'> <div class="rule"></div> <h3>Network Graph</h3> <div class="columns equacols"> <div class="column first"> <dl class="keyboard-mappings"> <dt><span class="badmono">←</span> <em>or</em> h</dt> <dd>Scroll left</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="badmono">→</span> <em>or</em> l</dt> <dd>Scroll right</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="badmono">↑</span> <em>or</em> k</dt> <dd>Scroll up</dd> </dl> <dl class="keyboard-mappings"> <dt><span class="badmono">↓</span> <em>or</em> j</dt> <dd>Scroll down</dd> </dl> <dl class="keyboard-mappings"> <dt>t</dt> <dd>Toggle visibility of head labels</dd> </dl> </div><!-- /.column.first --> <div class="column last"> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">←</span> <em>or</em> shift h</dt> <dd>Scroll all the way left</dd> </dl> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">→</span> <em>or</em> shift l</dt> <dd>Scroll all the way right</dd> </dl> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">↑</span> <em>or</em> shift k</dt> <dd>Scroll all the way up</dd> </dl> <dl class="keyboard-mappings"> <dt>shift <span class="badmono">↓</span> <em>or</em> shift j</dt> <dd>Scroll all the way down</dd> </dl> </div><!-- /.column.last --> </div> </div> <div style='display:none'> <div class="rule"></div> <div class="columns threecols"> <div class="column first" style='display:none'> <h3>Source Code Browsing</h3> <dl class="keyboard-mappings"> <dt>t</dt> <dd>Activates the file finder</dd> </dl> <dl class="keyboard-mappings"> <dt>l</dt> <dd>Jump to line</dd> </dl> <dl class="keyboard-mappings"> <dt>w</dt> <dd>Switch branch/tag</dd> </dl> <dl class="keyboard-mappings"> <dt>y</dt> <dd>Expand URL to its canonical form</dd> </dl> </div> </div> </div></div> <div id="markdown-help" class="instapaper_ignore readability-extra"> <h2>Markdown Cheat Sheet</h2> <div class="cheatsheet-content"> <div class="mod"> <div class="col"> <h3>Format Text</h3> <p>Headers</p> <pre># This is an <h1> tag## This is an <h2> tag###### This is an <h6> tag</pre> <p>Text styles</p> <pre>*This text will be italic*_This will also be italic_**This text will be bold**__This will also be bold__*You **can** combine them*</pre> </div> <div class="col"> <h3>Lists</h3> <p>Unordered</p> <pre>* Item 1* Item 2 * Item 2a * Item 2b</pre> <p>Ordered</p> <pre>1. Item 12. Item 23. Item 3 * Item 3a * Item 3b</pre> </div> <div class="col"> <h3>Miscellaneous</h3> <p>Images</p> <pre>![GitHub Logo](/images/logo.png)Format: ![Alt Text](url)</pre> <p>Links</p> <pre>http://github.com/ - automatic![GitHub](http://github.com)</pre><p>Blockquotes</p> <pre>As Kanye West said:> We're living the future so> the present is our past.</pre> </div> </div> <div class="rule"></div> <h3>Code Examples in Markdown</h3> <div class="col"> <p>Syntax highlighting with <a href="http://github.github.com/github-flavored-markdown/" title="GitHub Flavored Markdown" target="_blank">GFM</a></p> <pre>```javascriptfunction fancyAlert(arg) { if(arg) { $.facebox({div:'#foo'}) }}```</pre> </div> <div class="col"> <p>Or, indent your code 4 spaces</p> <pre>Here is a Python code examplewithout syntax highlighting: def foo: if not bar: return true</pre> </div> <div class="col"> <p>Inline code for comments</p> <pre>I think you should use an`<addr>` element here instead.</pre> </div> </div> </div></div> <div class="ajax-error-message"> <p><span class="icon"></span> Something went wrong with that request. Please try again. <a href="javascript:;" class="ajax-error-dismiss">Dismiss</a></p> </div> <div id="logo-popup"> <h2>Looking for the GitHub logo?</h2> <ul> <li> <h4>GitHub Logo</h4> <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip"><img alt="Github_logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/github_logo.png?1306884374" /></a> <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip" class="minibutton btn-download download"><span><span class="icon"></span>Download</span></a> </li> <li> <h4>The Octocat</h4> <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip"><img alt="Octocat" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/octocat.png?1306884374" /></a> <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip" class="minibutton btn-download download"><span><span class="icon"></span>Download</span></a> </li> </ul> </div> </body></html>Die eigentliche “Arbeit” macht dann die folgende Klasse, darin sind die benötigten Methoden überschrieben und mit Leben gefüllt:<?php/** * @author Michael Kliewe * @copyright 2012 Michael Kliewe * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://www.phpgangsta.de/ */require_once dirname(__FILE__) . '/../PHPGangsta/PayPalIPN.php';class App_PayPalIPN extends PHPGangsta_PayPalIPN{ protected $_useSandbox = true; // set this to false if you want to run this in Paypal Live Environment protected function _checkEmail() { $validEmailAddresses = array( 'seller_1321807401_biz@tg-tg.de', 'paypal@phpgangsta.de', 'payment@myshop.de', ); // we check if the receiver email address we got from paypal is one of our email addresses. if (!in_array($this->_postData['receiver_email'], $validEmailAddresses)) { $this->_writeLog('Invalid receiver email address: ' . $this->_postData['receiver_email']); throw new Exception('Invalid receiver email address: ' . $this->_postData['receiver_email']); } $this->_writeLog('Valid receiver email address found: ' . $this->_postData['receiver_email']); } protected function _statusCompleted() { $this->_writeLog('Status completed, writing to database now'); // Here you can now set the status of the order in the database, send a mail to the customer // or whatever is needed in this situation. // You can use all variables from $this->_postData array. }}Das ist das einfache Beispiel, in einem vollständigen Script würde man wahrscheinlich auch noch _checkTxnId(), _checkAmount() und die weiteren _status*() Methoden überschreiben. Aber für einen ersten Test reicht dieses Beispiel.Bei Fragen und Verbesserungen würde ich mich freuen wenn ihr Kommentare hinterlasst, mich würde interessieren wie ihr das bisher gemacht habt falls ihr schonmal mit PayPal IPNs zu tun hattet. Welche Features fehlen noch? Keine ähnlichen Artikel.
Nginx: Konkurrenz für Apache und IIS
(Fri, 02 Mar 2012 16:50:03 GMT)  Vor kurzem hat der russische Webdesigner Igor Sysoev die Version 1.1.16 seines Webservers nginx veröffentlicht.Neben zahlreichen Bugfixes bringt das aktuelle Release auch einige neue Features mit. So gilt für simultane Subrequests nun ein höheres Limit von 200, außerdem wurde die „disable-symlinks“-Direktive um den Parameter „from“ erweitert. Weitere Änderungen können dem ausführlichen Changelog entnommen werden.Nginx ist ein modularer Webserver, Reverse Proxy und E-Mail-Proxy und wurde ursprünglich speziell auf die Bedürfnisse der großen russischen Suchmaschine Rambler zurechtgeschnitten. Aufgrund der hohen Leistung und Flexibilität wird der Server inzwischen allerdings auch bei anderen großen Services wie beispielsweise GitHub, Golem oder Wikimedia verwendet.Einer aktuellen Statistik der Firma Netcraft zufolge läuft nginx derzeit auf gut 22,2 Millionen aktiven Webseiten; damit hat das Open-Source-Projekt sogar Microsofts Internet Information Services (IIS) knapp übertroffen. Marktführer – und damit stärkster Konkurrent – ist nach wie vor der ebenfalls freie Apache Webserver, der jüngst in der Version 2.4 erschienen ist.Nginx 1.1.16 steht auf der Projektwebseite zum kostenlosen Download bereit.
PHP 5.4.0 released! Neue Funktionen
(Fri, 02 Mar 2012 01:05:05 GMT)  Soeben wurde PHP 5.4.0 released! Nach 8 Release Candidates ist nun die finale Version erschienen und kann auf php.net heruntergeladen werden. Ich habe 2 meiner größeren Applikationen bereits mit der neuen Version getestet (mit dem RC8, der gleich der finalen Version ist). Sobald DotDeb die neue Version released wird der Server upgedated.So, hier eine Übersicht der wichtigsten Änderungen:Das wohl größte Feature: Traits (auch “Horizontal Reuse” renannt). Hier im Blog gibt es auch schon einen sehr ausführlichen Artikel über Traits.<?class Base { public function sayHello() { echo 'Hello '; }}trait SayWorld { public function sayHello() { parent::sayHello(); echo 'World!'; }}class MyHelloWorld extends Base { use SayWorld;}$o = new MyHelloWorld();$o->sayHello();Weitere Details und Beispiele zu Traits gibt es in diesen Blogartikeln.Auf das nächste Feature habe ich schon einige Jahre gewartet, endlich kommt es: Array-Dereferenzierung!<?function autos () { return array('a' => 'audi', 'b' => 'bmw');}echo autos()['a'];Nun sind Methodenaufrufe direkt nach dem Constructor möglich, also ein Fluent Interface:echo (new Auto())->getName();Neuer Typehint “callable“, der Parameter muss also “irgendwie aufrufbar” sein, sprich ein Funktionsname, ein Array mit Klassennamen und statischem Methodennamen, oder ein Array mit Objekt und Methodennamen. Details siehe is_callable()<?function doSomething(callable $cb) { $cb();}Die Short Array Syntaxkommt! Ob ich sie mag weiß ich noch nicht so ganz, man spart sich einfach 5 Zeichen. Aber immerhin hat man dann in Javascript bzw. JSON die gleiche Syntax.<?$a = [1, 2, 3];$b = ['key1' => 'value1', 'key2' => 'value2'];Native Binärzahlen kommen (wer sie braucht)<?$x = 0b001110;echo $x;Mehr Flexibilität bei variablen Methodenaufrufen: Class::{expr}()<?class ClassA{ public function doSomething() { echo "something\n"; }}$method = 'doSomething';$classA = new ClassA();$classA->doSomething();$classA->$method();$classA->{'doSomething'}();ClassA::doSomething();ClassA::$method();ClassA::{'doSomething'}();$GLOBALS ist nun eine Just-In-Time (JIT) Variable. Andere würden es “lazy initialisation” nennen. Sie wird also erst initialisiert wenn sie das erste Mal benutzt wird, man gewinnt also eventuell etwas Performance wenn man es nicht nutzt.Die Performance des Silence-Operators wurde etwas verbessert:<?for ($i=0; $i<1000000; $i++) { $x = @file_get_contents('/etc/passwdff'); echo $x;}PHP 5.3.9real    0m4.134suser    0m3.244ssys    0m0.884sPHP 5.4 RC6real    0m3.050suser    0m2.176ssys    0m0.872sZugriff auf den Upload Progress ohne Extension. Details siehe Artikel bei Johannes oder im PHP Manual.E_ALL enthält nun E_STRICTEin kleiner eingebauter Webserver für Tests und Entwicklungsumgebungen. Ich hatte ja bereits hier im Blog darüber geschrieben.<?= ist nun immer verfügbar, auch wenn short_open_tag ausgeschaltet istWenn ein Array automatisch in einen String gecastet wird (“Array”) gibt es nun eine Notice“default_charset” php.ini Einstellung von ISO-8859-1 auf UTF-8 gesetztUnd noch einige weitere Performance- sowie Speicheroptimierungen und Bugfixes.Einige Dinge wurden nun auch endgültig entfernt:Bei break und continue kann nun nicht mehr eine Variable genutzt werden um die Anzahl der Schleifenabbrüche zu definieren.Die seit PHP 5.3 als DEPRECATED markierten Safe-Mode-Funktionen sowie alle php.ini Variablen wurden entfernt.Magic Quotes (magic_quotes_gpc) wurden entfernt!Endlich wurden register_globals und register_long_arrays aus der php.ini entfernt.Die Einstellung allow_call_time_pass_reference wurde entfernt.CHANGELOG + NEWS + Migrationshilfe von 5.3 nach 5.4Habe ich etwas wichtiges vergessen? Welche Änderung findet ihr am herausragendsten? Ähnliche Artikel:PHP 5.3 released!Der Klasse neue Kleider: Traits
Welche PHP Version setzt du ein?
(Wed, 29 Feb 2012 10:25:03 GMT)  Ich würde gern von euch wissen welche PHP Version ihr aktuell einsetzt. Vor allem geht es mir um eure Produktivserver, aber auch um eure Testumgebung bzw. Entwicklungsumgebung. Läuft dort genau die selbe Version? Die ganze Sache ist natürlich etwas komplizierter wenn man mehrere Projekte hat die auf verschiedenen Servern mit unterschiedlichen Versionen laufen, deshalb interessiert mich vor allem die am häufigsten verwendete Version. Ich würde gern unterscheiden zwischen “eigener Server” und “Hosting”, denn auf die verfügbaren Versionen beim Hosting hat man meistens keinen Einfluss und muss das nehmen was der Hoster bietet.Wahrscheinlich macht auch ein kurzer Kommentar Sinn warum ihr die entsprechende Version einsetzt, zum Beispiel könnte eine alte Applikation nicht mehr mit 5.3 funktionieren, und deshalb steckt ihr bei 5.2 fest. Note: There is a poll embedded within this post, please visit the site to participate in this post's poll. Note: There is a poll embedded within this post, please visit the site to participate in this post's poll. Ähnliche Artikel:Punycode, IDN: Welche Probleme es bei Umlaut-Domains in PHP gibtWelche PHP-Feeds habt ihr in eurem Reader?
Präsentationen der PHPBenelux Konferenz 2012
(Sun, 26 Feb 2012 11:30:04 GMT)  Am 27. und 28. Januar fand in Antwerpen die PHPBenelux 2012 statt. Einige Vorträge sind bereits bekannt aus dem Jahr 2011, die Konferenz ist gut dokumentiert, viel zu lesen und lernen!Freitag, 27.01.2012Zend Framework 2 Matthew Weier O’PhinneySymfony 2 Fabien PotencierMobile for PHP developers Ivo JanschHTML5 for PHP developers Mathias BynensHow To Stand On The Shoulders Of Giants Ian BarberSecurity audits as integral part of PHP application development Sijmen RuwhofLarge-Scale Data Processing with Hadoop and PHP David ZülkeMasterizing PHP Data Structure 102 Patrick AllaertHTTP is your architecture Kore NordmannPHAR, the PHP .exe format Helgi Þormar ÞorbjörnssonPHP and mongoDB Derick RethansMicro-frameworks: Why should you care? Fabien PotencierMagic Behind the Numbers – Software Metrics In Practice Sebastian MarekAn introduction to Phing the PHP build system Jeremy CoatesSamstag 28.01.2012Modular application architecture Kore NordmannAdding real-time to your apps with WebSockets Igor WiedlerRedis – Your advanced in-memory key-value store Jordi BoggianoEstimation or, “How to Dig you own Grave” Rowan MerewoodEnterprise Class Cloud for the Average Joe Craig KittermanThe state of DI in PHP Stephan HochdoerferVIM + *nix Toolchain == PHP IDE Matthew Weier O’PhinneyWriting testable code Tobias SchlittPHP Content Repository Specification Lukas Kahwe SmithWorking successfully outside the cube John MerticDoctrine 2: An Introduction Juozas KaziukėnasPHP traits, treat or threat? Nick BelhommeThe lust for knowledge and experience Marcel van BrakelPHP in the Dark Jeroen KeppensClient-side Javascript Unit Testing Tom Van HerrewegheTaking it to the next level David Coallier Ähnliche Artikel:Slides der PHPBenelux Conference 2011Präsentationen der International PHP Conference 2011 in MainzConfoo 2011, die Mega Konferenz
Apache Webserver 2.4: Bereit für die Cloud
(Wed, 22 Feb 2012 16:25:02 GMT)  Gut sechs Jahre nach dem letzten Major Release wurde jetzt die Version 2.4.1 des beliebten Webservers Apache HTTP Server freigegeben. Das aktuelle Release kommt mit einer ganzen Reihe neuer Features und ist optimiert für Cloud-Umgebungen.Neu ist unter anderem das Multi-Processing-Modul Event, das eine deutlich bessere Performance liefern soll, auch wenn viele inaktive Verbindungen gleichzeitig geöffnet sind - Apache versucht damit, an Webserver wie nginx aufzuschließen. Hinzu kommen viele weitere neue Module (z.B. CGI-Protikoll-Backends für mod_proxy) sowie Code- und Modul-Erweiterungen für definierbare Konfigurationsvariablen, geringere Speicherauslastung und erweiterte Proxyfähigkeiten.Darüber hinaus steht Administratoren nun eine webbasierte Schnittstelle zur Verfügung, mit deren Hilfe sie Apache-Cluster hinzufügen und konfigurieren können - textbasierte Konfiguration von Hand gehört damit der Vergangenheit an.Ursprünglich hätte die Version 2.4.0 bereits Ende des vergangenen Jahres veröffentlicht werden sollen, so Jim Jagielski, Präsident der Apache Software Foundation. Diese wurde jedoch aufgrund eines Windows-Konflikts zurückgehalten, der auch in der Version 2.4.1 noch besteht. In der nächsten Version 2.4.2 soll das Problem behoben sein. Jagielski rechnet für die Zukunft mit regelmäßigen Minor-Releases in einem etwa zweimonatlichen Rhythmus. Der Download findet sich neben ausführlichen Dokumentationen und Releasenotes auf der Produktwebsite.
Doppelte Array-Einträge entfernen
(Wed, 22 Feb 2012 10:25:03 GMT)  Vor kurzem hatte ich das kleine Problemchen dass in einem Array die Werte (Strings und Integer) mehrfach vorkamen, ich diese aber nicht gebrauchen konnte. Mit array_unique() kann man doppelte bzw. mehrfach vorkommende Werte auf ein Vorkommen reduzieren, aber es gibt keine direkte Methode um mehrfach vorkommende Werte ganz zu entfernen.Beispiel: Aus dem Array (1, 5, 8, ‘Michael’, 5, 4, 9, ‘Martin’, 18, 12, ‘Michael’, 4, 12) sollen die mehrfach vorkommenden Werte entfernt werden, sodass nur noch das Array (1, 8, 9, ‘Martin’, 18) übrig bleibt.Meine einfache und erste Lösung ist die folgende:function removeDuplicates($array) { $counts = array_count_values($array); foreach ($counts as $value => $counter) { if ($counter > 1) { unset($counts[$value]); } } return array_keys($counts);}Der Aufruf sieht dann wie folgt aus:$a = array(1, 5, 8, 'Michael', 5, 4, 9, 'Martin', 18, 12, 'Michael', 4, 12);var_dump(removeDuplicates($a));Habt ihr eine andere/bessere Funktion? Gerade bei sehr großen Arrays wäre es evtl. interessant schnellere Lösungen zu kennen, denn meine durchläuft das Array 3 Mal (array_count_values(), meine foreach Schleife und array_keys()), es müßte auch mit einem oder maximal 2 Schleifendurchläufen gehen…Edit:Mir ist gerade noch nach dem Schreiben des Artikels eine zweite Lösung eingefallen, die aber bei sehr großen Arrays genauso langsam sein dürfte und etwas schwerer zu durchschauen ist:function removeDuplicates($array) {return array_diff($array, array_diff_assoc($array, array_unique($array)));}Ähnliche Artikel:Kleine Aufgabe: Ein Array umbauenPer Index auf einen assoziativen Array zugreifenErgebnisse der Array-Umbau-Aufgabe
Java: Howto Kodierung mit BASE64
(Tue, 21 Feb 2012 21:00:08 GMT)  base64 KodierungTotal Bananne, aber dennoch oft gefragt, stelle ich euch heute die BASE64 Kodierung vor.Für die Übertragung von Binärdaten im Internet hat sich im Laufe der Zeit die so genannte Base64-Kodierung durchgesetzt. Man findet diese Art der Kodierung zum Beispiel bei E-Mail-Anhängen, Downloads oder SOAP-Nachrichten. Die im Request for Comments kurz RFC 1521 beschriebene Methode übersetzt drei Bytes also 24 Bits (1 Byte = 8 Bit;-) in vier Base64-kodierte Zeichen (4 Zeichen mit jeweils 6 repräsentativen Bits). Die Base64-Zeichen bestehen aus den Buchstaben des lateinischen Alphabets, den Ziffern 0 bis 9 sowie den Sonderzeichen “+”, “/” und “=”.Der Vorteil der BASE64 Kodierung ist ihr reduzierter Zeichensatz. Er ermöglicht es die Binärdaten korrekte und unverändert über mehrere Leitungen und Protokolle hinweg zu übertragen. Die, für die Übertragung ausgewählten Zeichen, sind außerdem so ausgewählt, dass sie in allen verbreiteten Zeichencode-Tabellen (ASCII, ANSI, UTF, etc.) an der gleichen Stelle vorkommen. Der Nachteil dieser Umformung ist jedoch, dass die Binärdaten um rund 33 % größer werden.  Die Umsetzung in JavaEs gibt verschiedene Möglichkeit einen String, Stream, etc in BASE64 zu kodieren und zu dekodieren. Zwei davon stelle ich hier vor:Zum einen gibt es die Klassen “BASE64Encoder” und “BASE64Decoder” von Sun Mircosystems selbstund zum anderen die Klasse “Base64″ der Apache Foundation (Commons).Generell sollte die Apache Commons-Variante verwendet werden, da diese im Gegensatz zur Sun-Variante JDK unabhängig und konstant ist. Die Apache Commons Codec-Lib können sie hier downloaden. String text = "AxxG Blog"; System.out.println("Dein Text: " + text); // Variante 1. SUN BASE64Encoder myEncoder = new BASE64Encoder(); String erg = myEncoder.encode(text.getBytes()); System.out.println("Der BASE64 String: " + erg); BASE64Decoder myDecoder = new BASE64Decoder(); String ursp = new String(myDecoder.decodeBuffer(erg)); System.out.println("Der Text aus dem BASE64: " + ursp); // Variante 2. Apache Commons erg = Base64.encode(text.getBytes()); System.out.println("Der BASE64 String: " + erg); ursp = new String(Base64.decode(erg)); System.out.println("Der Text aus dem BASE64: " + ursp); Die AusgabeDein Text: AxxG BlogDer BASE64 String: QXh4RyBCbG9nDer Text aus dem BASE64: AxxG BlogDer BASE64 String: QXh4RyBCbG9nDer Text aus dem BASE64: AxxG Blog Die Quellenhttp://www.informationsarchiv.net/lexikon/eintrag/822http://de.wikipedia.org/wiki/Base64http://openbook.galileodesign.de/javainsel7/javainsel_04_008.htm Email this to a friend? Share this on Google+ Share this on Facebook Tweet This! Add this to Google Bookmarks Subscribe to the comments for this post? Clip this to Evernote Pin this to Pinterest
Apache Flex: Adobe auch weiterhin involviert
(Fri, 17 Feb 2012 13:55:02 GMT)  Im Januar hatte Adobe sein Flash-Framework an Apache abgegeben, was natürlich Fragen über die Zukunft von Flex aufwarf und Spekulationen nährte. Nun hat Adobe ein Whitepaper zur eigenen Flex-Roadmap vorgestellt. „Adobe’s view of Flex and its commitments to Flex in the future” klärt die zukünftige Beteiligung von Adobe an Apache Flex und soll einige der Bedenken zerstreuen.So sieht Adobe die Zukunft von Flex auch weiterhin vor allem im Unternehmensbereich. Für die Weiterentwicklung will Adobe der Apache Software Foundation zwar ein eigens abgestelltes Team zur Seite stellen, die Ressourcen werden aber deutlich reduziert werden.Dennoch will Adobe zum Start von Apache Flex Core- und Spark-Komponenten aus dem Flex SDK zur Verfügung stellen, bis Ende des Jahres sollen zwei Compiler, das Test-Framework Mustella und womöglich sogar das Messaging-System BlazeDS folgen. Die Community und die User Groups sollen außerdem auch in Zukunft uneingeschränkt weiter unterstützt werden.Die kommenden Versionen von Adobes Flash Player und AIR sollen ausführlich gegen Flex 4.6 getestet werden und die nächsten Jahre rückwärtskompatibel bleiben; gesonderte Whitepapers zu den geplanten Roadmaps zu Flash Player und AIR sollen außerdem in absehbarer Zeit veröffentlicht werden. Flex ist ein Entwicklungsframework auf Basis der Flash-Plattform und dient in erster Linie der Erstellung von Rich Internet Applications.
Client-Zertifikate als sicherer Login-Ersatz?
(Sat, 11 Feb 2012 10:20:03 GMT)  Wer auf Sicherheit achtet und seinen Webseitenbesuchern etwas Privatsphäre spendieren möchte installiert ein SSL-Zertifikat auf dem eigenen Webserver. Damit ist es Besuchern möglich verschlüsselt mit dem Webserver zu kommunizieren und ein eventuell vorhandener Mithörer im offenen WLAN guckt dumm aus der Wäsche. Spätestens wenn es um Login-Daten oder andere persönliche Informationen geht sollte HTTPS eigentlich mittlerweile Standard sein, aber auch für normale Seiten lohnt es sich, denn bereits eine URL verrät einiges über eine Person, auch wenn die Seite eigentlich nichts geheimes enthält.Hier soll es nicht direkt um die Ausstattung des Webservers mit einem Serverzertifikat gehen. Ein Serverzertifikat ist dafür geeignet eine verschlüsselte Kommunikation ermöglichen und einem Besucher die Sicherheit geben dass er auf dem richtigen Server gelandet ist. Ein Client-Zertifikat hingegen dient zur Authentifizierung eines Besuchers. Wenn ein Besucher ein bestimmtes Zertifikat besitzt und das durch eine kleine Abfrage beweisen kann ist das gleichzusetzen mit einem Login via Username und Passwort. Doch Achtung: Auch ein Zertifikat auf dem PC eines Users kann von Trojanern und ähnlichem gestohlen werden, es ist nicht der Weisheit letzter Schluss. Lösungen die zusätzlich noch ein Hardwaregerät (wie Handy oder Token (Yubikey!)) benötigen sind eventuell zu bevorzugen. Außerdem kann die Verwendung problematisch sein wenn man sich beispielsweise zuhause einen Rechner teilt und keine getrennten Browser-Profile hat. Doch der Reihe nach.Basis für den Einsatz von Client-Zertifikaten ist eine HTTPS-Verschlüsselung. Zuerst müssen wir also sicherstellen dass unser Webserver unter dem Port 443 erreichbar ist und SSL spricht. Dazu generieren wir uns schnell ein selbst signiertes Zertifikat. Natürlich kann auch ein richtiges Zertifikat genutzt werden, dazu benötigt man nur den Certificate Signing Request (CSR) und schickt diesen zum entsprechenden Anbieter.openssl req -new > server.cert.csropenssl rsa -in privkey.pem -out server.cert.keyopenssl x509 -in server.cert.csr -out server.cert.crt  -req -signkey server.cert.key -days 365sudo mkdir /etc/apache2/sslsudo mv server.cert.* /etc/apache2/sslsudo a2enmod sslIm entsprechenden VHost des Webservers dann SSL aktivieren (hier am Beispiel des Apache):<VirtualHost *:443> ServerName phpgangstatest.de SSLEngine on SSLCertificateKeyFile /etc/apache2/ssl/server.cert.key SSLCertificateFile /etc/apache2/ssl/server.cert.crt ...</VirtualHost>Falls noch nicht vorhanden muss noch eine “Listen 443″ Zeile in die /etc/apache2/ports.conf eingetragen werden. Bei mir war das bereits der Fall.Nach einem Neustart des Apache ist die Seite per https:// erreichbar.sudo service apache2 restartNun haben wir die Vorbedingung erfüllt und können uns den Client-Zertifikaten widmen. Standardmäßig verlangt ein Webserver kein Client-Zertifikat, das müssen wir also ändern.Client-Zertifikate können natürlich von richtigen CAs signiert werden, in unserem Fall reicht aber ein selbst signiertes Zertifikat unserer eigenen CA. Dazu kann man sich ein eigenes Root-CA-Zertifikat erstellen das nur dafür gedacht ist Client-Zertifikate zu signieren, oder man tut dies mit dem bereits existierenden Server-Zertifikat das der Webserver ja bereits hat und dem er vertraut. Wenn man das ganze nicht nur zum Test macht sollte man darauf achten welche Angaben man macht. Dazu sollte auch die Datei /etc/ssl/openssl.cnf bearbeitet werden, dann kann man sich das unten stehende “demoCA” ersparen wenn man das “dir” richtig einstellt etc.Wir generieren nun also unser erstes Client-Zertifikat:mkdir -p demoCAtouch demoCA/index.txtecho 1001 > demoCA/serialgenrsa -des3 -out michael.keyopenssl req -new -key michael.key -out michael.reqopenssl ca -cert /etc/apache2/ssl/server.cert.crt -keyfile /etc/apache2/ssl/server.cert.key -out michael.crt -in michael.reqWir haben damit ein Schlüsselpaar für den Benutzer michael erzeugt und es mit dem CA-Zertifikat (hier gleich dem selbst erstellten Server-Zertifikat) signiert.Damit die meisten Browser das Client-Zertifikat installieren können wandeln wir es noch um in das PKCS#12 Format:openssl pkcs12 -export -inkey michael.key -name "Michael" -in michael.crt -certfile /etc/apache2/ssl/server.cert.crt -out michael.p12Bei diesem Export werden wir nach einem Export-Passwort gefragt. Dieses Export-Passwort geben wir dann dem entsprechenden Benutzer zusammen mit der .p12 Datei.Nun kommt als nächstes der Server. Man kann das Vorhandensein eines Client-Zertifikats optional oder verpflichtend fordern. Je nachdem welche Applikation man schützen möchte gibt man den Benutzern noch die Möglichkeit sich via Username+Passwort einzuloggen, oder eben nicht.<VirtualHost *:443> ... SSLCACertificateFile /etc/apache2/ssl/server.cert.crt SSLVerifyClient require SSLVerifyDepth 1 SSLOptions +StdEnvVars</VirtualHost>Die Client-Zertifikate müssen also abgeleitet sein vom SSLCACertificateFile. SSLVerifyClient kann alternativ auch auf “optional” gestellt werden. Die Einstellung SSLVerifyDepth definiert die maximal Tiefe der Zertifikatshierarchie. In diesem Fall muss das Client-Zertifikat also direkt vom CA-Zertifikat signiert sein. Zu den SSLOptions kann zusätzlich noch +ExportCertData hinzugefügt werden, dann wird das komplette Client Zertifikat auch in PHP zur Verfügung stehen. So erhält PHP also Zugriff auf die Werte des Client Zertifikats und kann daran später erkennen wer gerade die Webseite betreten hat.Nach einem Neustart des Webservers fragt der Webserver nach einem Client-Zertifikat. Der Firefox beispielsweise präsentiert im require-Fall diese unschöne Fehlermeldung falls man kein passendes Client-Zertifikat installiert hat:Ein Fehler ist während einer Verbindung mit phpgangstatest.de aufgetreten.Die SSL-Gegenstelle konnte keinen akzeptablen Satz an Sicherheitsparametern aushandeln.(Fehlercode: ssl_error_handshake_failure_alert)Im Chrome ist die Fehlermeldung etwas verständlicher:SSL-VerbindungsfehlerEs kann keine sichere Verbindung zum Server hergestellt werden. Möglicherweise liegt einProblem mit dem Server vor oder es ist ein Client-Authentifizierungszertifikat erforderlich,das Sie nicht haben.Fehler 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL-ProtokollfehlerDamit wir auf die Seite zugreifen können importieren wir nun also das Client-Zertifikat michael.p12 . Im Firefox geht das unterEinstellungen -> Erweitert ->Verschlüsselung ->Zertifikate anzeigen -> Ihre Zertifikate -> Importieren…Dort wählt man die michael.p12 Datei aus, gibt das Export-Passwort ein, drückt 2 Mal OK und wird beim erneuten Betreten der Seite gefragt ob man das Client-Zertifikat verwenden möchte:In Chrome importiert man das Client-Zertifikat unterOptionen -> Details -> HTTPS/SSL -> Zertifikate verwaltenIn PHP können wir nun auf die Client-Zertifikats-Informationen zugreifen indem wir in das $_SERVER Array reinschauen, darin sind nun etliche Einträge enthalten die uns verraten wer sich gerade angemeldet hat:array(78) { ["HTTPS"]=> string(2) "on" ["SSL_TLS_SNI"]=> string(17) "phpgangstatest.de" ["SSL_SERVER_S_DN_C"]=> string(2) "DE" ["SSL_SERVER_S_DN_ST"]=> string(3) "NRW" ["SSL_SERVER_S_DN_L"]=> string(5) "Oelde" ["SSL_SERVER_S_DN_O"]=> string(7) "private" ["SSL_SERVER_S_DN_CN"]=> string(14) "Michael Kliewe" ["SSL_SERVER_S_DN_Email"]=> string(18) "XXXX@phpgangsta.de" ["SSL_SERVER_I_DN_C"]=> string(2) "DE" ["SSL_SERVER_I_DN_ST"]=> string(3) "NRW" ["SSL_SERVER_I_DN_L"]=> string(5) "Oelde" ["SSL_SERVER_I_DN_O"]=> string(7) "private" ["SSL_SERVER_I_DN_CN"]=> string(14) "Michael Kliewe" ["SSL_SERVER_I_DN_Email"]=> string(18) "XXXX@phpgangsta.de" ["SSL_CLIENT_S_DN_C"]=> string(2) "DE" ["SSL_CLIENT_S_DN_ST"]=> string(3) "NRW" ["SSL_CLIENT_S_DN_O"]=> string(7) "private" ["SSL_CLIENT_S_DN_CN"]=> string(14) "Michael Kliewe" ["SSL_CLIENT_I_DN_C"]=> string(2) "DE" ["SSL_CLIENT_I_DN_ST"]=> string(3) "NRW" ["SSL_CLIENT_I_DN_L"]=> string(5) "Oelde" ["SSL_CLIENT_I_DN_O"]=> string(7) "private" ["SSL_CLIENT_I_DN_CN"]=> string(14) "Michael Kliewe" ["SSL_CLIENT_I_DN_Email"]=> string(18) "XXXX@phpgangsta.de" ["SSL_VERSION_INTERFACE"]=> string(14) "mod_ssl/2.2.20" ["SSL_VERSION_LIBRARY"]=> string(14) "OpenSSL/1.0.0e" ["SSL_PROTOCOL"]=> string(5) "TLSv1" ["SSL_SECURE_RENEG"]=> string(4) "true" ["SSL_COMPRESS_METHOD"]=> string(4) "NULL" ["SSL_CIPHER"]=> string(23) "DHE-RSA-CAMELLIA256-SHA" ["SSL_CIPHER_EXPORT"]=> string(5) "false" ["SSL_CIPHER_USEKEYSIZE"]=> string(3) "256" ["SSL_CIPHER_ALGKEYSIZE"]=> string(3) "256" ["SSL_CLIENT_VERIFY"]=> string(7) "SUCCESS" ["SSL_CLIENT_M_VERSION"]=> string(1) "3" ["SSL_CLIENT_M_SERIAL"]=> string(4) "1001" ["SSL_CLIENT_V_START"]=> string(24) "Feb 9 22:37:08 2012 GMT" ["SSL_CLIENT_V_END"]=> string(24) "Feb 8 22:37:08 2013 GMT" ["SSL_CLIENT_V_REMAIN"]=> string(3) "365" ["SSL_CLIENT_S_DN"]=> string(40) "/C=DE/ST=NRW/O=private/CN=Michael Kliewe" ["SSL_CLIENT_I_DN"]=> string(80) "/C=DE/ST=NRW/L=Oelde/O=private/CN=Michael Kliewe/emailAddress=XXXX@phpgangsta.de" ["SSL_CLIENT_A_KEY"]=> string(13) "rsaEncryption" ["SSL_CLIENT_A_SIG"]=> string(21) "sha1WithRSAEncryption" ["SSL_SERVER_M_VERSION"]=> string(1) "1" ["SSL_SERVER_M_SERIAL"]=> string(16) "A123F59C7E1E781B" ["SSL_SERVER_V_START"]=> string(24) "Feb 9 21:25:30 2012 GMT" ["SSL_SERVER_V_END"]=> string(24) "Feb 8 21:25:30 2013 GMT" ["SSL_SERVER_S_DN"]=> string(80) "/C=DE/ST=NRW/L=Oelde/O=private/CN=Michael Kliewe/emailAddress=XXXX@phpgangsta.de" ["SSL_SERVER_I_DN"]=> string(80) "/C=DE/ST=NRW/L=Oelde/O=private/CN=Michael Kliewe/emailAddress=XXXX@phpgangsta.de" ["SSL_SERVER_A_KEY"]=> string(13) "rsaEncryption" ["SSL_SERVER_A_SIG"]=> string(21) "sha1WithRSAEncryption" ["SSL_SESSION_ID"]=> string(64) "212FA56ECCB33E54CBC3F07DEEA0071696AC96DFFD02EF8BF6271E9545D8149C" ...}Wichtig dabei ist dass SSL_CLIENT_VERIFY auf SUCCESS steht, sollte der Wert “NONE” sein ist ein Benutzer ohne Zertifikat vorbeigekommen. Um das Zertifikat wiederzuerkennen eignen sich die SSL_CLIENT_M_SERIAL zusammen mit SSL_CLIENT_I_DN wohl am besten, diese sind einzigartig innerhalb der CA. Natürlich sollte man auch nicht vergessen zu prüfen ob das Zertifikat noch gültig ist. Dazu prüft man ob SSL_CLIENT_V_REMAIN > 0 ist, bzw. SSL_CLIENT_V_START und SSL_CLIENT_V_END .Man sollte in der PHP-Applikation eine Datenbanktabelle haben in der die Zertifikatsinformationen zum entsprechenden Benutzer zugeordnet sind. Der Einfachheit halber kann man auch noch SSL_CLIENT_S_DN_CN und SSL_CLIENT_S_DN_Email speichern, dann ist es eventuell bequemer die Zertifikate zu administrieren.Übrigens ist es auch möglich .htaccess mit den Client-Zertifikaten zu kombinieren.Weitere Informationen zu diesem spannenden Thema:http://cweiske.de/tagebuch/ssl-client-certificates.htm http://www.noatun.net/docs/ssl_client.html#7 http://www.vanemery.com/Linux/Apache/apache-SSL.htmlNginx: http://blog.nategood.com/client-side-certificate-authentication-in-ngi Ähnliche Artikel:Client-IP Problem bei Reverse-Proxy-BetriebPDT 2.1 unter Windows mit Subclipse SVN Client
CodeAnywhere jetzt auch für Honeycomb
(Fri, 10 Feb 2012 18:40:03 GMT)  Programmieren on the go - klar, mit dem Laptop ist das kein Problem, aber wer hat den schon immer dabei? Was, wenn man außer seinem Tablet oder Smartphone keine Hardware bei sich trägt? Für diesen Fall gibt es zum Beispiel Codeanywhere: der mobile Editor unterstützt die Sprachen HTML, PHP, CSS, JavaScript und XML und bringt auch einen eigenen Browser und FTP-Client mit.So kann man tatsächlich von überall aus programmieren und auf seine Server (SFTP, FTP und Dropbox) und Dateien zugreifen - und das ohne zusätzliche Installationen, man muss sich lediglich unter seinem Benutzernamen anmelden.Optimal arbeitet es sich mit der mobilen Version natürlich in Kombination mit der Desktop-Variante von Codeanywhere. Lässt man dort eine Datei geöffnet und meldet sich dann von unterwegs mit seinem Handy oder Tablet bei Codeanywhere an, ist die Datei auch hier geöffnet und kann sofort weiter bearbeitet werden. Die Desktop-Version unterstützt Syntax-Highlighting und Code Folding, was in der mobilen Version fehlt - diese bietet aber immerhin eine Undo-Redo- sowie eine Suchen-Einsetzen-Funktion.Codeanywhere gibt es für iPhone, iPad und Android, seit wenigen Tagen außerdem für Honeycomb. Die mobilen Clients sind kostenlos erhältlich, zusätzliche Features wie unbegrenzte gleichzeitig geöffnete Dateien oder eine größere monatliche Bandbreite lassen sich dazukaufen.
CodeAnywhere jetzt auch für Honeycomb
(Fri, 10 Feb 2012 18:40:02 GMT)  Programmieren on the go - klar, mit dem Laptop ist das kein Problem, aber wer hat den schon immer dabei? Was, wenn man außer seinem Tablet oder Smartphone keine Hardware bei sich trägt? Für diesen Fall gibt es zum Beispiel Codeanywhere: der mobile Editor unterstützt die Sprachen HTML, PHP, CSS, JavaScript und XML und bringt auch einen eigenen Browser und FTP-Client mit.So kann man tatsächlich von überall aus programmieren und auf seine Server (SFTP, FTP und Dropbox) und Dateien zugreifen - und das ohne zusätzliche Installationen, man muss sich lediglich unter seinem Benutzernamen anmelden.Optimal arbeitet es sich mit der mobilen Version natürlich in Kombination mit der Desktop-Variante von Codeanywhere. Lässt man dort eine Datei geöffnet und meldet sich dann von unterwegs mit seinem Handy oder Tablet bei Codeanywhere an, ist die Datei auch hier geöffnet und kann sofort weiter bearbeitet werden. Die Desktop-Version unterstützt Syntax-Highlighting und Code Folding, was in der mobilen Version fehlt - diese bietet aber immerhin eine Undo-Redo- sowie eine Suchen-Einsetzen-Funktion.Codeanywhere gibt es für iPhone, iPad und Android, seit wenigen Tagen außerdem fürHoneycomb. Die mobilen Clients sind kostenlos erhältlich, zusätzliche Features wie unbegrenzte gleichzeitig geöffnete Dateien oder eine größere monatliche Bandbreite lassen sich dazukaufen.
Youtube-API intelligent nutzen
(Thu, 09 Feb 2012 18:10:02 GMT)  In Ausgabe 03/2012 erfahren Sie unter anderem, wie Sie Youtube-Videos via JSON und PHP auf Ihrer Homepage einbinden können. Martin Goldmanns Artikel erklärt ausführlich und anhand vieler Beispiele, auch welche Weisen sich das realisieren lässt.Zusätzlich finden sich hier nützliche Links und Listings – auf die Sie selbstverständlich auch online Zugriff haben.Um das Datenaustauschformat JSON geht es auch in Christian Bleskes Artikel, hier allerdings mit einem Schwerpunkt auf Webentwicklung unter Android. Weitere Themenschwerpunkte dieser Ausgabe sind die neuen Web-Standards HTML5 und DOM5, die in einem ausführlichen Grundlagenartikel von Ralph Steyer vorgestellt werden, das MVC-Framework CakePHP und das Open-Source-CMS CitusCMS.Weitere Themen sind:- Webentwicklung mit Java- CSS-Framework Blueprint- XML mit PHP- Selenium Framework- Bibliothek PHPWord… und vieles mehr. Die aktuelle Ausgabe der web-developer ist ab heute am Kiosk erhältlich.
Komodo-IDE 7.0 unterstützt Node.js und CoffeScript
(Fri, 03 Feb 2012 14:40:03 GMT)  Nach fast eineinhalb Jahren erscheint nun die Version 7.0 der Entwicklungsumgebung Komodo. Komodo ist eine plattformübergreifende IDE für Web- und seit neuestem auch Cloud-Entwicklung und ermöglicht das Arbeiten mit Python, PHP, Perl, Ruby und JavaScript. In der aktuellen Version neu dazugekommen sind Sprach- und Framework-Unterstützung für Node.js, CoffeScript, LESS und SCSS sowie die Integration von ActiveStates PaaS Stackato.Durch das Einbinden neuer Engine-Versionen wurde die Performance von Komodo 7.0 gegenüber der Vorgängerversion abermals verbessert, außerdem ist es nun möglich, mehrere Workstations miteinander zu synchronisieren. Darüber hinaus können jetzt auch mehrere Personen gleichzeitig in Echtzeit an einem Projekt arbeiten.Weitere Verbesserungen gab es in den Bereichen Navigation, Suche, Syntaxprüfung und Auto-Complete. Eine vollständige Feature-Liste sowie eine auf 21 Tage beschränkte Demo-Version finden sich auf der Herstellerseite. Die Vollversion kostet derzeit 245 $, das Update ist für 118 $ zu haben.
Komodo-IDE 7.0 unterstützt Node.js und CoffeScript
(Fri, 03 Feb 2012 13:55:02 GMT)  Nach fast eineinhalb Jahren erscheint nun die Version 7.0 der Entwicklungsumgebung Komodo. Komodo ist eine plattformübergreifende IDE für Web- und seit neuestem auch Cloud-Entwicklung und ermöglicht das Arbeiten mit Python, PHP, Perl, Ruby und JavaScript. In der aktuellen Version neu dazugekommen sind Sprach- und Framework-Unterstützung für Node.js, CoffeScript, LESS und SCSS sowie die Integration von ActiveStates PaaS Stackato.Durch das Einbinden neuer Engine-Versionen wurde die Performance von Komodo 7.0 gegenüber der Vorgängerversion abermals verbessert, außerdem ist es nun möglich, mehrere Workstations miteinander zu synchronisieren. Darüber hinaus können jetzt auch mehrere Personen gleichzeitig in Echtzeit an einem Projekt arbeiten.Weitere Verbesserungen gab es in den Bereichen Navigation, Suche, Syntaxprüfung und Auto-Complete. Eine vollständige Feature-Liste sowie eine auf 21 Tage beschränkte Demo-Version finden sich auf der Herstellerseite. Die Vollversion kostet derzeit 245 $, das Update ist für 118 $ zu haben.
Couchbase PHP Library 1.0 kommuniziert mit Serverclustern
(Fri, 27 Jan 2012 10:30:03 GMT)  Die NoSQL-Datenbank Couchbase liegt jetzt in Version 1.8 vor. Das Entwicklungsteam hat sich aber nicht nur die Datenbank vorgenommen, sondern veröffentlicht auch ein brandneues PHP-SDK, das Entwicklern den Einsatz eines Proxys wie Moxi für Cluster-Umgebungen erspart. Das bisherige SDK war nur imstande, sich mit einem einzelnen Endpunkt auszutauschen. Daher war es nötig, einen Proxy-Server für die Kommunikation zwischen PHP und Couchbase beziehungsweise deren Vorgänger Membase zwischenzuschalten, sobald ganze Server-Cluster ins Spiel kamen. Dieser Weg ging aber auf Kosten der Performance und war mit zusätzlichem Verwaltungsaufwand verbunden.Im von Grund auf neu geschriebenen SDK steckt daher eine neue Bibliothek für PHP, die selbst Cluster erkennt und anspricht. Die PHP Library 1.0 nimmt damit Moxi aus der Gleichung und gewährt Entwicklern einen direkten und schnellen Datenbankzugriff auf den Cluster. Gleichzeitig löst die Bibliothek das eindimensionale Kommunikationsproblem. Ansonsten haben die Couchbase-Entwickler darauf geachtet, dass die APIs des PHP-SDKs kompatibel zu bestehenden Anwendungen bleiben. (jp)Info:Couchbase
PGP und GPG: Wie arbeite ich mit asynchroner Verschlüsselung
(Thu, 26 Jan 2012 10:25:03 GMT)  PGP und GPG sollte den meisten ein Begriff sein, auch wenn es selbst noch nie oder nur sehr selten eingesetzt wird. Die wenigsten nutzen es wahrscheinlich täglich und beispielsweise mit allen E-Mail-Adressen.Einen Rundumschlag bezüglich asynchroner Verschlüsselung und PGP/GPG mit PHP habe ich für das PHP Magazin geschrieben. In der Ausgabe 1.12 erkläre ich darin das Grundkonzept von asynchroner Verschlüsselung und der Nutzung von GPG aus PHP heraus, zum Beispiel zum Versenden von signierten und/oder verschlüsselten E-Mails. Seit vorgestern gibt es den Artikel auch kostenlos Online. Ich zeige wie man Dateien und Texte verschlüsseln, signieren, entschlüsseln und Signaturen prüfen kann. Am Ende verweise ich auf eine kleine GPG-Test-Webseite, auf der man etwas mit GPG rumspielen kann. Außerdem habe ich einen kleinen GPG-E-Mail-Bot gebastelt der auf eingehende E-Mails reagiert und mit dem man seine E-Mail-Verschlüsselung testen kann. Alle weiteren Details befinden sich auf der angesprochenen Webseite.Auch sehr interessante Informationen bietet der Artikel von Oliver Sperke hier im Blog zu GPG und speziell der Nutzung mit Javascript und PHP, auch unbedingt lesenswert!Ich würde mich freuen wenn ihr die Webseite und den E-Mail-Bot ausprobiert, und natürlich auch wenn ihr das PHP Magazin kauft und Feedback gebt. Mich würde zum Beispiel auch interessieren ob ihr aktuell E-Mails die ihr mit PHP verschickt, signiert und/oder verschlüsselt verschickt, und wenn nein, warum nicht? Oder nutzt ihr statt PGP eventuell S/MIME zur E-Mail-Verschlüsselung? Keine ähnlichen Artikel.
Filtern und Bereinigen von HTML mit jsoup
(Wed, 25 Jan 2012 17:50:02 GMT)  Immer wieder stößt man auf den Anwendungsfall, dass Benutzereingaben, die HTML enthalten dürfen, bereinigt werden müssen. Besonders hinsichtlich dem Schutz vor XSS Angriffen führt kein Weg an einem solchen Schritt vorbei. In PHP gibt es hierfür mehrere Bibliotheken wie HTML Purifier Bibliothek oder htmLawed.Besteht die Anforderung, dass bestimmte HTML Eingaben erlaubt sein sollen, so ist der Einsatz einer Bibliothek an dieser Stelle unbedingt notwendig. Es gibt zahlreiche Angriffsmöglichkeiten, mit der ein Filter zurecht kommen muss und so kann man nur davon abraten selbst etwas zu bauen (z.b. Textersetzung mittels Regulären Ausdrücken).Für Java habe ich eine sehr einfache und gute Bibliothek gefunden, die ich an dieser Stelle nur weiterempfehlen kann. jsoup heißt die schlanke Library, die unter der MIT Lizenz zur Verfügung steht und auch für die Manipulation von HTML Dokumenten zahlreiche Funktionen mit bringt. Zudem wird HTML5 und auch invalides HTML unterstützt.Die Funktionsweise ist schnell erklärt. Will man jegliches HTML entfernen, so geschieht das mit folgenden AufrufString userText = "Beispieltext <script>alert('xyz'); </script> Beispieltext";String cleanText = Jsoup.clean(userText, Whitelist.none());// cleanText == "Beispieltext Beispieltext"Wie man sieht, dient ein Whitelist Objekt zur Definition, was erlaubt ist und was nicht. So kann man genau festlegen, welche Tags und welche Attribute zugelassen werden und welche nicht. Folgendes Beispiel erlaubt nur <i> und <b> Tags:String userText = "<a href='beispiel.de'>xyz</a> Bla <i>Blub</i> Bl<b>ub</b>";String[] allowedTags = {"i","b"};Whitelist whitelist = new Whitelist();whitelist.addTags(allowedTags);String cleanText = Jsoup.clean(userText, whitelist);// cleanText == "xyz Bla <i>Blub</i> Bl<b>ub</b>"Die Dokumentation und das JAR File sind auf der Webseite von jsoup zu finden:jsoup Website
Neuer frischer Gutschein für PHPStorm 3.0!
(Tue, 24 Jan 2012 09:20:03 GMT)  Ich habe gute Nachrichten von JetBrains: Nach dem erfolgreichen Release der Version 3.0 im Dezember letzten Jahres habe ich wieder Gutscheine über 20% Preisnachlass beim Kauf einer Personal License von PHPStorm bekommen und kann diese an euch rausgeben!Wie bereits beim letzten Mal gilt dies nicht für Verlängerungen sondern nur für Neubestellungen der Personal License. Der Gutschein ist gültig bis zum 23. Februar 2012.Tja, was gibt es noch groß zu sagen, jeder PHP Entwickler sollte sich diese IDE anschauen und 30 Tage ausprobieren falls er sie noch nicht kennt, es ist aktuell meiner Meinung nach (und der vieler anderer) die beste IDE für PHP, auf der Produktseite von PHPStorm bei JetBrains kann man sich ausführlich informieren über die Features und Neuigkeiten, in Demo-Videos wird eindrucksvoll gezeigt was die Software drauf hat, und im Blog stehen Neuigkeiten, werden wichtige Features wie das Remote Debugging erklärt etc.Also erst ausprobieren, dann kaufen! Ähnliche Artikel:20% Gutschein für PHPStorm verlängert!PHPStorm 20% günstiger, hier bei mirEilmeldung: PHPStorm satte 50% günstiger!
Zend Server 5.6 jetzt auch für Mac-Entwickler
(Mon, 23 Jan 2012 08:45:02 GMT)  Die neue Mac-Unterstützung in Zend Server 5.6 sorgt dafür, dass Entwicklungsteams auch direkt auf dem Mac Webanwendungen mit PHP entwickeln können. Der Web Application Server von Zend lässt sich nativ besonders performant auf der Apple-Plattform einsetzen. Umwege über eine Virtualisierungssoftware sind nicht mehr notwendig. Die PHP-Anwendungen stellen Entwickler dann auf einem Linux- oder Windows-System bereit.Im Zend Server 5.6 ist ein kompletter PHP-Stack sowie das Zend Framework enthalten. Der Server bietet darüber hinaus fortschrittliche Überwachungsfunktionen für Webanwendungen. Mit Code Tracing ist es einfach, Fehler anhand er detailreichen Ausführungsaufzeichnung nachzuvollziehen und zu beheben. Mac-Entwickler profitieren auch von Performance-Optimierungen wie Job Queue, Code-Beschleunigung, Daten-Caching und Seiten-Caching. Job Queue ist in Zend Server 5.6 übrigens ebenfalls fehlertolerant. Entwickler greifen mit dem Zend Server auf die Zend Developer Cloud zu, bauen mit Zend Server Cluster Manager eine verteilte Umgebung mit mehreren Zend-Server-Instanzen auf und nutzen über die PHP/Java Bridge nahtlos spezielle Anwendungen und Schnittstellen in Java. (jp)Info:Zend
Video-Tutorial: Einfacher AJAX-Request mit Hilfe von jQuery
(Thu, 19 Jan 2012 09:20:03 GMT)  Für das CMS fokus nehme ich zur Zeit einige technische Tutorials auf. Per Screencasting-Software zeige ich beispielsweise, wie man Templates erstellt oder mit den komplexen Dokumentenklassen umgehen sollte. Da mir diese Arbeit sehr viel Spaß bereit – aber auch enorme Übung erfordert – habe ich mir gedacht, warum nicht auch mal ein Video-Tutorial für diesen Blog erstellen?Gesagt getan: Für den Anfang habe ich mir ein Thema vorgenommen, welches hier im Blog bereits in einer eigenen Artikelserie behandelt wurde. Die Rede ist von einem AJAX-Request, der mit Hilfe von jQuery umgesetzt werden soll.Ein passendes Beispiel war ebenfalls schnell gefunden. Jede Sekunde soll der Server angefunkt werden und die Uhrzeit zurückgeliefert werden. Somit ist mit nicht einmal 30 Zeilen Quellcode eine digitale Uhr entstanden.Das Video findet ihr hier im Blog und direkt bei Youtube. Ich empfehle euch jedoch dringend, als Auflösung 1080p zu wählen, da das Bild ansonsten doch sehr verpixelt ist.Eure Meinung ist gefragtIch bin sehr auf eure Meinung gespannt. Gefällt euch der Ansatz mit den Video-Tutorials oder bevorzugt ihr klar die schriftliche Form? Was könnte man besser machen? Was ist in Ordnung? Themen-Wünsche für das nächste Video?Im Video verwendete DateienGerne greife ich den Vorschlag von Matthias aus den Kommentaren auf und zeige hier nochmal direkt den Quellcode der verwendeten Dateien. Macht natürlich Sinn und werde ich auch in Zukunft so handhaben! :)index.htmltime.phpjquery.jsDownload
Den USB Mail Melder per Webseite steuern
(Mon, 16 Jan 2012 09:20:02 GMT)  Mein erstes richtiges USB-Gadget ist der USB Mail Melder (USB Mail Notifier). Um damit etwas zu experimentieren habe ich ein kleines Webinterface gebaut mit dem man in nahezu Echtzeit die Farben verändern kann. Doch erstmal ein Bild:Diese kleine Box kann man in allen Farben aufleuchten lassen. Normalerweise gibt es dazu Treiber und Software auf einer CD mitgeliefert. In der Software kann man via POP3 bzw. Webmail auf E-Mail-Accounts zugreifen, und bei neuen E-Mails aufleuchten lassen.Ich dachte mir dann, wie wäre es das Gadget aus PHP heraus zu steuern? Leider mußte ich schnell feststellen dass man mit PHP nicht so leicht auf die USB-Schnittstelle zugreifen kann. Ich habe es jedenfalls nicht hinbekommen.Aber Dank der hervorragenden Arbeit von Christoph gibt es auch ein kleines Kommandozeilen-Tool mit dem man das Gadget erleuchten kann. Mein Webfrontend sieht dann so aus:Hier noch ein kleines Video:Der Benutzer kann aktuell per Slider die drei Grundfarben einstellen, es X mal pulsieren lassen oder es ausschalten. Man könnte natürlich auch einen kleinen Daemon bauen der per IMAP/POP3 einige E-Mail-Accounts prüft, oder einen RSS Feed abfragt, oder oder oder. Alles was man mit PHP machen kann und bei dem man ein visuelles Feedback benötigt.Den Code gibt es bei Github. Es ist nichts besonderes, hauptsächlich HTML, CSS und Javascript, sowie einige wenige Zeilen um auf das Kommandozeilentool von Christoph zuzugreifen.Ich weiß nicht ob es unter Linux geht direkt auf die USB-Schnittstelle zuzugreifen, ich denke da an so etwas ähnliches hier:<?php$string = "Hallo Schnittstelle!\n";$pointer = fopen("/dev/ttyS0","w");fwrite ($pointer, $string);fclose($pointer);Für Windows und die COM1 Schnittstelle habe ich diesen Schnipsel gefunden, ob das so oder so ähnlich auch für ein USB Gerät funktioniert habe ich noch nicht herausfinden können:<?php`mode COM1: BAUD=4800 PARITY=N data=8 stop=1 xon=off`;$fp = fopen ("COM1:", "w+");if (!$fp) { echo "can't open port: COM1";} else { fputs ($fp, $string );}Oder aber mittels der W32API auf eine DLL zugreifen und darin eine Funktion aufrufen. Habe ich aber auch noch nie gemacht.Wer das also schonmal gemacht hat oder eine Idee hat wie man auf eine Zwischensoftware verzichten kann, möge sich melden!Danke nochmals an getDigital für das Gadget! Ähnliche Artikel:Bug in PHP 5.3.0′s mail() FunktionDie mail.de GmbH sucht Javascript-EntwicklerWebseite testen mit Browser Sandboxen
Programmieren in der Cloud - Vier Online-IDEs im Vergleich
(Fri, 13 Jan 2012 16:05:02 GMT)  Die Welt spricht Internet, und so war es nur eine Frage der Zeit, bis auch Integrierte Entwicklungsumgebungen (IDE) per Software as a Service angeboten werden.Die Vorteile einer browsergestützten Entwicklungsumgebung gehen vor allem in Richtung Ortsunabhängigkeit: Der Anwender ist plattformunabhängig  und kann von jedem Rechner aus auf seine Dateien zugreifen und daran arbeiten, und das ganz ohne Installation und in der ihm vertrauten IDE.Die Unterstützung weiterer Cloud-Dienste, wie Datenaustausch oder sogar die gleichzeitige Zusammenarbeit mehrerer Personen am gleichen Code, macht Online-IDEs besonders attraktiv.Vier browsergestützte Entwicklungsumgebungen wollen wir hier kurz vorstellen und dabei auch auf die wichtigsten Feature und Unterschiede eingehen.Bespin, Skywriter, Cloud 9 und AceEine der ersten Online-IDEs, dabei aber noch kaum mehr als ein einfacher Java-basierter Code-Editor, war Mozillas Bespin. Im Jahr  2009 wurde er vorgestellt und seither beständig weiterentwickelt. Umbenannt in Skywriter verschmolz der Editor 2010 schließlich mit den  niederländischen Open-Source-Projekten Cloud 9 und Ace von Ajax.org. Er wird seither von beiden Entwicklerteams gemeinsam weitergeführt.Schwerpunkt von Ace und Cloud 9 ist die JavaScript-Programmierung. Die Programme unterstützen aber auch HTML, CSS, PHP und Coffeescript mit Syntax-Highlighting und anderen hilfreichen Funktionen. Weitere Sprachen sind geplant.Features sind unter anderem Realtime Code Analysis, GitHub-Integration sowie die Möglichkeit, den erstellten Code auszuführen, zu testen und zu debuggen. Er basiert auf HTML5.Link:  http://ace.ajax.org/           http://c9.io/Coderun StudioDas ursprünglich israelische Coderun Studio läuft in so ziemlich jedem Browser. Unterstützt werden neben Javascript, PHP, CSS und HTML auch C#, ASP .NET, WPF und Silverlight. Weitere Features sind Syntax Coloring, Code Completion und Code Sharing via Hyperlinks. Für viele Funktionen, die über den reinen Editor hinausgehen, muss man allerdings in die kostenpflichtige Vollversion wechseln. Link:   http://www.coderun.com/ Kodingen Kodingen erfreut sich in Entwicklerkreisen hoher Beliebtheit, bietet es doch sozusagen das Beste beider Welten, nämlich einen schlanken, Bespin-basierten Kern bei einer trotzdem opulenten grafischen Benutzeroberfläche, vergleichbar mit Coderun Studio.Entwickelt wurde Kodingen Ende 2008 von den türkischstämmigen Brüdern Devrim und Sinan Yasar aus dem Bedürfnis heraus, eine Website zu erstellen und gleichzeitig PHP zu erlernen. Enttäuscht von der Umständlichkeit und mangelnden Flexibilität der Offline-Tools, sowie von den Kosten für manche notwendigen Dienste, beschlossen die beiden Brüder, selbst eine Open-Source-Alternative zu entwickeln. Kodingen ist für den Anwender gratis und ermöglicht die Einbindung eigener FTP-Konten sowie das Arbeiten mit bekannten web-basierten Editoren wie Ace oder Bespin. Unterstützte Sprachen sind unter anderem PHP, Perl, Python, Ruby On Rails, Django und noch einige weitere.Link:   https://kodingen.com/Code AnywhereCode Anywhere ist der Geheimtipp unter den Online-IDEs. Es ist die bisher die einzige browserbasierte Entwicklungsumgebung ist, die sogar unter iOS und Android - und damit auch auf den gängigsten Smartphones und Tablets - läuft. Die dazu benötigte App ist übrigens kostenlos.Auch hier sind (S)FTP-Client und Dropbox bereits integriert, ebenfalls werden alle gängigen Web-Formate (JavaScript, HTML, CSS, PHP, XML) unterstützt.Features wie Syntax Highlighting und Code Folding dürfen natürlich nicht fehlen, und das bei einer trotzdem einladenden und übersichtlichen Benutzeroberfläche.Link: https://codeanywhere.net/Fazit:Wir glauben: mehr mobil geht nicht. In Sachen Plattformunabhängigkeit schießt Code Anywhere tatsächlich den Vogel ab und ist bisher auch die einzige Online-IDE mit Unterstützung für iPhone, iPad und Co. - das ist wahrlich cloud coding at its best.
PHP-Entwickler beherrschen mehrere andere Sprachen
(Thu, 12 Jan 2012 07:25:02 GMT)  Zend hat im November 2011 insgesamt 3335 Entwickler nach den Technologietrends und Karrierechancen für 2012 befragt und stellt die Ergebnisse jetzt vor. Dabei stellt sich heraus, dass die PHP-Entwickler im Durchschnitt ein bis zwei weitere Sprachen beherrschen und in ihrer täglichen Arbeit benötigen. Javascript liegt mit großem Abstand vorn: 82 Prozent programmieren regelmäßig auch mit Javascript. Mit Java arbeiten 24 Prozent der PHP-Experten. Andere Sprachen schaffen es auf Platz 3 mit 21 Prozent. Danach folgen C/C++ mit 17 Prozent und C# mit 15 Prozent.66 Prozent der Entwickler beschäftigen sich in diesem Jahr mit mobilen Apps. 48 Prozent rechnen damit, APIs zu entwickeln, und 45 Prozent widmen sich der Integration von Social Media. Cloud-Anwendungen wollen 41 Prozent der Befragten entwickeln. Für 40 Prozent stehen große Datenanwendungen und für 35 Prozent Migrations-Projete im Vordergrund. Aus Karrieresicht halten 75 Prozent die Entwicklung von Oberflächen der nächsten Generation für entscheidend, gefolgt von mobiler Entwicklung mit 67 Prozent und Cloud-basierter Programmierung mit 46 Prozent. Die Ergebnisse der Umfrage stehen als PDF zum Download bereit. (jp)Info: Zend
PHP 5.3.9 verbessert Stabilität und Sicherheit
(Wed, 11 Jan 2012 11:00:02 GMT)  Während parallel schon die nächste Generation reift – von PHP 5.4 liegt inzwischen der fünfte Release Candidate vor – erhält auch PHP 5.3 noch einmal Zuwendung. Der Verbesserung der Stabilität gilt das Hauptaugenmerk von PHP 5.3.9. Gleich mehrere Änderungen gab es beim PHP-FPM-SAPI-Modul, bei DateTime, Fileinfo und bei der MySQLi-Erweiterung. Vor allem haben sich unter die mehr als 90 Bugfixes auch sicherheitsrelevante Änderungen gemischt. Durch einen Integer-Overflow beim Parsen von invaliden Exif-Headern kam es zu Problemen, die ein Patch in PHP 5.3.9 ausbügelt. Eine neue Direktive namens max_input_vars kommt hinzu, die Angriffe ausgelöst durch Hash-Kollisionen verhindert. Mehrere potenzielle Speicherlecks haben die PHP-Entwickler ausgebessert. Die vollständige Liste der Änderungen ist im Changelog nachzulesen. (jp)Info: PHP
phpMyAdmin 3.5 erhält Drizzle-Unterstützung
(Mon, 09 Jan 2012 10:00:03 GMT)  Die Entwicklung der neuen Version hat gerade erst begonnen. Momentan liegt phpMyAdmin 3.5 in einer Alpha-Version vor. Die Entwickler tüfteln an komfortablen Optionen für die Arbeit mit der Datenbank. Die PHP-Software erhält mehr Ajax-Funktionen, eine kompaktere Navigationsleiste und eine überarbeitete Server-Statusseite mit Server-Monitoring.In phpMyAdmin 3.5 gesellt sich zu MySQL auch die Unterstützung für den Ableger Drizzle hinzu, eine Datenbank, die auf Cloud Computing ausgelegt ist. Durch die OpenGIS-Unterstützung kann das Datenbanktool auch mit Geospatialdaten umgehen. (jp)Info: phpMyAdmin
Linkpool Nummer 27 + Adventskalenderartikel 10.12. – 24.12.
(Mon, 09 Jan 2012 09:20:02 GMT)  Heute wieder eine lange Liste mit Artikeln die es zu Lesen gilt, hauptsächlich gefüllt mit Artikeln aus den Adventskalendern 2011. Artikel vor dem 09.12. befinden sich im ersten Adventskalender-Übersichts-Artikel.Info über ein 3 Jahre altes RFC für PHP für eine neue Syntax für Getter und Setter:http://bigwhoop.ch/artikel/119/2011-12-05/properties-neue-get-set-syntax-fr-php10 Gründe nicht Test-Driven-Development (TDD) zu machen (oder auch nicht):http://assafstone.blogspot.com/2011/12/10-reasons-to-avoid-test-driven.htmlInteressante Graphiken zur Versionsverbreitung von Browsern und Plugins:http://www.netmagazine.com/features/developers-guide-browser-adoption-ratesInterne Informationen wie Datentypen in PHP aussehen: ZVAL und so weiter:http://nikic.github.com/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.htmlZusammenfassung Adventskalender 2011 von Mayflower:09.12. 10 good reasons why to learn a css meta language like sass or less10.12. Lösungen für Debugging von Mobile Web Apps11.12.: Migrate to HTML5!12.12. Javascript Metriken13.12. Profiling mit xhprof14.12. Backbone VS Knockout VS JavaScriptMVC15.12. Using custom annotations in PHP16.12. Eine Einführung in Behavior Driven Development17.12. Zend Framework (1) vs. Symfony218.12. Cloud2Go Services for your web development20.12. JSHint – das bessere JSLint?21.12. Agile Developer Skills (ADS)22.12. Zend Framework und BackboneJs23.12. Verpacktes in PHP24.12. PHP and the Lean StartupZusammenfassung PHP Advent 2011:10.12. Better Object-Oriented Arrays11.12. Out with the Old12.12. Bake Cookies Like a Chef13.12 Don’t Forget the Front14.12. Nightmare Before (Last) Christmas15.12. Cross-Origin Ajax with CORS16.12. Cracks in the Foundation17.12. PHP for All the Things18.12. Simplifying Commerce for Small Business19.12. Egomaniacal and Scalable Apps20.12. Code for the Users, Not for the Spec21.12. Social-Driven Development22.12. Keep the Front in the Front23.12. Look Ma! No Passwords!24.12. Facilitating Development Environment ConsistencyZusammenfassung Webkrauts CSS Adventskalender 2011:11.12. schema.org: Sieht so das Web 3.0 aus?12.12. Der aktuelle Stand der Dinge im Mobile Web Development13.12. Serverseitiges JavaScript mit node.js14.12. Webworking unter Linux15.12. Schnelltest zur Barrierefreiheit16.12. CodeKit – Der Alleskönner unter den Tools für Frontendentwickler17.12. Zwei, die zusammengehören: SEO und Informationsarchitektur (Teil 1)18.12. Zwei, die zusammengehören: SEO und Informationsarchitektur (Teil 2)19.12. CSS3 PIE | Dekoratives mit und ohne CSS320.12. CSS 3 im Praxistest: Transition21.12. Ein Blick durch den Viewport22.12. Dreimal CSS4 zum Mitnehmen23.12. Bauen wie die Ameisen24.12. Vorschau auf einen Relaunch Ähnliche Artikel:Adventskalenderartikel 01.12. – 10.12.Linkpool Nummer 20Linkpool Nummer 23
Template-Engine Twig 1.5 wird komfortabler
(Thu, 05 Jan 2012 08:10:03 GMT)  Die Entwicklung der Smarty-Alternative für PHP schreitet schnell voran. Einen Monat nach Version 1.4 steht schon Twig 1.5 in den Startlöchern. Dieses Release ist auf Komfort ausgerichtet: Der viel genutzte Filter nl2br ist jetzt Teil des Twig-Cores. Entwickler stellen das Datumsformat in Twig 1.5 global um, statt das Format jedes mal erneut anzugeben. Ein debug-Tag lässt sich in Twig-Ausdrücken einsetzen. Im Twig-Core kommt eine dump-Funktion hinzu, mit der sich die Templates schnell debuggen lassen. In Twig 1.5 entfallen die Beschränkungen für Hash-Keys, die jetzt auch Namen und Ausdrücke umfassen können. Fehlermeldungen sind noch aussagekräftiger und hilfreicher, denn sie schlagen bei einer unbekannten Funktion, einem falschen Tag, Test oder Filter die beste bekannte Alternative vor. Dynamische Funktionen, String-Interpolation sowie ein do-Tag, ein flush-Tag und eine random-Funktion kommen in Version 1.5 hinzu. Twig wird vom Entwickler des Symfony-Frameworks Fabien Potencier vorangetrieben und als Open Source unter der BSD-Lizenz herausgegeben. (jp)Info: Twig
phpMyFAQ 2.7.2 verbessert den PDF-Export
(Mon, 02 Jan 2012 10:45:02 GMT)  phpMyFAQ ist eine populäre Webanwendung, um eine Online-Hilfe im Frage-Antwort-Stil aufzubauen. Das aktuelle Release 2.7.2 hat ein verbessertes Installationsskript an Bord, das MySQL-Usern die Einrichtung der Software erleichtert. Auch die Möglichkeit zum PDF-Export haben sich die Entwickler vorgenommen. Die PDF-Ausgabe der Inhalte gelingt dadurch einfacher. Bei dieser Gelegenheit wurde die mitgelieferte TCPDF-Bibliothek auf die Version 5.9.136 aktualisiert. Die Plugin jQuery Date Picker hat ebenfalls ein Update erhalten. Das Projektteam erweitert das FAQ-System noch um mehrere überarbeitete Übersetzungen und hat Fehler im FAQ-System bereinigt. Der Support für phpMyFAQ 2.6 wird mit diesem Release eingestellt. Anwender sollten auf den aktuellen Entwicklungszweig 2.7 umsteigen. phpMyFAQ wird als Open Source unter der Mozilla-Lizenz angeboten. (jp)Info: phpMyFAQ
HashDoS Angriff legt (unter anderem) PHP lahm
(Thu, 29 Dec 2011 02:00:03 GMT)  Ich bin leider die letzten 2 Tage nur wenige Stunden dazu gekommen die Live-Streams vom 28. Chaos Communication Congress (28C3) zu schauen, aber bzgl. PHP ist heute Nachmittag ein interessanter Talk gehalten worden mit dem Thema Effective Denial of Service attacks against web application platforms dem ich hier einen kurzen Artikel widmen werde.Es geht darum wie PHP (und die anderen anfälligen Sprachen auch) Hash-Tabellen erstellen und verwalten. Die hier interessante Hash-Tabelle ist das $_POST Array, das man von außen füllen kann, und das anfällig ist wenn man nur genügend “passende” Datensätze reinfüllt. Der Algorithmus der die Hash-Tabelle befüllt wird nämlich langsamer sobald Kollisionen der Keys auftreten. Schickt man also beispielsweise 300KB POST-Daten an ein PHP-Script ist eine schnelle CPU damit ca. 30 Sekunden unter Volllast. Bei 8MB (dem Standard-Maximum für POST-Daten in der php.ini) wären es immerhin schon 5 Stunden, die die CPU benötigt um die Hash-Table zu füllen. Man kann also mit einer relativ kleinen DSL-Leitung einigen Schaden anrichten. Mit einer Gigabit-Leitung kann man so 10.000 CPU-Kerne dauerhaft beschäftigen.Etwas Abhilfe schaffen da die Einstellungen max_input_time und max_execution_time, die je nach Distribution 30 Sekunden, 60 Sekunden bzw. nicht beschränkt sind. Man müßte also mehrere kleine Anfragen schicken und kann nicht die 8MB ausnutzen. mit ca. 500KB kann man einen CPU-Kern dann etwa eine Minute beschäftigen.Das Problem ist wohl seit 2003 bekannt, Perl hat es damals behoben indem in die Generierung des Hash-Index auch Zufall mit einfließt, und nicht nur der Key die Hash-Position bestimmt. Neben PHP sind übrigens auch Java, Apache Tomcat, Apache Geronimo, Jetty, Oracle Glassfish, ASP.NET, Python, Plone, CRuby 1.8, JRuby, Rubinius und v8 (Node.JS) betroffen (Details zu betroffenen und gefixten Versionen).Abhilfe schafft beispielsweise die PHP-Extension Suhosin, mit der die Anzahl an POST-Variablen beschränkt werden kann (Standard ist 200). Seit 3 Wochen gibt es auch einen Patch für PHP der eine neue php.ini Variable max_input_vars (Standard 1000) einführt, dieser Patch wird enthalten sein in PHP >=5.3.9 und >=5.4.0 RC4Ein sehr hilfreicher Artikel bei cryptanalysis.eu erklärt noch einige Details. Natürlich empfiehlt es sich auch das aufgezeichnete Video des Talks zu schauen. Aktuell ist es ein PreRelease, das finale Video wird wahrscheinlich erst morgen oder übermorgen erscheinen nehme ich an.Aktuell werden wohl noch keine großflächigen Angriffe beobachtet, aber wer auf der sicheren Seite sein will installiert sich Suhosin falls nicht eh schon geschehen. Aber Achtung, einige Restriktionen sind zu streng und könnten die Benutzung der Applikation beeinflussen die auf hohe Werte einiger Einstellungen angewiesen ist, also bitte vorher testen. Oder noch etwas gedulden und bald auf PHP 5.3.9 bzw. PHP 5.4.0 updaten.EDIT: php.net ist langsam bzw. zeitweise nicht erreichbar…EDIT: Der torrent zum offiziellen Release des Videos.EDIT: Demo-Webseite incl. Quelltext Ähnliche Artikel:PDT 2.1 unter Windows mit Subclipse SVN Client
Neue Komponenten in Zend Framework 2.0 Beta 2
(Fri, 23 Dec 2011 10:00:03 GMT)  Entwickler dürfen das kommende Zend Framework 2.0 mit frisch erweiterten Komponenten in der aktuellen Betaversion 2 testen. Der Hersteller hat sich auf drei Bereiche konzentriert: MVC, Mail und Cache. Die Cache-Komponente wurde von Grund auf neu geschrieben. Die API bietet Storage-Adapter, Adapter-Plugins für die Implementierung von Cache-Speicher und Funktionen wie Serialisierung, Aufräumen und Optimierung. Eine neue Pattern-API vereinfacht den Umgang mit method, class, object und output caching. Die Mail-Komponente erhält neue Adress-, Header- und Transport-Funktionen und wartet mit einer überarbeiteten Storage API auf, deren Klassen und Schnittstellen umorganisiert wurden. Die Änderungen am MVC-System legen viele Funktionen des alten Managers in die Hände von Event Listenern. Schließlich ist das Zend Framework 2.0 in Beta 2 noch über 100 Bugs ärmer geworden. (jp)Info: Zend Framework
$_GET in Codeigniter nutzen
(Thu, 22 Dec 2011 16:50:04 GMT)  Ganz kurz: Bei Codeigniter auf URL-Parameter mit $_GET zugreifen:parse_str(substr($_SERVER['REQUEST_URI'],strpos($_SERVER['REQUEST_URI'],'?')+1,strlen($_SERVER['REQUEST_URI'])-strpos($_SERVER['REQUEST_URI'],'?')),$_GET);Dann kann auch $_GET benutzt werden
High Performance: Caching (reloaded) mit PHP
(Mon, 19 Dec 2011 09:20:12 GMT)  Gastartikel von Oliver Sperke.Ich bin 35 Jahre alt und seit 10 Jahren selbständiger Webentwickler. Mein Fokus liegt dabei auf der Erstellung, Beratung und Optimierung in den Bereichen High Performance, Usability und Sicherheit in den gängigsten Internetsprachen: PHP, HTML, Javascript und CSS.Nach langem Arbeiten an einem Projekt fängt der ambitionierte Entwickler an, zu testen, wie sich seine dynamische Internetseite unter Last verhält. Da ja jeder von uns von Millionen Besuchern träumt, will man natürlich auch wissen, wie sich Millionen von Besucher anfühlen und ob unser „kleines Kunstwerk“ davon genau so begeistert wäre wie wir. Dynamische Webseiten sind toll, allerdings hat der gemeine Internetserver ein großes Problem damit. Die Erzeugung ist meist sehr aufwendig. Daten müssen aus Datenbanken geholt werden, Berechnungen wollen berechnet werden und Blogeinträge müssen wie Blogeinträge aussehen.Seit Jahren hat sich eine simple Technik etabliert, die diese gequälten Webserver entlastet. Jeder fortgeschrittene Entwickler kennt und liebt sie, weil sie so schön einfach und universal einsetzbar ist: *trommelwirbel* Das Caching *tusch*. Da aber Caching an sich ein uralter Hut ist, will ich Euch zeigen, wie Ihr evtl. Eure Performance mit minimalen Änderungen mehr als verdoppeln könnt.Am Anfang war der BenchmarkNehmen wir als Beispiel eine ganz normale WordPress Installation mit dem üblichem Inhalt. WordPress ist umfangreich, es ist komfortabel, es ist leicht verständlich und es ist langsam. Da aber in den wenigstens Blogs sekündlich neue Beiträge und/oder Kommentare geschrieben werden, dafür aber häufige Aufrufe nicht unüblich sind, drängt sich uns hier das Caching geradezu auf. Natürlich gibt es einige gute Plugins dafür, die die verschiedenen Möglichkeiten des Cachings wunderbar abdecken. Aber um die soll es heute zur Abwechslung einmal nicht gehen. Ich will Euch ja nicht mit den „ollen Kamellen“ langweilen.Um die Geschwindigkeit zu testen brauchen wir natürlich Hilfe in Form eines wunderbaren Programm Namens Apachebench. Dieses ist ein sehr einfach gehaltenes, aber mächtiges Kommandozeilenprogramm. Es macht im Prinzip nichts anderes als eine vorgegebene Seite immer wieder und wieder abzurufen. Dabei merkt es sich Start und Endzeitpunkt und berechnet daraus die Geschwindigkeit, mit der unsere Anfragen beantwortet wurden. Da wir immer noch mit dynamischen Daten arbeiten, starten wir einen ersten vorsichtigen Test. Wir rufen die index.php unserer WordPress Installation zunächst 1000 Mal (-n1000) auf mit je 4 parallelen Zugriffen (-c4). Ich habe 4 gewählt, weil mein Testsystem vier Prozessorkerne hat. So ist ständig jeder Prozessorkern beschäftigt. Die gesamten Daten des Testsystems findet Ihr am Ende des Artikels. Ich gebe bei der Ausgabe von Apachebench immer nur die wichtigen Daten an. Die gesamte Ausgabe ist natürlich umfangreicher.ab -n1000 -c4 http://phpgangsta.x-blogs.org/Server Software: CherokeeServer Hostname: phpgangsta.x-blogs.orgServer Port: 80Document Path: /Document Length: 18612 bytesConcurrency Level: 4Time taken for tests: 16.623 secondsComplete requests: 1000Failed requests: 0Write errors: 0Total transferred: 18990000 bytesHTML transferred: 18612000 bytesRequests per second: 60.16 [#/sec] (mean)Time per request: 66.490 [ms] (mean)Time per request: 16.623 [ms] (mean, across all concurrent requests)Transfer rate: 1115.65 [Kbytes/sec] receivedWas soll man da sagen? Glückwunsch, es ist langsam!Machen wir es schnellerWie es schon zu erwarten war, kommen wir mit unserem Standard WordPress nicht weit. Neben der lausigen Geschwindigkeit von 60 Zugriffen pro Sekunde waren während des gesamten Tests auch alle Prozessorkerne bis zum Anschlag ausgelastet. So macht also Bloggen für Millionen Leser keinen Spaß. Einfachste Lösungmöglichkeit – wir besorgen uns eines der o. g. Plugins, doch da lernen wir ja nichts draus, richtig? Wir wollen selber cachen und ausserdem können wir das bestimmt auch viel besser.Als persistenten Speicher nehme ich APC. Dieses Zusatzmodul ist auf vielen PHP Webservern schon installiert, denn die Hauptaufgabe von APC ist es, PHP Code zu kompiliert und diesen im Arbeitsspeicher zu halten. So werden unsere PHP Scripte dramatisch beschleunigt. Alternativ funktionieren natürlich auch Memcache, alle Datenbanken oder einfache Dateien, in denen wir unsere Daten ablegen. Jede Variante hat seine Vor- und Nachteile. Memcache ist immer dann interessant, wenn man Daten auf mehrere Server verteilen muss, genau so wie Datenbanken, die aber überdimensioniert sind und einen hohen Overhead erzeugen. Dateien funktionieren auch ohne zusätzliche Installationen, sind aber recht langsam. APC ist von den genannten die schnellste Methode.Da wir hier kein WordPress-Tutorial, sondern ein Performancetutorial machen, tun wir genau das, was man niemals tun sollte. Wir schreiben der Einfachheit halber in die Kerndateien von WordPress, in diesem Fall die index.php. Diese drängt sich geradezu auf, beschleunigt zu werden. Meine Modifizierung ist sehr einfach und stellt quasi ein Modell eines sehr sehr einfachen Caching dar. Keine Funktion, keine Klassen, Caching pur. Für die Praxis ist es damit natürlich nur eingeschränkt tauglich, denn es berücksichtigt ja in keinster Weise Änderungen durch neuen Beiträge oder Kommentare und unterscheidet auch nicht, ob ein Benutzer eingeloggt ist oder nicht. Das ganze System müsste um diese Abhängigkeiten erweitert werden. Trotzdem eignet es sich aber als Basis für Eure eigenen Experimente.// CacheID// Der Cache wird neu erstellt durch Änderung der vorstehenden Variable$cacheid = 'cache' . md5($_SERVER['REQUEST_URI']);// Sind Daten vorhanden?if(apc_exists($cacheid) != false){ // dann hole sie und zeige Sie auf der Seite und beende den Vorgang $output = apc_fetch($cacheid); echo $output; exit;}// Wir benötigen einen Ausgabepufferob_start();/** Loads the WordPress Environment and Template */require('./wp-blog-header.php');// Wir fangen die Ausgabe ab ...$output = ob_get_contents();// ... und vertrauen diese APC anapc_store($cacheid, $output, 300);Wiederholen wir den Test von oben. Die Performance sollte sich jetzt wesentlich verbessert haben. Die Daten werden einmal erzeugt und dann in den gemeinsamen Speicher von APC abgelegt. Weitere Aufrufe geben nur noch den Inhaltes des Caches wieder. Testen wir also noch einmal. Ab hier erhöhe ich die Anzahl der Abfragen (-n) auf 100.000, weil damit aussagekräftigere Werte entstehen.ab -n100000 -c4 http://phpgangsta.x-blogs.org/Concurrency Level: 4Time taken for tests: 19.911 secondsComplete requests: 100000Requests per second: 5022.40 [#/sec] (mean)Time per request: 0.796 [ms] (mean)Time per request: 0.199 [ms] (mean, across all concurrent requests)Okay, klarer Fall von Makro-Optimierung!Machen wir es noch schnellerBis hier hin dürften die meisten von uns schon einmal gekommen sein. Wir haben also die Geschwindigkeit unseres kleinen Blogs mit einfachsten Mitteln um den Faktor ~80 beschleunigt und könnten also Feierabend machen. Tun wir aber nicht, denn ein anderes großes Problem haben wir nämlich noch gar nicht bedacht. Eine Seite schnell zu generieren heißt nicht, dass sie auch schnell bei unserem Besucher ankommt. Dazu kommen noch mehr Faktoren. Eine der wichtigsten ist die Komprimierung des Textes vor der Ausgabe.Wie man im ersten Test schon sah, ist unsere Startseite ungefähr 18 kb groß. Über GPRS oder unser gutes altes Kabelmodem wäre diese Seite satte 3 bis 4 Sekunden unterwegs. Das ist definitiv so lang, dass ein Benutzer genervt wegschalten könnte. Wenn wir Millionen Besucher haben möchten, dürfen wir aber auf dem Weg niemanden verlieren. Text-, bzw. html-Dateien sind gerade zu dafür erfunden worden, vor dem Versand komprimiert zu werden. Die Trafficersparnis beträgt meistens über 80%, da sich wiederholende Zeichen leicht zusammengepackt lassen. In PHP ist diese Funktion durch den ob_gzhandler auch sehr einfach umzusetzen. Also zurück zu unserer index.php und eine Zeile hinzufügen.// Sind Daten vorhanden?if(apc_exists($cacheid) != false){ // Seiten vor der Ausgabe packen ob_start("ob_gzhandler"); // dann hole sie und zeige Sie auf der Seite und beende den Vorgang $output = apc_fetch($cacheid); echo $output; exit;}Da Apachebench in der Standardkonfiguration dem Webserver nicht mitteilt, dass es auch mit der gepackten Version arbeiten kann, müssen wir unsere Befehlszeile etwas modifizieren. Mit dem Parameter -H können wir der abgefragten Internetseite zusätzliche Kopfdaten schicken und damit sagen, dass wir auch GZip sprechen und daher doch lieber das kleine Päckchen nehmen. Damit imitieren wir das Verhalten von richtigen Browsern. Diese sagen einer Internetseite mit jedem Aufruf, „Hallo, ich kann auch GZip“. Der ob_gzhandler erkennt dies und packt unsere Daten im Ausgabepuffer vor dem Versand. Die Größe der Datei sinkt – die Übertragung wird schneller. Doch was ist mit unserer Serverperformance?ab -n 100000 -c 4 -H "Accept-Encoding: GZip" http://phpgangsta.x-blogs.org/Document Length: 4844 bytesConcurrency Level: 4Time taken for tests: 41.272 secondsRequests per second: 2422.94 [#/sec] (mean)Time per request: 1.651 [ms] (mean)Time per request: 0.413 [ms] (mean, across all concurrent requests)Ein Testergebnis mit 8 Buchstaben: Resultat Verdammt! Positiv fällt uns natürlich sofort auf, dass die Seite auf ca. ein Viertel geschrumpft ist. Statt 3 bis 4 Sekunden würde ein Besucher mit kleiner Leitung nur noch weniger als 1 Sekunde warten. Eine wesentliche Verbesserung und kaum eine Chance, den Browser zu schliessen. Nur unsere wunderbare Performance hat sich dabei halbiert. Nichts mehr mit Millionen Besuchern, Frauen (oder Männern), Geld, Ruhm und noch mehr Frauen (oder Männern).Die Reihenfolge macht’sPreisfrage: Was würde passieren, wenn wir nicht die Ausgabe speichern und dann komprimieren, sondern erst komprimieren und dann speichern? An die Editoren! Zunächst einmal brauchen wir eine Funktion, die uns aus einer Textdatei eine GZip Datei macht. Mit der Funktion gzencode ist dies problemlos möglich. Unsere Datei muss dazu nur minimal geändert werden. Wir komprimieren die Ausgabe vor der Speicherung auf dem höchsten Faktor 9. Die Datei soll möglichst klein werden.// und vertrauen diese APC anapc_store($cacheid, gzencode($output, 9), 300);Fehlt uns noch die Ausgabe. Diese bleibt an sich gleich, allerdings ersetzen wir unseren ob_gzhandler gegen den Content-Encoding header, den der Browser benötigt, um GZip Daten zu erkennen und entsprechend zu interpretieren. Ohne diese „Markierung“ würde er uns die Datei einfach im Fenster angezeigt werden, was bei komprimierten Dateien, sagen wir mal, schwierig zu lesen wäre. Wir wollen ja, dass unsere Millionen Leser auch wieder kommen. Denkt bitte auch daran die CacheID zu ändern oder 5 Minuten zu warten, sonst wird der alte Inhalt des Caches ausgegeben.if(apc_exists($cacheid) != false){ header('Content-Encoding: GZip'); $output = apc_fetch($cacheid); echo $output; exit;}ob_start();Alle Browser in freier Wildbahn unterstützen übrigens GZip-komprimierte Daten. Daher sollten auch standardmässig immer gepackte Daten ausgegeben werden. Für die wenigen Ausnahmen, bei denen dem nicht so ist, kann man folgenden Code verwenden. Dies erhöht zwar grundsätzlich die Serverauslastung, aber wie bereits erwähnt, dass ist die absolute Ausnahme.if(!isset($_SERVER["HTTP_ACCEPT_ENCODING"]) || strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip') === false){ echo gzdecode($output); exit;}Unsere Daten werden nun komprimiert gespeichert und dann ohne weitere Bearbeitung, aber mit dem richtigen Kopfdaten an den Browser gereicht. Die Frage ist, wie verhält sich unser kleines Blog jetzt? Probieren wir es aus!Concurrency Level: 4Time taken for tests: 17.424 secondsComplete requests: 100000Requests per second: 5739.37 [#/sec] (mean)Time per request: 0.697 [ms] (mean)Time per request: 0.174 [ms] (mean, across all concurrent requests)Concurrency Level: 10Time taken for tests: 16.773 secondsComplete requests: 100000Requests per second: 5961.95 [#/sec] (mean)Time per request: 1.677 [ms] (mean)Time per request: 0.168 [ms] (mean, across all concurrent requests)Concurrency Level: 100Time taken for tests: 19.683 secondsComplete requests: 100000Requests per second: 5080.58 [#/sec] (mean)Time per request: 19.683 [ms] (mean)Time per request: 0.197 [ms] (mean, across all concurrent requests)Concurrency Level: 1000Time taken for tests: 24.064 secondsComplete requests: 100000Requests per second: 4155.55 [#/sec] (mean)Time per request: 240.642 [ms] (mean)Time per request: 0.241 [ms] (mean, across all concurrent requests)Concurrency Level: 2000Time taken for tests: 33.335 secondsComplete requests: 100000Requests per second: 2999.87 [#/sec] (mean)Time per request: 666.696 [ms] (mean)Time per request: 0.333 [ms] (mean, across all concurrent requests)Wie man sieht, liegen die Anfragen pro Sekunde bei 2000 (!) parallelen Abfragen immer noch 20% über denen unserer ob_gzhandler Version. Im Normalbereich ca. 10 bis 20 % über denen ohne Komprimierung. Der Prozessor ist dabei übrigens noch weit weg von Totalauslastung. Dieses Verhalten ist auch vollkommen logisch. Kleineren Daten werden wesentlich schneller abgearbeitet. Sie werden schneller aus dem shared memory gelesen und verstopfen nicht unsere Netzwerkverbindung. Auch bei unrealistisch vielen parallelen Anfragen bricht die Performance messbar, aber nicht spürbar ein.FazitCaching ist eine lohnenswerte Technik. Caching von komprimierten Daten ist eine noch viel lohnenswertere(re) Technik, vor allem im High Performancebereich oder auf Webservern, die eigentlich unterdimensioniert sind. Wenn Ihr diese Möglichkeit habt, nutzt sie und baut es in Euer bestehendes System ein.TestsystemHardware:- Intel Quad Core i5 CPU 750 @ 2.67GHz- 6 GB Ram- Software Raid 1Software:- Debian 6.0.3- Cherokee Web Server 1.2.101- PHP 5.3.8 (php-fpm)- APC 3.1.9Ähnliche Artikel:UDP Nachrichten versenden und empfangenPHP in_array() die Performance-BremsePHP 5.4.0 Beta1 Performance!
Pagoda Box mit Echtzeitanalyse und reduzierter Datenbanklast
(Mon, 19 Dec 2011 08:15:03 GMT)  Die Echtzeitanalysefunktion der skalierbaren Platform-as-a-Service (PaaS) steht nun wieder im Dashboard von Pagoda Box bereit. Der Hersteller hat eine neue Analytics Engine implementiert, die Beinahe-Echtzeit-Analysen bietet. Damit reagieren Anwender schnell auf Probleme, spüren Engpässe auf und erkennen plötzliche Traffic-Änderungen. Die Funktion aktualisiert die Daten alle 60 Sekunden und zeigt die Ergebnisse in der lokalen Zeit des Users an. Die Tracking-Features umfassen die Gesamtzahl der Webzugriffe, die durchschnittliche Reaktionszeit, die RAM- und CPU-Nutzung aller App-Komponenten, die langsamsten URLs und die am häufigsten aufgerufenen URLs. Mit dem Memcached-Support, der jetzt die Beta-Phase abgeschlossen hat, liefert die PHP-Cloud von Pagoda Box Datenbankanwendungen schneller aus und senkt die Last durch weniger Datenbankzugriffe. Das verteilte Speicher-Caching-System lädt Objekte und Daten in den Arbeitsspeicher und macht viele Datenbankzugriffe überflüssig. Entwickler aktivieren Memcached für eine App, indem sie im App-Dashboard den Button Add Cache anklicken und Memcached auswählen. (jp)Info: Pagoda Box
Kleine Einführung in die YouTube API
(Wed, 14 Dec 2011 18:10:12 GMT)  So, heute ist die YouTube API dran, nachdem ich letzte Woche die SlideShare API vorgestellt hatte. Mit Hilfe der YouTube Data API ist es möglich Videos hochzuladen, nach Videos zu suchen und Kommentare abzurufen. Man kann sich mit der API auch “einloggen” und Dinge tun die man als eingeloggter User machen kann, beispielsweise als dieser User Videos hochladen, Playlisten bearbeiten usw.Da wir uns die Hände nicht unnötig schmutzig machen wollen nutzen wir wieder Zend-Klassen dafür. Ich zeige hier die Verwendung von Zend_Gdata_YouTube, wenn man das ganze Zend Framework scheut kann man die Zend_Gdata Klassen aber auch einzeln downloaden. PHP 5.1.4 und Zend_Gdata > 1.7.7 werden aktuell benötigt.Für die öffentlichen Funktionen benötigen wir keine Authentifizierung, wir können direkt loslegen. Wenn die YouTube VideoID bekannt ist kann man Informationen zum betreffenden Video wie folgt abrufen:<?// loader or autoloader hererequire_once 'Zend/Loader.php'; // the Zend dir must be in your include_pathZend_Loader::loadClass('Zend_Gdata_YouTube');$yt = new Zend_Gdata_YouTube();$yt->setMajorProtocolVersion(2);$entry = $yt->getVideoEntry('oebqlzblfyo');printVideoEntry($entry);Die printVideoEntry() Funktion zeigt in diesem Fall Informationen des Zend_Gdata_YouTube_VideoEntry Objekts an:function printVideoEntry($videoEntry){ // the videoEntry object contains many helper functions // that access the underlying mediaGroup object echo 'Video: ' . $videoEntry->getVideoTitle() . "\n"; echo 'Video ID: ' . $videoEntry->getVideoId() . "\n"; echo 'Updated: ' . $videoEntry->getUpdated() . "\n"; echo 'Description: ' . $videoEntry->getVideoDescription() . "\n"; echo 'Category: ' . $videoEntry->getVideoCategory() . "\n"; echo 'Tags: ' . implode(", ", $videoEntry->getVideoTags()) . "\n"; echo 'Watch page: ' . $videoEntry->getVideoWatchPageUrl() . "\n"; echo 'Flash Player Url: ' . $videoEntry->getFlashPlayerUrl() . "\n"; echo 'Duration: ' . $videoEntry->getVideoDuration() . "\n"; echo 'View count: ' . $videoEntry->getVideoViewCount() . "\n"; echo 'Rating: ' . $videoEntry->getVideoRatingInfo() . "\n"; echo 'Geo Location: ' . $videoEntry->getVideoGeoLocation() . "\n"; echo 'Recorded on: ' . $videoEntry->getVideoRecorded() . "\n"; // see the paragraph above this function for more information on the // 'mediaGroup' object. in the following code, we use the mediaGroup // object directly to retrieve its 'Mobile RSTP link' child foreach ($videoEntry->mediaGroup->content as $content) { if ($content->type === "video/3gpp") { echo 'Mobile RTSP link: ' . $content->url . "\n"; } } echo "Thumbnails:\n"; $videoThumbnails = $videoEntry->getVideoThumbnails(); foreach($videoThumbnails as $videoThumbnail) { echo $videoThumbnail['time'] . ' - ' . $videoThumbnail['url']; echo ' height=' . $videoThumbnail['height']; echo ' width=' . $videoThumbnail['width'] . "\n"; }}Die Ausgabe sieht dann so aus:Video: Velocity Europe, Artur Bergman, "Full Stack Awareness"Video ID: oebqlzblfyoUpdated: 2011-12-08T16:06:11.000ZDescription: Artur Bergman VP Engineering and Operations, Wikia/FastlyPerformance and operability doesn't come from simply focusing on a single part of your application or infrastructure. They come from having a systemic view of what makes your stack work, what could bottleneck it, and what could bring it down. I'll talk about this journey from kernel to continents.Category: TechTags: velocityconf, europe, 2011Watch page: http://www.youtube.com/watch?v=oebqlzblfyo&feature=youtube_gdata_playerFlash Player Url: http://www.youtube.com/v/oebqlzblfyo?version=3&f=videos&app=youtube_gdataDuration: 1090View count: 2883Rating: ArrayGeo Location:Recorded on:Mobile RTSP link: rtsp://v8.cache2.c.youtube.com/CiILENy73wIaGQkqf-U2l-rmoRMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gpMobile RTSP link: rtsp://v4.cache3.c.youtube.com/CiILENy73wIaGQkqf-U2l-rmoRMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gpThumbnails:00:09:05 - http://i.ytimg.com/vi/oebqlzblfyo/default.jpg height=90 width=120 - http://i.ytimg.com/vi/oebqlzblfyo/hqdefault.jpg height=360 width=48000:04:32.500 - http://i.ytimg.com/vi/oebqlzblfyo/1.jpg height=90 width=12000:09:05 - http://i.ytimg.com/vi/oebqlzblfyo/2.jpg height=90 width=12000:13:37.500 - http://i.ytimg.com/vi/oebqlzblfyo/3.jpg height=90 width=120Es ist auch möglich einige Standard-Feeds abzurufen, wie beispielsweise recently_features, most_viewed, top_rated, top_favorites usw. Und das geht so:printVideoFeed($yt->getRecentlyFeaturedVideoFeed());Die printVideoFeed() Funktion ist einfach eine Schleife über die Ergebnisse:function printVideoFeed($videoFeed){ $count = 1; foreach ($videoFeed as $videoEntry) { echo "Entry # " . $count . "\n"; printVideoEntry($videoEntry); echo "\n"; $count++; }}Oder aber alle ähnlichen Videos zum oben gezeigten:printVideoFeed($yt->getRelatedVideoFeed('oebqlzblfyo'));Oder alle Videos eines bestimmten Users:printVideoFeed($yt->getuserUploads('OreillyMedia'));Alle Antworten die Feeds betreffen liefern standardmäßig erstmal maximal 25 Ergebnisse zurück. Möchte man “weiterblättern” kann man das so tun:try { $nextFeed = $videoFeed->getNextFeed();} catch (Zend_Gdata_App_Exception $e) { echo $e->getMessage() . "\n";}Gibt es keine nächstes Seite wird eine Exception geworfen.Eine Suche nach einem Suchstring sieht wie folgt aus:$query = $yt->newVideoQuery();$query->videoQuery = 'phpunit test';$query->startIndex = 10;$query->maxResults = 20;$query->orderBy = 'viewCount';$videoFeed = $yt->getVideoFeed($query->getQueryUrl(2));printVideoFeed($videoFeed);Für alle “non-public” Zugriffe auf die API benötigt man einen Developer-Account, mit dem dann ein API-Key generiert werden kann. Das betrifft beispielsweise den Video-Upload, Kommentare und Ratings setzen, Nachrichten lesen, Playlists bearbeiten und vielem mehr. Im YouTube Developer API Guide befinden sich noch viele weitere Informationen zur API, genauso wie im Zend_Gdata_YouTube Manual.Ähnliche Artikel:PHP und Zend Framework Video-Podcasts und -SerienKleine Aufgabe: Ein Array umbauenSlides und Videos der Velocity Europe 2011
Adventskalenderartikel 01.12. – 10.12.
(Sat, 10 Dec 2011 12:35:00 GMT)  Heute gibts eine Menge Links zu Adventskalender-Blogartikeln. Jeden Tag ein Türchen, dahinter jeden Tag ein Artikel aus dem PHP- und Webumfeld. Viel Spass beim Lesen!Zusammenfassung Adventskalender 2011 von Mayflower:01.12. CLOUD Transformation Model02.12. PHP 5.3 Features in real life03.12. Setting up an own QA Environment for Javascript04.12. PDF nicht nur mit PHP05.12. Doctrine 206.12. Doctrine 2 – Zend Framework Integration07.12. One-click Deployment08.12. Agilere DatenbankentwicklungZusammenfassung PHP Advent 2011:01.12. Because It’s Fun!02.12. More Than Just Style03.12. Reduced-Friction Deployment04.12. Better Than the Rest05.12. A Stitch in Time Saves Nine06.12. Dates and Times07.12. Twilio in Two Minutes08.12. Integration Testing09.12. Merry Error HandlingZusammenfassung Webkrauts CSS Adventskalender 2011:01.12. Wireframes für Startseiten02.12. Konzentriert und strukturiert Texten03.12. One Button to rule them all04.12. Effiziente CSS-Entwicklung mit Sass und Compass (Teil 1)05.12. Effiziente CSS-Entwicklung mit Sass und Compass (Teil 2)06.12. Geschenke für Geeks07.12. Mobile Usability – Gebrauchstauglichkeit für unterwegs08.12. CSS 3 im Praxistest: Multi-column Layout09.12. SELECT Bilder FROM Flickr OR PicasaWebAlbums WITH YQL FOR Bildergalerie10.12. YQL-Bildergalerie als WordPress-PluginEs gibt noch weitere Adventskalender-Artikel, beispielsweise über CSS:http://24ways.org/http://maddesigns.de/ zusammen mit http://webstandard.kulando.de/ Keine ähnlichen Artikel.
Hintergründe zu selfoss
(Fri, 09 Dec 2011 21:00:01 GMT)  In einem Gastbeitrag bei phphatesme schreibe ich über selfoss. Dort stelle ich auch die verschiedenen Bibliotheken vor, die ich für den RSS Reader verwende. Also für Interessierte: schaut einfach rein.Herzlichen Dank an Nils, dass er mir die Möglichkeit gegeben hat, selfoss in seinem Blog vorzustellen.
MariaDB integriert PAM-Authentifizierungssystem
(Tue, 06 Dec 2011 11:15:01 GMT)  Zwei Updates stellen die MariaDB-Entwickler für ihre aktiv gepflegten Reihen 5.1 und 5.2 vor: MariaDB 5.2.10 und 5.1.60. MariaDB 5.1.60 baut direkt auf MySQL 5.1.60 auf. Diese Version stellt eine Alternative für den schnellen Umstieg dar, die mit weniger Bugs arbeitet und dank XtraDB, einer erweiterten Version der Storage Engine InnoDB, eine Performance auf dem Niveau von MySQL 5.5 bieten soll.In MariaDB 5.2.10 rüsten die Entwickler das Featureset auf. Die wichtigste Änderung ist das PAM-Authentifizierungs-Plugin, das das Authentifizierungs-Framework Pluggable Authentification Modules (PAM) einbindet. Der einzige Nachteil an dieser Technologie ist, dass PAM nicht unter Windows funktioniert. Die Entwickler schlagen vor, sich von einem Windows-Client mit einem MariaDB-Server zum Beispiel unter Linux oder Solaris zu verbinden, der das PAM-Authentifizierungs-Plugin nutzt. In MariaDB 5.2.10 kommen außerdem Bugfixes und weiter kleinere Verbesserungen der Datenbank hinzu. (jp)Info: MariaDB
Umzug: Von 1und1 zu all-inkl.com
(Mon, 05 Dec 2011 11:30:09 GMT)  ALL-INKL LogoSeit über 6 Jahren bin ich ein treuer Kunde der 1&1 Internet AG, aber jetzt wechsele ich die Seiten – genauer zu All-Inkl. Eigentlich war ich immer zufrieden mit dem Angebot und dem Service von 1und1, jedoch häuften sich mit der Zeit immer mehr kleinere Probleme an. Bestes Beispiel ist das Memorylimit von PHP…. 1&1 und Fatal error: Out of memory (allocated XYZ) (tried to allocate WXYZ bytes)Am Anfang merkt man rein gar nichts von der Beschränkung. Egal ob man WordPress, Joomla oder XY installiert, das Speicherlimit von PHP wird selten überschritten. Mit der Zeit wächst jedoch der Speicherbedarf derartiger Installationen, sei es durch Plugins oder durch intensivere Nutzung. 1und1-Worpress-Nutzer wissen, wenn man ein WordPress-Update durchführen will, müssen alle Plugins deaktiviert werden. Besonders nervt das bei Plugins, die die Einstellungen vergessen oder irgendeinen API-Key benötigen.Die PHP-Speicherbeschränkung betrifft sehr viele Anwender und tritt häufig bei älteren Tarifen/Angeboten von 1&1 auf. (z.B. Homepage Perfect) Hier gibt es eine Beschränkung auf 32 MB bzw. effektiv 29 MB, obwohl bis zu 90 MB vom Server unterstützt werden könnten. Dabei helfen Anpassungen der .htaccess-Datei oder der wp-config.php auch nichts!Lediglich ein Tarifwechsel würde Abhilfe schaffen. Die folgende Grafik zeigt die Memorylimits der neuen Dualhosting Tarife:php memorylimit bei 1und1Ein Wechsel, egal ob Hoster oder Tarif, löst das Memorylimitproblem…. Ich habe mich für einen Hosterwechsel entschieden.  LeistungsumfangBetrachtet man den Leistungsumfang anderer Hoster (Host Europe, Strato, 1Blu, etc), so fällt auf das All-Inkl.com einfach mehr Leistung für das gleiche Geld anbietet:Der direkte VergleichMerkmal1und1 LogoALL-INKL LogoTarif1&1 Dual PerfectAll-Inkl PREMIUMKosten pro Monat9,99 €/Mon.9,95 €/Mon. Einrichtungsgebühr9,60 €14,95 €Webspace5 GB50 GBMonatliches TransfervolumenunbegrenztTraffic FLATInklusive Domains65MySQL Datenbanken1050WebFTP & WebMailJaJaPHP Memorylimit60 MBWhat you want:-) 64 MBFTP-Zugang20unbegrenztGit VersionierungJaJa und SVNSupportNajaSuper! FazitNeben dem PHP Memorylimit Problem, hatte ich noch Probleme mit der Domain-Verwaltung (Was ist inklusive und was nicht), den Datenbanken (Umstellung 100MB auf 1GB) und der e-Mailverwaltung(Weiterleitung, IMAP, etc). Bei meinem neuen Hoster “All-Inkl” hoffe ich, dass 1. die Performance besser ist, 2. die Probleme gelöst sind und 3. die versprochenen Leistungen uneingeschränkt funktionieren.  QuellenPHP Memory Limit bei 1und1All Inkl1und1 Tarife
Apache Tapestry 5.3 beschleunigt Webanwendungen
(Mon, 05 Dec 2011 10:40:01 GMT)  Tapestry 5.3 soll große Webseiten bis zu 40 Prozent beschleunigen. Im Vergleich zu Version 5.2 nutzt das Java-Framework 30 Prozent weniger Speicherressourcen. Die Entwickler spendieren dem Framework auch neue Komponenten: Services für Benutzerbenachrichtigungen kommen hinzu, ebenso wie eine Ajax-basierte Baumansicht und Captchas. Eine ausführliche Komponentenreferenz ist in JavaDoc integriert. Der HTML5 Doctype wird unterstützt. Der Einsatz von Skins und Themes ist mit Typestry 5.3 möglich. Javascript-Code und CSS verkleinert Tapestry automatisch mit Hilfe von YUICompressor. Bei  Ajax-Aufrufen soll die clientseitge Präsentation serverseitiger Ausnahmen besser klappen. JSR-330-Injection-Annotation sind nun auch möglich. Mit Tapestry schreiben Entwickler ihre Webanwendungen in Java, Groovy oder Scala. (jp)Info: Apache Tapestry
Zugriff auf die SlideShows bei SlideShare via Zend_Service_SlideShare
(Mon, 05 Dec 2011 09:20:02 GMT)  SlideShare hat eine API über die man auf die SlideShows zugreifen kann, man kann einzelne SlideShows abrufen und SlideShows nach Tags, Gruppen oder Usernamen suchen, und erhält dann jeweils Details wie Titel, Uploaddatum, Anzahl Views, Anzahl Downloads, EmbedCode und über ein Dutzend weitere Informationen. Es ist auch möglich neue SlideShows hochzuladen.Der Zugriff ist nicht sonderlich schwer, man benötigt einen API-Schlüssel und ein Shared Secret die man bei SlideShare im Entwicklerbereich beantragen kann. Dann sendet man einfach GET bzw. POST Anfragen an bestimmte URLs, und bekommt XML zurück.Am einfachsten geht es jedoch mit der Zend_Service_SlideShare Klasse aus dem Zend Framework:$slideShare = new Zend_Service_SlideShare( 'XXXXXXXX', 'XXXXXXXX', 'PHPGangsta', 'XXXXXXXX');$slideShow = $slideShare->getSlideShow('10328838');echo 'Title: '.$slideShow->getTitle()."\n";echo 'Description: '.$slideShow->getDescription()."\n";echo 'NumViews: '.$slideShow->getNumViews()."\n";echo 'PermaLink: '.$slideShow->getPermaLink()."\n";echo 'Tags: '.join(',', $slideShow->getTags())."\n";echo 'ThumbnailUrl: '.$slideShow->getThumbnailUrl()."\n";echo 'EmbedCode: '.$slideShow->getEmbedCode()."\n";Und schon hat man Informationen über die betreffende Präsentation, wie beispielsweise:Title: Caching and tuning fun for high scalability @ PHPTourDescription: Caching has been a 'hot' topic for a few years. But caching takes more than merely taking data and puttingit in a cache : the right caching techniques can improve performance and reduce load significantly. But we'll also lookat some major pitfalls, showing that caching the wrong way can bring down your site. If you're looking for a clear explanation about various caching techniques and tools like Memcached, Nginx and Varnish, as well as ways to deploy them in an efficient way, this talk is for you. In this tutorial, we'll start from a Zend Framework based site. We'll add caching, begin to add servers and replace the standard LAMP stack, all while performing live benchmarks.NumViews: 28PermaLink: http://www.slideshare.net/wimg/caching-and-tuning-fun-for-high-scalability-phptourTags: tuning caching phptour memcache varnishThumbnailUrl: http://cdn.slidesharecdn.com/cachingandtuningfun-111125134026-phpapp02-thumbnail-2EmbedCode: <object width="425" height="348" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://s3.amazonaws.com/slideshare/ssplayer.swf?id=10328838&doc=cachingandtuningfun-111125134026-phpapp02&branding=no" /><embed width="425" height="348" type="application/x-shockwave-flash" src="http://s3.amazonaws.com/slideshare/ssplayer.swf?id=10328838&doc=cachingandtuningfun-111125134026-phpapp02&branding=no" /></object>Wie oben bereits angedeutet gibt es bereits Methoden um SlideShows zu suchen via Tag, Username oder Gruppe:$slideShows = $slideShare->getSlideShowsByTag('php');$slideShows = $slideShare->getSlideShowsByUsername('wimg');$slideShows = $slideShare->getSlideShowsByGroup('kollace');Die API kann aber noch mehr wie man in der API-Dokumentation sehen kann, beispielsweise “normal” suchen per Query String. Da die Zend-Klasse das nicht anbietet habe ich das schnell eingebaut. Für das Zend Framework 2 habe ich bereits einen entsprechenden Pull-Request abgesetzt, hoffe es wird bald übernommen. Darin sind dann auch Änderungen bzgl. der API-Version (es gibt mittlerweile Version 2), es sind mehr Informationen im SlideShow Objekt abrufbar und einiges mehr.$slideShows = $slideShare->searchSlideShow('php unit test');SlideShare macht es insgesamt sehr einfach die API zu benutzen, die Dokumentation ist gut. Mal sehen ob ich die Zeit finde und die restlichen fehlenden Methoden noch in das Zend Framework 2 einpflegen werde.Hier meine abgeleitete Klasse mit der searchSlideShow() Methode:<?phpclass PHPGangsta_Service_SlideShare extends Zend_Service_SlideShare{ const SERVICE_SEARCH_SLIDE_SHOW = 'http://www.slideshare.net/api/2/search_slideshows'; public function searchSlideShow($searchterm) { $timestamp = time(); $params = array('api_key' => $this->getApiKey(), 'ts' => $timestamp, 'hash' => sha1($this->getSharedSecret().$timestamp), 'detailed' => 1, 'q' => $searchterm); $cache = $this->getCacheObject(); $cache_key = md5("__zendslideshare_cache_search_$searchterm"); if(!$resultSlideshows = $cache->load($cache_key)) { $client = $this->getHttpClient(); $client->setUri(self::SERVICE_SEARCH_SLIDE_SHOW); $client->setParameterPost($params); require_once 'Zend/Http/Client/Exception.php'; try { $response = $client->request('POST'); } catch(Zend_Http_Client_Exception $e) { require_once 'Zend/Service/SlideShare/Exception.php'; throw new Zend_Service_SlideShare_Exception("Service Request Failed: {$e->getMessage()}", 0, $e); } $sxe = simplexml_load_string($response->getBody()); if($sxe->getName() == "SlideShareServiceError") { $message = (string)$sxe->Message[0]; list($code, $error_str) = explode(':', $message); require_once 'Zend/Service/SlideShare/Exception.php'; throw new Zend_Service_SlideShare_Exception(trim($error_str), $code); } if(!$sxe->getName() == 'Slideshows') { require_once 'Zend/Service/SlideShare/Exception.php'; throw new Zend_Service_SlideShare_Exception('Unknown XML Repsonse Received'); } $resultSlideshows = array(); foreach ($sxe->Slideshow as $resultSlideshowNode) { $resultSlideshows[] = $this->_slideShowNodeToObject(clone $resultSlideshowNode); } $cache->save($resultSlideshows, $cache_key); } return $resultSlideshows; }}Ähnliche Artikel:Konstanten, Klassenkonstanten und der ZugriffSlides der PHP Community Conference 2011
PhpStorm 3.0 spürt Performance-Bremsen und doppelten Code auf
(Wed, 30 Nov 2011 08:15:01 GMT)  Mit dem Smart Duplicated Code Detector in PhpStorm 3.0 finden Webentwickler schnell identische Codeblöcke in ihrem Projekt. Der Profiler ermöglicht direkt aus der IDE heraus die gezielte Performance-Kontrolle der Skripte wahlweise mit Xdebug oder dem Zend Debugger. Um sich einen Überblick über die Projektstruktur zu verschaffen, nutzen PHP-Entwickler das integrierte UML-Tool in PhpStorm 3.0. Die Entwicklungsumgebung bietet jetzt Unterstützung für CoffeeScript, integriert PHPUnit 3.6 und ermöglicht Javascript-Unittests über ein Plugin. In PhpStorm 3.0 stehen Entwicklern XSLT-2.0-Support und ein XSLT Debugger zur Verfügung. Bei der FTP- und SFTP-Synchronisierung hat Jetbrains mehrere Verbesserungen bewirkt. Bei der Versionskontrolle mit Git zeigt die IDE nun eine Revisionskurve an. Auch an der Benutzeroberfläche hat der Hersteller über alle Betriebssysteme hinweg geschraubt und die Kompatibilität mit Mac OS X Lion samt Vollbildmodus nachgerüstet. (jp)Info:PhpStorm
PHPStorm 3.0 erschienen!
(Tue, 29 Nov 2011 14:35:00 GMT)  Kurze und aktuelle News: PHPStorm 3.0, die meiner Meinung nach beste PHP IDE von JetBrains, ist soeben released worden, alle die eine Lizenz haben können updaten. Wer noch keine Lizenz hat kann PHPStorm 30 Tage kostenlos testen.Ankündigung: http://blog.jetbrains.com/webide/2011/11/phpstorm-3-0-keep-your-code-in-its-best-shapeWhat’s new: http://www.jetbrains.com/phpstorm/whatsnew/?whatsnew30Download: http://www.jetbrains.com/phpstorm/download/index.htmlÄhnliche Artikel:Eilmeldung: PHPStorm satte 50% günstiger!PHPStorm 60% günstiger! Bis zum 30.04.2011PHPStorm 20% günstiger, hier bei mir
Linkpool Nummer 26
(Sat, 26 Nov 2011 11:30:01 GMT)  Der neue Apache httpd v 2.4 (PDF):http://people.apache.org/~jim/presos/ACNA11/Apache_httpd_cloud.pdfIn welchen Fällen bei foreach-Schleifen nutzt PHP intern Kopien und wann nicht:http://nikic.github.com/2011/11/11/PHP-Internals-When-does-foreach-copy.htmlWas bei Google unter anderem wichtig ist: Qualität, Rechtschreibung …http://sixrevisions.com/content-strategy/creating-websites-optimized-for-googles-panda-algorithm/PHP Session Storage via MySQL Cluster und Memcached-Frontend:http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html6 Kostenloses Web-Speed-Tools:http://t3n.de/news/website-speedtest-6-kostenlose-tools-342243/Wie Facebook seine Releases deployed, monitored usw.http://www.facebook.com/video/video.php?v=10100259101684977&oid=9445547199&commentsWarum man den Destructor nicht manuell aufrufen sollte:http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/Auf welche Weise man Selenium 2 nutzen kann:http://css.dzone.com/articles/selenium-2-php-codeFallstudie wie 500ms oder 1000ms die Conversion nachhaltig beeinflusst:http://www.webperformancetoday.com/2011/11/23/case-study-slow-page-load-mobile-business-metrics/PHP Aufgaben mit so wenig Bytes wie möglich lösen:http://www.phpgolf.org/Ähnliche Artikel:Linkpool Nummer 23Linkpool Nummer 21Linkpool Nummer 20
Slides und Videos der Velocity Europe 2011
(Fri, 25 Nov 2011 10:25:02 GMT)  Hier werdet ihr euch freuen, es gibt viele Videos und viele Präsentationen von der Velocity Europe, sehr gute Speaker und sehr interessante Themen aus dem Performance- und Operations Umfeld, dafür sollte man sich auf jeden Fall einige Stunden einplanen und Videos + Präsentationen angucken, es lohnt!Dienstag, 08. November 20119:00 Plenary Opening remarks Steve Souders (Google), John Allspaw (Etsy.com)9:10 Plenary A Career in Web Operations Theo Schlossnagle (OmniTI) YouTube Video9:40 Plenary Lightning Demos Advanced Performance Analysis with Google Page Speed Andrew Oates (Google) Debugging Mobile Web Applications with weinre Patrick Mueller (IBM) YouTube Video YouTube Video9:55 Plenary If You Can Keep Your Site Standing Up When All About You Are Falling Down… Robert Castley (Keynote Systems) YouTube Video10:00 Plenary What It Means To Deliver Exceptional Performance Alois Reitbauer (dynatrace Software) YouTube Video10:05 Plenary The Future of Application Performance Management Brian Doll (New Relic) YouTube Video10:35 Plenary The Relationship Between Faster Mobile Sites and Business KPIs: Case Studies from the Mobile Frontier Joshua Bixby (Strangeloop Networks) YouTube Video11:05 Plenary The Velocity of Dev Ops Jon Jenkins (Amazon.com) YouTube Video11:20 Plenary Betfair’s Site Rebuild: Fast – We Promise Tim Morrow (Betfair) YouTube Video13:00 Monitoring Is Easy, Why Are We So Bad At It? Theo Schlossnagle (OmniTI) Introducing the Amazon Silk Web Browser Jon Jenkins (Amazon.com)13:50 Massively Sharded MySQL at Tumblr Evan Elias (Tumblr) Know Your Engines: How to Make Your JavaScript Fast David Mandelin (Mozilla Corporation)14:40 Quality of Service (QoS) for Web Applications William Louth (JINSPIRED BV) Measuring Web Performance Stephen Thair (Seriti Consulting)15:55 Our First DDoS attack Cosimo Streppone (Opera Software ASA) How DRY Affects JavaScript Performance — Faster JavaScript Execution For The Lazy Developer Mathias Bynens (Qiwi)16:20 Empirical Results from Page Speed and mod_pagespeed Matthew Steele (Google), Andrew Oates (Google), Joshua Marantz (Google)16:45 Be Fast Or Stay Behind – Building A Continuous Delivery Platform Schlomo Schapiro (ImmobilienScout24), Ingmar Krusch (ImmobilienScout24) Performance Automation 101 Jeroen Tjepkema (MeasureWorks)Mittwoch, 09. November 20119:00 Plenary Opening remarks John Allspaw (Etsy.com), Steve Souders (Google)9:10 Plenary Designing for Disaster: How Teams Can Thrive in the Cloud Jeff Veen (Typekit) YouTube Video9:40 Plenary Lightning Demos Deep Dive Browser Diagnostics Andreas Grabner (dynaTrace Software) FITB – Network Graphing Done Right Laurie Denness (Etsy) YouTube Video YouTube Video9:55 Plenary Exhaustive End-User Monitoring: A Necessity in an Ever Complex Digital Environment Arnaud Becart (ip-label) YouTube Video10:35 Plenary Anticipation: What Could Possibly Go Wrong? John Allspaw (Etsy.com) YouTube Video11:05 Plenary Full Stack Awareness Artur Bergman (Wikia/Fastly) YouTube Video11:20 Plenary Taking on the Performance Challenge Ivo Teel (SPIL GAMES), Laurens van Hees (SPIL GAMES) YouTube Video13:00 NoSQL Performance In The Real World David Mytton (Boxed Ice) Fast & Furious: Speed In The Opera Browser Andreas Bovens (Opera Software)13:30 Chrome Fast Tony Gentilcore (Google)13:50 Apps Behaving Badly Michael Brunton-Spall (Guardian News and Media), Lisa van Gelder (Guardian News and Media)14:00 Firefox Performance Chris Heilmann (Mozilla Firefox)14:40 Deploying Large Payloads At Scale Ramon van Alteren (Hyves) Fast Loading JavaScript Aaron Peters (aaronpeters.nl)15:55 The Social Seismograph – I Just Love Monitoring Johannes Mainusch (XING AG) Mobile UI Performance Estelle Weyl (Standardista.com)16:45 HTTP Connection Management, From 10 Users To 100 million Bradley Heilbrun (YouTube/Google Inc) Player Widgets Panel Matas Petrikas (SoundCloud), Andrew Pile (Vimeo), Greg Schechter (YouTube)Ähnliche Artikel:Velocity Europe Tag 1: Der VormittagVelocity Europe Tag 2: Whao!Velocity Europe Tag 1: Die Sessions am Nachmittag
Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP
(Wed, 23 Nov 2011 09:20:30 GMT)  Manchmal möchte man wissen aus welchem Land oder welcher Region eine IP-Adresse kommt, und dafür gibt es bereits Lösungen die leicht zu benutzen sind. Als erstes schauen wir uns die Geo-IP-Datenbank von MaxMind an, die wir mit der PEAR-Klasse Net_GeoIP ansprechen. Wer nur das Land braucht der sollte sich die kostenlose GeoLite Country Datenbank anschauen, wenn die Stadt bzw. die Region benötigt wird wirft man einen Blick auf die GeoLite City Datenbank. Von beiden gibt es auch noch kostenpflichtige Versionen, die genauer und aktueller sind.Das erste Beispiel zeigt die Verwendung der Länder-Datenbank:<?phprequire_once "Net/GeoIP.php";$geoip = Net_GeoIP::getInstance("GeoIP.dat");$ipAddresses = array( '77.177.166.7', '41.135.69.4', '183.111.12.21', '202.127.1.88', '174.139.204.218', '192.121.32.239',);foreach ($ipAddresses as $ipAddress) { echo $ipAddress.' '.$geoip->lookupCountryCode($ipAddress)."\n";}Die Ausgabe in diesem Fall sieht so aus:77.177.166.7 DE41.135.69.4 ZA183.111.12.21 KR202.127.1.88 CN174.139.204.218 US192.121.32.239 SEFür die zweite Variante mit der City-Datenbank sieht das Script recht ähnlich aus:<?phprequire_once "Net/GeoIP.php";$geoip = Net_GeoIP::getInstance("GeoLiteCity.dat");$ipAddresses = array( '77.177.166.7', '41.135.69.4', '183.111.12.21', '202.127.1.88', '174.139.204.218', '192.121.32.239',);foreach ($ipAddresses as $ipAddress) { $location = $geoip->lookupLocation($ipAddress); echo 'IP Address: '.$ipAddress."\n". 'CountryCode: '.$location->countryCode."\n". 'CountryName: '.$location->countryName."\n". 'City: '.$location->city."\n". 'PostalCode: '.$location->postalCode."\n". 'Region: '. $location->region."\n". 'Lat/Lan: '.$location->latitude."/".$location->longitude."\n\n";}Die Ausgabe:IP Address: 77.177.166.7CountryCode: DECountryName: GermanyCity: SpengePostalCode:Region: 07Lat/Lan: 52.1333/8.4833IP Address: 41.135.69.4CountryCode: ZACountryName: South AfricaCity: Port ElizabethPostalCode:Region: 05Lat/Lan: -33.9667/25.5833IP Address: 183.111.12.21CountryCode: KRCountryName: Korea, Republic ofCity: SeoulPostalCode:Region: 11Lat/Lan: 37.5664/126.9997IP Address: 202.127.1.88CountryCode: CNCountryName: ChinaCity: BeijingPostalCode:Region: 22Lat/Lan: 39.9289/116.3883IP Address: 174.139.204.218CountryCode: USCountryName: United StatesCity: SpartanburgPostalCode: 29302Region: SCLat/Lan: 34.8822/-81.8511IP Address: 192.121.32.239CountryCode: SECountryName: SwedenCity:PostalCode:Region:Lat/Lan: 62/15Des weiteren gibt es noch eine Region-Datenbank und eine Organisation/ISP-Datenbank, die mit den entsprechenden Methoden lookupRegion() und lookupOrg() in Net_GeoIP ausgelesen werden können.Alternativ gibt es die Möglichkeit die PECL geoip PHP Extension zu nutzen, die auch die Datenbanken von MaxMind nutzt, das Manual befindet sich auf php.net.Webserver können auch Geo-Informationen nutzen, beispielsweise Apache GeoIP API und nginx HttpGeoIP Module. Damit ist es super einfach Zugriffe aus bestimmten Ländern zu blocken oder anderen Inhalt zu präsentieren, oder auch die Geo-Information als Parameter an den Backend-Server zu liefern (im Fall von nginx als Reverse Proxy).Es gibt auch einige Webservices die Geo-Informationen zu IP-Adressen bieten, von denen bekommt man via REST entweder JSON, XML oder CSV. Einige Beispiele:http://freegeoip.net/http://www.geobytes.com/iplocator.htmhttp://www.geoio.com/http://ipinfodb.com/ip_location_api_json.phphttps://simplegeo.com/docs/clients-code-libraries/phphttp://www.hostip.info/use.htmlWenn diese Dienste eine bessere Datenbank bieten lohnt sich evtl. ein Blick, aber da man auf die Verfügbarkeit angewiesen ist und Webservices auch langsamer sind als lokale Lookups ist die Verwendung problematisch.Keine ähnlichen Artikel.
Mehrzeiliger Text mit Zend_Pdf
(Fri, 18 Nov 2011 16:55:01 GMT)  Mehrzeiligen Text erstellen muss man auch mit Zend_Pdf noch manuell ... leiderIch möchte an dieser Stelle allen, die mehrzeiligen Text in einem PDF mit Hilfe von Zend_Pdf ausgeben wollen, einen Denkanstoß geben.Ich habe das Problem wie folgt gelöst:Verfügbare Breite ermitteln. Diese Breite in einer Variable merken.Verfügbare Zeilen ermitteln. Diese Info auch speichern, da das für den späteren Seitenumbruch nötig wird. Nicht, dass euer Text plötzlich endet, nur weil die Seite zu Ende ist.Den Text mittels wordwrap umbrechen. Diesen dann per explode in ein array bekommen.Das dann per foreach und array_shift solange ausgelesen wird, bis das Seitenende erreicht ist. Dannach eine neue Seite beginnen und den Rest des arrays abarbeiten.Ich hoffe, ich kann euch zumindest auf die richtige Spur bringen, dass das ganze gar nicht schwer ist. Am Ende könnt ihr beliebig großen Text in einem PDF darstellen und das sogar über mehrere Seiten.Viel Erfolg.
Zend Studio 9 verbessert Cloud-Anbindung und Editoren
(Fri, 18 Nov 2011 10:40:01 GMT)  Zend veröffentlicht eine neue Version seiner PHP-Entwicklungsumgebung. In Zend Studio 9 hat der Hersteller die Werkzeuge für Webentwickler ausgebaut. Mit einer verbesserten Cloud-Integration nutzen Entwickler nun auch die neuen Möglichkeiten von phpcloud.com, die aus der Zend Developer Cloud für das Entwickeln und Debuggen in der Cloud und der Zend Application Fabric zum Deployment der PHP-Anwendungen in einer Cloud-Umgebung bestehen. Die IDE integriert jetzt auch das Amazon Web Services Toolkit.Neben der Cloud-Unterstützung hat sich Zend auch Möglichkeiten zur Steuerung des Applikations-Lebenszyklus vorgenommen. Ob Entwickler allein oder im Team arbeiten, mit der Git- und Github-Integration lässt sich die Versionskontrolle effizienter organisieren. Die Editoren für HTML5, CSS3 und Javascript wurden in Zend Studio 9 weiter ausgebaut. Entwickler dürfen auch Plugins der Eclipse-Community nutzen, um den Funktionsumfang von Zend Studio zu erweitern. Eine intelligente Produktkonfiguration ermöglicht es, die IDE an die eigenen Bedürfnisse anzupassen und Module hinzuzufügen und zu entfernen. Laut Zend bewirkt dies durchschnittlich zwei Drittel schnellere Startzeiten und 40 Prozent weniger Festplattenbedarf. (jp)Info: Zend Studio
Bitnami-PHP-Stacks speichern Daten mit MySQL 5.5
(Thu, 17 Nov 2011 06:15:00 GMT)  Bitnami liefert die PHP-Stacks für Windows, Linux und Mac jetzt mit MySQL 5.5 aus. Entwickler profitieren dabei von einer höheren Performance vor allem auf Systemen mit Mehrkernprozessoren.  InnoDB löst die Standard-Storage-Engine MyISAM ab. Im Paket ist der native MySQL-Treiber für PHP 5.3 enthalten, der in vielen Fällen Performance-Vorteile bringt und es überflüssig macht, externe Bibliotheken zu verlinken. Mit Updates werden weitere wichtige Komponenten aktualisiert. Die Webstacks bringen jetzt den Webserver Apache 2.2.21 und PHP 5.3.8 mit. Als alternative Datenbank steht PostgreSQL 9.1.1 bereit. Für die Verwaltung nutzen Entwickler entweder phpMyAdmin 3.4.7.1 oder phpPgAdmin 5.0.3. Außerdem wurde das AWS SDK for PHP auf Version 1.4.7 angehoben, mit dem Webentwickler die Cloud-Dienste von Amazon Webservices in ihren Anwendungen nutzen. (jp)Info: Bitnami
Slides der ZendCon 2011
(Wed, 16 Nov 2011 11:30:02 GMT)  Die PHP Konferenz der Firma Zend, die ZendCon 2011 in Santa Clara, war natürlich wieder ein Highlight was die aktuellen und zukünftigen Themen rund um PHP angeht. Leider sind noch einige Lücken geblieben, wenn ihr die fehlenden Präsentationen findet, bitte in die Kommentare packen, Danke!Montag, 17.10.2011Creating and Using Streams, Filters and Sockets Elizabeth Marie SmithDoctrine 2 Juozas KaziukėnasPHP Components From Idea To Maturity Chris HartjesPHP Extensions, Why and What? Derick RethansZend PHP 5.3 Certification Boot Camp Christian WenzBeware of the Dark Side, Luke! Arne BlankertsDesign Patterns in Action Stefan PriebschLearning CouchDB Bradley HoltDienstag, 18.10.2011Opening Keynote Andi Gutmans VideoBenchmarking Applications and Frameworks Paul M. JonesHTML5 WebSockets Scott MattocksPHP Batch Jobs on IBM i Alan SeidenDevelopment in the 24th and a half century Kevin SchroederGit for Subversion Users Stefan KoopmanschapCloud Based Application Performance Testing Moris ChenOverview of Zend Framework 2 Matthew Weier O’PhinneyPHP and IBM i Frequent Questions, FastCGI, DB2, etc. Tony CairnsXdebug Derick RethansChange is Inevitable (Except from a Vending Machine) Stefan PriebschProfiling PHP Applications Derick RethansScaling PHP Applications with Redis Josh ButtsSQL Injection Myths and Fallacies Bill KarwinThe Future of PHP on IBM i Tim RoweA Practical Look At Symfony2 Stefan KoopmanschapEvent and Signal Driven Programming Techniques Elizabeth Marie SmithOpen Source PHP Toolkit for IBM i Mike Pavlak, Tony CairnsSkynet in ZF 2.0: The Automation, Compilation, and Generation of Projects with Zend\Code Ralph SchindlerDB2 and PHP Best Practices on IBM i Alan SeidenDeployment Without the Chaos Eric RitchieManage Cloud Infrastructures Using Zend Framework Enrico ZimuelUnder the Hood Ilia AlshanetskyZend Studio Tips and Tricks Roy GanorMittwoch, 19.10.2011Dependency Injection; Containers and Frameworks In PHP Ralph SchindlerIntroduction to Adobe Flash Builder for PHP Roy GanorMySQL — What’s New Dave StokesProduction Scaling in the Cloud Kent MitchellLarge-Scale Data Processing with Hadoop and PHP David ZülkeIntro to Flex Anna FilinaSOA with Zend Framework Mike WillbanksThe Contextual Experience of the Mobile Web Jeff CarouthTriggered: Zend Framework 2′s EventManager Matthew Weier O’PhinneyExtending Open Source Solutions for Large Scale Federal Applications Rakesh KumarAPI Security Rob RichardsAdding Dependency Injection To Legacy Applications Sam HennessyBig Server is Watching You Maurice KherlakianCharacter Sets Suck Raymond DeRooCouchbase Mobile, The database that talks sync. Matt IngenthronOptimizing Zend Framework for use on High Traffic Volume Web Sites Shawn StrattonCryptography in PHP: Use Cases Enrico ZimueljQuery Mobile: For Fun and Profit Daniel CousineauInjecting Domain Expertise into Varchars Jeff KiblerUsing SPL Tools in Your Code. Elizabeth Marie SmithCloudify Your Application Ed KietlinksiPerforming Security Audits Arne BlankertsPHP & MongoDB Steve FranciaPHP Testing Tools Sebastian BergmannDonnerstag, 20.10.2011Introducing Assetic: Asset Management for PHP 5.3 Kris WallsmithOptimizing Application Performance Kevin SchroederPuppet for Dummies Joshua ThijssenUnit Testing Zend Framework Apps Michelangelo van DamCare and feeding of a MySQL Database Dave StokesJavascript Tools and Frameworks Faves Anna FilinaMobile Development with Adobe AIR, Flash Builder, and Flex Mihai CorlanPowering Your Website with Realtime Data Bert Van HauwaertTaming the Cloud Rob RichardsImplementing the Open/Closed Principle Sam HennessyDesigning HTTP Interfaces and RESTful Web Services David ZülkeMobile: Push for Sync and Notifications Mike WillbanksMySQL 5.5 InnoDB Tuning Bill KarwinUsing GitHub Scott Chacon—— weitere Fundstücke ——Cloud Panel – Challenges and Tips for Developing Applications in the Cloud VideoUnConf: Domain-Driven Design – A Collaboration Between Domain Experts and Software PractitionersJeff Barr – Amazon Web ServicesAutomating ebay’s Infrastrcture Hugh E. WilliamsZend Framework 2 Matthew Weier O’PhinneyÄhnliche Artikel:Slides der ZendCon 2010Slides der php|tek 11Slides der PHPBenelux Conference 2011
PHP Clouds und Platform as a Service (PaaS): phpcloud von Zend
(Mon, 14 Nov 2011 12:56:57 GMT)  Die Zend Cloud phpcloud wurde auf der ZendCon 2011 im Oktober vorgestellt, ich habe mich natürlich direkt vorregistriert und seitdem auf einen Invite gewartet. Nun habe ich einen Invite-Key bekommen und direkt ein wenig damit experimentiert.Dieser Artikel stellt also eine weitere Platform-as-a-Service (PaaS) für PHP vor. Die Applikationen laufen auf einem Fundament namens Zend Application Fabric (ein aufgebohrter Zend Server) und können entweder in einer private Cloud oder bei einem der folgenden Anbieter gehostet werden: Rightscale, Amazon, IBM oder Rackspace (Info).Die Registrierung verlangt aktuell einen Zend-Account und den besagten Invite-Key. Danach muss man als nächstes einen Container anlegen in dem die Applikationen laufen werden. Ich lege also einen ersten Testcontainer an:Das gewählte Passwort ist, wie dort auch zu lesen ist, gleichzeitig auch das MySQL Passwort und das Passwort für die Zend Server Oberfläche. Es gibt die Möglichkeit einen SSH-Key hochzuladen oder ein neues Paar generieren zu lassen. Diese werden später für die Git und SFTP Verbindungen benötigt.Den Container kann man auch administrieren: Snapshots erstellen, Zurücksetzen und Löschen. Während der Beta kann man auch weitere Container anfordern.Der neue Container enthält dann eine Default-Application, die wir nun verwalten können. Auf der Seite erscheint eine phpcloud Willkommensseite. Wir können mit einem Klick nun weitere leere Applikationen erstellen oder auch andere vorgefertigte Applikationen installieren:Die neue Applikation können wir nun direkt aufrufen. Wir können den Code natürlich auch verändern, und zwar entweder via GIT oder via SFTP. Zend Studio bietet eine gute Integration, dort ist es etwas einfacher die Applikation einzubinden, aber prinzipiell kann natürlich jeder Client genutzt werden der GIT oder SFTP Support bietet. Hier beispielsweise mit PHPStorm per SFTP:PHPStorm beschwert sich wenn kein passender Public Key gefunden wird, den kann man aber herunterladen von der phpcloud Administrationsoberfläche. Die Verzeichnisstruktur ist auf den ersten Blick kompliziert da dort auch mit Versionen hantiert werden kann. Uns interessiert erstmal nur der untere public-Ordner der Default Application: applications/container-root/public den wir als Project-Root festlegen. blog1 ist übrigens eine 1-Click-Wordpress-Blog-Application.Und schon kann in der Cloud programmiert werden, bei jedem Speichervorgang wird die Datei per SFTP hochgeladen. Wer lieber mit Versionskontrolle, in diesem Fall GIT arbeitet, kann das natürlich auch wunderbar tun.Wenn man Code Tracing aktiviert kann man auch online Requests untersuchen, extrem cool!Der Container kann nun auch via Zend Server GUI gemonitored und administriert werden. Der Zend Server ist ziemlich mächtig und es macht viel Spass damit zu arbeiten. Für Details sollte man es sich selbst angucken, einige Stichworte sind Events, Jobs, Queue, Logs, Rules, php.ini Einstellungen, Monitoring usw.Bei ausgehenden E-Mails hat Zend das selbe Problem wie alle Cloud-Provider, selbst versenden kann die Cloud nicht und benötigt einen externen Mail-Server der das übernimmt.Insgesamt eine sehr nette Cloud muss man sagen. Wie gesagt aktuell Beta und nur mit Einladung, wer Interesse hat sollte sich also vormerken und auf eine Einladung warten. Die Features sind im großen und ganzen mit anderen Mitbewerbern vergleichbar (PHP 5.3, SFTP, GIT), nur der mächtige Zend Server sticht etwas heraus. Die mitgelieferte Job-Queue überragt auch die meisten anderen, ebenso wie Code-Tracing, das umfangreiche Monitoring und Event-Handling. Zur Zeit fehlt aber Unterstützung für Memcached, CouchDB/MongoDB und andere Dinge die man so brauchen könnte. Bin sehr gespannt wann die kommen und wie die Preisstrukturen später aussehen werden.Ähnliche Artikel:PHP Clouds und Platform as a Service (PaaS): cloudControlPHP Clouds und Platform as a Service (PaaS): ÜbersichtNicht-HTML-Responses mit dem Zend Framework
selfoss 1.0 final
(Sun, 13 Nov 2011 15:50:02 GMT)  So, endlich ist es vollbracht. selfoss 1.0 ist verfügbar. Dazu gibt es jetzt auch eine eigene Webseite, wo natürlich die Werbetrommel ordentlich angeheizt wird und mit Buzzwords nur so um sich geworfen wird.Neu verfügbar ist nun neben MySQL ein Datenbankbackend für Sqlite und MongoDB (danke Harald). Zudem habe ich noch ein paar Bugs entfernt. Vielen Dank an alle Betatester. Euer Feedback war echt super!Auf selfoss.aditu.de ist nun auch eine Dokumentation zu finden. Dort ist auch eine kurze Erklärung, wie eigene spouts, also andere Anwendungen und Quellen an Selfoss angeschlossen werden können. Dazu habe ich hier im Blog ja auch schon einmal ein Tutorial geschrieben.Tja, sonst kann ich nur sagen: schaut euch selfoss einfach einmal an. Ich nutze es ja schon seit einigen Monaten und schätze die schlichte und übersichtliche Art, News zu lesen sehr.
Velocity Europe Tag 2: Whao!
(Fri, 11 Nov 2011 12:35:02 GMT)  Speeeed! Genauso wie der letzte Tag geendet hat beginnt der zweite.Steve und John eröffnen den zweiten Tag mit einer kurzen Opening Keynote, gefolgt von Jeff Veen der von den Problemen berichtet als Typekit einige Tage vor Weihnachten vom Erfolg überrollt wurde, und wie innerhalb eines Wochenendes das Problem kurzerhand gelöst werden musste und auch wurde. Das Grundproblem waren die vielen Kits die nicht zeitnah in das CDN gebracht werden konnten, und sich so eine massive Queue aufgebaut hatte. Ich mag solche praxisnahen Einsichten sehr. Eine These bzw. Grundsatz der Kultur der Firma: IRC über E-Mail. Im IRC kann man kurze Fragen und Antworten schreiben wie “no”. In E-Mails haben wir irgendwie den Zwang, formal zu schreiben und viele Sätze zu bilden. Das bläht schnelle interne Kommunikation unnötig auf.Die folgenden zwei Lighning Demos stellten kurz Dynatrace Ajax Edition und FITB vor. Dynatrace ist eines der führenden Tools um sehr tief in Browser hereinschauen zu können (auch IE6/7!) und so Reflowes, Repaints usw sehen zu können und komfortabel Performance-Bottlenecks zu finden, die man ohne solche Einsichten nicht oder nur sehr schlecht eingrenzen kann. FITB ist ein PHP-basiertes Tool um Netzwerke zu monitoren und Graphen zu erstellen. Mit einer Zeile in der Konfiguration werden neue Switches hinzugefügt, alle aktiven Ports werden automatisch erkannt und Graphen erstellt.Weiter ging es mit Arnaud Becard von ip-label, er zeigt auf wie wichtig Real User Monitoring (RUM) ist, und warum das wichtiger ist als künstliche Messwerte von einfachen Tools. Gerade unterschiedliche Bandbreiten (schnelles DSL, ISDN, Mobile), aber auch Browsergenerationen einzeln zu betrachten ist sehr sinnvoll. Auch Kleinigkeiten wie beispielsweise der Umstieg von HTTP 1.0 auf HTTP 1.1 mit KeepAlives kann bis zu 30% Performance Unterschied bringen!John, einer der Mitorganisatoren und Moderatoren zeigt auf wie unmöglich es ist, Systeme ohne Fehler zu erstellen. Gerade bei Systemen wo man wirklich darauf achtet wie Amazon, Blackberry oder auch die Challenger Katastrophe zeigen dass man mit Ausfällen leben muss, es geht einzig darum sie möglichst schnell in den Griff zu bekommen und die Konsequenzen gering zu halten. Dazu gehören neben vielen anderen Dingen auch vor allem die Überlegungen vorher was alles passieren könnte (was mit viel Erfahrung natürlich besser gelingt), aber auch ein durchdachtes Troubleshooting und Kommunikation. Was passiert wenn das Netz ins Rechenzentrum ausfällt, möchte man dann Shellkommandos durchs Telefon durchsagen oder möchte man vor Ort einen Notfallplan liegen haben? Das Lernen aus Vorfällen ist auch ein sehr wichtiger Punkt. Messen ob Gegenmaßnahmen in der Zukunft gegriffen haben. Vor großen Änderungen und Deploys schreibt jeder Mitarbeiter eine Liste mit Dingen die passieren könnten…Wenn man noch nie einen Ausfall hatte wird der nächste Ausfall schlimm werden, wenn man öfter Ausfälle hat wird der nächste schnell und gut gelöst. Übung und Vorbereitung macht den Meister!Dann betrat Artur Bergmann die Bühne, ein Veteran der Velocity-Konferenzen. So ganz genau kann man seinen Vortrag nicht zusammenfassen, im Prinzip ging es glaube ich darum zu zeigen dass man sich mit der Materie auseinander setzen sollte mit der man arbeitet, und generell sind Computer, Kernel und Tools kacke bis auf sehr wenige Ausnahmen. Wenn man in irgendwelchen Graphen Load-Spitzen erkennt tippt man zuerst auf die Applikationen, aber auch der Linux-Kernel ist laut Artur kaputt und schlecht dokumentiert, man sollte sie nie auf Magic verlassen. Seinen alten Jeep mag er deutlich lieber als einen Porsche Cayenne, da man ihn leicht verstehen, reparieren und erweitern kann. Ich hätte auch mal mitzählen sollen wie oft er “What the fuck” gesagt hat ;-)Bei Spil Games, einem der führenden Spieleanbieter hat man mit 140 Millionen Unique Users pro Monat zu tun, und um User zu binden und zu gewinnen benötigt man vor allem eines: Geschwindigkeit! Wenn ein Spiel erst nach 15 Sekunden startet ist ein User wieder weg, wenn es nach 7 Sekunden da ist und das schneller ist als bei der Konkurrenz, dann bleiben sie und spielen wie verrückt. Dabei gilt es auch an langsame Verbindungen zu denken, Usern in Brasilien sollte man beispielsweise vorzugsweise bandbreitenschonende Spiele anbieten. Benutzer sind der Schlüssel, die Erfahrung der Benutzer, und dazu gehört eine gute Performance. Performance ist kein Projekt das ein Ende hat, sondern eine andauernde Mission. Focus: 5 Mitarbeiter wegschicken und nur an Performance arbeiten lassen ab und zu, aber auch permanent dran arbeiten. Wenn man einen Request um 4Sekunden verkürzen kann und das 1 Tag dauert: Machen! Messen messen messen und nie wieder langsamer werden, nur schneller, es gibt keine Ausnahmen und Entschuldigungen. Einblicke gewinnen, Multi Varianten Tests und A/B Tests, Aufschlüsselung von Messdaten nach Land, Spieltyp usw., auch in Staging Environment messen vor Deploy… Lernen: Bücher, Velocity Videos, Google Analytics Site Speed, CDNs, head.js, css/js/images kombinieren Low hanging fruits finden… Von 5s DOM Load auf 360ms DOM Load, und von 11s Full Page Load auf 4s Full Page Load.. An durchschnittlichem Samstag spart das den Usern 4 Jahre Wartezeit!Beim nächsten größeren Block haben sowohl Opera als auch Chrome und Firefox über aktuelle Entwicklungen im Bereich Performance erzählt.Opera arbeitet an SSL False Start, verbesserten Netwerkstack, Strict Transport Security, Opera Turbo, Opera Dragonfly als Remote Debugger vor allem für mobile Geräte, Opera Mini, angenehmeres und ruckelfreies Scrollen gerade auf schwachbrüstigen Geräten usw.Tony Gentilcore von Google berichtet über Chrome Features, von Chrome Frame für den IE mit Aufforderung im IE zur Installation, <link rel=”prerender”>, webkitvisibilitychange event, Developer Tools verbessert (Timeline, Memory Profiler), requestAnimationFrame und einiges mehr.Chris Heilmann von Mozilla gab bewußt keinerlei Zahlen im Detail für Firefox, denn die sind in sehr wenigen Wochen schon wieder outdated. Generell berichtete er von der Wichtigkeit von Browsern, dass es dem User generell freisteht welchen Browser er benutzt. Kurz riss er einige neue Features an wie die Web Console, Style Inspector, Scratchpad, Navigating visually, Sourcemapping im Javascriptbereich (Coffeescript), TILT um HTML-Verschachtelungen darzustellen.Ramon erzählte über Hyves, dem sehr beliebten holländischen Sozialen Netzwerk. Bei 16,7 Millionen Niederländern hat Hyves 9,7 Millionen Accounts und 2 Millionen Unique Visitors pro Tag. Die Last wird mit 3500 Servern in 3 Rechenzentren bewältigt, 6Gbit Bandbreite, 12 Entwickler, 33 Entwickler. Einer dieser Entwickler hat an einem Wochenende HipHop for PHP ausprobiert und dabei eine 3-7 fache Performance feststellen können. Mit dieser Aussicht macht man sich daran es für einen Teil der Seiten einzusetzen, dabei entstand ein Binary von 750MB Größe, das auf 700 Frontend-Server deployed werden mußte. Die Kompilierung dauert anfangs 40-60 Minuten, nach massiven Verbesserungen und neuer Hardware konnte das auf <10 Minuten gedrückt werden. Probleme wie eval, Destruktoren etc. wurden beseitigt. Mit Hilfe von Jenkins und sollte das Deployment passieren, ein serielles Ausrollen kam nicht in Frage (bei 1Gbit Netzwerk würde das bei 700 Servern sehr lang dauern), nur ein Diff der Binarys deployen kommt nicht in Frage da das Diff teilweise 400MB groß ist. Erste Lösung: Bittorrent: Gemacht in Live Umgebung: Totalausfall des Netzwerkes, da alle Leitungen und Switches überlastet wurden über viele Minuten, selbst Admin-Zugang nicht mehr möglich. Danach Murder von Twitter angeschaut, einen eigenen Tracker geschrieben, einen modifizierten rtorrent-Client ohne DHT und UPNP etc., Definition von mehreren Schwärmen um die Rechenzentren zu trennen, Begrenzung im Client auf 90Mbit usw..Johannes Mainusch von Xing plauderte auch etwas aus dem Nähkästchen, von Problemen beim Messen der Performance, nur jeder 200. Besucher schickt Messdaten an den Server. onbeforeunload() Cookie setzen, auf nächster Seite Zeit messen bei onLoad. Wenn Benutzer in das Login Formular klickt werden schonmal einige Bilder vorgeladen die auf der nächsten Seite gebraucht werden. Tweets pro Tag werden gemessen und vieles vieles mehr. Unter anderem auch Anzahl der Registrierungsmails, Anzahl Anleitung nach erstem Login, Anzahl Passwort vergessen, Benutzungen des Handshake-Features per Google Earth und kml.Bradley Heilbrun von YouTube bzw. Google konzentrierte sich speziell auf das Thema HTTP Connection Handling. Was tut man wenn man mit 6 Servern beginnt und überrollt wird und sehr schnell skalieren muss? Hunderttausende von gleichzeitigen Verbindungen müssen gehalten werden, und wenn Apache für jede Connection einen Prozess startet? Man benötigt einen guten Loadbalancer bzw. spezialisierte Software, die das kann, und idle-Connections halten kann. nur Requests gehen dann durch auf die Backend-Webserver, die früher mit mod_php und mpm_prefork liefen. Besser: FastCGI und mpm_worker, bessere Skalierungsmöglichkeiten. Weiter hilfreich: URL Routing. Später dann Probleme als man > 5 IPs im DNS veröffentlichen wollte, >512 Byte, Umschwenk von UDP auf TCP. Dann wurde es nötig mit Direct-Server-Return zu arbeiten und 2 Load-Balancer-Schichten einzuführen. Bei Global Server Load Balancing (GSLB) sind Länder-Subdomains (us.youtube.com, eu.youtube.com …) doof, Indizierungsprobleme, Bookmarks usw… Anycast doof. Besser Geo-DNS.So, das war es im groben Überblick, es war unglaublich wie viele interessante Eindrücke ich gesammelt habe, hoch interessant wenn solche großen Firmen und Weltmarkführer ihre Erfahrungen vermitteln, da könnte ich wochenlang zuhören. Eine wirklich tolle Konferenz ist nun zuende, und ich würde jedem empfehlen an der nächsten Velocity Europe teilzunehmen wenn möglich, es lohnt sich auf jeden Fall!Übrigens bemerkenswert war das Vorhandensein eine Übersetzers in Gebärdensprache, cool!      Ähnliche Artikel:Velocity Europe Tag 1: Der VormittagVelocity Europe Tag 1: Die Sessions am NachmittagFast by Default – O’Reilly Media’s Velocity Konferenz kommt nach Berlin!
MediaWiki 1.18 integriert jQuery und Plugins
(Thu, 10 Nov 2011 10:55:01 GMT)  Eine erste Betafassung der Wiki-Software steht zum Testen bereit. MediaWiki wird jetzt standardmäßig mit jQuery ausgeliefert. Allerdings handelt es sich in der Beta noch um die Version 1.6.4. Dazu kommen eine Menge jQuery-Plugins, die den Funktionsumfang der Software aufwerten. Neben neuen und ausgebesserten Features gibt es auch einige API-Änderungen, auf die sich Entwickler einstellen müssen. Dafür bieten neue Programmierschnittstellen die Möglichkeit, auf QueryPage-basierte Seiten zuzugreifen, um Seiten zu vergleichen, Dateien zurückzusetzen und auf besondere Seiten zuzugreifen, darunter Special:UnwatchedPages, Special:MimeSearch und Special:ActiveUsers. Die Details sind dem Changelog zu entnehmen. MediaWiki 1.18 setzt PHP 5.2.3 voraus. PHP 4 wird nicht mehr unterstützt. (jp)Info: MediaWiki
Metadatenprozessor Apache Tika 1.0 veröffentlicht
(Wed, 09 Nov 2011 10:25:00 GMT)  Das Tika-Projekt stellt die erste stabile Version Tika 1.0 vor. Tika wurde ursprünglich als Unterprojekt von Lucene entwickelt. Das Toolkit dient zur automatisierten Analyse von Dokumenten unterschiedlicher Art. Darin findet die Software strukturierten Text und Metadaten, die sie anschließend extrahiert und in anderen Anwendungen zur Verfügung stellt. Dabei greift Tika auf existierende Parser-Bibliotheken zurück.In Version 1.0 haben sich noch einige Änderungen ergeben. Verbesserungen gibt es bei der Konfiguration, die den Anwender nicht mehr auf die Parser und Erkennungsklassen des jeweiligen Standard-Class-Loaders festlegt. In einer OSGi-Umgebung benutzt Tika automatisch die verfügbaren Parser und Erkennungsdienste, die zur Verfügung stehen. Schließlich haben die Entwickler für Tika 1.0 noch alle veralteten API-Methoden entfernt. (jp)Info: Apache Tika
Hinweis: Der Feed "PHP-Journal Newsfeed" und dessen hier dargestellten RSS-Inhalte liegen urheberrechtlich beim Autor der Betreiber-URL (siehe RSS-Link). Auf den Inhalt von "PHP-Journal Newsfeed" hat RSS-Nachrichten.de keinen Einfluss. (31361-4-212-1 - 0)

Passend zu diesem RSS-Feed haben wir folgenden Themen für Sie recherchiert:
Digitalkamera, Megapixel sind nicht alles
Es werden häufig beim Kauf der Digitalkamera Megapixel völlig überschätzt. Die Händler übertrumpfen sich hier und Kunden werden komplett in die .. mehr
Mobile Scanner für alle Lebenslagen
Nicht nur Versicherungsfachleute, sondern auch andere Berufsgruppen sind im täglichen Leben auf ein Notebook angewiesen. Ein interessantes Zubehör i.. mehr
Lotus Server: das Datenbanksystem
Wer einen Server benötigt, der ist mit einem Lotus Server gut beraten. Diese professionelle Einrichtung wird privat wie geschäftlich wegen seiner ho.. mehr
Das RAID System - effiziente Arbeit
Ein RAID System ist eine effektive Maßnahme zum Schutz von Daten vor Ausfällen. Es ermöglicht zudem Wartungsarbeiten oder den Austausch von Festpla.. mehr
Gebrauchte Monitore sind kaum erhältlich
Gebrauchte Monitore haben inzwischen kaum noch einen Markt, denn die Zeiten, zu denen ein 20-Zoll-Bildschirm noch richtig teuer war, sind einfach vorb.. mehr
 RSS Startseite ·  Nachrichten ·  RSS-Verzeichnis ·  Weblogs ·  Podcasts ·  Video-Podcasts ·  RSS-Reader ·  Podcatcher  
Was ist RSS? ·  Neuen Feed eintragen  
RSS Verzeichnis
Top-Feed des MonatsTop-Feeds des Monats aus der Kategorie: PHPPHP-Journal NewsfeedPHP-Journal NewsfeedPHP MagazinPHPWelt Script-Archivphparchiv.de RSS FeedphpBB.de Knowledge Basephpforum.depost-nuke.netPHP-CenterPHPNuke.deArchiv2012 | 2011 | 2010 | 2009 | 2008 | 2007 | 2006 | 2005Aus diesem BereichMini Laptop die Alternative zum Notebook Handheld PDA: der AlleskönnerDigitalkamera Zoom, dreifach optisch reichtWie kann man eine Festplatte reparieren?Laptop kaufen: vorher gut informierenDas PDA DisplayFaxen mit PC kann so einfach seinGoogle PDA: Internet im KleinformatScanner Linux - kinderleichte BildbearbeitungEinfach Druckerpatronen nachfüllenFotos online bestellen - Qualität und Sicherheit entscheidetDigitalkamera Powershot mit neuer LeistungLaptop Docking StationTWAIN Scanner: Erfolgreich arbeitenDatenrettung der Festplatte: selbstgemacht oder einschicken?Neue ThemenSephora Kosmetik - Beautypionier mit MarkenproduktenDie Jahresplaner 2011 in großer AuswahlSchnell und einfach Geld verdienen, aber wie?Die richtige Festnetz Flatrate ohne Internet findeniPhone Update: Termine aller iPhone-OSX-UpdatesEin Baufinanzierungsrechner verschafft den ÜberblickHandyvertrag ohne Schufa-Auskunft möglich.Kohlenhydrate Diät: Essen nach Tabelle ist nicht notwendig!Kreatin: Nebenwirkungen von Kreatin MonohydratKostenloses Girokonto im Vergleich bewertenKredit von Privat als AlternativeForex Trading, aber richtigJetzt Amazon Gutschein sichern.Lohntabelle zum vergleichen der GehälterMehr Zinsen beim Festgeld.
RSS · Nachrichten · RSS Reader · Podcatcher · RSSFeed eintragen · Verzeichnis
Impressum · AGBs & Nutzungsbedingungenn · Partnerprogramme · Sitemap


· Diese Seite wurde generiert in 1.75251 Sekunden ·
© 2004-2012 RSS Nachrichten -