Martin Lantzsch
Software Entwickler
14. November 2010

wvdial bricht ständig Verbindung ab

14. November 2010 - Geschrieben von Martin - Keine Kommentare

Wer unterwegs sein UMTS/GPRS fähiges Handy in Verbindung mit seinem Linux Notebook als Modem nutzen will kommt an wvdial nicht vorbei. Leider hatte ich in letzter Zeit immer öfter erlebt, das wvdial einfach ausgestiegen ist. Ich hatte zwar volles Netz und konnte einwandfrei im Internet surfen aber aus heiterem Himmel wurde die Verbindung einfach geschlossen.

Nachdem ich nun verschiedenste Konfigurationsparameter (/etc/wvdial.conf) ausgetestet habe, wurde ich fündig.

idle seconds

legt eigentlich fest, nach welcher Zeit die unbenützte Verbindung geschlossen wird, aber komischerweise hängt dieser Param auch mit meinen Verbindungsabbrüchen zusammen…

Ich habe ihn jetzt auf 600 Sekunden gesetzt (= 10 Minuten)

idle seconds = 600

und siehe da, ich kann ohne Verbindungsabbrüche surfen. Bis ich wieder kein Netz mehr habe… aber das ist eine andere Geschichte :D

31. Oktober 2010

WBB „SEORedirectListener.class.php“ fehlt

31. Oktober 2010 - Geschrieben von Martin - Ein Kommentar

Heute haben wir das Litotex.de Forum auf einen neuen Server umgezogen. Sprich die gesamten Dateien auf den neuen Server kopiert, die Datenbank importiert und Verbindungseinstellungen in der „wcf/config.inc.php“ angepasst.

Soweit hat das ganze auch geklappt. Allerdings hat uns beim betreten der neuen Seite immer folgender Fehler begrüßt:

Fatal error: Unable to find class file '[...]/wcf/lib/system/event/listener/SEORedirectListener.class.php'

Es hat sich herausgestellt, das für das SEO Paket in der Datenbank ein falscher Pfad eingetragen war (Wir haben beim umzug unsere WCF Directory geändert). Unter „wcf_1_packages“ muss beim Paket „com.woltlab.wbb.seo“ der „packageDir“ an die neuen Gegebenheiten angepasst werden.

Nun zeigte zwar die Fehlermeldung auf das richtige Verzeichnis aber die Datei hat noch immer gefehlt. Also habe ich das SEO Paket, welches man entweder der WotLab Webseite oder dem WBB Archiv entnimmt entpackt und die oben genannte „SEORedirectListener.class.php“ Klasse in folgendes Verzeichnis kopiert „wcf/lib/system/event/listener/SEORedirectListener.class.php„.

Gut Seite neu laden .. und was muss ich dann sehen? Es fehlen nochmal um die 8 Klassen. Gut alle hochgeladen und schon mal gefreut doch Pustekuchen, eine Konstante SEO_ENABLE fehlte. Dies ist eine Option, welche durch speichern des ACP Formulars „Suchmaschinen Optimierung“ generiert wird. Nach einem erneuten Seitenaufruf wurde diese Option dann nach „options.inc.php“ geschrieben. UND WBB LIEF!

Nur zeigt die Mitgliederliste merkwürdigerweise nur Benutzer an, die sich seit dem Umzug angemeldet haben. Komische Sache… aber das werden wir sicher auch noch hinbekommen.

1. Oktober 2010

MonoDevelop auf Ubuntu – GTK# fehlt

1. Oktober 2010 - Geschrieben von Martin - Keine Kommentare

Gerade habe ich auf meinem Frischen Ubuntu MonoDevelop installiert und musste Feststellen das beim erstellen eines Projekts, bzw in den Projekt Einstellungen keine GTK# Version gewählt werden kann.

Folgende Fehlermeldung wurde beim Kompilieren eines Projekts ausgegeben:

The type or namespace name ‚Gtk‘ could not be found. Are you missing a using directive or an assembly reference? (CS0246)

Über apt hab ich festgestellt, das ich gar keine Gtk# Lib installiert hatte also habe ich geschwind folgendes Paket installiert und die Sache war gegessen:

sudo apt-get install gtk-sharp2

Nach einem Neustart der MonoDevelop IDE sollte alles wie gewohnt funktionieren.

18. August 2010

einfaches PHP Plugin System

18. August 2010 - Geschrieben von Martin - 6 Kommentare

Plugin Systeme, sie sind viel gefragt in der heutigen Zeit, jeder will seinen Code schön erweiterbar haben, doch viele haben entweder gar keinen Schimmer wie sie das am besten machen oder sie setzten es teils auf unglaubliche Weise um. Ich habe schon die verrücktesten Kostruktionen gesehen, die Code aus Datenbanken lesen oder wie die phpBB Jungs, die einen ganzen Parser geschrieben haben, der Core Dateien Modifiziert, um an bestimmten Stellen eigenen Code ausführen zu können. Für mich ist das alles Humbug, ein Plugin System muss flexibel und performant sein und nicht zuletzt sollte das ganze so umgesetzt werden, dass vom Benutzer selbst keinerlei Änderung am Code durchgeführt werden muss um ein Plugin einzubauen/zu laden.

Dem habe ich mir angenomen, und zwar habe ein an meinem SimpleLD Framework angelehntes Plugin System (bzw. eine Klasse) geschrieben, die alle aufgezählten Punkte vereint. Folgende Funktionen hat das ganze:

  • Überall einsetzbar – Es ist lediglich eine Klasse, welche in jedem PHP Projekt verwendet werde kann
  • Sie erlaubt es Code an vorher definierten Stellen im eigenem Programm einzuhängen und auszuführen. (mittels Hooks dt. Haken)
  • Die Plugins können ohne Programmier Kentnisse vom Benutzer einfach „installiert“ werden. Denn dazu muss lediglich eine Klasse in ein vordefiniertes Verzeichnis kopiert werden.

(Für die Ungeduldigen, hier gehts zum Github Repo: PHP-Plugin-System @ Github)
Durch die geringe Anzahl an Code Zeilen (rund 100 mit Kommentaren) arbeitet das ganze System Performant. Allerdings wird es je nach Anzahl installierter Plugins langsamer, das kann aber durch einen Cache (siehe SimpleLD Framework) umgangen werden.

Wie funktioniert das ganze?
Die Funktionsweise ist ganz simpel. Plugins bestehen aus ganz normalen Klassen mit public Methoden, welche sich alle in einem von ihnen bestimmten Verzeichnis befinden. Von dort liest das Plugin System alle Klassen ein und speichert Methoden als sogenannte Hooks (dt. Haken) in einem Array. Falls im Code ein solcher Hook aufgerufen wird, werden alle Plugins mit einer passenden Methode herausgesucht und aufgerufen.

Praktisches Beispiel
Plugin Klasse (sample.php)

class sample {
  public function helloWorld() {
    echo "Hello World!";
  }
}

Wichtig: Die Klasse muss exakt so wie die Datei benannt werden! Alle Methoden ohne beginnendes _ werden als Hooks verwendet!

Datei in der das Plugin verwendet wird (index.php)

// laden des Plugin Systems
include('plugins.class.php');
// starten des Systems mit Übergabe des Plugin Verzeichnisses
plugins::start('plugin/ordner/');
// nun können wir einen Hook aufrufen
plugins::call('helloWorld');
// dann noch einen anderen 
plugins::call('foo');

Mit Parametern
Natürlich kann an Hooks auch Parameter übergeben werden. Dies geschieht in Form eines Arrays:

plugins::call('foo', array('Parameter 1', 'Parameter 2', 'Parameter 3'));

Die Methode des Plugin sieht dann folgendermaßen aus:

public function foo($parameter1, $parameter2, $parameter3) {
  // was auch immer wir tun möchten ...
}

Dabei muss allerdings beachtet werden, dass die übergeben Parameter alle von der Methode entgegen genommen werden müssen, ansonsten bricht PHP mit einem Fehler ab.

Nimmt man Änderungen an der Parametern innerhalb des Hooks vor und will diese an den Orginal Code wieder „zurückgeben“, bzw mitteilen, setzt man einfach & vor die Variable:

$var = "foo";
plugins::call('foo', array(&$var));
// Inhalt nach Änderung durch den Hook foo
echo $var;

Die Methode des Plugin sieht dann folgendermaßen aus:

public function foo(&$blub) {
  // hier können wir nun $blub ändern
}

Source Code beziehen
Der Code kann hier mit Beispielen in meinem Git Repo heruntergeladen werden:
http://github.com/LinuxDoku/PHP-Plugin-System/
oder für die faulen unter uns der Direktlink
… ich bin der Direktlink zur Zip Datei …

Tipps’n Tricks

  • Der Verzeichnis Parser liest die Plugins nach altbekannten Regeln des Alphabets (dem ABC ;-)) ein, demzufolge werden Hooks, deren Plugin Namen z.B. mit A beginnen vor Hooks, deren Plugin Namen mit M beginnen ausgeführt. Sollte dies nicht gewünscht sein, kann man sich an der Methode „load“ des System zu schaffen gemacht werden.
  • Beim Starten des System muss dem Plugin Ordnername immer ein Endendes / (Slash) mitgegeben werden!
  • Es empfiehlt sich das System in einer Global verwendeten Datei zu Starten, da ansonsten ziemlich viele Ressourcen benötigt werden. Und ein mehrfacher Start unnötig ist.
15. August 2010

PHP_FCGI_CHILDREN – spar dir den Ram!

15. August 2010 - Geschrieben von Martin - 3 Kommentare

Mein kleiner Debian Test Server hat die letzten Tage unwahrscheinlich viel Ram gezogen. Von 265MB welche verbaut sind, nutzte er bereits nach einem Neustart ganze 75% – das kann es ja nicht sein, schließlich laufen dort lediglich ein Lighttpd, MySQL, Exim4, Courier und SSH, also nichts weltbewegendes. Zu diesem Zeitpunkt griff ich auch nur mit 2 Rechnern auf meine PHP Anwendungen zu.

Also begann ich die vielen php5-cgi Prozesse genauer unter die Lupe zu nehmen, da diese am meisten Ram brauchten. Nach einigem unnützen hin und herstellen in der PHP.ini wagte ich mich noch an die FastCGI Konfiguration von Lighttpd, dort habe ich nur so zum Test die PHP_FCGI_CHILDREN heraus geschmissen und siehe da, der Server benötigt nach einem Neustart des Webservers Lighttpd nur noch gute 30 bis 50% Ram, wenn das mal kein befriedigendes Ergebnis ist.

Des weiteren habe ich nun anstatt 12 php5-fcgi Prozessen nur noch 4 Stück. Offenbar beendet PHP oder FastCGI die Geforkten Tasks nicht mehr richtig …

Laut PHP Bugtracker existiert dieser Bug schon seit gut 3,5 Jahren: http://bugs.php.net/40286

4. August 2010

jQuery idTabs bei Seitenwechsel speichern

4. August 2010 - Geschrieben von Martin - 2 Kommentare

In letzter Zeit beschäftige ich mich wieder verstärkt mit JavaScript, bzw. jQuery. Heute habe ich auf Basis von idTabs (@BissyDesign – Danke für den Tipp ;-)) ein Horizontales Menü beflügelt, dessen Untermenüpunkte nun bei klick auf einen Obermenüpunkt ohne Seitenreload wechseln. Lange Rede kurzer Sinn:

und so sieht es nach dem klick auf „Nachrichten“ aus:

Leider hat die Sache mit idTabs einen Haken, und zwar springt das Menü nach einem Seitenreload wieder zum ersten Tab zurück und bleibt nicht beim gewählten. Doch dafür habe ich eine ganz einfache Lösung gefunden.

Als erstes müssen wir das jQuery Cookie Plugin einbinden: http://plugins.jquery.com/project/cookie
Nächster Schritt ist die Modifikation des idTabs Plugins, man suche folgende Stelle im Code (im Unkomprimierten Zeile 95):

$(id).show();
return s.change; //Option for changing url

und ändere dies zu:

$(id).show();
// write to cookie
$.cookie('PAGENAME_menu', id.split('#')[1], { expires: 1 });
return s.change; //Option for changing url

(PAGENAME_menu ist der Cookie Name, welcher an die Gegebenheiten angepasst werden muss).

Anschließend muss noch der Funktionsaufruf von idTabs Modifiziert werden:

$("#menu ul").idTabs();

zu

id = $.cookie("PAGENAME_menu");
if(id == null) { id = 0; } // failback if no cookie is availible
$("#menu ul").idTabs(id);

Nun wird bei jedem Tabwelchsel der aktuelle Tab in einen Cookie geschrieben. Beim neu laden der Seite wird dieser ausgelesen und dessen Wert (der letzte Tab) an idTabs als default Tab übergeben. Es muss lediglich beachtet werden, das keiner der Tabs das Attribut „class=’selected'“ hat, da unser Hack Trick sonst nicht funktioniert.

28. Juli 2010

Brickfilm: Was siehst du?

28. Juli 2010 - Geschrieben von Martin - Keine Kommentare

Heute habe ich im Brickboard ein echtes Meisterwerk gefunden, und zwar der Steinerei 2010 (Publikumspreis-)Gewinner – „Was siehst du?“. An dieser Stelle möchte ich den beiden „Machern“ für diesen super Film Danken. Einen Brickfilm mit solch Grandioser Qualität, gefühlvoller Story und Sprechern, die ihre Rollen überzeugend sprechen sieht man selten.

Die Geschichte handelt von einem kleinem Mädchen und einem Blinden Mann. Diesem erzählt das das Mädchen was sie sieht (deshalb auch der Titel ;)). Eine wunderschöne Welt, spielende Kinder, ein verliebtes paar und Menschen denen der Alltag Spaß bereitet. Am Ende des Films gibt es jedoch eine dramatische Wendung, offenbar wurde die schöne Welt in der alles in Ordnung ist durch einen Anschlag, Krieg oder ähnliches zerstört (wird im Film nicht erwähnt) und das Kind „spielt“ dem älterem Herr etwas vor, indem sie eine Kassette mit Geräuschen „von früher“ in ihrem Kassettenrekorder laufen lässt. Offenbar will sie dem Blinden die Wirklichkeit ersparen und ihr eine schöne – heile Welt vor Augen bringen.

Alles in allem Sehr gut Umgesetzt, sowohl die Kamera, als auch die überzeugende Synchronisation. Das ist wirklich großes Kino.

9. Juli 2010

Netcup Gutscheine für Alle!

9. Juli 2010 - Geschrieben von Martin - 7 Kommentare

So ihr lieben heute habe ich ein paar Gutscheine für euch im Gepäck :-)

Es handelt sich hierbei um 10 Gutscheine des Webhosters Netcup im Wert von je 5€. Bei Netcup gibt es vom Einsteiger Webspace (ab 0,19€ / Monat) über vServer bis hin zu Managed vServer alles, was man für einen Gelungenen Webauftritt benötigt. Der Gutschein Code kann einfach beim bestellen mit Angegeben werden und schon hat man 5€ gespart.

Hier die Gutscheincodes:

36nc12786822950
36nc12786822951
36nc12786822952
36nc12786822953
36nc12786822954
36nc12786822955
36nc12786822956
36nc12786822957
36nc12786822958
36nc12786822959

(falls alle Gutscheine aufgebracht sind, schreibt einen Kommentar, dann bekommt ihr neue)

Ein sonniges Wochenende euch allen.