Archive for the 'Programmieren' Category

Moderne Routing-Verfahren in PHP-Apps

Zwar bin ich schon seit einiger Zeit auf Python umgestiegen und versuche PHP mittlerweile weitgehenst zu vermeiden, aber dennoch wurde ich vor einigen Tagen von einem Freund gefragt, wie man heutzutage seinen URLs den richtigen Controller zuordnet. Aus lauter Langeweile, habe ich so ein relativ umfangreiches Beispiel erstellt, welches die meiner Meinung nach schönste Möglichkeit aufzeigt.

Undzwar besteht diese aus einer Tabelle, welche mit Hilfe von Regulären Ausdrücken, URLs einen bestimmten Controller (im Beispiel eine einfache Datei) zuordnet. Die Regex-Tabelle hat den Vorteil, eine zentral gelegene, leicht zu ändernde und flexible Möglichkeit zum Registrieren von URLs zu bieten. Weiterhin werden GET-Parameter in Forum von URI-Komponenten (z.B. “username” in /profile/username/view) direkt mit geparst und in ein einfach zu bedienendes Array (hier: $matches) gepackt.

Kurze Erklärung, wie man das Script benutzen kann. Man erstellt sich einen Ordner mit beliebigem Namen auf dem eigenen Webserver. Dort erstellt man eine Datei, welche zwingend index.php heißen muss mit dem gleich folgenden Inhalt. Außerdem benötigt man eine Datei namens .htaccess, welche den in der index.php als Kommentar vorhanden Code enthält. Nachdem das getan ist, muss die Variable $url_prefix noch angepasst werden. Diese muss die URI enthalten, unter dem die index.php (bzw. deren übergeordneter Ordner) erreichbar ist. In meinem Beispiel ist dies /test/. wichtig ist der abschließende Slash! anschließend probiert man einfach mal die in der $urls-Variable angegebenen URLs aus.

Read more »

Bastelstunde: Schöne URLs

Durch Zufall bin ich heute auf einen Thread in meinem Forum gestoßen. Dieser Thread hat mich direkt dazu gebracht, eine Funktion zu erstellen, die aus Thread-Titel (oder ähnlichem) URL-taugliche Strings macht. Sie ist wahrscheinlich nicht 100%ig komplett und entspricht auch nicht Jedermans Geschmack, aber ich wollte sie trotzdem mal veröffentlichen. In Aktion kann man das Script hier bewundern.

Funktion zum Erstellen von URLs aus Thread-Titeln
  1. function make_urlname($name)
  2. {
  3.     /* Schritt 1: Kleinbuchstaben */
  4.     $name = strtolower($name);
  5.  
  6.     /* Schritt 2: Ausgewählte Zeichen ersetzen */
  7.     $name = str_replace(" ", "-", $name);
  8.     $name = str_replace("ß", "ss", $name);
  9.     $name = str_replace("ä", "ae", $name);
  10.     $name = str_replace("ö", "oe", $name);
  11.     $name = str_replace("ü", "ue", $name);
  12.    
  13.     /* Schritt 3: Alles andere entfernen */
  14.     $whitelist = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
  15.         'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
  16.         'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+');
  17.     $name_tmp = "";
  18.     for ($i=0; $i<strlen ($name); $i++) {
  19.         $char = substr($name, $i, 1);
  20.         if (in_array($char, $whitelist)) {
  21.             $name_tmp .= $char;
  22.         }
  23.     }
  24.  
  25.     /* Schritt 4: Doppelte Leerzeichen entfernen */
  26.     $count = -1;
  27.     while ($count != 0) {
  28.         /* Irgendwie macht WP hier nur ein Minus draus, daher so… */
  29.         $name_tmp = str_replace('-' . '-', '-', $name_tmp, $count);
  30.     }
  31.  
  32.     /* Schritt 5: Leerzeichen (d.h. '-') am Anfang und am Ende entfernen */
  33.     return trim($name_tmp, '-');
  34. }

Update: Für eine Übersetzung in die Programmiersprache Python bitte auf mehr klicken. :-)

Read more »

Mal wieder: Die IDE

Da doch des Programmierers wichtigestes Tool, ist es mir durchaus wert, mal wieder was über die IDE zu schreiben. Ich bin schon über massenweise IDEs gestolpert, von einfach gehaltenen wie Kate oder Notepad++ bis zu Monstern wie Eclipse oder NetBeans. Aber irgendwie war das auf Dauer alles nicht das Wahre. Jetzt benutze ich schon seit fast einem Jahr Vim. Und bin wirklich begeistert, wie viele Möglichkeiten man doch haben kann, auch ohne mehrere Hundert Megabyte IDE mit sich rum schleppen zu müssen. Auch wenn besonders anfangs die Eingewöhnung mehr als umständlich war, so kann man doch nun schon eher von effizientem Arbeiten reden.

Heute habe ich meinem Terminal urxvt einen Patch spendiert, der es ermöglich statt nur 16 jetzt 256 Farbein zu verwenden. Ich war es einfach Leid, mir die sehr hässlichen Default Farben von vim anzuschauen. Besonders das so genannte “cyan” tat bei vollen CSS-Dateien schon richtig weh. Zwar bin ich mir jetzt noch nicht ganz sicher, welches Colorscheme ich verwenden werde, aber das ist wohl eher ein geringeres Problem. ;-) Hier jetzt mal ein Screenshot, wie es aktuell aussieht.

VIM

VIM

IMAP, fetchmail und mehr

Nachdem ich nun schon lange nichts mehr geschrieben habe, berichte ich mal wieder über meinen stetig wachsenden Homeserver, der langsam anfängt echt nützliche Dinge für mich zu erledigen. ;-)

Seit einigen Wochen nun habe ich ein neues System, meine E-Mails abzurufen. Auf dem Server läuft nun das Programm fetchmail. Fetchmail ist ein Perl-Script, welches in regelmäßigen Abständen die Mails einer Mailbox abfragt und entsprechend weiterleitet. In meinem Fall checkt fetchmail alle fünf Minuten die Mails auf meinem GMX E-Mail Account und sendet sie an die lokal laufende Postfix Instanz. Wer es nicht weiß, Postfix ist ein Mailserver. ;-)

Postfix hat seit kurzer Zeit jetzt auch einen Spamfilter, genauer gesagt SpamAssassin. Dieser Spamfilter kann zwar auch Spam aussortieren, ich habe mich aber dazu entschieden, meinen Spam vorerst nur mit einer Änderung des Betreffs zu markieren. Damit möchte ich jetzt erst einmal testen, wie zuverlässig SpamAssassin Spam von nicht-Spam unterscheidet. Später dann kann ich Spam auch direkt löschen lassen. Bei meiner bisherigen Menge hingegen lohnt sich das noch nicht.

Um jetzt meine E-Mails von Postfix auf meine E-Mail-Clients zu bekommen, habe ich außerdem noch einen IMAP-Server installiert, genannt Courier. Courier erlaubt es mir, meine Ordnerstruktur für E-Mails und die E-Mails selbst direkt auf dem Server zu behalten und erleichtert mir somit die Synchronisierung der Mail-Clients enorm. Die gespeicherten Mails liegen außerdem noch in einer RAID1-Partition, was damit also auch die Sicherheit der Daten erhöht.

Neben Courier habe ich außerdem schon seit längerem noch einen Webserver laufen. Auf diesem Webserver befindet sich jetzt seit wenigen Tagen auch eine SquirrelMail-Installation. Mittels SquirrelMail ist die Mobilität meines E-Mail Accounts jetzt komplett. SquirrelMail ist ein Webinterface für IMAP-Accounts. Damit kann ich nun von jedem beliebigen Ort der Welt (Internetanbindung vorausgesetzt) meine E-Mails samt Ordnerstruktur abrufen. :-)

Vor lauter Langeweile habe ich heute außerdem noch einen kleinen Python-Bot hinzugefügt. Okay, zugegeben, eigentlich braucht man das nicht. Aber es ist auf jeden Fall mal wieder eine neue Erfahrung. Dieser Bot ist dauerhaft in meinen Jabber-Account eingeloggt und wartet mit Hilfe von FAM auf eine Änderung der Mailserver-Logs. Sollte er eine Änderung feststellen, werden die neuen Zeilen ausgelesen und auf ein Regular Expression überprüft. Konnte der RegEx angewendet werden, so werde ich via Jabber sofort über den Erhalt neuer Mails informiert. Das Ganze kann bei GMX-Mails natürlich bis zu fünf Minuten dauern, da fetchmail leider auf Polling zurückgreifen muss. Bei lokalen Mails hingegen bekomme ich fast eine Realtime-Benachrichtigung. Dinge, die die Welt nicht braucht, nicht wahr? ;-)

PHP-Klasse zum Lesen und Schreiben von INIs

Hello World. Braucht jemand eine PHP-Klasse zum Lesen und Schreiben von Ini-Dateien? Habe heute mal eine geschrieben, da ich diese wahrscheinlich demnächst mal benötigen werde. Die Datei hat knapp über 300 Zeilen und ist gut Dokumentiert. Ich habe sie mal hochgeladen, vielleicht braucht das jemand. :-)

zip Read/write PHP Ini-class (3.19 KB, zip)

Collectd und rrdtool

Endlich habe ich mal ein schönes Programm zum Überwachen der Performance eines Computers gefunden. Das Programm nennt sich collectd. Der Collectd selbst, speichert nur die Daten in regelmäßigen Abständen (Ich glabe es sind 15 Sekunden per default) in mehrere Dateien. Diese Dateien sind im so genannten Round Robin Database-Format. Mit Hilfe des Prorgamms rrdtool kannn man dann relativ einfach eine graphische Darstellung dieser Daten erstellen. Das rrdtool in Aktion kann man hier sehen. Dazu mal ein kleiner Beispiel-Code, der mir einen Graphen über den Verlauf des Load-Averages der letzten 24 Stunden erstellt.

Graph eines Load-Average der letzten 24h
  1. rrdtool graph "/var/www/user/de/dev/htdocs/dev/rrd/load.png" –start -24h –en
  2.   –title "load average – last 24h" \
  3.   DEF:shortterm=/var/lib/collectd/load.rrd:shortterm:AVERAGE \
  4.   DEF:midterm=/var/lib/collectd/load.rrd:midterm:AVERAGE \
  5.   DEF:longterm=/var/lib/collectd/load.rrd:longterm:AVERAGE \
  6.   LINE1:shortterm#00CC00:"last minute" \
  7.   LINE1:midterm#FF0000:"last five minutes" \
  8.   LINE1:longterm#0000FF:"last fifteen minutes"

Man kann jetzt damit also recht detailiert seine Graphen erstellen lassen. Ich habe mir dazu gleich ein ganzes Shell-Script geschrieben, dem ich einen Parameter mitgebe, der angibt, von welchem Zeitpunkt an bis jetzt der Graph erstellt werden soll. Das Script könnt ihr euch (mit einer PHP-Datei zur Anzeige auf einem Webserver) nach Bedarf gerne einmal runterladen.

zip Collectd And Rrdtool (1.54 KB, zip)

Die perfekte IDE?

Es war mal wieder Zeit, mir eine gescheite IDE zu suchen. Jetzt, wo meine Projekte größeren Umfang annehmen und ein normaler Editor nicht mehr reicht (zumindest wenn man trotzdem komfortabel arbeiten will). Die Suche war echt lang. Viele IDEs haben viele tolle Features, aber eben auch Bugs oder fehlende Features, auf die ich nicht verzichten kann. Jetzt habe ich mich aber vorerst mal entschieden.

And the winner is… Eclipse. Naja, wen wundert’s. Eclipse gehört wohl zu den größten, besten und bekanntesten IDEs. Alles, was ich mir so vorgestellt habe (Projekt Manager, SVN integration, Outline) ist da drin und wartet nun noch darauf von mir getestet zu werden. Ich habe mich den heutigen Nachmittag zwar schon recht gut eingearbeitet, aber Eclipse ist so groß, dass ich wohl nichtmal 10% aller Funktionen testen konnte. Ich will mal einen kleinen Screenshot zeigen, damit man sich unter Eclipse was vorstellen kann.

Eclipse IDE

Eclipse IDE

[III] The Game Of Life

Irgendwie geht mir das nicht aus dem Kopf. Jetzt war mit Python zu langsam und ich habe mich seit meinem letzten Eintrag mit C++ beschäftigt. Zumindest was die Geschwindigkeit angeht, kann ich mich jetzt überhaupt nicht mehr beschweren. ;-)

Ich habe Borlands / Codegears Turbo C++ verwendet. Die grafische Oberfläche ist demnach auch mit der VCL gemacht. Irgendwie bereue ich diesen Schritt. Ich muss euch jetzt leider 2 DLLs mitliefern. Das gesamte Paket ist 1,38MB groß. ZIP-gepackt zum Glück nur noch 625kB. Ich werde wohl irgendwann mal eine andere Oberfläche benutzen. Kann doch nicht sein, dass ich für so ein bisschen Code gleich 1,38MB brauche.

Naja, mal zu den Dingen die das Teil momentan kann. Man kann das Spielfeld in Größe und Anzeige bearbeiten. Außerdem (im Gegensatz zur alten Konsolen Version) kann man die Felder des Spielfelds durch einfache Links- und Rechtsklicks bearbeiten. Man hat sogar die Möglichkeit das Spielfeld in eine Datei abzuspeichern und natürlich auch wieder zu laden. Außerdem sind noch ein paar Extras dabei, die einem die Bedienung erleichtern. Den Source-Code werde ich später einmal veröffentlichen.

Ihr könnt euch das Programm ja gerne mal anschauen. Ich denke ich werde daran noch weiter arbeiten, denn irgendwie macht mir das Spaß. ;-) Besonders das erwähnte Thema mit der Oberfläche will ich noch ändern. Vielleicht hinterlässt der ein oder andere ja mal ein wenig Kritik in Form eines Kommentars hier. Download:

zip The Game Of Life (625.18 KB, zip)

[II] The Game Of Life

So, ich habe das Ding jetzt von der Geschwindigkeit etwa verdreifacht. Außerdem noch ein wenig aufgeräumt und den Debug-Code entfernt. Noch ein paar Kommentare und eine Priese Dokumentation dazu und fertig ist’s. Wer sich mein Game Of Life gerne mal anschauen möchte hat hiermit die Gelegenheit. Downloadlink.  Oder einfach auf “more” klicken. Read more »

The Game Of Life

Heute bin ich auf das “Game Of Life” gestoßen. Auf den ersten Blick langweilig, ist das eigentlich eine total lustige Spielerei. Das Spiel hat ganz einfache Regeln. Es ist aufgebaut wie eine Art Schachfeld. Also ein 2-dimensionales Array. Jedes dieser Felder kann entweder tot oder lebendig sein. Tote und lebendige Felder unterscheidet man ganz einfach durch ihr aussehen. Nun verändert sich bei jedem Durchgang (Generation genannt) das Spielfeld mit Hilfe von ganz einfachen Regeln. Hat eine tote zelle genau 3 lebende Nachbarn, so wird das tote zu einem lebendem Feld. Hat eine lebende Zelle weniger als 2 lebende Nachbarn, so stirbt sie. Hat eine lebende Zelle genau 2 oder 3 Nachbarn bleibt sie lebendig. Hat eine lebende Zelle mehr als 3 lebende Nachbarn, so stirbt sie.

Nun kann man bei diesem Spiel sehr lustige Figuren beobachten, wenn man einfach mal einige beliebige (möglichst nah beieinander liegende) Zellen belebt. So können dabei Animationen entstehen und so lange weitergehen, bis alle Zellen wieder tot sind. Es kann aber auch passieren, dass das ganze in ein totales Chaos verfällt und selbst mach 1000en von Generationen immer noch alles drunter und drüber geht.

Aus reiner Langeweile und aus Interesse wie leicht sowas denn zu programmieren sei, habe ich mal mein eigenes Game of Life programmiert. Es ist in Python geschrieben und gibt seine Zellen bisher leider nur über die Konsole aus. Dazu ist es momentan auch noch sehr langsam, kann also bei mir nur so ca. 88 Generationen in 5 Sekunden berechnen. Ich werde es die nächsten Tage mal ein wenig optmimieren und dann auch hier mal reinstellen. Jetzt erstmal ein wenig ASCII-Art.

                    XX                              X              X      XX
                   X  X                            X X            X X   X XX
                    XX                             XX             X X  XXXXX
                                                                   X       X X
                                        XX                                 X  X
                                       X  X                                 XX
                                        XX
                                    XX                X
                    X               X X              X X
                    X               X                 XX                  XXX
                    X                                                    X   X
                                                            XX  XXXXX    X   X
                                                              XXX    X   X   X
                                                                XX XX     XXX
                                                            X     XX
                                                             X   XX
                             XX       XX                      X   X
                             XX       XX

Next Page »