Archive for the 'Programmieren' Category

URxvt: Tabbed nur wenn mehr als ein Tab

Vielleicht benutzt der ein oder andere auch rxvt-unicode als Standard Terminalemulator. Ich jedenfalls mache das seit Jahren und bin sehr glücklich damit. Da ich vor einigen Wochen von Debian (mal wieder) auf Gentoo umgestiegen bin, musste ich erneut mein Terminal einrichten. Dabei fiel mir auf, dass es noch durchaus interessantere Scripts gibt als matcher. Besonders angetan hat es mir hierbei das Script tabbed. Tabbed erstellt, wie der Name schon sagt, Tabs im Terminal. Diese sind via Maus oder Tastatur ganz einfach mit Shift+Left oder Shift+Right zu erreichen. Mit Shift+Down kann man einen neuen Tab erstellen. Schließen kann man die Tabs einfach, indem man wie gewöhnlich das darin laufende Programm schließt. Meistens ist das wohl bash, d.h. Ctrl+D oder exit schließen einen Tab.

Leider stört es mich ein wenig, dass die Tab-Leiste immer angezeigt wird, selbst wenn nur ein Tab offen ist. Dabei hat man einen ziemlich unnötigen Overhead, da dann in jedem Terminal völlig redundante Informationen zu sehen sind – auf Kosten einer ganzen Zeile im Terminal!^^ Da das für seine Funktionalität gar nicht mal so umfangreiche Script in Perl geschrieben ist, habe ich mich kurz rangesetzt und das Problem behoben. Die Tab-Leiste wird jetzt nur noch angezeigt, wenn mehr als ein Tab vorhanden ist. Das Ganze ist sogar über die Konfigurationsoption URxvt.tabbed.hide-when-empty: true einstellbar. Installiert habe ich die Version 9.10 von rxvt-unicode. Wer Interesse an dieser Funktionalität hat, kann folgenden Patch auf  /usr/lib/urxvt/perl/tabbed anwenden.

  1. 5a6,10
  2. >    my $num_tabs = scalar @{$self->{tabs}};
  3. >    if ($self->{hide} ne 0 and $num_tabs < 2) {
  4. >       return;
  5. >    }
  6. >
  7. 77a83,87
  8. >    my $num_tabs = scalar @{$self->{tabs}};
  9. >    if ($self->{hide} ne 0 and $num_tabs < 2) {
  10. >       return;
  11. >    }
  12. >
  13. 225a236
  14. >    my $hide  = $self->x_resource ("hide-when-empty");
  15. 230a242
  16. >    defined $hide  or $hide  = 0;
  17. 233a246
  18. >    $self->{hide}      = $hide;

Metaballs, erste Optimierung

Okay, ich habe es also weiterhin nicht geschafft von den Metabällen die Finger zu lassen. :-D Nach meinem ersten Versuch mit Python und Pygame, habe ich mich nun mal mit C++ und SDL an die Thematik gewagt. Das Ergebnis kann sich durchaus sehen lassen, denn jetzt läuft die Animation bei mir flüssig – auch mit mehr als 2 Metabällen. Zum Testen benötigt man die libsdl und die libsdl-dev, außerdem natürlich den g++. Ein make-Script in Form eines simplen Shellscripts liegt bei. :-) Hier noch ein Bild:

Metabälle in C++ (1.79 KB)

Metaballs

Per Zufall bin ich gestern und heute über den Artikel über Metabälle gestolpert. Was auf den ersten Blick ziemlich kompliziert aussieht, gestaltet sich im Prinzip gar nicht so schwer. Denn wie ich halt so bin, konnte ich leider nicht widerstehen so etwas direkt mal zu probieren. Das Ergebnis ist eine einfache Python-Animation zweier Metabälle. Endlos langsam – aber funktioniert. ;-) Zum Zeichnen der Oberfläche benötigt man die “pygame”-Libraray, die sich (zumindest in Debian-basierten Systemen) leicht über den Packetmanager installieren lässt.

Metabälle in Python (932 bytes)

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

Next Page »