Sind PHP, Java und .Net am Sterben?

 

Mal wieder ein bisschen mit Google Trends gespielt. Scheint als wären die grossen Programmiersprachen am Sterben… oder aber die Leute wissen bereits alles dazu und müssen daher nicht mehr danach googeln.

Neue Trends aktuell sind sicher Node.js (und wahrscheinlich noch andere):

Im Vergleich zu den Grossen noch verschwindend klein, aber doch mal ein guter Start. Auf jeden Fall spannend zu sehen, wie das in 2 Jahren ausschaut… der neue Überflieger oder es gibt bereits den nächsten grossen Star.

Ich habe aktuell viel mit Javascript gearbeitet und finde mich so langsam aber sicher ein bisschen damit zurecht. Noch fühlen sich die Konzepte für Objekte komisch an (wahrscheinlich bin ich hier einfach Java gebrandmarkt), aber so langsam aber sicher nähere ich mich da an. Es stellt sich jetzt die Frage PHP den Rücken zu kehren und serverseitig auch mit Javascript zu arbeiten oder weiter auf PHP zu setzen? Die Benchmarks für Node.js sind seeehr vielversprechend…

Stellt sich halt die Frage, ob das lediglich ein Trend ist, der bald wieder verschwindet, oder ob Node.js eine ernst zu nehmende Plattform wird? Dann wiederum ist gut zu wissen, dass Javascript so schnell nicht verschwinden wird bzw. vermehrt Verbreitung (Firefox OS z.B.)

Symfony2 – Mini Review

Es ist mal wieder Zeit für etwas neues. Mittlerweile kann ich doch schon auf ein paar Frameworks/CMS zurückblicken:

Neuestes Mitglied in der Familie ist Symfony2. Übungsprojekt ist ein kleiner Rest Server, sowie ein passender Rest Client. Hier meine bescheidene Einschätzung:

Gefällt mir sehr gut

  • Dokumentation. Die einzelnen Teile sind sehr gut Dokumentiert und vor allem auch immer mit vielen praktischen Beispielen illustriert. Dazu gibt es entweder die Hauptdokumentation auf symfony.com oder dann jeweils noch detaillierte Dokumentationen auf den Webseiten der einzelnen Komponenten.
  • Filestruktur. Obwohl es mit der Zeit ziemlich verschachtelt wird und eine beachtliche Anzahl an Files zusammenkommt, finde ich doch eine gewisse Logik dahinter.
  • Kommandozeilen Tools. Noch habe ich hier relativ wenig ausprobiert, aber mit wenigen Zeilen im Terminal lassen sich Getter und Setter erzeugen, die Datenbank entsprechend der Klasse anpassen (falls ein ORM verwendet wird), Cache leeren usw.
  • Abstraktion in hält sich in Grenzen. Das Zend Framework schien mir viel komplexer mit unzähligen Vererbungen und abstrakten Klassen. Vielleicht ist das bei Symfony lediglich der Schein, aber es scheint alles eine Stufe einfacher zu sein.
  • Developer Toolbar. Herrlich. Wichtige Informationen sind jederzeit zur Hand.
  • Composer. Anfänglich war ich doch noch ein bisschen skeptisch. Mittlerweile bin ich begeistert, wenn ich auch noch nicht vollumfänglich dahinterblicke. In a Box: Composer ist apt-get upgrade für PHP.
  • Sehr einfaches Deployment. Das liegt weniger an Symfony als vielmehr an PHP.

Gefällt mir weniger gut

  • Fehlendes Admin Backend. Das Admin Backend von Django ist eine wahre Freude. Ohne etwas zu machen, hat man ein erweiterbares funktionales Backend, um Daten zu bearbeiten. Das fehlt leider bei Django.
  • Syntax. Ist eher ein PHP “Problem”, aber mein kurzer Ausflug in die Python Welt hat mir gezeigt, dass es auch eine Welt ohne geschweifte Klammern gibt und dass dadurch der Code doch um einiges leserlicher wird.

Alles in allem bin ich sehr zufrieden mit Symfony. Es erinnert stark an Django und scheint wie Django für PHP (Logger, ORM, Security…). Leider ist es in einigen Stellen nicht ganz so elegant wie Django. Der geneigte Leser kann sich jetzt natürlich fragen: “Also, warum dann nicht Django”. Die Antwort ist ganz einfach. Infrastrukturmässig kenne ich mich viel besser in der LAMP (Linux Apache MySQL PHP) aus. Ich hatte keine Lust mich mit dem ganzen CGI geraffel, welches nötig ist um Python zu deployen herumzuschlagen. Zudem hat Symfony doch auch noch ein bisschen was gemeinsam mit Drupal ;) … kommt fast ein bisschen Nostalgie auf.

Meine Empfehlung

Mit Symfony ist man relativ schnell produktiv. Natürlich: Die Lernkurve ist überall vorhanden, aber dennoch ist es dank der guten Dokumentation machbar.

PHP Deployment via Git

Endlich habe ich einen halbwegs praktikablen Deployment Prozess gefunden, den ich hier kurz beschreiben möchte:

Source Code

Source Code verwalte ich in Bitbucket. Ja, Bitbucket und nicht Github. Auf Bitbucket kann ich eine unbegrenzte Anzahl an privaten Projekten haben. Für meine privaten Sachen perfekt geeignet. Auf Github wiederum habe ich meine öffentlichen Projekte.

Entwicklung

Selbstverständliche entwickle ich den ganzen Code lokal auf meinem Desktop Rechner. Dazu hätte ich noch einen kleinen Homeserver, den ich eigentlich zum Testen einsetzen könnte, doch der ist aktuell noch nicht im Einsatz.

In meinem Git Repository habe ich einen Entwicklungs Branch. Dort wird entwickelt und gemacht. Ist ein Feature fertig, dann merge ich Entwicklungs Branch und Master.

Deployment

Bitbucket bietet sogenannte Services an:

Bitbucket offers integration with external services via a set of service brokers that run when certain events happen. These brokers are simple Python scripts, that receive information about the event and then take action. For example, there is a broker for sending email messages, another for posting information to an arbitrary URL, and another for posting updates to a Twitter account.

Bei mir sieht das im Konkreten wie folgt aus:

  • Push to Bitbucket
  • Trigger Post request nach http://www.sample.com/deploy.php
  • Das PHP Script überprüft, ob es eine Änderung im Master Branch gegeben hat. Falls ja, dann wird eine Datei leere Datei “dodeploy.true” auf dem Webserver geschrieben
  • Ein Cron überprüft im Minutentakt, ob diese Datei vorhanden ist
  • Falls dodeploy.true vorhanden ist, wird Deployment Script ausgeführt.

That’s it.

Das Deployment Script

#!/bin/bash

# check if there is new code in the repository
if [ -f /var/www/deployment/deploy-wordpress.true ]
then

DATE=`date +%m-%d-%y-%H:%M:%S`
#echo "Backup Database"
/home/ubuntu/deployments/backup-db.sh

git clone [email protected]:rapsli/wordpress.git /home/ubuntu/deployments/wordpress/wordpress-$DATE

rm -Rf /home/ubuntu/deployments/wordpress/wordpress-$DATE/.git

# copy the config file, since this doesn't get deployed
cp /home/ubuntu/deployments/wp-config.php /home/ubuntu/deployments/wordpress/wordpress-$DATE/wp-config.php

# remove old installations
rm -Rf /home/ubuntu/deployments/wordpress/wordpress-old

# rename currently working folder, as it will become the older 
# folder -- this will break the site now
mv /home/ubuntu/deployments/wordpress/wordpress /home/ubuntu/deployments/wordpress/wordpress-old

# we make the new wordpress active
mv /home/ubuntu/deployments/wordpress/wordpress-$DATE /home/ubuntu/deployments/wordpress/wordpress

# symlinking the userdata in
ln -s /home/ubuntu/userdata/uploads/ /home/ubuntu/deployments/wordpress/wordpress/wp-content/uploads
ln -s /home/ubuntu/userdata/cache/ /home/ubuntu/deployments/wordpress/wordpress/wp-content/cache
ln -s /home/ubuntu/userdata/blogs.dir/ /home/ubuntu/deployments/wordpress/wordpress/wp-content/blogs.dir

# make sure the symlink here is active
ln -nsf /home/ubuntu/deployments/wordpress/wordpress/ /var/www/wordpress

# and finally make sure the next cron run doesn't execute the deployment script again
rm -f /var/www/deployment/deploy-wordpress.true

fi

Ist eigentlich ziemlich trivial und sogar gut kommentiert. Falls fragen sind, einfach einen Kommentar posten.

Zwei Bemerkungen

Symlink und Apache ist problematisch. Nach einem Deployment kann es ab und zu mal vorkommen, dass die Seite hängt. Ich vermute, dass dies damit zu tun hat, dass ich einen Apache Worker habe, der noch irgendwie in der alten Version hängt. Ein /etc/init.d/apache2 restart verhilft da jeweils immer Abhilfe. Nein, das ist noch nicht perfekt und ich überlege mir, ob ich einfach komplett auf die Symlinks verzichten soll und einfach mit mv arbeiten soll.

Der Umweg über diese deploy-wordpress.true Datei ist aus folgendem Grund notwendig. Der Request von Bitbucket kommt mit dem www User rein. Dieser hat jedoch nicht die entsprechenden Schreibrechte im home Verzeichnis und kann daher den Clone Befehl dort nicht ausführen. Daher wird lediglich signalisiert, dass es etwas Neues gibt und dann kann der normale User das Deployment durchführen.

Ich finde diesen Ansatz gar nicht mal übel, da er doch auch eine gewisse Sicherheit bringt.

Die Zukunft

Wahrscheinlich wird dieses Script noch ein bisschen wachsen. Das ist das Schöne am Web, es gibt immer etwas Neues und Besseres, aber es ist ein riesiger Schritt nach vorne… die FTP Upload Zeiten sind definitiv vorbei!

Ich bin gespannt zu hören, wie du das Deployment machst. Let me know.

Google Analytics Dashboard

Hier eine kleine Peek Preview auf das Executive Google Analytics Dashboard. Ziel: Die Daten z.B. in einem Intranet zugänglich machen. Dadurch sehen die Mitarbeiter auch gleich, wie es denn um die Seite eigentlich steht.

Mal schauen, was ich damit weiter machen werde. Noch ein kurzer technischer Einschub: Zend Framework und Twitter Bootstrap. Keine Datenbank notwendig.

Würde mich über Feedback freuen. Demo kommt bald.

Google Analytics Dashboard – Einfache Übersicht der Pageviews und der Top Ten Seiten

Basierend auf dem Twitter Bootstrap passt sich das Dashboard der Browser Breite an. Theoretisch also auch auf dem iPhone schön ersichtlich … vielleicht ein bisschen schmal ;)

Die Navigation wird aus einem csv File gerendert. Dort liegen auch die Zugangsdaten sowie die Gruppierung drin.

Mittels Comparer lassen sich verschiedene Seiten gegeneinander vergleichen. Die Daten werden dann einfach übereinander gelegt.

Und so sieht der Comparer dann aus. Das Jahr, sowie der vergangene Monat gegeneinander verglichen. Es können beliebig viele gegeneinander verglichen werden.

Frameworks und CMS auf einem jungfräulichen Apache

Wie ich gerade die vergangenen 90 Minuten gemerkt habe, birgt das doch so einige Gefahren! Ich glaube, das ist nicht das erste Mal, dass ich nach diesem Fehler gesucht habe. Daher fürs nächste Mal:

Mod Rewrite aktivieren. Für Debian, Ubuntu und co ist das in etwa wie folgt.

sudo a2enmod rewrite
sudo /etc/init.d/apache2 restart

.htaccess erlauben. Standartmässig wird ein .htaccess File nicht beachtet. Daher funktionieren dann auch viele Frameworks/CMS nicht.

sudo nano /etc/apache2/sites-enabled/000-default

Hier gibt es irgendwo diesen Eintrag. Wichtig dabei: AllowOverride all (None wäre falsch!)


Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all

RewriteBase korrekt setzen. Vor allem wenn der Pfad so etwas wie http://localhost/myapp/ ist.

Dabei sollte dann auch das wichtigste geschafft sein.

Using More Javascript Would Save Energy

Javascript is a very strange little language that has become very powerful. Building more classical client/server application based on a Javascript/PHP will provide a better user experience and better performance and those kind of applications will scale better and they need less server power.

I’m a PHP developer. I’ve been developing with PHP for probably 10 years. I love PHP because it’s so simple and flexible yet very powerful. In those 10 years I’ve done some programming in Java, I’ve peeked into C/C++, I got in touch with Lisp and Prolog and I have also done quit some Javascript coding. I never liked Javascript.

JavaScript

Javascript has been around for years. I remember when back in the day it was considered to be a thread and when it was best practice to turn JavaScript off, because it was too dangerous. Those times are long gone.

Javascript to me seems like some freak programming language intransparent and just weird and unlogic. In Javascript objects are like arrays and functions are just like variables. There is multiple ways to define methods and objects. It’s just confusing. Yes you can do some jQuery stuff, which is easy, but which is not really programming (hide elements, animate elements and so on). I would rather call that “High-end-CSS”. What about those sofisticated applications built with JavaScript? Just look at JavaScript libraries (like jQuery). I don’t even dare trying to understand what is going on.

Javascript applications actually have a state. You load that one page with the javascript and then you can do things. You can store objects, you can manipulate objects and you don’t have to pay attention to the max page execution time. You can’t rely on that redeeming page refresh that will clear everything. You actually need to carefully think what you do.

Javascript vs PHP trend

Both PHP and Javascript are becoming less popular

Using more Javascript would save lots of energy

Just recently I started writing a little web application (www.instalog.me). I started doing it very classical in PHP, because it’s just so simple. It worked perfectly fine and it was actually fairly performant. It’s only running on a cheap shared hosting. So I was thinking: “What will happen if that service would become popular?”. The answer: “Caching and moving to a new bigger server.”

Do I even need to use PHP? No. So I decided to build it again based on Javascript only. Taking a static HTML file and building all of the logic in Javascript. No PHP at all, as it’s not needed. All of the computation will be done on the client. This will allow serving much more page requests. Looking at this globally. If people were using more Javascript running applications would need less server power and less bandwith, because you could be talking between client and server using JSON.  Yes you would actually be talking about a client/server application (which in PHP only applications is not really the case). And less servers would also mean less electricity.

Is this realistic?

Maybe. But: PHP is just way too easy… Javascript just way too hard. With HTML 5 and CSS3 peaking around the corner and the mobile web becoming more and more attractive, this kind of application becomes more attractive. You have now even a local object store at your hands (way better than cookies!)! It takes though some software engineering skills to build this kind of application and you have to be an expert in Javascript! But then: You can save mother earth by saving electricity!

After all that kind of application will provide a better user experience, they are faster and they are cheaper to run, but it also takes some effort to develop.

Drupal – PHP Performance

Drupal lässt sich auf vielen verschiedenen Ebenen optimieren: Datenbank, Apache, Server, Architektur und PHP Code.

Auf einige Parameter haben wir als Entwickler weniger Einfluss, auf andere mehr. Auf den PHP Code und dessen Qualität haben wir vollen Einfluss. Die Seite “The PHP Benchmark” hat ein paar interessante Tests durchgeführt. Am interessantesten ist der folgende:

Is it worth the effort to calculate the length of the loop in advance?

for ($i=0; $i < $size; $i++)
Im Vergleich zu
for ($i=0; $i < sizeOf($x); $i++)

A loop with 1000 keys with 1 byte values are given

Das Resultat ist ziemlich klar und für jeden verständlich. Fall 2 sollte daher definitiv verbannt werden!

Linux vs Windows in der Drupal Entwicklung

Normalerweise arbeite ich mit folgendem System:

  • Windows XP
  • XAMPP (von Apachefriends)
  • Eclipse
  • je nach dem Subversive oder TortoiseSVN.

Das Zusammenspiel der Systeme ist eigentlich relativ gut. Ich habe zudem mal einen kleinen Ausflug zu Netbeans gemacht, was auch super gut funktioniert hat. Ich war und bin echt begeistert davon und würde es jederzeit wieder für kleinere Projekte einsetzen. Leider ist es es für grosse Projekte nicht geeignet, das es einfach zu langsam ist und noch speicherhungriger als Eclipse ist. Office 2007 und die Ribbons finde ich super. Open Office kann sicher auch alles, aber zum Arbeiten ist MS Office einfach um Klassen besser.

Linux

Gestern habe ich jetzt mal einen Linux Tag gemacht. Nachdem ich die vergangenen Wochen immer mal ein paar Minutenj in der Linux Welt verbracht habe, kannte ich mich bereits ein wenig damit aus. Ich habe es jedoch immer nur für meine kleinen Projekte für kurze Entwicklungssachen verwendet, nie jedoch im professionellen Umfeld. Daher war das gestern ein Beta Tag: Ein Tag Entwicklung mit Linux:

  • Ubuntu 9.10 (mittels Wubi installer)
  • Netbeans
  • KDESVN
  • LAMPP

Netbeans scheint auch hier die gleichen Schwächen wie unter Windows zu haben, dass es sehr langsam zu sein scheint. Eclipse habe ich aber nicht zum Laufen gebracht (und dauch nicht wirklich versucht). Apache ist vieeeel schneller und stabiler! Super. Denn, wenn auf dem Localhost entwickelt wird, dann gibt es nichts nervenderes, als eine langsame Seite. Für kleine Installationen geht es auch unter Windows zügig voran, aber für grosse Drupal Sites, kann es unter Windwos sehr langsam werden. Das mag an der falschen Konfiguration liegen?! Aber unter Linux geht es einfach. Terminal und Drush. Es läuft einfach und es ist wunderbar.

Der wichtigste Vorteil ist jedoch meiner Meinung das Verständnis fürs System. PHP Applikationen sind für Linux Systeme geschrieben. Ja sie laufen bestimmt auch unter Windows und IIS, aber eigentlich gehören sie auf Linuxmaschinen. Um die Möglichkeiten eines Systems wirklich ausschöpfen zu können gehört ein bestimmtes Verständnis des Systemes dazu. Bis vor einigen Monaten hätte ich nichts mit einem SSH Zugriff anfangen können, doch jetzt kann ich bereits einfache Tasks remote durchführen, Konfigurationen ändern und wenn ich im Internet irgend eine Anleitung mit einem Terminal Befehl sehe, dann bin ich nicht abgeschreckt, sondern kann etwas damit anfangen.

Fazit

Drupalentwickler gehören auf ein Unix System. Ja ja. Es läuft auch auf Windows, aber Mac Anwendungen werde ich auch nicht unter Windows entwickeln und umgekehrt werde ich sicher kein .Net Programm unter Linux schreiben. Alles was im Office Bereich ist. Nein, Open Office hat einfach nicht die Qualität wie MS Office. Der Office Bereich gehört Windows, der PHP Entwicklungsbereich gehört Linux. Und wenn man wie ich praktisch nie ein Word Dokument schreiben muss, sondern zum Entwickeln angestellt ist, dann könnte man eigentlich getrost Linux als primäres Betriebssystem laufen lassen und Windows für irgendwelche Spezialapplikationen in eine VM verbannen.

Und noch als kleines Gimick. Tomboy Notes ist mein neuestes Lieblings Tool. Es kommt ursprünglich vom Gnome Desktop gibt es aber auch als Windowsanwendung. Damit lassen sich Notizen als Wiki lokal verwalten. Super schnell und super praktisch. So ein wenig wie Microsoft Onenote, aber einfach klein und Sexy.

Warning: Got a packet bigger than 'max_allowed_packet'

“Warning: Got a packet bigger than ‘max_allowed_packet’ bytes query: INSERT INTO watchdog”

Irgendwie wurde ich nicht schlau aus dieser Meldung, habe aber dann rausgefunden worum es sich handelt.

Was ist max_allowed_packet? Ich bin dem nicht ganz auf den Grund gegangen, aber es geht irgendwie darum, wenn irgend ein serialisierter String (oder Bild oder was weiss ich) in der Datenbank gespeichert wird und dadurch diesen max_allowed_packet überschreittet. Dieser ist bis MySQL 3.23 auf maximal 16MB beschränkt, wurde danach auf 1GB erhöht (will aber nicht heissen, dass dieser auf allen Hostings so hoch ist.

Bei mir trat das Problem auf, als ich via Devel modul ein dsm($rows) Befehl aufgerufen habe. Das Problem war, dass $rows ein Array war, welches 1000 weitere Arrays hielt. dsm() funktioniert so, dass es in irgend einer Tabelle gespeichert wird und dann auf der nächsten Seite ausgeben wird. Anscheinend war der Wert jedoch zu gross, was zu dieser Fehlermeldung führt.

Auf drupalcenter gibt es auch eine Diskussion darüber.

Das mag jetzt nicht das beste Post sein, aber es hilft vielleicht, in die richtige Richtung zu zeigen.