Linux in a shell – a Symfony Story

Gestern installierte ich mal wieder Linux. Soweit ist das nichts besonderes. Diesmal habe ich Linux in einer virtuellen Umgebung auf meinem Windows 7 Rechner installiert. Für mich ist das n sofern besonders, da ich eigentlich genug Hardware hier stehen habe auf der ich testen kann. Sogar ein fertiger kleiner Linuxserver ist werkelt hier im Netz.

Dank Virtualbox ist das Einrichten einer virtuellen Installation auch kein Problem. Der Einrichtungsassistent führt einen Schritt für Schritt zum Ziel. Eigentlich musste ich nur noch die Linuxinstallations-CD einlegen und schon wurde Linux in der zuvor erstellten virtuellen Umgebung installiert. Installiert habe ich ein Debian 5.0 in der Net-Install-Variante.  Diese Minimalversion hat den Vorteil, dass wirklich nur das nötigste installiert wird. Das System ist also nicht von vorn herein mit nie benutzten Modulen, Bibliotheken und Programmen belastet. Auf den Desktop kann ich auch gut verzichten. Die Konsole reicht für meinen Anwendungsfall. Der Nachteil ist, man muss alles selber installieren. Mit den modernen Paketverwaltungen der heutigen Linux Distributionen kann das auch jeder. Bei Debian ist dies “aptitude”.

Warum wollte ich Linux installieren?
Ich möchte mich mit dem PHP-Framework Symfony beschäftigen. Da ich mir auch noch in den Kopf gesetzt habe, mit der 2.0 Betaversion von Symfony anzufangen, brauchte ich ein sehr aktuelles PHP. Mindestens PHP 5.3.2. Bei Apachefriends.org gab es für Windows aber nur PHP 5.3.1. Das wäre sonst der einfachste Weg gewesen, einen Webserver für Windows aufzusetzen. Dann hätte ich gleich loslegen können. An php.net mit den neuen Windows Binaries hatte ich zu dem Zeitpunkt noch nicht gedacht.  Die virtuelle Technik hat mich auch gereizt und ich wollte das schon länger mal ausprobieren. Nun war die Gelegenheit.

Schön und gut, aber wie greife ich vom Hostsystem auf das Gastsystem zu? Eigentlich sollte über die ipv4 Adresse http://192.168.56.101 im Browser auf die Webserverinhalte zugegriffen werden können. Ein “it works!” soll im Browser erscheinen. Auch wenn ich mit Putty oder WinSCP auf das Gastsystem zugreifen wollte, konnte keine Verbindung aufgebaut werden. Der Netzwerkadapter von Virtualbox ist in der Standardeinstellung auf NAT gestellt. Es müssen nun noch ein paar Einstellungen vorgenommen werden, damit eine Kommunikation stattfinden kann. Auf Virtualbox gibt es dafür eine Anleitung.
http://www.virtualbox.org/manual/ch06.html#network_nat

VBoxManage modifyvm "Linux" --natpf1 "ssh,tcp,,22,,22"
VBoxManage modifyvm "Linux" --natpf1 "http,tcp,,80,,80"

Beide Zeilen habe ich in der Winsows-Shell (cmd) ausgeführt. “Linux” habe ich die virtuelle Installation in Virtualbox genannt. Die obere Zeile sorgt dafür, dass ich mit Putty und WinSCP auf normale Weise zugreifen kann (nachdem ssh installiert wurde “aptitude install ssh”). Die zweite Zeile bringt nun die gewünschten Browserergebnisse. Ein http://192.168.56.101 im Browser bringt mir nun ein “it works!”.

PHP 5.3.3 musste ich für Linux kompilieren. Von php.net habe ich mir den Sourcecode auf den virtuellen Linuxserver geladen. “wget http://www.php.net/get/php-5.3.3.tar.gz/from/de.php.net/mirror” in meinem Fall. Wie man diese gepackte Datei entpackt, musste ich erst einmal nachschauen. http://www.linux-fuer-alle.de/doc_show.php?docid=76 da wurde ich fündig. Nach dem Entpacken ging es darum, das Kompilieren vorzubereiten.

So sieht meine configure-Anweisung aus:

./configure' '--with-mysql' '--with-apxs2=/usr/bin/apxs2' '--enable-mbstring' '--with-xsl' '--disable-short-tags

Brach gleich mit einem Fehler ab. Der Kompiler fehlt. “aptitude install gcc”. Noch einmal. Es fehlen nun mysql-server, mysql-client, libmysqlclient-dev und xsl.
“aptitude mysql-server”
“aptitude mysql-client”
“aptitude mysql-libmysqlclient-dev”
“aptitude install apache2-dev”
“aptitude install php5-xsl”
“aptitude install libxslt-dev”

configure lief dann erst einmal ohne Fehler durch. Nun noch das make. Wieder Fehler. Es war kein make installiert.
“aptitude install make”
“aptitude install libtool” (für “libtool — finish /PFAD/libs”)

Nachdem der Apache Webserver die Konfigurationsdateien neu eingelesen hat, stand PHP 5.3.3 zur Verfügung. “/etc/init.d/apach2 restart”

Symfony auf den Server laden und entpacken.
http://symfony-reloaded.org/code
Die Sandbox hat zum Testen alles dabei. Auch ein Skript mit dem man die Funktionsfähigkeit von Symfony überprüfen kann. Die Datei heisst check.php
Symfony habe ich in den Unterordner sym vom Webrootordner gepackt. Meine Adresse zu check.php lautet also http://192.168.56.101/sym/web/check.php
Dies kann bei jedem anders sein.

Die Symfony Check-Seite sieht bei mir nun so aus:

eAccelerator habe ich auch noch installiert. Das ändert bei mir jedoch nichts an der Anzeige.

Jetzt kann es losgehen.

PS:
Wenn noch nicht alles von Anfang an grün ist, muss man noch ein bisschen Hand anlegen. Wichtig ist, dass bei den “Mandatory Requirements” alles grün ist. Wenn die Zugriffsrechte für cache/ und logs/, beides Verzeichnisse innerhalb eures Symfony Ordners, nicht stimmen, können diese mit Hilfe von WinSCP eingestellt werden. Oder über die Konsole mit “chmod”.
In der php.ini musste ich noch nach “date.timezone” suchen. Der Eintrag war Auskommentiert. Das Semikolon davor muss entfernt werden. Dann noch um die Zeitzone erweitern. Insgesamt sieht das dann so aus: date.timezone =  ”Europe/Berlin” Wer in einer anderen Zeitzone lebt, sollte dies entsprechend anpassen. Siehe dazu in die php.net Doku: http://www.php.net/manual/en/timezones.php

In der php.ini kann man auch noch das ein oder andere Feld unter den optionalen Checks grün bekommen. magic_quotes_gpc ist meistens On. Das ändert man in “magic_quotes_gpc Off”. Nach einer Änderung in der php.ini nicht vergessen, den Apache neu zu starten. “/etc/init.d/apach2 restart”

Wie lernt man Programmieren?

Viele, vor allem junge Menschen, glaube, sie können mal schnell was programmieren. Das Internet zeigt die vielfältigen Möglichkeiten. Augenscheinlich wird mit einer kleinen Software schnell viel Geld verdient. Das möchte man gerne nachmachen.

Nur wie beginnt man nun? Ein bisschen HTML und CSS stellt kein Problem da. Vor allem da es gut WYSIWYG Editoren (z.B. Dreamweaver) oder Webspace-Baukasten-Systeme gibt. Also nur ein wenig hier und da klicken und schon ist die eigene Webseite im professionellen Look fertig. Wenn man sich selber nun auch noch Webdesigner nennt, kann man schon sein erstes eigenes Gewerbe eröffnen und mit dem Geld scheffeln anfangen. Ganz so einfach ist es denn doch nicht; dennoch machen es viele “Hobbydesigner” so.

Nun gut, es steht also eine statische Webseite im Netz. Nun möchte man aber auch noch Dienste über das Internet anbieten. Vielleicht eine Community wie Facebook oder MeinVZ? Da wird es nun schon schwieriger. Es gibt zwar diverse fertige Open Source Community Projekte, diese sind aber oftmals noch anpassungsbedürftig oder entsprechen gar nicht den Vorstellungen des frischen Jungunternehmers. Außerdem ist es viel cooler etwas selber zu coden.

Wie anfangen?

Der folgende Wechsel stammt aus einem Forum, in dem ich geantwortet habe. Der Fragesteller soll keineswegs diffamiert werden. Die Fragen sind typisch für einen neugierigen eifrigen Menschen und sollen hier als Beispiel ohne Wertung dienen.

Hallo,

ich wollte euch mal fragen, ob ihr die verschiedenen Programmiersprachen in einer bestimmten Reihenfolge gelernt habt. Ich interessiere mich jetzt schon seit mehreren Jahren für Webdesign und Programmierung und habe mir in mühseliger Arbeit die verschiedensten Dinge schon beigebracht.

[...]

So, nun ist es aber so das ich in den nächsten Monaten und Jahren weiter darauf aufbauen möchte und nicht nur andere Webseiten immer “toll finde”, sondern in der Lage bin meine eigenen Ideen auch zu realisieren. Facebook oder Twitter sind tolle Sachen … ich wäre jedoch nie in der Lage so etwas zu erstellen (ich glaube Facebook wurde in C+ geschrieben !? Verbessert mich wenn es falsch ist).

Jetzt aber meine eigentliche Frage … gibt es eine bestimmte Reihenfolge, in der man Programmiersprachen erlernen sollte? Manchmal ist es ja einfacher die eine zu verstehen, wenn man die andere schon kann. Welche Sprachen sind überhaupt empfehlenswert? C, C+, C++, Python, ASP, Java, Visual Basic?

Antwort:

Moin.
Es spielt keine Rolle mit welcher Hochsprache du anfängst. Zu unterscheiden wären noch Skriptsprachen und Programmiersprachen.

FB hat sicherlich einige Teile in direkt in kompilierter Form vorliegen. Deren PHP Skripte werden durch einen speziellen Parser direkt in Maschinencode umgesetzt und als Maschinencode genutzt.

Alleine wirst du nie WordPress, FB und Co nachbauen können. Ein eigener kleiner Blog ist aber durchaus gut drin.

Facebook hat einen Übersetzer, der PHP Code in C++ Quellcode übersetzt. Dieser kann dann in Maschinencode compiliert werden.

http://wiki.github.com/facebook/hiphop-php/
http://de.wikipedia.org/wiki/HipHop

Fragestellung:

Hi Guin,

erstmal vielen Dank für deine Antwort. Facebook und Co. sind natürlich zu hoch gegriffen und dahinter steckt ein wahnsinniges großes Team an Programmieren. Aber nehmen wir mal z.B. die Jungs, die Facebook mit Diaspora Konkurrenz machen wollen. Laut eigener wollen sie zu Dritt ein soziales Netzwerk programmieren. Irgendwie müssen die ja auch angefangen haben!? Die haben z.B. alle Informatik an der Uni studiert …. wie ist denn da der Ablauf?

Oder ein Programmierer der an der Erstellung von z.B. Facebook mitwirkt? Welche Programmiersprachen kann der? Wie hat er angefangen bzw. gibt es einen logischen Ablauf, welche Sprache man beherrschen sollte bevor man mit der nächsten anfängt?

Ich habe jetzt z.B. oft gelesen, dass C++ spitze ist aber für einen Anfänger eine Nummer zu groß.

Noch ein anderes Beispiel: Ein Mitbegründer von Twitter hat eine App entwickelt, mit der Geschäfte per Iphone + Zubehör Kreditkarten akzeptieren können. Das ist eine super Idee, doch wie konnte er diese realisieren? Hat er sich nur mit dem Developer Kit für Iphone apps beschäftigt? Oder muss man für solch’ eine Idee auch noch andere Sprachen beherrschen?

Im Endeffekt versuche ich zu verstehen, wie ich meine Ideen verwirklichen kann und welche Voraussetzungen ich dafür schaffen muss.

MB

P.S. Ich bin auch kein Träumer der meint, morgen FB nachbauen zu können. Es ist ein langfristiger Plan meine Skills Schritt für Schritt auszubauen

Antwort:

Ich habe im ersten Semester C, im zweiten Semester C++ gelern. Dann kamen Softwaretechnik, Objektorientierte Programmierung noch noch drei Semester Java dazu. Wärend eines Praktikums habe ich was in C# gemacht.

Wie schon gesagt, spielt es keine Rolle, welche Sprache man nun genau kann. Ein Programm besteht aus Schleifen (while, for, …) und Verzweigungen (if, switch, …). Mehr ist das nicht. Man muss lernen wie man ein Programm plant und wie man OOP einsetzt (bei größeren Projekten).

Fragestellung:

Ok, das leuchtet mir auf jeden Fall ein! Kannst du mir vielleicht ein gutes Buch empfehlen, dass mich ein wenig in die Materie einführt? Ich glaube bei mir haperts noch ein wenig am Grundverständnis, wie man eine Idee in die Tat umsetzt.

Besten Dank!
MB

Antwort:

Als Hausarbeit mussten wir mal eine Blogsoftware selber machen. Das war eigentlich ganz aufschlussreich.

Schau dir mal die “$irgendwas von Kopf bis Fuß” Reihe an
http://www.amazon.de/PHP-MySQL-von-K…/dp/3897219034

eher für Fortgeschrittene
http://www.amazon.de/Entwurfsmuster-…/dp/3897214210
http://www.amazon.de/Objektorientier…/dp/3897214954

Geh am besten in einen Buchladen und guck dir die Bücher genau an. Die kosten immerhin schon einiges an Geld. Wenn du mit dem Stil gut zurecht kommst, dann lohnt sich der Kauf. Wirklich selber angucken! Der Stil ist etwas spezieller.

Wichtig ist, dass du dann am Ball bleibst. Wenn du dich entschließt, eine Blogsoftware zu erstellen, mache zuerst einen Zeitplan. Halte dich dann an den Zeitplan. Wenn der Zeitplan nicht einhaltbar ist, schreibe eine Begründung für die Verzögerung auf.

Aus Büchern lernen ist sehr langwierig. Man muss wirklich konsequent und kontinuierlich lernen. Bevor man ein Buch kauft, sollte man reingeguckt haben! Es muß auch kein neues Buch sein. Solange das Buch nicht (unnötig) vollgekritzelt ist und Seiten fehlen, ist ein Gebrauchtkauf eine günstige Alternative.

Man fängt mit dem ersten Schritt an. Klingt abgedroschen, ist aber nun mal so. Der erste Schritt kann ruhig mit Papier und Bleistift gemacht werden. Auf das Blatt schreibt man dann auf, was einem wichtig ist. Brainstorming sozusagen. Das hilft ungemein, eine Struktur zu bekommen.

Gutes Gelingen :)

Serverentlastung

Damit der Server nicht mehr so ächzen muss, teste ich den WordPresscache.

Da ich “nur” einfachen Webspace gemietet habe, kommt es öfter mal zu längeren Aussetzern, wenn man sich die Artikel angucket. Wer weiss, was meine Webspacenachbarn so alles anstellen :-D
Auf die Idee bin ich durch bueltge.de gekommen, wo ein Artikel über “eAccelerator für WordPress” geschrieben steht.

Der eAccelerator kann auf Webservern zum Einsatz kommen, wird als Modul implementiert, ist Open Source und dient als Beschleuniger, Optimierer und Cache für PHP-Seiten. Mit Hilfe von phpinfo kann kann man schnell feststellen, ob das Modul aktiv ist – wenn ja, dann lohnt die Einbindung von WordPress. Dies ist recht einfach und dazu einige Hinweise.

Da ich auch auf meinem Webspace eAccelerator aktiv habe, passte der Artikel gerade. Früher, als ich noch einen eigenen Server hatte, hatte ich gute Erfahrungen mit dem eAccelerator gemacht.

Professioneller „PHP-Programmierer“

Frage:

Wie arbeitet der professionelle PHP-Programmierer? Ist dieser Mensch überdurchschnittlich intelligent, sodass er beim zweiten Durchsehen eines Beispiels den Code im Langzeit-Gedächtnis hat und von nun an Ähnliches ohne Nachsehen programmieren kann?

Oder verläuft auch professionelle Programmierung nach dem Schema Learning-By-Doing plus Verständnis objektorientierter Programmierung?

Antwort von mir:

Erst mal ist es egal, ob man PHP, Java, C, C#, … “Programmierer” (in Anführungsstrichen, da PHP eine Skriptsprache ist, also Skripter) ist.

Erst einmal plant man sein Programm. Man hat eine Idee, zerlegt es in kleine Teilbereiche (wichtig für OOP, Entwurfsmuster, …).
Sehr viel Zeit geht in die Planung. Das eigentlich programmieren/skripten ist dann nur noch ein kleiner Teil, wenn die Planung gut gemacht wurde.
Ggf kommt dann das Debugen, wobei die kleinen Einzelkomponenten schon in der Entstehung einzeln unabhängig getestet werden. Tests werden vor dem Programmieren erstellt.

Codebeispiele zusammensuchen und dann zusammenbasteln ist nicht so gut. Klar schaut man sich Beispiele an, aber das dient eher dazu, zu verstehen, wie man die Parameter benutzt oder man holt sich Inspiration.

Letzendlich sind es nur ein paar Vokabeln (Programmiersprachen sind auch nur Sprachen, bei denen man die Vokabeln lernen muss). Dann kommt noch ein bisschen Grammatik dazu, wobei man da gut durch IDE oder Docs unterstützt wird.
Es hat also weniger mit “überdurchschnittlich intelligent” als mit fleissig und Übung zu tun.

„sodass er beim zweiten Durchsehen eines Beispiels den Code im Langzeit-Gedächtnis hat und von nun an Ähnliches ohne Nachsehen programmieren kann?“
Wie oben schon angedeutet, löst man öfter auftretende Probleme mit Entwurfsmustern. Diese hat man sich mit der Zeit gemerkt.
Wichtig ist aber, dass man sie verstanden hat, denn diese Muster sehen nicht immer gleich aus und müssen auch mal angepasst werden. Blosses abschreiben
(Problemstellung google und mir verschiedene Codefragmente zusammensetze) bringt also nicht viel.

Fazit:
Zum Programmieren gehört eben nicht nur programmieren, auch wenn man das anfangs gerne so macht. Bei großen Projekten geht das nach hinten los und man muss von vorne anfangen. Das nennt sich dann Coderevision :D

Frage 2:

Ist es möglich “professioneller Programmierer” als Autodidakt zu werden? Oder ist es wichtig Kurse zu besuchen oder gar eine Ausbildung zu machen?

… naja… Professionell muss ja nicht bedeuten, dass man gut ist… also sollte man die Frage mit Ja beantworten können.

Manchmal trifft man in Foren schon auf seltsame Menschen. Den Link zum entsprechenden Artikel habe ich absichtlich nicht angegeben, um den Fragesteller nicht zu gängeln.