Fehlersuche mit „git bisect“

In größeren Projekten arbeiten meist mehrere Entwickler an einem Git-Repository. Und wie es bei der Software-Entwicklung nun einmal ist kommt es ab und an zu Fehlern. Bei einer komplexen Versionshistorie ist es allerdings schwierig den Ursprungscommit eines Fehlers zu finden. An dieser Stelle hilft das Git-Kommando bisect weiter. Zum Start muss Git mitgeteilt werden welcher der letzte (aus Sicht des Entwicklers) korrekt funktionierende und der erste fehlerhafte Commit ist. Dies geschieht im Terminal auf dem Repository mittels:

git bisect start
git bisect good <hash>
git bisect bad <hash>

Danach checkt bisect einen Commit aus. Dieser Commit muss nun auf den gesuchten Fehler überprüft werden. Ist der Fehler weiterhin vorhanden, so teilen wir dies Git mittels:

git bisect bad

mit. Ist der Fehler nicht mehr vorhanden, so teilen wir Git dies ebenfalls mit:

git bisect good

Dieser Prozess wird dabei so lange durchlaufen bis Git uns am Ende des Prozesses mitteilt, in welchem Commit der Fehler seinen Ursprung hat. Danach können wir uns den Commit notieren und bisect mittels:

git bisect reset

mitteilen das der Prozess zu einem Ergebnis geführt hat. Dadurch wird das Repository in seinen Ursprungszustand versetzt.

Probleme mit dem Chrome Präsentationsmodus unter Mac OS X

Unter Mac OS X gibt es in den aktuellen Versionen des Browser Chrome einen nervigen Bug. Wenn man den Vollbildmodus aktiviert, kann es passieren, das Chrome in den Präsentationsmodus schaltet. Dieser lässt sich dann nicht einfach per Escape, sondern nur mit der entsprechenden Tastenkombination (Shift + Cmd + F) beenden.

Chrome

Chrome

Bei dem Fehler scheint es sich um einen Regresionsfehler zu handeln, wie der entsprechende Bugreport zeigt. Leider scheint es im Moment keinen Workarround zu geben, so das man hier auf eine fehlerbereinigte Version warten muss. In der Zwischenzeit sollte man sich obige Tastenkombination merken.

Probleme mit der Fontauswahl unter Inkscape

In einigen Versionen hat Inkscape Probleme mit der Fontauswahl. Nachvollziehen kann man das zum Beispiel mit den Ubuntu Fonts. Diese gibt es in den Varianten „Ubuntu“, „Ubuntu Condensed“ und „Ubuntu Light“. Möchte man nun z.B. den Font „Ubuntu Light“ anwählen, so funktioniert es nicht. Inkscape springt unvermittelt auf den Font „Ubuntu“.

Die Fontauswahl unter Inkscape

Die Fontauswahl unter Inkscape

Bei diesem Problem handelt es sich um ein Fehler in Inkscape, welche sich glücklicherweise umschiffen lässt. Dazu gibt man den Fontnamen, in der Fontleiste ein und hängt ein Komma an den Namen. Aus „Ubuntu Light“ wird dann „Ubuntu Light,“. Damit akzeptiert Inkscape den Font und man kann wieder damit arbeiten.

Weitere Informationen gibt es unter:
https://bugs.launchpad.net/inkscape/+bug/595432

Der Internet Explorer und Comboboxen

AJAX ist schon eine feine Sache. Wenn die Daten dann zurückkommen und man damit eine Combobox füllen möchte so sieht das meist so aus:

function showData() {
  if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete") {
    document.getElementById("combobox").innerHTML = xmlHttp.responseText;
  }
}

Es gibt hierbei bloß ein Problem, der Internet Explorer mag es einfach nicht. Während dieser Code mit Chrome, Firefox, Opera et cetera wunderbar funktioniert, gibt es beim Internet Explorer ein Problem. Er hat Probleme mit dem innerHTML und füllt es einfach nicht.

Damit man nun nicht seinen ganzen Code umschreiben muss gibt es auf http://www.fpruefer.de/blog/archives/innerHTML-und-die-Select-Box-2009-08-04.html eine interessante Funktion welche sich das outerHTML nimmt (welches der Internet Explorer unterstützt) und dort die <select> Tags ausspart und nur alles zwischen diesen Tags ändert. Die Funktion welche die Arbeit dabei erledigt sieht dabei so aus:

function fillSelect(pList, pOptionHTML)
{
  if (pList) {
    if (pList.outerHTML) {
      var begin = pList.outerHTML.match(/(<select .*?>)/i);
      var end   = pList.outerHTML.match(/(<\/select>)/i);

      if (begin && end) {
        var s = begin[1] + pOptionHTML + end[1];
        pList.outerHTML = s;
      }
   }
  else {
    pList.innerHTML = pOptionHTML;
    }
  }
}

Angewendet wird sie dann so:

fillSelect(document.getElementById("combobox"), xmlHttp.responseText);

Und schon ist dieses Problem Geschichte :)

Weitere Informationen gibt es unter:
http://support.microsoft.com/kb/276228/de