Martin Lantzsch
Software Entwickler
2. Oktober 2011

PECL uploadprogress auf Debian installieren

2. Oktober 2011 - Geschrieben von Martin - 3 Kommentare

In den letzten Wochen hatte ich 2x das Vergnügen die PECL extension „uploadprogress“ zu installieren. Leider ist die Installation etwas tricky, wenn man nicht weiß was genau man zu tun hat.

Nötige Pakete aus den Quellen installieren

apt-get install php5-dev php-pear

PECL extension installieren

pecl install uploadprogress

PHP.ini um folgende Zeile erweitern

extension=uploadprogress.so

und in der PHP.ini die Temporäre File Upload Directory auf /tmp setzen (ohne diesen Schritt liefert uploadprogress_get_info() „null“ zurück)

upload_tmp_dir=/tmp

Webserver neu starten und die extension sollte Problemlos laufen.

2. Oktober 2011

API Bashing vom Feinsten

2. Oktober 2011 - Geschrieben von Martin - Keine Kommentare

Bei „Vier Fäuste für ein Halleluja“ ziehen Felix von Leitner und Erdgeist im Rahmen des CCC Kongresses 2009 (26C3) schön über vermurkste APIs wie HTTP, X11, smb und natürlich über Sockets her.

Nehmt euch die Stunde zeit und hört es euch an. Den Programmierern unter euch wird es sicher das ein oder andere Auge öffnen. Und natürlich ist es super lustig. Wie die beiden über die APIs herziehen ist echt vom Feinsten. Es wird kein Blatt vor den Mund genommen.

Da hab ich gesaugt: [mp3] [ogg] [mp4]
Und hier gibt es eine FTP Liste: http://events.ccc.de/congress/2009/wiki/Ftp

Das Video ist meiner Meinung nach nicht unbedingt von Nöten, auf den Folien sind nur der Vollständigkeit halber „kurze“ Code Ausschnitte und Schlagworte zu dem was gesagt wird.

7. September 2011

Android SDK unter Windows Installieren

7. September 2011 - Geschrieben von Martin - 2 Kommentare

Wer unter Windows für Android entwickeln will muss ein paar Dinge beachten, um das SDK zum laufen zu bekommen.

  • Eclipse Classic installieren
  • Android SDK Installieren (und benötigte Pakete herunterladen)
  • Eclipse Android Developer Plugin installieren
    Falls es zu Abhängigkeitsfehlern kommt das Eclipse Helios Repo via Window -> Preferences -> Install/Update -> Available Software Sites hinzufügen
    http://download.eclipse.org/releases/helios/

  • Unter Window -> Preferences -> Android folgende SDK Location verwenden
    C:\PROGRA~1\Android\android-sdk

    Unter x64 Windows diesen hier

    C:\PROGRA~2\Android\android-sdk

    Denn der Pfad zum SDK darf keine Leerzeichen enthalten, ansonsten funktioniert der Android Emulator nicht.

30. August 2011

Jamendo Songs Downloaden (Script)

30. August 2011 - Geschrieben von Martin - Keine Kommentare

Gestern habe ich ein kleines Script in PHP geschrieben, mit dem man Jamendo Songs inklusiv Cover Bild herunterladen kann. Das Script liest die Informationen auf dem Jamendo Server aus und speichert die Tracks in folgendem Format:

/[ALBUM NAME]/[INTERPRET] - [TITEL].ogg
/[ALBUM NAME]/[INTERPRET] - [TITEL]_cover.jpg

Hier das Script, evl schreibe ich noch einen Downloader in Java oder C#, falls ich demnächst ein wenig Zeit finde:

<?php
if(isset($_GET['id'])) {
	$trackID = (int)$_GET['id'];
	// get download url
	$trackUrl = file_get_contents('http://www.jamendo.com/get/track/id/track/audio/plain/'.$trackID.'/?aue=ogg2');
	if($trackUrl == false) {
		echo 'track id not availible!';
	} else {
		// get track information
		$trackTitle = (string)file_get_contents('http://www.jamendo.com/get/album/id/album/title/plain/'.$trackID.'/');
		$trackInterpret = (string)file_get_contents('http://www.jamendo.com/get/artist/id/track/title/plain/'.$trackID.'/');
		$trackAlbum = (string)file_get_contents('http://www.jamendo.com/get/album/id/track/title/plain/'.$trackID.'/');
 
		$location = './'.$trackAlbum.'/'.$trackInterpret.' - '.$trackTitle;
		if(!file_exists($trackAlbum)) {
			mkdir($trackAlbum);
		}
		// download track
		$track = file_get_contents($trackUrl);
		file_put_contents($location.'.ogg', $track);
		// download cover
		$trackCoverUrl = file_get_contents('http://www.jamendo.com/get/album/id/track/artworkurl/plain/'.$trackID.'/?artwork_size=400');
		if($trackCoverUrl != false) {
			file_put_contents($location.'_cover.jpg', file_get_contents($trackCoverUrl));
		}
 
		echo 'track download finished!';
	}
}
echo '<p><form action="jamendo.php" method="GET"><label for="id">track id:</label> <input type="text" name="id" id="id" /><input type="submit" value="download" /></form></p>';

21. Januar 2011

Netbeans – immer für eine Überraschung gut

21. Januar 2011 - Geschrieben von Martin - 7 Kommentare


Netbeans überrascht mich doch immer wieder, eben habe ich ein Template entworfen, welches ich in selben Zug auch gleich mit Classes gefüllt habe und zack zeigt mir Netbeans diese im CSS Editor. Sogar mit Hervorhebung, wenn sie bereits niedergeschrieben wurden.

9. Dezember 2010

SVN Repo bei Commit nach htdocs kopieren

9. Dezember 2010 - Geschrieben von Martin - Keine Kommentare

Oft arbeitet man im Team an einer Webanwendung und würde gerne Testern den aktuellen Stand der Entwicklung geben. Um das nicht allzu umständlich zu machen, ist es hilfreich immer das aktuelle SVN Repo im WebRoot des Server abzulegen.

Hier kommt uns die Hook Schnittstelle von Subversion entgegen, welche erlaubt an bestimmten Events eigene Shell Scripte ausführen kann (wie z.B. nach dem Commiten).

Zu finden sind diese unter

/[SVNREPO]/hooks/

Wir öffnen nun den Hook, der nach dem Commiten ausgeführt wird:

cd /[SVNREPO]/hooks/
nano post-commit.tmpl

in dieser Datei bewegen wir uns nun mit dem Zeiger ganz runter und fügen folgenden Code ein:

svn checkout file:///[SVNREPO]/[DIRNAME] /var/www/[DIRNAME]
cd /var/www/[DIRNAME]
svn update

also z.B.

svn checkout file:///svnrepos/resigame /var/www/resigame
cd /var/www/resigame
svn update

Nun speichern wir es mittels [STRG] + [O] ab und benennen die Datei um (damit sie vom SVN erkannt wird):

cp post-commit.tmpl post-commit

und nun noch ausführbar machen (ist ja ein Shell Script ;))

chmod +x post-commit
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.