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

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.

Howto: Administrative Freigaben unter Windows 7 mit Heimnetzgruppe

Der Zugriff auf administrative Freigaben wie C$ bereitet unter Windows 7 wie schon unter Vista so einige Probleme.
Zu aller erst muss der schon von Vista bekannte Registry Schlüssen gesetzt werden „HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System/LocalAccountTokenFilterPolicy = DWORD:0x1“.

Das nächste Problem entsteht durch die vorhandene Heimnetzgruppe in der man auf anderen Rechnern automatisch als HomeGroupUser$ angemeldet wird. Da man sich pro Rechner nur mit einen Benutzer gleichzeitig anmelden kann, erscheint auch bei Eingabe des richtigen Nutzers samt Kennwort immer Zugriff verweigert.

Abhilfe schafft hier die Einstellung: „Benutzerkonten und Kennwörter zum Herstellen von Verbindungen mit anderen Computern verwenden“ in den erweiterten Freigabeeinstellungen. Für Leute die ihr Benutzerkonto nicht mit einer Live-ID verknüpft haben sollte das ganze nach einen Neustart funktionieren.

Wer dies allerdings getan hab wird sehen das es auf dem anderen Rechner immer mit seiner Live-ID angemeldet wird statt mit seinem echten Nutzernamen. Dieses Problem lässt sich nur lösen indem man die Verknüpfung von Live-ID und Nutzerkonto wieder löst.

Howto: Fix für Shader Compliation Error bei Shaun White Snowboarding

Wer auch das Problem hat, dass die Retail Version von Shaun White Snowboarding unter Windows 7/8 einen „shader compilation error“ beim Start meldet, kann das Problem ähnlich lösen, wie wenn dieses bei der Steam Version auftritt.
Man kopiert die Datei „EKShadersPC.BIN“ von „\ProgramData\Ubisoft\SWSnow“ nach „\Users\Public\Ubisoft\SWSnow“ und in der Ordner in dem das Spiel installiert ist.

Für die „ShaunWhiteSnowboardingGame.exe“ muss in den Eigenschaften der Kompatibiltätsmodus für Windows XP SP3 aktiviert werden.

p.s. Wer zusätzlich noch gerne eine höhere Auslösung hätte, findet die Einstellungen in der Registry unter „HKEY_CURRENT_USER\Software\Ubisoft\ShaunWhiteSnowboarding\1.0\Engine“ (ScreenResolutionHeight, ScreenResolutionWidth)

 

GUI Bugs in Windows Vista und 7

Ich möchte hier mal über 3 Bugs berichten die auftreten wenn man mehrere Bildschirme verwendet.
Die Konstellation besteht aus 3 Bildschirmen 1 x 22″ in der Mitte und 2 x 19″ daneben.
Zu aller erst mal ein Screenshot vom gesamten Bildschirminhalt.

Screenshot

Wie man sieht befinden sich die linke und die rechte Seite weiter unten, was daran liegt das die Bildschirme nicht gleich hoch sind und ich deswegen die Position so angepasst habe das man ein Fenster gerade zwischen den Bildschirmen hin- und herziehen kann.

Der Bug mit dem Hintergrundbild

Es wäre schön wenn man die Bilder jetzt einfach so anordnen könnte und ein großes Bild hätte, aber dem ist nicht so. Es gibt keine Möglichkeit die Hintergrundbilder pro Bildschirm zu ändern, also ist puzzeln angesagt.

Das Hintergrundbild das ich verwende um das Ergebnis zu erhalten sieht nämlich so aus.

dev

Wenn man die Nummerierung der Bildschirme in den Einstellungen beachtet ergibt das Ganze Sinn, rein vom logischen Verständnis aber nicht. Der primäre Bildschirm in der Mitte kommt mit Nummer 1 ganz links, gefolgt vom rechten mit Nummer 2. Nummer 3 ist dann der Bildschirm der eigentlich links steht, aber im Hintergrund ganz rechts kommt.

Der Bug mit der Taskleiste und Aero Glass

Offensichtlich waren auch die Entwickler von Microsoft bei der Position des Hintergrundbildes etwas verwirrt.

Wahrscheinlich aus Gründen der Performance ist die Taskleiste (sofern dauerhaft eingeblendet) nicht wirklich transparent sondern erhält einen statischen Hintergrund der berechnet wird sobald beim Start die Desktopsymbole angezeigt werden. Bis zu diesem Zeitpunkt ist also alles in Ordnung. Doch dann wird für diesen Hintergrund das Bildmaterial genommen, das sich auf dem Bildschirm befindet, der am weitesten links ist. Das sieht dann bei mir so aus.

Falsch

Richtig müsste es aber so aussehen (mit Option „Taskleiste automatisch ausblenden“)

Richtig

p.s. Immerhin dieser Bug wurde bei Windows 7 offensichtlich behoben.

Der Bug mit der Grenze für Symbole

Dadurch, dass ich die beiden äußeren Bildschirme weiter unten positioniert habe entsteht ein weiteren Bug.
Eine eigentlich nützliche Funktion die verhindern soll, dass Symbole unter der Taskleiste verschwinden, greift auch bei Bildschirmen auf denen sich diese gar nicht befindet. Ich kann also in dem Bildschirmteil, der sich unterhalb der oberen Grenze der Taskleiste befindet, keinerlei Symbole platzieren. Wenn man die Symbole per Drag’n’Drop an diese Stelle zieht werden sie beim loslassen automatisch wieder soweit nach oben geschoben, bis sie sich oberhalb der Höhe der Taskleiste befinden.

Abhilfe schafft in diesem Fall Fences, welches auch verhindert das die Symbole umsortiert werden sobald sich die Auflösung des primären Bildschirms z.B. durch Spiele ändert.