In eigener Sache

Du kannst PHP? Die Arbeit für eine Agentur ist nichts für Dich? Preissuchmaschinen langweilen Dich zu Tode? Du hast ein schlechtes Gewissen Leute mit einem Freemium Modell auszubeuten? Du willst nicht in der anonymen Masse von Entwicklern untergehen?

Dann sind wir vielleicht genau der richtige Arbeitgeber für Dich.

Das Wort TEAM wird bei uns großgeschrieben. Wenn Du mal nicht weiter kommst, kein Problem. Es findet sich immer jemand, der Dir gerne weiterhilft.

Du würdest gern mal einen neuen Ansatz ausprobieren? Dann triffst Du bei uns auf offene Ohren.

Falls das Dein Interesse geweckt hat, melde Dich doch mal bei uns.
Linux-Administrator (m/w) in Festanstellung gesucht
PHP Webentwickler (m/w) in Festanstellung in Berlin gesucht
PHP Webentwickler (m/w) in Festanstellung in Dresden gesucht

Datenbankfehler nach Update auf HHVM 3.6

Nach dem Update von HHVM auf Version 3.6 konnten meine Seiten nicht mehr auf ihre MySQL Datenbank zugreifen. Ursache des Problems ist, dass bei den Paketen für Ubuntu/Debian  der Socket für die Verbindung zu localhost hart auf „/tmp/mysql.sock“ kodiert ist.

Der richtige Socket wäre aber „/var/run/mysqld/mysqld.sock“. Glücklicherweise gibt es dafür einen Konfigurationsparameter sodass man HHVM  nicht selbst neu kompilieren muss.

Es genügt ein Eintrag in der Datei /etc/hhvm/server.ini

hhvm.mysql.socket = /var/run/mysqld/mysqld.sock

TexLive 2014 unter Ubuntu 14.04

Es gibt derzeit keine Pakete von TexLive 2014 für die aktuelle Ubuntu Version 14.04 diese stehen erst für die nächste Version mit Codenamen Utopic zur Verfügung.
Um die Pakete zu installieren muss man zuerst die Repository URL von Utopic zur /etc/apt/sources.list hinzufügen

deb http://de.archive.ubuntu.com/ubuntu/ utopic main universe restricted multiverse

und im Anschluss die benötigten Pakete auf Utopic pinnen. Dies geschieht mit der neuen Datei /etc/apt/preferences.d/texlive mit folgendem Inhalt

Package: context
Pin: release n=utopic
Pin-Priority: 900

Package: libtext-*
Pin: release n=utopic
Pin-Priority: 900

Package: dvipng
Pin: release n=utopic
Pin-Priority: 900

Package: luatex
Pin: release n=utopic
Pin-Priority: 900

Package: biber
Pin: release n=utopic
Pin-Priority: 900

Package: libkpathsea6
Pin: release n=utopic
Pin-Priority: 900

Package: libpoppler46
Pin: release n=utopic
Pin-Priority: 900

Package: libptexenc1
Pin: release n=utopic
Pin-Priority: 900

Package: libsynctex1
Pin: release n=utopic
Pin-Priority: 900

Package: context-*
Pin: release n=utopic
Pin-Priority: 900

Package: pgf
Pin: release n=utopic
Pin-Priority: 900

Package: thailatex*
Pin: release n=utopic
Pin-Priority: 900

Package: tex-*
Pin: release n=utopic
Pin-Priority: 900

Package: texlive
Pin: release n=utopic
Pin-Priority: 900
Package: texlive-*
Pin: release n=utopic
Pin-Priority: 900

Package: latex-*
Pin: release n=utopic
Pin-Priority: 900

Package: *
Pin: release n=utopic
Pin-Priority: -10

Der letzte Eintrag sorgt dafür das sonst keine Pakete von Utopic verwendet werden.

Flackerndes Display bei Dell Vostro 3550 unter Ubuntu

Beim Dell Vostro 3550 gibt es unter Ubuntu einen nervigen Bug. In den ersten ca. 10 Minuten nach dem einschalten, schaltet das Notebook ständig zwischen verschiedenen Displayeinstellungen hin und her. Dabei ist es völlig egal wie oft man diese mit XRandR neu setzt. Noch viel nerviger ist dabei, dass die Maus jedes Mal den Fokus verliert.

Das Problem selbst scheint aber nicht nur Ubuntus Unity zu betreffen, sondern z.B. auch Gnome 3 unter Arch.

Dieses von dem User beschriebene Event wird bei mir auch jedes Mal geworfen, wenn sich das Display wieder mal auf zufällige Werte zurücksetzt. Woher es kommt und wodurch es ausgelöst wird, ist nicht feststellbar. Es scheint aber nur dann aufzutreten wenn der Intel Grafikchip verwendet wird und steht in Zusammenhang mit der hybriden Grafiklösung (Intel/AMD).

Die momentane Lösung besteht also darin dem XServer beizubringen, das er dieses Event einfach ignorieren kann. Dazu erzeugt man eine neue Konfiguration in /usr/share/X11/xorg.conf.d damit diese unabhängig von einer evtl. vorhandenen /etc/X11/xorg.conf verwendet wird.

Diese Datei (10-flickering-fix.conf) enthält folgenden Inhalt:

Section "InputClass"
        Identifier "unknown device that causes display flicker"
        MatchDevicePath "/dev/input/event7"
        Option  "Ignore" "on"
EndSection

Dazu erstellt man ein Script das bei jedem Start ausgeführt wird und den entsprechenden „Video Bus“ deaktiviert.

Das Script 40custom-vostro-fix liegt in /etc/X11/Xsession.d und enthält nur eine Zeile.

xinput disable 8

Howto: Windows 8 – Ruhezustand aktivieren


Da die Rechner mit Windows 8 schneller hochfahren als bei den Vorgängerversionen, hat sich Microsoft unverständlicherweise dazu entschlossen, den Ruhezustand aus den Standardoptionen zu entfernen. Stattdessen wird nur noch “Herunterfahren” und “Energie sparen” angeboten. Die erste Option sogt dafür, dass man bei erneutem Einschalten alle seine Programme neu starten muss und die Zweite verbraucht jede Menge Energie und führt bei Verlust der Netzspannung zum gleichen Effekt wie die erste Option.

Dieser lässt sich aber relativ einfach wieder aktivieren:

Man startet zunächst die Eingabeaufforderung als Administrator. Die geht am schnellsten mit einem Rechtsklick auf die Startkachel, welche angezeigt wird wann man die Maus in die linke untere Ecke des Bildschirms bewegt.

Start Kontextmenü der Startkachel

Da aktiviert man mit dem Kommando „powercfg -h on“ den Ruhezustand

Eingabeaufforderung mit Kommando

Damit dieser auch im Menü angezeigt wird, muss man jetzt in der Systemsteuerung, bei den Energieoptionen unter dem Punkt „Auswählen was beim Drücken von Netzschaltern geschehen soll“ alle Optionen mittels Klick auf „Einige Einstellungen sind momentan nicht verfügbar.“ aktivieren.

Energieoptionen Netzschalteroptionen

Anschließend kann man unterhalb bei „Einstellungen für das Herunterfahren“ den Haken für den Ruhezustand setzen.

Netzschalteroptionen nach Freischaltung

PHP und das Datetime Problem

Alle modernen PHP-Frameworks setzen bei der Verarbeitung von Datums- und Uhrzeitangaben auf die Klasse Datetime, welche PHP von haus aus mitbringt. Die Klasse ist praktisch, kapselt sie doch alle Funktionen die man für das Arbeiten mit einem Datum braucht an einer Stelle.

Sie hat aber bei der Nutzung in Frameworks bzw. deren ORM einen entscheidenden Nachteil. Ihr fehlt die magische __toString() Methode, welche dafür sorgt das sich ein Objekt der Klasse in den Datentyp string konvertieren lässt.

Datetime in Doctrine

So ist es in Doctrine2 beispielsweise bisher nicht möglich, Spalten eines Datums- oder Uhrzeittyps als Teil des Primärschlüssels zu verwenden. Dieser wird zur internen Identifizierung aus einer Verkettung der jeweiligen String-Entsprechung der beteiligten Spalten gebildet. Das funktioniert wunderbar einfach, solange alle Objekte eine __toString() Methode besitzen. Tun sie das nicht erhält man eine Exception.

Eine Lösung wäre jetzt die explizite Prüfung, ob es sich bei einer der beteiligen Spalten um einen Datetime Datentyp handelt und eine entsprechende Sonderbehandlung dieses Typs. Diesen Weg ist man gegangen, der dazugehörige Code hat es aber aus Performancegründen nie in einen produktiven Zweit des Repository geschafft.

Eine andere Lösung ist das Überschreiben, der von Doctrine verwendeten Datetime Klasse, für die entsprechenden SQL-Typen zu einer Datetime Klasse die eine generische __toString() Methode zur Verfügung stellt.

Klingt einfach, bringt aber ein Problem mit sich. Wenn man von der Klasse Datetime ableitet, kann man zwar relativ leicht die __toString() Methode ergänzen, man muss aber immer noch Objekte der Klasse Erzeugen können. Da Datetime schon vor PHP 5.3 existierte, unterstützt die Klasse keinerlei LSB Funktionalität. D.h. die statische Methode MyDatetime::createFromFormat() wird immer ein Objekt vom Typ Datetime liefern, welches man beim Aufruf der Methode im Kontext der Klasse MyDatetime gleich wieder verwerfen kann, um daraus ein neues Objekt vom richtigen Typ zu erzeugen.

Datetime in Propel

Von dem gleichen Problem mit der fehlenden __toString() Methode ist auch Propel betroffen, denn auch da werden zur Identifizierung einfach die jeweiligen String-Entsprechungen verkettet. Das Problem lässt sich aber bei Propel leichter umgehen, indem man die Nutzung der Datetime Klasse für Datums- und Uhrzeitangaben gleich komplett verbietet.

bekanntes Problem

Das Problem mit der fehlenden __toString() Methode bzw. fehlender LSB Funktionalität ist aber nicht neu. Entsprechende Tickets finden sich schon seit geraumer Zeit im Bug-Trackerr des PHP-Projekts. Es passiert aber rein gar nichts, da jeder Entwickler immer wieder Workarounds für diese fehlende Funktionalität einbaut.

  • Ticket von Benjamin Eberlei, seines Zeichens einer der Hauptentwickler von Doctrine, wegen fehlendem LSB. (https://bugs.php.net/bug.php?id=60302) Er wollte offensichtlich von Datetime ableiten und stieß dabei auf das beschriebene Problem.
    • außer einer Reaktion vom Autor der Datetime Klasse mit einem: “Nicht so einfach wie ich zuerst dachte.” Ist nichts passiert.
  • Ticket wegen fehlender __toString() Methode und Vorschlag der Definition eines Standardformats welches von der Funktion zurück gegeben werden soll. (https://bugs.php.net/bug.php?id=41187) Das Ticket gibt es bereits seit dem Jahr 2007.
    • keinerlei Reaktion

Selbst ist der Mann

Ich dachte mir “Wozu hab ich all die Jahre C gelernt?” und habe mich dem zweiten Ticket angenommen, da es das Problem an einer Wurzel beseitigt und ersteres ja nur daraus resultiert. Für mich ein voller Erfolg. Ich bin jetzt stolzer Besitzer einer PHP Version deren Datetime Klasse eine funktionierende __toString() Methode hat. Nur der Rest der Community nicht, sofern dieser nicht dazu übergeht seinen PHP-Quellcode selbst zu patchen und zu kompilieren. Der entsprechende Pull-Request auf Github verstaubt nämlich derzeit genauso wie das Ticket im PHP Bug-Tracker selbst.

Geforce GTX470 noch immer mit Treiberproblem


Seit ich die GTX 470 habe, leide ich trotz aktueller Version 285.62 unter einem Treiberproblem der Karte. Ein Hardwareproblem scheint das nicht zu sein, denn die Karte ist bereits die Dritte und das Problem ist immer noch da. Es sind auch nicht wie Anfangs vermutet Hitzeprobleme, denn es passiert auch direkt nach dem Booten oder wenn die Karte gerade mal 50°C Temperatur hat. Aktuell z.B. bei Might and Magic: Heroes VI denn da langweilt sie sich ohne Ende und trotzdem tritt der Fehler auf das sich der Treiber mitten drin einfach selber zurücksetzt und das System gleich völlig hängen bleibt.

Es betrifft aber auch genau so alle anderen Spiele, wenn auch nicht in der Häufigkeit. Siehe Bild mit Crash bei Dead Island .

So sieht das Bild aus wenn sich der Rechner beim Treiberabsturz komplett aufhängt.Interessanterweise lässt sich das Auftreten das Fehlers dadurch verzögern das man kein Multimonitor Setup verwendet, also vor dem Spielstart alle anderen Desktops bis auf den Primären deaktiviert.

Ich hoffe echt das Nvidia das bald hinbekommt, denn es nervt wirklich sehr!

Test – Raidsonic Icy Box IB-NAS5220

Installation der Platten

Platten:

  • 2 x Samsung HD501LJ (500GB)

Die Festplatten lassen sich sehr einfach in dem Gehäuse einbauen. Für den Einbau müssen lediglich Front- und Seitenblenden entfernt werden, dann lassen die Platten hineinschieben und man kann sie mit den mitgelieferten Schrauben festziehen.

Einrichtung der Platten

Das sich die Platten einfach ein- und ausbauen lassen ist bei dem Gerät auch bitter nötig. Denn beim Formatieren der Platten bleibt die Box ständig hängen. Das vom Support immer wieder empfohlene Low-Level-Formatierung der Platten kostet dabei unnötig Zeit und schafft keinerlei Abhilfe. Ein einfaches Löschen der Partitionen reicht.

Dies muss man auch ständig tun, denn von der nur halb eingerichteten Platten will die Box nicht starten. Man muss also nach jedem Fehlversuch die Platten wieder in den Rechner einbauen und die Partitionen von Hand löschen und das nur um wieder das träge und langsame Webinterface zu sehen.

Auch der Jumper um die Platte in den 1,5 Gbps Modus zu zwingen brachte keinerlei Besserung.

Den Betrieb an einer Fritz!Box kann ich bei der Form wie die Box versucht die Fortschrittsanzeige zu realisieren auch nicht empfehlen. Da alle 100ms eine “sinnlose” Anfrage gesendet wird, die wenn keine direkte Route definiert ist immer über das Standard-Gateway laufen. Das Ganze kommt einer DDOS-Attacke auf den Router gleich und die Fritz!Box startet irgendwann von selbst neu. Das ganze ist nachvollziehbar bei meiner 7270 v1, sowie bei der 7390.

Die Hardware

Die Icy Box 5220 besitzt so wenig internen Speicher, dass dieser nicht einmal ausreicht um eine 500GB Platte zu formatieren. Für diesen Zweck wird bereits eine extra Swap Partition benötigt. Einstellungen werden nicht in der Box direkt gespeichert sondern auf einer der eingebauten Platten in einer extra Systempartition. Dieses vorgehen macht zudem jegliche Konfiguration am Webinterface vorbei über SSH komplett nutzlos, da die Änderungen beim Neustart verloren gehen und keine Möglichkeit besteht diese Systempartition über die Shell auf die Platte zu bekommen.

Im Gegensatz zum Webinterface lassen sich die Platten über SSH einrichten und auch formatieren. Da die Konfiguration aber nicht gespeichert werden kann, ist das Ganze nutzlos.

Der verbaute Lüfter ist klein und laut. Trotz des hohen Geräuschfaktors ist der Lüfter trotzdem nicht in der Lage die Platten ausreichend zu kühlen. Das ganze Gehäuse wird also extrem heiß.

Fazit

Nach erfolgloser Reklamation, da ja immer noch die Hoffnung bestand, dass es sich um einen Einzelfall handelt, steht das Ding hier vorerst sinnlos rum.

Wer will es haben? Bestens geeignet für Leute die masochistisch veranlagt sind, denn mehr als Ärger hab man mit dem Teil nicht.

Howto: Debian 6 (Squeeze) mit nginx + FastCGI + Zend Framework

Falls noch nicht geschehen installieren wir zuerst mal nginx und php5-cgi PHP-FPM.

aptitude install nginx php5-cgi php5-fpm

Jetzt legen wir uns eine neue Konfigurationsdatei für nginx mit folgendem Inhalt an.

server {
	server_name  example.com;
	access_log  /var/log/nginx/com.example.access.log;
	if (!-e $request_filename) {
    		rewrite ^.*$ /index.php last;
	}
	root   /var/www/vhosts/example.com/public;
	index  index.php index.html;
	location ~ \.php$ {
		include /etc/nginx/fastcgi_params;
                keepalive_timeout 0;
                fastcgi_param  APPLICATION_ENV  'development';
                fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_pass    127.0.0.1:9000;
	}
}

Die Rewrite Regel leitet wie beim Zend-Framework üblich alle Dateien die nicht existieren auf die index.php um.

Die Datei wird anschließend als “/etc/nginx/sites-available/example.com” gespeichert und zum aktivieren verlinkt.

ln –s “/etc/nginx/sites-available/example.com “/etc/nginx/sites-enabled/example.com

Nun muss noch nginx neu startet werden.

/etc/init.d/nginx restart

Dateien mit der Endung .php werden also an localhost auf den Port 9000 weiter gereicht. An der Stelle wartet jetzt noch kein PHP auf die Anfrage. Man könnte jetzt also einfach php-cgi starten, das hält aber nur bis nächsten Neustart.

php-cgi -b 127.0.0.1 &

Oder aber man richtet sich ein entsprechendes Init Script ein.

Howto: Debian 5 (Lenny) mit Lighttpd (Lighty) + PHP 5.3 + Zend Framework

Backports einfügen

PHP Backports von dotdeb.org

deb http://php53.dotdeb.org stable all
deb-src http://php53.dotdeb.org stable all


Lighty Backports von bits and pieces

deb http://www.jonmoniaci.com/debian-ppa/ lenny main contrib non-free

Installation

aptitude install lighttpd php5-cgi
lighttpd-enable-mod fastcgi fastcgi-php

VHost einrichten

Wir legen jetzt eine neue Konfigurationsdatei für unseren VHost an.

touch /etc/lighty/available-mods/10-myvhost.conf


Die Datei bearbeiten wir jetzt mit einen beliebigen Editor

$HTTP["host"] == "myhost.example.com" {
	server.document-root = "/pfad/zur/ZF-Anwendung/public"
	url.rewrite-once = (
		".*\.(js|ico|gif|jpg|png|css)$" => "$0",
		".*\?(.*)$" => "/index.php?$1",
		"" => "/index.php"
	)
	setenv.add-environment = (
		"APPLICATION_ENV" => "development"
	)
}


Nun muss die Konfiguration noch aktiviert werden

lighttpd-enable-mod myvhost

Module hinzufügen

Jetzt müssen der Datei “/etc/lighttpd/lighttpd.conf” noch 2 Module hinzugefügt werden

server.modules = (
	#andere Module
        "mod_rewrite",
        "mod_setenv"
)

Konfiguration neu laden

/etc/init.d/lighttpd force-reload


Nachdem die Konfiguration neu geladen wurde, sollte das Ganze wie gewünscht funktionieren.