GoogleLabsVerschachtelteLabels

Google Mail beherrscht nun verschachtelte Labels

Ein Feature, das ich mir schon bald nach der Umstellung auf einen Google Mail Account gewünscht habe, ist nun umgesetzt worden. Labels in Labels sind nun verschachtelbar.

Aktivieren

Man muss einfach unter Labs “Verschachtelte Labels” aktivieren.

Anschließend kann man Labels verschachteln.

Namenskonvention

Die Hierarchie ergibt sich aus der Namenskonvention. Das “Eltern”-Label wird im Namen des Unter-Labels durch ein “/” getrennt voranstellt.

Beispiel

Hat man zwei bestehende Labels, z.B. Privat und Notes, so kann man Notes als Unter-Label von Privat anlegen, indem man Notes folgenden neuen Namen gibt:
Privat/Notes

Das Ergebnis sieht dann so aus:

So ist es möglich, bestehende Labels einfach durch umbenennen zu gruppieren.

Auswirkung auf IMAP

Wenn man seine Mails auch noch per IMAP in einem Mail-Client abruft, so wird man erfreut feststellen, dass die Unter-Labels dabei auch in Unter-Ordner abgebildet werden! D.h. es wird bei o.g. Beispiel nicht ein Ordner “Privat/Notes” angelegt, sondern “Notes” als Unter-Ordner von “Privat”. Absolut genial.

PHP string contains und startsWith

Wer von anderen Programmiersprachen evtl. gewohnt ist, einen String nach einem Zeichen bzw. Teilstring zu durchsuchen, wird in PHP etwas verwundert sein. Eine entsprechende Funktion wie, strcontains (um der Namensgebung in PHP zu folgen) gibt es nicht.
Natürlich wird man sehr schnell fündig werden und auf strpos stoßen, was eben die in der Überschrift genannten Funktionen vereint.

Hintergrund

Folgender Ausdruck liefert den Integer Wert 5 zurück, da ‘der’ im Text an fünfter Stelle (beginnend mit 0) vor kommt.
strpos('Text der was enthält','der')

Suchte man nach ‘Text’ würde man 0 als Ergebnis erhalten.
Ein nicht vorkommendes Zeichen bzw. Textstück wird mit einem ‘false’ quittiert.

Hier zeigt sich dann aber auch ein kleines Problem: PHP behandelt standardmäßig den booleschen Wert ‘false’ wie ’0′.
Ein einfacher Vergleich der Form
if (strpos($haystack,$needle)==0)
könnte dann ein unerwünschtes Ergebnis liefern, wenn man auf die Position 0 prüfen möchte. Wenn der Text $haystack nicht $needle enthält würde ein false zurück geliefert, was bei einem einfachen Vergleich wie 0 behandelt wird, somit die Bedingung erfüllt!
Würde man erwarten, dass das 0 als false interpretiert wird, würde ein $needle, das genau am Beginn von $haystack steht auch für ein falsche Ergebnis sorgen.
In jedem Fall ist es Wichtig zu Wissen, dass PHP für diesen Fall den “===” Vergleichs-Operator ‘Identisch’ kennt. Wird zwar deutlich in der Dokumentation zu strpos beim Rückgabewert darauf hingewiesen, aber evtl. für manchen erst mal verwirrend. Dieser Operator vergleicht auch den Typen, sodass das boolesche false NICHT dasselbe ist, wie der Integer 0.

Umsetzung

Mit diesem Wissen kann man strpos für die ursprünglich gewünschten Funktionen einsetzen:
startsWith entspricht folgendem Vergleich:
if (strpos($heystack,$needle)===0)

contains entspricht folgenem Vergleich:
if (strpos($haystack,$needle)!==false)

Da ich nach etwas PHP-Abstinenz immer wieder etwas brauche, um genau diesen Sachverhalt zu verstehen, habe ich diese Vergleiche in Funktionen ausgelagert, die einen sinnvollen Namen haben.

strcontains($haystack,$needle) {
  if  (strpos($haystack,$needle)!==false)
    return true;
  else
    return false;
}
strstartswith($haystack,$needle) {
  if  (strpos($haystack,$needle)===0)
    return true;
  else
    return false;
}

Natürlich könnte man diese Zeilen noch etwas komprimierter schreiben, aber so lässt sich das ganze auch später (oder von Anderen) gut lesen und nachvollziehen.

iPhone bleibt im Startbildschirm hängen

Genauer gesagt, das Apfel-Logo während des Bootvorgangs ist sichtbar. Sobald das Gerät (gefühlsmäßig) fertig gebootet hat erscheint nicht das Springboard, sondern der Apfel bleibt weiterhin sichtbar – zusätzlich überlagernd der runde “Lade-Indikator”, der sich aber nicht bewegt. Nach einigen Sekunden startet das System neu durch, was dann in einer Endlosschleife resultiert.

Laut Apfeltalk Forumsbeitrag hilft das bloße anstecken und einschalten des iPhones bei laufendem iTunes (zumindest bei OS 2.x). Bei mir (OS 3.1.2) half dieses Vorgehen auch nach längerer Wartezeit leider nicht.

Die Lösung

Die (unangenehme) Lösung bestand nun darin, das iPhone wiederherzustellen. Hierbei zahlt es sich aus, das iPhone regelmäßig zum Syncen und damit zum Datensichern mit iTunes zu verbinden. Nur so kann man einen Stand wiederherstellen, der einigermaßen aktuell ist.