Category archive: Programmierung

Futuristisches, minimal und hell eingerichtetes Büro mit einem Mitarbeiter an seinem Schreibtisch.

Die ideale IDE

Wer PHP professionell entwickelt wird sich früher oder später auf die Suche nach einer geeigneten IDE begeben. Inzwischen gibt es hier auch für PHP einige interessante Stücke Software: PDT, Zend Studio, NetBeans for PHP, uvm.

Für welche IDE man sich entscheidet hängt entweder von den Präferenzen des Entwicklers ab oder davon was die Firma dafür ausgeben will. Immerhin hat man die Wahl zwischen ausgereiften kostenlosen Produkten und kommerziellen Varianten, die je nach Lizenztyp auch mal schnell ins Geld gehen können.

Eine weitere Frage, die man sich stellen muss ist die, was die IDE alles können soll/muss. Code-Completion versteht sich von selbst, aber was gibt es sonst noch? SVN-/Git-Integration? FTP? Automatische Erstellung von Dokumentationen anhand des Codes? Datenbank-Management? Debugger? Automatisierte Unit-Tests? Oder etwas ganz anderes?

Und wer sich bis jetzt noch nicht gefragt hat warum ich genau die drei oben genannten IDEs aufgezählt habe erfährt jetzt warum. Das sind nämlich genau diejenigen, die ich bisher verwendet und getestet habe. Hier also nun meine Eindrücke.

PDT

PDT ist eine freie IDE, die auf Eclipse basiert. Dadurch, dass hier schon eine ausgereifte IDE im Hintergrund arbeitet und die PHP-Integration eher durch Plugins erfolgt als durch Einbau in die Basis hat man viele benötigte Features quasi schon frei Haus.

Jedoch ist PDT in meinen Augen bei weitem noch nicht ausgereift und es fehlen viele Features, die man als professioneller PHP-Entwickler benötigt. Zudem laufen viele Prozesse in der IDE, die man für die Entwicklung von PHP gar nicht benötigt, was die Software teilweise mächtig ausbremsen kann.

Zend Studio

Wenn es nach Zend geht ist das Zend Studio die ultimative IDE für PHP. Früher war sie das auch, zumindest bis Version 5.5. Seit der Nutzung von Eclipse und PDT als Basis hatte ich nur noch Probleme. Also jetzt bitte nicht falsch verstehen, die IDE ist wirklich großartig, wenn sie funktioniert. Jedoch war zumindest in meinem Fall einiges an Handarbeit nötig bis es soweit war. Und da ich mich sehr über diese sündhaft teure verbuggte IDE geärgert habe will ich auch gar nicht mehr Worte darüber verlieren.

NetBeans for PHP

Seit einiger Zeit nutze ich NetBeans for PHP. Eine super IDE, die wirklich schnell und zuverlässig arbeitet und einige sehr interessante Features hat, die sonst keine IDE zu bieten hat. Natürlich gibt es auch hier nicht alles, was man sich wünscht, aber das was vorhanden ist funktioniert einwandfrei.

Und du?

Nun liegt es an dir. Welche IDE nutzt du und warum?

Langzeitaufnahme einer Straße mit vorbeifahrenden Autos, deren Scheinwerfer lange Lichtspuren ziehen.

(Mikro-)Optimierungen

Es gibt dutzende, wenn nicht sogar hunderte oder tausende, Wege eine Anwendung performanter zu gestalten. Einer der meistgenutzten Wege ist die Optimierung des Codes. Hierbei gibt es natürlich einige sehr interessante und gute Ansätze, aber auch viele, die die Wartungsfähigkeit des Codes einschränken oder schlichtweg nur minimale Gewinne bringen.

Vorweg wollen wir uns jedoch mit der Frage beschäftigen, ob Optimierungen wirklich nötig sind. Wenn eine Anwendung in einer für den Nutzer zumutbaren Zeit reagiert sollte man sich keine Gedanken machen hier noch etwas zu verbessern. Ebenso sollte man sich keinen unnötigen Aufwand zumuten, wenn sich das Problem durch Aufstocken der Hardware lösen lässt. Meist bringt das mehr und kommt günstiger. Man sollte jedoch dringend etwas unternehmen, wenn sich die Hardware sowieso schon auf einem Maximallevel befindet und diese an ihre Grenzen stößt.

Der übliche Weg ist dann mithilfe eines Profilers die Stellen im Code zu finden, die die Anwendung ausbremsen. Sobald man sie gefunden hat macht man sich Gedanken, was man verbessern kann. Beispiele hierfür sind weniger Datenbankabfragen ausführen, Ergebnisse zu cachen, Statements optimieren, etc.

Was man jedoch tunlichst vermeiden sollte sind Mikro-Optimierungen. In PHP gibt es hierfür einige tolle Beispiele, z.B. Strings in einfache Hochkommata schreiben, Prekrement statt Postkrement verwenden, kürzere Variablennamen zu verwenden, usw. Ich persönlich habe mir zwar einige Sachen davon angewöhnt, da es nie schaden kann hier und da eine tausendstel Millisekunde zu sparen, jedoch bringen diese Optimierungen meistens keine Verbesserung im Gegensatz zum vorherigen Stand. Viel wichtiger ist es seinen Code nochmal zu überdenken und alternative Methoden zu finden, die die Ausführung beschleunigen.

Irgendwie habe ich gerade das Gefühl, dass ich was komplett anderes geschrieben habe als ich ursprünglich wollte, aber die wichtigste Message habe ich genannt und darauf kommt es an. Übrigens gibt es auch bei PHP hates me einen Artikel dazu.

Stark im Farbton angepasstes Bild von Luftballons auf einem Tisch vor einem hellen Hintergrund.

Herzlichen Glückwunsch zu 500 Artikeln

Schule behindert. Zumindest dann, wenn man eigentlich zeitnah über ein großes Ereignis in der deutschen PHP-Community berichten will wie das Jubiläum von PHP hates me. 500 Artikel gibt es dort nun schon zu bestaunen und sein Vorsatz jeden Tag einen Artikel zu veröffentlichen hat bisher auch wunderbar funktioniert. Herzlichen Glückwunsch dazu!

Wie es sich für ein Jubiläum gehört feiert Nils natürlich nicht allein im stillen Kämmerlein, sondern hat ein Gewinnspiel auf die Beine gestellt mit einigen interessanten Preisen. Und als ob das noch nicht reichen würde ziert auch noch ein neues Design die Website, welches ich übrigens sehr gelungen finde.

So, genug geschwafelt. Auf gehts zur Party im Blog von Nils!

Ein Elefant auf einer grünen Wiese. Im Hintergrund sind Berge zu erkennen.

Warum PHP?

Dieser Artikel bezieht sich auf einen Beitrag im PHP Labor, der die Frage stellt “Warum PHP?“. Der Artikel ist sehr interessant zu lesen, da aber jeder seine eigene Meinung hat, was auch gut ist, will ich mich heute auch dieser Frage stellen und eine Antwort darauf geben.

Zuerst einmal der Weg wie ich zu PHP gekommen bin. Vor ein paar Jahren fing ich an mit simplem HTML Websites zu erstellen. Irgendwann folgte dann CSS und die Websites wurden komplexer. Gerade als ich soweit war diese beiden Sprachen zu verstehen hatte ich das erste Mal Kontakt mit PHP. Ich wollte damals ein Forum für die Mitglieder meines “Clans” bereitstellen.

Leider hatte ich damals keine Ahnung was ich mache und habe einfach so lang rumgewurschtelt bis es gepasst hat. Dann fing jedoch recht bald danach meine Ausbildung zum Fachinformatiker (Anwendungsentwicklung) bei der infomax websolutions GmbH an. Dort hatte ich dann zum ersten Mal mit einer richtigen Anwendung zu tun. Unter Anleitung habe ich dann Schritt für Schritt die Sprache gelernt.

Heute, fast drei Jahre danach, wage ich zu behaupten, dass ich PHP durchaus gut kenne und auch kann.

Aber warum PHP und nicht Java, C#, Python oder sogar Delphi? Nun, jede Sprache hat ihren Reiz und auch einen mehr oder weniger festgelegten Einsatzzweck. Bei PHP fasziniert mich die Einfachheit. Es ist super einfach die Sprache zu lernen und damit Anwendungen zu programmieren. Von einfachen Skripten, die nur einen einzigen Zweck haben bis hin zu hochkomplizierten Anwendungen nach allen Regeln der Programmierkunst ist alles möglich. Und das meist recht schnell.

Auch der Einstieg ist schnell geschehen. Installiere dir einen Webserver mit PHP und lege los. Es muss nichts kompiliert werden, sondern Änderungen sind sofort sichtbar. Alles Dinge, die ich mag und so schnell nicht aufgeben will.

So, das war meine Meinung zu der Frage “Warum PHP?”. Was sagst du dazu?

Eine große grüne Wiese mit einigen Heustapeln, die mit Stöcken und Planen zusammengehalten werden.

Die Nadel im Heuhaufen, oder andersrum?

Erst vorgestern habe ich einen gewaltigen Bug im Code eines Projektes gefunden, weil PHP die Parameter anders erwartet hat, als ich sie angegeben habe. Daraufhin folgte ein Tweet und die Erkenntnis, dass es oftmals keine Gemeinsamkeiten gibt in der Parameterfolge von Funktionen.

Als Beispiel habe ich strpos() zu nennen, welches zuerst den Heuhaufen erwartet und dann erst die Nadel. Das Gegenbeispiel dafür ist in_array(), wo man zuerst die Nadel angibt und dann den Heuhaufen, in dem gesucht werden soll.

Wovon ich hier eigentlich spreche? Von Suchfunktionen auf diverse Typen in PHP. Mal gibt man zuerst das an, wo gesucht werden soll und ein andermal das, wonach gesucht werden soll. Das ist eindeutig doof und führt zu Verwirrungen. Man kann zwar behaupten, dass Funktionen, die Strings durchsuchen immer die gleiche Reihenfolge nutzen und die für Arrays auch, aber warum hat man sich hier nicht von Anfang an Gedanken gemacht und das angeglichen. Wäre das so schwer gewesen?

Nun gut, jetzt weiß ich es besser und passe auf, was wohin kommt. Auch trübt dies nicht meine Freude an der Programmiersprache an sich, aber eventuell macht sich ja nochmal jemand Gedanken darüber. Vielleicht für PHP 6?

Foto der Bühne, auf der die erste Keynote der International PHP Conference 2009 in Karlsruhe, stattfand.

IPC 2009 – Tag 1

Da ich, wie ich bereits geschrieben habe, pünktlich angekommen bin habe ich die Eröffnungssession auch noch mitbekommen, die einen kleinen Einblick in das vielfältige Programm der International PHP Conference und der webtech gab. Kurz darauf ging es dann auch schon mit der Session “Design Patterns” von Cal Evans bei mir los und das war genau richtig als Einstimmung auf die nächsten drei Tage.

Design Patterns von Cal Evans

Gestartet hat die Session direkt mit einer Buchempfehlung: “Design Patterns” von der Gang Of Four. Anschließend ging er dann großteils auf das MVC-Pattern ein und hat dessen richtige Verwendung erklärt, z.B. sollte ein Model niemals direkt auf eine Datenbank abbilden, da die Datenquellen eines Models wesentlich vielfältiger sein können. Sie können neben Datenbanken auch auf Webservices, etc. zugreifen und ihre Daten von dort beziehen.

Controller sollten ebenfalls keine großen Logiken beinhalten, sondern nur dafür Sorge tragen, dass die Daten vom Model zum View und umgekehrt gelangen. Jedoch sollten im Controller die Exceptions gefangen werden. Das Stichwort, welches ich vor kurzem dazu gelernt habe, nennt sich “Fat Model, Tiny Controller”.

Der View sollte logischerweise keine Logiken enthalten, sondern nur für die Darstellung sorgen. Dafür kann er, wenn nötig, auch direkt auf das Model zugreifen, darf jedoch keine Daten schreiben, sondern nur lesen.

Abgesehen davon ist er noch auf das Decorator Pattern eingegangen, welches anstatt multipler Vererbungen verwendet werden sollte, da man damit wesentlich flexibler ist.

NetBeans IDE von Petr Pisl

Die zweite Session stand ganz im Zeichen der aktuellen Betaversion von NetBeans, einer schlanken, aber sehr mächtigen IDE für die Entwicklung in verschiedenen Programmiersprachen. Da es bei der IPC logischerweise um PHP geht wurden auch nur die neuen Features dieses Pakets abgehandelt.

So soll die neue Version nach Plan am 10.12.2009 erscheinen und viele neue Fähigkeiten besitzen. Die erste genannte war eine Codevervollständigung ohne PHPDoc. Dafür scannt NetBeans den Code und versucht anhand verschiedener Indikatoren herauszufinden, was die Methoden und Funktionen für Rückgabewerte liefern. Auch soll PHPDoc nun eine Code-Completion erhalten, ebenso wie einzelne Elemente eines Arrays oder auch SQL, welches in Strings vorkommt. Man kann nun auch bestimmte Ordner aus dem Index für die Vervollständigung herausnehmen.

Abgesehen von diesen Features, die ich enorm spannend finde soll auch das Erstellen von Unit-Tests sehr einfach werden und die Ausführung dieser ebenso. Das Handling dieses Features erinnert mich stark an Zend Studio for Eclipse, wo das auch möglich ist.

Continuous Integration von Stefan Priebsch und Sebastian Bergmann

Diese Session war für mich extrem interessant, da ich mit diesem Thema noch nicht wirklich in Berührung gekommen bin. Die ersten Aussagen der beiden hat auch direkt beinhaltet, dass man unbedingt automatische Tests durchlaufen lassen soll und mindestens einmal täglich den aktuellen Stand zu integrieren, also zu committen.

Anschließend wurde der Wert von Continuous Integration angesprochen, der sehr hoch ist. Durch dieses Verfahren verringert man Risiken und reduziert gleiche Prozesse, da nicht überall die gleiche Software installiert werden muss. Abgesehen davon erzeugt man deploybare Software, sorgt für größeres Vertrauen in den eigenen Code und die Sichtbarkeit eines Projektes wird erhöht, da jeder immer den aktuellsten Stand einsehen kann.

Um mit diesem Verfahren starten zu können muss man zuerst einmal die Prozesse herausfinden, die automatisiert werden können. Hieraus soll dann ein “Non-Event” gemacht werden, was im Klartext bedeutet, dass es sehr einfach sein soll diesen Prozess auszuführen, z.B. durch einen Klick auf einen Button oder ein kleines Skript.

Zuletzt wurden dann noch diverse Tools vorgestellt, die man nutzen kann und die ich hier einfach nur auflisten will, da ich mich damit noch nicht weiter beschäftigt habe: CruiseControl, phpUnderControl, Hudson, Atlassian Bamboo und Arbit.

Event Driven Architectures von Benjamin Eberlei

PHP an sich unterstützt nur bedingt Events, da es eine request-basierte Sprache ist. Jedoch gibt es zwei Patterns, die man nutzen kann, um so eine Architektur zu bilden: Das Observer-Pattern und das Event-Dispatcher-Pattern.

Doch auch dies reicht noch nicht aus, um auf Events reagieren zu können. Dazu sind weitere Tools notwendig, wie z.B. XMPP, dropr oder Gearman. Erst durch diese wird es möglich auch asynchron mit PHP arbeiten zu können. Von diesen drei Tools hat Benjamin noch Gearman etwas weiter vorgestellt, welches durch seine einfache Nutzung bei mir punkten konnte.

Wer langsam ist verliert von Dr. Johannes Mainusch

Diese Session war von der webtech und sehr interessant. Es wurde davon berichtet, welche Ziele sich XING gesetzt hat und wie sie es geschafft haben diese zu erreichen.

Die Performance von Websites ist sehr wichtig und jede Seite sollte innerhalb von zwei Sekunden komplett geladen werden, da ein Mensch in dieser Zeit eine Reaktion erwartet. Wenn nichts voran geht kommt Frustration auf und die Plattform wird verlassen. Diese Nutzer kommen auch meist nicht wieder. Dabei macht die Zeit, die der Server für die Datenverarbeitung benötigt, meist nur einen kleinen Teil aus, der größte Teil findet jedoch auf dem Weg vom Server zum Nutzer statt.

Um hier für mehr Geschwindigkeit zu sorgen ist es erstmal wichtig die Engpässe zu finden. Wie groß sind die ausgelieferten Dateien, werden diese vom Browser gecached, gibt es langsame Requests usw. Hat man hier alles identifiziert kann mit der Optimierung begonnen werden. Man kann dann anfangen Dateien zusammenzufassen, das Caching für den Browser zu beeinflussen usw.

Fazit

Alle diese Sessions waren sehr interessant und ich bereue es nicht andere Sessions besucht zu haben. Es waren viele spannende Themen von kompetenten Speakern, die zumindest mir einige neue Erkenntnisse gebracht haben.

Entwickler im ersten Talk von Cal Evan auf der International PHP Conference 2009 in Karlsruhe.

IPC 2009 – Eine Zusammenfassung

Wir schreiben den 16. November 2009. An sich genommen kein besonderes Datum. Doch einige unter uns Menschen, die sogenannten Geeks, Nerds und Konsorten freuen sich auf ein großes Event, welches in Karlsruhe stattfindet: Die International PHP Conference 2009.

Auch ich gehöre zu dieser auserlesenen Personengruppe und bin bereits seit Sonntag in Karlsruhe, um gleich morgens mit der Begrüßungssession durchstarten zu können.

Neben der IPC läuft parallel noch eine weitere Konferenz, die damit ihre Premiere feiert. Die webtech Conference hat sich aus der webinale heraus entwickelt und soll mehr auf die tatsächlich verwendeten Technologien im World Wide Web eingehen und kein Querbeet-Programm bieten, sondern sich gezielt an Webentwickler richten.

Beide Konferenzen bieten viele interessante Sessions zu allen möglichen relevanten Themen, die man sich im jeweiligen Umfeld nur denken kann. Somit gibt es insgesamt an die 150 Sessions (ich habe nicht nachgezählt). Für Besucher, die einen Super-Konferenz-Pass habe, so wie mich, gibt es sogar als Schmankerl kostenlos ein Netbook oder besser gesagt ein Intellibook.

Doch nun zur Zusammenfassung, bevor ich mich hier noch in irgendwelchen langwierigen Erklärungen verstricke

Sonntag, 15. November 2009

Nach einiger Verspätung bin ich in Karlsruhe angekommen und nachdem ich im Hotel eingecheckt habe, habe ich mich direkt auf den Weg ins Konferenzzentrum gemacht, um noch etwas von der Unconference, für die ich angemeldet war, mitzubekommen.

Doch das war eine herbe Enttäuschung, da mir die Dame am Empfang mitgeteilt hat, dass sich die Unonference aufgrund mangelnder Teilnehmerzahl zerschlagen hat. Wie ich am nächsten Tag erfahren habe waren ganze sieben Leute anwesend. Nichtsdestotrotz wurde mir angeboten die laufenden Workshops zu besuchen. Da ich jedoch schon recht spät dran war und die Workshops nur noch ca. 45 Minuten dauerten bin ich stattdessen ins Kino gegangen.

Montag, 16. November 2009

Um nichts zu verpassen war ich schon gegen neun Uhr im Konferenzzentrum, was sich als gut herausgestellt hat, da ich so auch die “Begrüßungssession” anschauen konnte, die auf das Programm der nächsten drei Tage vorbereitet hat.

Anschließend hieß es dann mein Hirn auf Englisch zu stellen und die erste Session zu besuchen. Welche Sessions ich genau besucht habe folgt in den nächsten Artikeln. Wer mir auf Twitter folgt hat sowieso einen großen Teil davon schon erfahren.

Insgesamt gibt es zu sagen, dass die Sessions am Montag sehr ausgewogen und interessant waren. Ich bereue keine einzige davon. Sehr überrascht war ich vom guten Essen des Caterings, auch wenn das “Essensband” um mein Handgelenk etwas sehr eng befestigt wurde.

Am Montag fand auch noch die Open Source Expo statt, wo sich Open Source-Projekte vorstellen und neue Nutzer sammeln können. Die meisten Systeme kannte ich auch schon zuvor, doch auch einige neue waren dabei, von denen ich noch nie zuvor gehört habe.

Abends bin ich nahezu direkt nach der letzten Session zurück ins Hotel und habe mich vom Tag erholt und angefangen mein neues technisches Spielzeug einzurichten.

Dienstag, 17. November 2009

Am Dienstag ging es schon um neun Uhr los und ich habe es auch geschafft, trotz starker Müdigkeit und des Unwillens mich aus dem warmen Bett zu begeben, pünktlich zu sein.

Auch an diesem Tag waren viele interessante Sessions zu besuchen, das Essen war auch wieder gut und abends gab es dann, nach einer doch etwas unnützen Session, noch eine Party, eine Fun-Keynote und Casino. Quasi das gleiche Programm wie letztes Jahr schon zur webinale. Diese Gelegenheit habe ich natürlich genutzt und mich über einen Twitterbekannten (@tweetmaex) noch mit zwei anderen Leuten bekannt gemacht.

Mittwoch, 18. November 2009

Auch am Mittwoch begannen die ersten Sessions schon um neun Uhr und wieder habe ich es geschafft pünktlich anzukommen. Die Sessions waren auch großteils interessant, aber irgendwie hat man sehr stark gemerkt, dass der letzte Tag der Konferenz ist, da auf eine bestimmte Art und Weise die Luft raus war.

Gefühlt gab es wesentlich mehr deutsche Sessions und sogar die Keynote war deutsch, was ich ziemlich unpassend finde auf einer internationalen Konferenz. Dazu kommt, dass sie nicht mal sehr spannend oder ansprechend war. Mehr dazu jedoch in einem anderen Artikel. Die letzte Session hab ich dann aufgrund mangelnder guter Themen sausen lassen und bin stattdessen mit meinen neuen Bekannten zu Starbucks und habe mir einen sehr leckeren Cappuccino genehmigt.

Fazit

Alles in allem betrachtet hat mir die Konferenz sehr gut gefallen und ich habe einiges dazu gelernt. Und bis auf ein paar kleine “Unstimmigkeiten” gibt es auch nichts zu meckern.

Sehr faszinierend fand ich wie stark das Zend Framework gepusht und die VZ-Familie mies gemacht wurde. Zudem sollte jeder seinen Buildvorgang überdenken und auf Continuos Integration und automatische Builds umstellen, um die Qualität sicher zu stellen, die man haben will. Hierzu wurden auch einige Tools genannt, die ich mir bestimmt mal anschauen werde.

So, das ist ein hübsch langer Artikel geworden und deswegen höre ich jetzt auch auf bevor der Akku seinen Geist aufgibt und alles zunichte macht. Alles weitere darüber, welche Sessions ich besucht habe und was die Kernaussagen davon waren folgt in den nächsten drei Artikeln.

Das Wort Vote, welches auf eine Straße gemalt wurde und dessen erster Buchstabe aus Füßen gebildet wird.

WordPress Plugin: dB Twtpoll

Just to say it before anyone complains. This is my first public released plugin for WordPress and I´m not used to write english posts as you can tell if you look around a bit.

What´s this all about?

I like to create polls with Twtpoll, a neat little service to create votings with your account from Twitter.

These polls can be embedded in a website by using two lines of javascript code. That´s not a difficult thing to do, but it´s somehow inflexible. After embedding a poll you have javascript code directly in your post. That´s a bad thing because of three simple reasons:

  1. It´s not to easy to read. Especially for people that don´t speak HTML.
  2. If the code for embedding a poll gets changed in future you have to look through all your posts with polls and update it.
  3. Your feed subscribers could by chance not be able to view the poll, because script tags are filtered by their feedreader. If this is the case and you are using this plugin a fallback will be shown with a link to the original post.

So, where to get the plugin?

At this very moment it isn´t listed in the Plugin Directory at WordPress. So you can only download it from here.

DOWNLOAD

How do I install the plugin now?

That´s as easy as always with WordPress. Unpack the archive, upload it to your wp-content directory and activate it at the plugins page.

I installed it. How do I embed polls?

That´s really easy. Just add the shortcode [ twtpoll] with the attribute id anywhere in your post (without spaces). After this the poll will be shown at this exact position.

For now it is not possible to read and copy the ID of your poll from anywhere on Twtpoll. Sounds confusing, but you can get the ID if you take a look at the URL in your browsers address bar. The last part of it is the ID you need to include your poll. Just copy it and paste it within the shortcode, e.g. [ twtpoll id="d6iby3"] (without spaces).

Something else?

Nope. Not really. I just hope you have fun with this plugin and my English wasn´t too bad. If you encounter any spelling or grammar errors please share this knowledge with me in the comments.

One more thing. If you have a nice idea to extend the plugin don´t hesitate to let me know in the comments. I appreciate every feedback.

Ein altes, verwittertes Buch neben einem ebenso altertümlich wirkenden Eimer.

String Klasse: Version 1.1.0

Diese Version gammelt nun schon seit weit über einem Monat auf meinem PC herum, hat aber erst heute ihre Vollendung gefunden dank dem Kommentar von Phil. Er hat mich darauf gebracht zwei magische Methoden einzubauen, mit denen die Möglichkeiten der Klasse enorm gestiegen sind.

Neue Features

Da dieses Release neue Features beinhaltet und nicht nur Bugs und Optimierungen enthält verdient es auch den Sprung von Version 1.0.1 auf 1.1.0. Welche Features das genau sind werde ich jetzt versuchen zu erläutern.

String erweitern

Es gibt jetzt gleich vier neue Methoden einen String zu erweitern: add(), addMore(), insert(), insertMore().

Mit der add()-Methode ist es möglich einen anderen String oder auch ein String-Objekt an das bisher bestehende anzufügen oder voranzustellen. Man kann auch mit einem Parameter angeben, was zwischen den Strings stehen soll. Mit addMore() kann man im Grunde genommen genau das Gleiche machen, nur kann man hier ein Array aus Strings oder String-Objekten übergeben.

Mittels insert() kann man einen String oder auch hier wieder ein String-Objekt in das bisherige String-Objekt einfügen. Dabei gibt man über einen Parameter den Offset an. Hier macht insertMore() auch wieder das Gleiche, nur dass es die in einem Array übergebenen Strings nacheinander einfügt.

String kopieren

Es ist nun auch möglich ein String-Objekt zu kopieren mittels der Methode copy(). Zurückgegeben wird ein neues String-Objekt, welches den gleichen Inhalt hat, wie das, welches kopiert wurde.

Magische Methoden

Mit PHP 5 wurden magische Methoden in Objekten eingeführt. Wie eingangs erwähnt habe ich heute erste die beiden Methoden __call() und __toString() eingebaut.

Erstere ist dafür zuständig die Möglichkeiten dieser Klasse enorm zu erweitern, da man dadurch jede beliebige String-Funktion aufrufen kann und diese dann auf das Objekt angewendet wird. Beispiel:

// Gibt 'is is the new st' aus
$string = new String('This is the new string.');
$string->substr(2, 16)->show();

Wie man sieht ist diese Methode ein wirklich mächtiges Werkzeug und auch Simon sollte jetzt zufrieden gestellt sein

Die Methode __toString() sorgt dafür, dass das Objekt direkt ausgegeben werden kann. Normalerweise würde eine Warnung auftreten, doch jetzt wird schlicht und ergreifend der String zurückgegeben. Das kann dann so aussehen:

// Gibt 'This is the new string.' aus
$string = new String('This is the new string.');
echo $string;

Vererbbarkeit

Als letzte gravierende Änderung ist es nun möglich von der String-Klasse abzuleiten, um eigene Erweiterungen dafür zu schreiben. Man kann in den abgeleiteten Klassen jede Methode verwenden, die die String-Klasse selbst hat, da alles entweder von außen zugänglich, also public ist oder geschützt (protected).

Diese Möglichkeit habe ich mir auch direkt zunutze gemacht und eine Ableitung geschrieben: JavascriptString. Mit dieser Klasse ist es möglich viele String-Funktionen, die in Javascript zur Verfügung stehen auch in PHP zu nutzen.

Dokumentation

Dieser Artikel ist nicht allzu ausführlich und das soll er auch gar nicht sein. Ich muss nicht jede einzelne Zeile oder Methode ausführlich erklären, denn die Klasse selbst ist ausführlichst dokumentiert und mit Beispielen versehen. Wer jedoch einen schnellen Blick riskieren will findet hier eine ausführliche Dokumentation, die mit phpDocumentor erstellt wurde.

Subversion

Da ich inzwischen Subversion auch privat nutze war es nur logisch das Projekt auch damit zu versionieren. Den aktuellen Entwicklungsstand findet man ab sofort immer unter dieser URL: http://dbsvn.agitos.de/public/string/trunk/

Committen darf momentan nur ich, aber um den aktuellen Stand auschecken zu können gibt es den User anonymous mit dem gleich lautenden Passwort.

Download

Zu guter Letzt kommt schließlich noch der Download der aktuellen Version. Download.

Wer auch hier Subversion nutzen möchte kann dies über den von mir angelegten Tag erledigen:http://dbsvn.agitos.de/public/string/tags/1_1_0/

Lichter auf einer Wand über eine Station zum Be- und Entladen eines LKW.

Statusmails per Cronjob verschicken

Wer mein Blog schon etwas länger verfolgt oder sich mal durchgeklickt hat ist vielleicht darauf aufmerksam geworden, dass ich als Feedreader Tiny Tiiny RSS verwende. Bei diesem Feedreader hat man die Möglichkeit per Cronjob seine abonnierten Feeds aktualisieren zu lassen.

Der schlechte Ansatz

Anfangs dachte ich es wäre eine gute Idee die Ausgaben des auszuführenden Skriptes in einer Datei zu loggen. Nach einer Woche wurde mir jedoch klar, dass dies keine gute Idee war, da die Logdatei bereits zu diesem Zeitpunkt mehrere Megabyte groß geworden war. Zum schnellen Checken des Status also völlig unbrauchbar. Die logische Konsequenz daraus war, dass ich das Logging komplett entfernt habe, was im Nachhinein betrachtet auch keine allzu schlaue Lösung darstellt.

Die bessere Lösung

Vor ein paar Wochen kam mir dann die Idee die Ausgaben des Skriptes per Mail verschicken zu lassen. Ich fand nach einiger Recherche auch ein paar brauchbare Ansätze, die jedoch dadurch zunichte gemacht wurden, dass mir auf meinem Webspace die benötigten Erweiterungen nicht zur Verfügung stehen.

Heute bin ich dann schließlich doch auf eine Lösung gestoßen, die mein Problem behebt. Hier jetzt erst mal der Code, der im Shellskript steht, welches ich für die Ausführung verwende:

#!/bin/sh

cd /path/to/feedreader
php5 -f update_feeds.php > update_feeds.log
mailx -s "Feedreader Update Status" example@example.com < update_feeds.log
rm -f update_feeds.log

Was passiert jetzt in diesem Skript genau? Das ist im Grunde genommen so einfach wie genial.

Die erste Zeile zeichnet die Datei als Shellskript aus, damit Linux auch weiß, dass sie ausgeführt und nicht gelesen werden soll. Der Befehl cd dient dazu in ein anderes Verzeichnis zu springen. In diesem Fall der Ordner, in dem Tiny Tiny RSS installiert ist.

Als nächstes kommt der wichtige Teil dieses Skriptes, da mit dem Befehl php5 das Updateskript aufgerufen wird. php5 deswegen, da unter dem üblichen Befehl php auf meinem Webspace noch PHP 4 ausgeführt wird. Das war jedoch noch nicht alles, da mit dem Operator > die Ausgabe des Skriptes in einer Datei gespeichert wird. Verwendet man den Operator >> wird die Ausgabe an die bisherigen Inhalte der Datei angehängt, was bei mir, wie oben beschrieben, zu riesigen Dateien führen kann.

Soweit so gut, das ist bisher fast genau das, was ich anfangs auch genutzt habe. Doch jetzt kommt der entscheidende Unterschied. In der nächsten Zeile wird mit dem Befehl mailx eine eMail verschickt. Den Betreff kann man über den Parameter -s angeben. Anschließend folgt die Mailadresse, an die die Mail geschickt werden soll. Am Ende der Zeile wird durch den Operator < der Inhalt der zuvor geschriebenen Logdatei in den Body geschrieben. Das Ergebnis davon sieht man Sekunden danach in seiner Inbox. In der letzten Zeile lösche ich mit dem Befehl rm noch die Datei, damit kein unnötiger Speicherplatz verbraucht wird.

Alles in allem also keine große Magie, die dort betrieben wird. Man muss einfach nur die zur Verfügung stehenden Mittel seines Servers/Webspaces herausfinden und nutzen, was am besten passt.

Die abschließende Perfektion der Lösung

Bisher scheint die Lösung des Problems schon sehr gut zu sein, doch wenn der Cronjob alle fünf Minuten ausgeführt wird hat man bald ein extrem überfülltes Postfach. Deswegen zeige ich hier noch eine Möglichkeit auf diesen Umstand in Thunderbird zu beheben.

Fängt man an zu rechnen fällt sehr schnell auf, dass pro Tag 288 eMails im Postfach landen. Rechnet man weiter sind das 2016 eMails in der Woche und 105120 eMails im Jahr. Eindeutig zuviel um den Überblick zu behalten. Hier kommt dann allerdings ein sehr praktisches Feature von Thunderbird ins Spiel. Leitet man seine Statusmails über einen Filter in einen bestimmten Ordner, so kann man einfach in den Eigenschaften dieses Ordners einstellen, dass alle darin enthaltenen eMails, die älter als ein Tag sind gelöscht werden.

Dazu macht man einen Rechtsklick auf den Ordner und wählt “Eigenschaften” aus. Im sich öffnenden Dialog wechselt man in den Reiter “Speicherplatz”. Dort befindet sich dann die gewünschte Einstellung. Es gibt natürlich auch noch andere Möglichkeiten, z.B. dass alle Nachrichten bis auf die letzten 30 oder alle gelesenen gelöscht werden. Das muss dann aber jeder für sich entscheiden.