Benjamin

Okt 042009
 

Jeder Mac Besitzer kennt das Problem, dass Mac OS X ganz heftig etwas Adobes Flashplayer hat. Denn egal ob Safari, Firefox oder Opera die CPU Auslastung steigt und steigt, genau wie die Temperatur meines MacBook Pros.

Jedoch kann man den Flashplayer auch einfach um gehen und einen anderen Player wie Quicktime oder VLC benutzen. Diese können viel besser mit den Videoformaten hinter dem Flashplayer umgehen.
Unser Rezept besteht also aus dem Safari Webbrowser und einem Player, der die entsprechende Datei abspielen kann.

  1. Webseite auf der das Video ist mit Safari öffenen und das Viedo laden lassem
  2. Als nächstes über Fenster -> Aktivität das Aktivitätsfenster von Safari öffnen
  3. Dort suchen wie die größte Datei, respektive die die noch läd, selektieren sie mit der Maus und CMD + C kopiert den link
  4. Danach den kopierten Link im Player öffnen (QT: CMD + U; VLC: CMD + N)

Bei kleinen 20 Sekunden Filmen macht der Aufwand keinen Sinn, aber wenn ein Video doch ein paar Minuten länger dauert schon.

Sep 022009
 

Die ganze Zeit habe ich PHP als FastCGI über mod_fcgid laufen gehabt und war eigentlich auch ganz zufrieden. Auf dem jetzigem Server war ich über die Performance aber doch sehr enttäuscht. So wurden durchschnittlich nur 0,49 Requests/Sek. verarbeitet, laut ab -n1000, was meiner Ansicht nach doch etwas sehr wenig ist. Darum habe ich mich entschlossen kurzer Hand wieder mod_php einzusetzen und siehe da, die Requests pro Sekunde sprangen auf 1,89 Requests/Sek.

Apache ITK

Da mir aber auch an Sicherheit gelegen ist soll PHP aber nicht als www_data respektive apache laufen. Außerdem fand ich es bei PHP als FastCGI doch sehr angenehm, dass man sich seine eigene php.ini anlegen konnte. Mit dem ITK Patch für Apache ist es möglich einem vHost einen Benutzer und eine Gruppe zu zuweisen unter welchem Sie laufen sollen, also wird nicht erst der PHP Prozess sondern direkt der vHost, respektive der Apache Prozess, unter diesem Benutzer ausgeführt. Einen schönen einführenden Artikel zu Apache ITK hat Stuart Herbert in seinem Blog geschrieben.

AssignUserID user group

Dies ist die einzige Ergänzung die im vHost gemacht werden muss um ihn einem speziellen Benutzer zu zuordnen.

PHP mit eigener php.ini

Wenn Apache ITK läuft brauch man nur noch mod_php zu aktivieren und PHP läuft nun auch unter dem angegebenem Benutzer, dennoch hat mod_php die Eigenschaft eine gemeinsame php.ini zu verwenden. Aber auch hierfür gibt es Abhilfe! Bei askapache.com gibt es einen netten Artikel über Custom php.ini tips and tricks über den ich eine Lösung für das Problem der php.ini gefunden habe. Im vHost Container muss einfach folgende Direktive gesetzt werden:

<span style="text-decoration: line-through;">PHPIniDir /path/to/php_ini/</span>

Nun wird die php.ini welche sich in diesem Verzeichnis befindet geladen.

Leider muss ich das oben geschriebene revidieren, da das Setting PHPIniDir nicht pro vHost sondern global gilt. Es scheint bis jetzt so, als wäre es nicht möglich mit mod_php für jeden vHost eine eigene php.ini festzulegen.

Fazit

Durch Apache ITK und einigen Einstellungen ist es möglich ein wesentlich performanteres PHP zu bekommen, dass zudem Vergleich zur FastCGI Variante auch noch mehr Features besitzt und nicht unter dem generellen Benutzers des Apache Webservers läuft.

Aug 302009
 

Nachdem nun offiziell Snow Leopard erschienen ist war ich doch sehr gespannt wie genau sich die verschiedenen Neuerungen im alltäglichen Betrieb auswirken würden. Eines was mir auffiel war, dass Quicktime keine MKV Dateien mehr abspielt, selbst wenn man Perian installiert hat.

In der Perian User Group habe ich einen netten Tipp gefunden der es ermöglicht Quicktime X das abspielen von MKV Dateien zu ermöglichen. Dazu läd man sich den NicePlayer herunter, mountet das Image und führ diesen einmal aus. Nun ist auch Quicktime X in der Lage MKV Dateien anzuspielen.

Meine Vermutung wieso es nach dem einmaligem starten des NicePlayers auch Quicktime X möglich ist MKV Dateien abzuspielen ist, dass der NicePlayer die Datei ~/Library/Preferences/com.apple.quicktime.plugin.preferences.plist verändert und dort den MKV Kontainer als Videodatei einträgt. Bestätigen kann ich dies allerdings nicht, da ich die Datei nicht mehr im orginal Format habe.

Wie dem auch sei, viel spaß beim Film schauen.After Snow Leopard is now officially released I was eager to see how the various changes work out in day to day use. One thing I noticed right after installing Snow Leopard was, that Quicktime X is not able to play MKV files, even if you got Perian installed.

On the Perian User Group I have found a very nice Tip how to enable Quicktime X to play MKV files again. To do so you need to download NicePlayer, mount the Image and open it once. Now you can close and delete NicePlayer and open MKV files with Quicktime X again.

My assumption why it is possible to play MKV files again with Quicktime X after launching NicePlayer once is, that NicePlayer adds the MKV Container as videofile to ~/Library/Preferences/com.apple.quicktime.plugin.preferences.plist. But since I don’t have the original file anymore I can not verify this thesis.

Anyway have fun playing MKV files with Quicktime again.

Aug 172009
 


Generelles zu Filtern

In der kleinen AsciiArt unten kann man erkennen wie Filter funktionieren. Von links kommt das Request an die Applikation, dieses wird vom Dispatcher bearbeitet, der das Request und seine Daten durch die Globalen Filter schickt, diese leiten es dann an die entsprechende Action weiter, welche wiederum das ganz durch ihre eigenen Filter schickt. Jetzt wird erst das Output generiert und die Filter werden danach in umgekehrter Reihenfolge wieder durchlaufen.

Agavi's Filters are like an Onion

Agavi's Filter sind wie eine Zwiebel

Bei allen Filtern ist es so, dass die Auflistung die Reihenfolge der Ausführung bestimmt. Weiter unten ein kleines Beispiel dazu.

Globale Filter

Was sind globale Filter? – Globale Filter gelten für das Request an die Applikation. Als Beispiel kann hier der FormPopulationFiler dienen. Dieser Filter ist in der Lage eine HTML mit Werten zu füllen, was aber erst gemacht werden kann, nachdem das ganze Request durchgelaufen ist und das Output generiert worden ist. Somit ist es möglich in dem Request weitere ActionContainer zu kreieren und weiter Actions auszuführen.

Die Konfiguration der Globalen Filter findet in der global_filter.xml im Konfigurationsverzeichnis der Applikation statt. Hierbei bestimmt die Reihenfolge in welcher sie in der Datei aufgelistet werden in welcher Reihenfolge sie ausgeführt werden.

<filter name="FirstFilter"/>
<filter name="SecondFilter"/>

Hier würde der Filter mit dem Namen FirstFilter zuerst, danach dann der SecondFilter ausgeführt. Die Globalen Filter werden vom Controller geladen und auf gerufen. Hierbei gilt, dass der Controller explizit den Filter AgaviDispatchFilter registriert und ihn dann gleich danach aufruft. In diesem wird das Response gesetzt, aus dem was noch kommt.

Action Filter

Action Filter sind, wie der Name auch schon sagt, für die Action gedacht. Die Grafik oben verdeutlicht dieses sehr gut. Eine Action generiert uns ja in der passenden View das Output, welches vor der Ausgabe dann noch mit dem FormPopulationFilter bearbeitet wird.

Bei den Action Filtern gibt es eine Besonderheit. Zum einen gibt es die Action Filter, die für jede Action aufgerufen werden und Spezial Action Filter die nur für eine bestimmt Action aufgerufen werden. Die Spezialfilter werden im app/Modulverzeichnis/config/action_filters.xml spezifiziert. Die Filter die für alle Actions gelten sollen werden in app/config/action_filters.xml spezifiziert.
Zur der Reihenfolge der Ausführung ist zu sagen, dass erst die generellen und dann die speziellen.

Noch etwas sehr wichtiges, dass man bei dem entwerfen eines Action Filters nicht vergessen darf, ist das jeder Slot, jede ForwardAction ihre eigene FilterChain hat, welche die Filter nochmal durchläuft. Deswegen gibt es zwei Verschiedene Methoden in der Klasse. Die eine, executeOnce, wird immer für die “main” Action auf gerufen, die andere execute wird dann in den restlichen FilterChains auf gerufen. Sollte man aber wollen, dass der Filter beim ersten bis zum letzten Aufruf immer gleich aufgerufen wird, bedient sich die Klasse AgaviFilter dem Trick, dass executeOnce einfach execute aufruft. ExecuteOnce muss als explizier überschrieben werden.

Aufbau eines Filters

Filter sollten immer die Klasse AgaviFilter erweitern. Dort sind schon einmal die grundlegenden Funktionen definiert wie die oben beschriebene executeOnce Methode.

In dem nachfolgenden Beispiel implementieren wir die Klasse FooBarFilter. Diese kann entweder wie im Beispiel ein Klasse sein die sowohl Global als aus Action Filter ist oder nur eines von beiden. (Hier ist es zu Demonstrationszwecken so gewählt)

<?PHP
class FooBarFilter extends AgaviFilter implements AgaviIActionFilter, AgaviIGlobalFilter {
 
public function executeOnce(AgaviFilterChain $filterChain, AgaviExecutionContainer $container)
{
    /* Stuff to be done before the Rest of filters and Output generation is executed */
 
    /* Now we continue with the other filters. THIS MUST BE DONE!!! */
    $filterChain->execute($container);
 
    /* now to the Stuff which needs to be done afterwards. ie. Output transformation etc. */
}
}
?>

Das Beispiel oben hat zu dem nur die Methode executeOnce, was also heißt das der Filter pro Kontext nur einmal ausgeführt würde.

Weiter Infos zu und um Agavi gibt es auf http://www.agavi.org. Auch zu empfehlen ist der Agavi FAQ in dem einige interessante Themen rund um Agavi behandelt werde.

ENGLISH TRANSLATION WILL FOLLOW!

Generelles zu Filtern

In der kleinen AsciiArt unten kann man erkennen wie Filter funktionieren. Von links kommt das Request an die Applikation, dieses wird vom Dispatcher bearbeitet, der das Request und seine Daten durch die Globalen Filter schickt, diese leiten es dann an die entsprechende Action weiter, welche wiederum das ganz durch ihre eigenen Filter schickt. Jetzt wird erst das Output generiert und die Filter werden danach in umgekehrter Reihenfolge wieder durchlaufen.

Agavi's Filters are like an Onion
Agavi’s Filter sind wie eine Zwiebel

Bei allen Filtern ist es so, dass die Auflistung die Reihenfolge der Ausführung bestimmt. Weiter unten ein kleines Beispiel dazu.

Globale Filter

Was sind globale Filter? – Globale Filter gelten für das Request an die Applikation. Als Beispiel kann hier der FormPopulationFiler dienen. Dieser Filter ist in der Lage eine HTML mit Werten zu füllen, was aber erst gemacht werden kann, nachdem das ganze Request durchgelaufen ist und das Output generiert worden ist. Somit ist es möglich in dem Request weitere ActionContainer zu kreieren und weiter Actions auszuführen.

Die Konfiguration der Globalen Filter findet in der global_filter.xml im Konfigurationsverzeichnis der Applikation statt. Hierbei bestimmt die Reihenfolge in welcher sie in der Datei aufgelistet werden in welcher Reihenfolge sie ausgeführt werden.

<filter name="FirstFilter"/>
<filter name="SecondFilter"/>

Hier würde der Filter mit dem Namen FirstFilter zuerst, danach dann der SecondFilter ausgeführt. Die Globalen Filter werden vom Controller geladen und auf gerufen. Hierbei gilt, dass der Controller explizit den Filter AgaviDispatchFilterregistriert und ihn dann gleich danach aufruft. In diesem wird das Response gesetzt, aus dem was noch kommt.

Action Filter

Action Filter sind, wie der Name auch schon sagt, für die Action gedacht. Die Grafik oben verdeutlicht dieses sehr gut. EineAction generiert uns ja in der passenden View das Output, welches vor der Ausgabe dann noch mit demFormPopulationFilter bearbeitet wird.

Bei den Action Filtern gibt es eine Besonderheit. Zum einen gibt es die Action Filter, die für jede Action aufgerufen werden und Spezial Action Filter die nur für eine bestimmt Action aufgerufen werden. Die Spezialfilter werden im app/Modulverzeichnis/config/action_filters.xml spezifiziert. Die Filter die für alle Actions gelten sollen werden inapp/config/action_filters.xml spezifiziert.
Zur der Reihenfolge der Ausführung ist zu sagen, dass erst die generellen und dann die speziellen.

Noch etwas sehr wichtiges, dass man bei dem entwerfen eines Action Filters nicht vergessen darf, ist das jeder Slot, jede ForwardAction ihre eigene FilterChain hat, welche die Filter nochmal durchläuft. Deswegen gibt es zwei Verschiedene Methoden in der Klasse. Die eine, executeOnce, wird immer für die “main” Action auf gerufen, die andere execute wird dann in den restlichen FilterChains auf gerufen. Sollte man aber wollen, dass der Filter beim ersten bis zum letzten Aufruf immer gleich aufgerufen wird, bedient sich die Klasse AgaviFilter dem Trick, dass executeOnce einfach execute aufruft. ExecuteOnce muss als explizier überschrieben werden.

Aufbau eines Filters

Filter sollten immer die Klasse AgaviFilter erweitern. Dort sind schon einmal die grundlegenden Funktionen definiert wie die oben beschriebene executeOnce Methode.

In dem nachfolgenden Beispiel implementieren wir die Klasse FooBarFilter. Diese kann entweder wie im Beispiel ein Klasse sein die sowohl Global als aus Action Filter ist oder nur eines von beiden. (Hier ist es zu Demonstrationszwecken so gewählt)

<?PHP
class FooBarFilter extends AgaviFilter implements AgaviIActionFilter, AgaviIGlobalFilter {
 
public function executeOnce(AgaviFilterChain $filterChain, AgaviExecutionContainer $container)
{
    /* Stuff to be done before the Rest of filters and Output generation is executed */
 
    /* Now we continue with the other filters. THIS MUST BE DONE!!! */
    $filterChain->execute($container);
 
    /* now to the Stuff which needs to be done afterwards. ie. Output transformation etc. */
}
}
?>

Das Beispiel oben hat zu dem nur die Methode executeOnce, was also heißt das der Filter pro Kontext nur einmal ausgeführt würde.

Weiter Infos zu und um Agavi gibt es auf http://www.agavi.org. Auch zu empfehlen ist der Agavi FAQ in dem einige interessante Themen rund um Agavi behandelt werde.

Aug 122009
 

Seit ein paar Tagen habe ich nun auch bei Hetzner einen Rootserver gemietet und muss sagen, dass ich im Vergleich zu Server4You sehr zufrieden bin. Die Hardware und Preis stimmen, das einziges kleine Manko ist die doch relativ hohe Einrichungsgebühr von 149EUR.

Der Server lässt sich sehr komfortabel über den Robot steuern, also Neustarten, Rescue etc. Bei dem Rescuesystem gibt es allerdings einige Kleinigkeiten die mich stören. Diese sind, dass das Passwort nur sehr kurze Zeit angezeigt wird, der Rescuemodus wird nach 5 Minuten wieder beendet somit ist kein Reboot im Rescue möglich. Ehrlich gesagt kann ich den letzen Punkt verstehen, da man eigentlich nur einmal ins Rescue bootet und dann hoffentlich nie wieder.

Fazit: Bis jetzt scheint Hetzner ein sehr fähiger und guter Provider zu sein, mal sehen wie sich dies in Zukunft verhalten wird.

Aug 092009
 

Seit dem heutigen Tag habe ich ein zweisprachiges Blog in dem ich versuchen werde die meisten Artikel sowohl auf Deutsch als auch auf Englisch zu schreiben.

Es hat wirklich lange gedauert bis ich dieses Vorhaben endlich umsetzen konnte, da mir dazu immer das entsprechende Plugin oder die Unterstützung durch WordPress gefehlt hat. Durch Zufall bin ich aber auf das Plugin qTranslate aufmerksam geworden, welches genau dieses Feature zur Verfügung stellt.

Auf dann, ab in eine zwei sprachig Zukuft.Since today I own a blog which from now on will serve most articles in two langauges, german and english.

It took me a while to complete this undertaking since I was not able to find a suitable Plugin nor did WordPress on its own support this feature , but I succeeded at last. Per incedent I found the Plugin qTranslate, which exactly supports multi language.

Towards a future of bilingual post.

Jul 292009
 

Irgendwie war klar das mindestens ein Team zum Ende der Session gehen würde, aber das es gerade BWM ist verwundert mich doch schon sehr. Leider lief es bis heute nicht gut, aber was nicht ist kann ja noch werden.

Ich hoffe nur das Kubica und Heidfeld der Formel1 erhalten bleiben. Ein Pole als Weltmeister wäre schon stark!

Jun 272009
 

SysCP ist ein prima Tool um einfach und schnell eine Webhostingumgebung zu managen. Besonders seine “keep it simple” Idee macht es zu dem was es ist. Leider sieht es unter der Haube etwas anders aus. Dort ist es seit einiger Zeit so, dass der Code ein Stadium erreicht hat, in dem er alles andere als simpel zu verwalten ist.

Darum habe ich mich entschlossen eine Fork von SysCP zu starten, der vorerst unter dem Namen SysCP-ng laufen wird. Ziel der Version 1.0 ist es die derzeitige Funktionalität von SysCP (1.4.2) nachzubauen.

Mal sehen was drauß wird.

Jun 262009
 

Eben habe ich ein PostgreSQL Upgrade von 8.0 auf 8.1 durch geführt, da dies mein erstes PostgreSQL Upgrade war, lief natürlich etwas schief (na ja so halb). Also hier nur als keine Notiz wie ich PostgreSQL wieder zum laufen gebracht habe.

pg_dumpall &lt; all.dump
rm -rf /var/lib/postgresql/data
psql -f all.dump -U postgres postgres

So das wars auch schon, schönes Wochende noch.