Bye bye, Rockmelt

Ziemlich genau zwei Jahre lang habe ich jetzt als primären Browser Rockmelt genutzt, und es tut mir schon ein bisschen weh wieder zu Chrome zurück zu wechseln. Leider lassen mir die Entwickler keine Wahl: Die größte Stärke von Rockmelt, der darunter liegende Chrome und die damit einhergehende Kompatibilität zu Erweiterungen leidet seit geraumer Zeit darunter dass die PC-Version nicht mehr gepflegt wird, immer mehr Erweiterungen verweigern den Dienst. Rockmelt findet es in der Zwischenzeit wichtiger eine Version für das iPad oder ein neues Logo zu entwickeln. Nichts gegen etwas neues, aber darunter sollte das ursprüngliche Produkt nicht leiden.

Mittlerweile macht es keinen Spaß mehr Rockmelt zu benutzen, einige Erweiterungen sind mir wichtiger als die tolle Integration von Social Features die von Anfang an meine Begeisterung für Rockmelt ausgelöst hat. Ein bisschen hat es vielleicht auch damit zu tun dass ich nicht mehr so viel Wert auf Benachrichtigungen aller Updates lege.

Ich hoffe dass die Entwickler sich irgendwann wieder besinnen und zumindest mal die aktuelle Chrome-Version in Rockmelt integrieren. Auf neue Features selbst bin ich gar nicht mal so scharf. Aber bis dahin … bye bye Rockmelt, hello Chrome.

Deutsches Datum in MySQL-Format konvertieren

Mit einem SQL-Einzeiler lassen sich Daten im deutschen Format in das MySQL DateTime-Format umschreiben.

UPDATE `table` SET `DateSQL`=STR_TO_DATE(`DateDeutsch`, "%d.%m.%Y");

Der zweite Parameter von STR_TO_DATE gibt dabei an in welchem Format das Datum im Feld DateDeutsch steht. %d steht für den Tag, %m für den Monat ung %Y für das (4-stellige) Jahr.

Email aus

In den letzten Monaten bin ich ich immer wieder über Blogbeiträge und Artikel von Leuten gestoßen, die testhalber alle Email-Benachrichtigungen abschalten und nur noch ab und an nach neuen Emails schauen. Alle berichten übereinstimmend, dass sie mit dem Ergebnis sehr zufrieden sind. Am Anfang ist es etwas gewöhnungsbedürftig, wenn man es gewohnt ist dass jede ankommende Email sofort an PC, Laptop, Handy, Tablet eine Benachrichtigung auslöst, aber nach kurzer Zeit freut man sich darüber dass man nicht mehr ständig unterbrochen wird, sich besser auf die aktuelle Tätigkeit konzentrieren kann und mehr von allem anderen mitbekommt.

Am 06.09.2012 habe ich beschlossen das auch mal auszuprobieren. Auf dem Handy habe ich Benachrichtigungston und Vibration abgeschaltet, so dass nur noch das Email-Symbol in der Benachrichtigungsleiste auftaucht. So sehe ich noch dass etwas neues da ist wenn ich ohnehin auf das Handy schaue. Am PC habe ich im Outlook/Postbox den Benachrichtigungston, das Fenster sowie das Icon in der Taskleiste abgeschaltet, so dass ich auch hier neue Emails erst sehe wenn ich das Mailprogramm öffne.

Zwei Monate später ist es Zeit für ein Fazit. Kurz gesagt: Es funktioniert. Bereits nach recht kurzer Zeit (vielleicht zwei Wochen oder so) habe ich nichts mehr vermisst, ich hole das Handy deutlich seltener aus der Tasche, konzentriere mich mehr darauf was ich gerade tue und habe dabei nicht das Gefühl ich würde irgend etwas verpassen. Nachdem ich mich daran gewöhnt hatte bin ich noch weiter gegangen und habe Benachrichtigungen von Facebook, Twitter etc. ebenfalls abgeschaltet, so dass ich nur noch Benachrichtigungen bekommen wenn mich jemand direkt anschreibt.

Ebenfalls vorteilhaft dabei ist übrigens (auch das hatte ich schon mal irgendwo gelesen) dass ich mir bereits vor einiger Zeit wieder angewöhnt hatte eine Armbanduhr zu tragen. Jahrelang hatte ich darauf verzichtet nachdem ich mich daran gewöhnt hatte dass ich die Uhrzeit ja auch auf meinem Pager und später auf meinem Handy ablesen konnte. Spätestens beim Smartphone ist der kurze Blick nach der Uhrzeit jedoch meistens mit einem “Oh, da gibt es ja eine Benachrichtigung” verbunden, was dann wieder eine größere Ablenkung schafft. Mittlerweile möchte ich die Armbanduhr schon aus diesem Grund nicht mehr missen, ich bin mal gespannt wie sich das entwickelt wenn meine bestellte Pebble Smartwatch endlich ankommt, hier werde ich wohl genau schauen müssen welche Benachrichtigungen ich mir auf der Uhr anzeigen lasse und welche nicht.

Active Directory LDAP-Zugriffe mit mehreren Domain Controllern

Auch in einer Windows-Domänen Umgebung kommt man früher oder später darauf, dass es eine Anwendung gibt die nicht auf Windows und IIS, sondern auf einem Apache läuft, vielleicht mit PHP oder einer anderen Skriptsprache. Sowohl PHP als auch der Apache direkt bieten über LDAP die Möglichkeit einen Domain Controller abzufragen, Beispielsweise zur Authentifizierung.

Spätestens wenn ausgerechnet der Domain-Controller ausgefallen (oder wegen Wartungsarbeiten nicht erreichbar) ist, den die PHP-Scripte zur Authentifizierung benutzen, stellt sich die Frage wie man es einrichtet dass irgend ein verfügbarer Domain Controller genutzt wird. Glücklicherweise sind sowohl PHP als auch das Apache-Modul für diesen Fall vorbereitet, und nutzen sogar das gleiche Prinzip dafür. Man muss lediglich an der Stelle wo der Servername steht mehrere Adressen durch Leerzeichen getrennt eintragen.

PHP-Aufruf:

$conn = ldap_connect("dc01.domain.local dc02.domain.local");
ldap_bind($conn, $username, $password);

Eintrag in der Apache-Konfiguration:

AuthLDAPUrl "ldap://dc01.domain.local:3268 dc02.domain.local:3268/dc=domain,dc=local?sAMAccountName?sub?(objectClass=*)" STARTTLS

Hier muss man darauf achten dass der LDAP-String in Anführungszeichen steht (solange kein Leerzeichen vorkommt funktioniert es auch ohne).

Auf diese Art werden alle angegebenen Server durchprobiert bis einer gefunden wird der erreichbar ist.

Quellen: mod_auth_ldap Dokumentation, Kommentar in der PHP-Dokumentation zu ldap_connect()

Schwarz-Weißes Bild beim Anschluss vom Raspberry Pi an einen analogen Fernseher

Der Raspberry Pi hat bekanntlich neben dem HDMI-Ausgang noch einen Composite Video-Ausgang mit dem man ihn an einen analogen Fernseher anschließen kann. Dafür benötigt man lediglich ein Cinch-Kabel, die für Video gedachten Kabel haben in der Regel gelbe Stecker.

Schließt man den Pi so an den Fernseher an dann kann es passieren dass auf dem Fernseher nur ein leicht verzerrtes Schwarz-Weiß Bild ankommt. Weiterlesen

Maximale Feldlänge im Active Directory

Bereits Freitag beschäftigte mich das Problem, dass ich bei einigen Usern keine neuen Einträge in das Notizfeld im Active Directory schreiben konnte (das Feld wird von uns als Protokoll für den Benutzer betreffenden Aktionen genutzt). Anfangs ging es recht problemlos mit diesen Befehlen:

$user = Get-QADUser -Identity $uid
$note += "`r`n" + $user.Info
Set-QADUser $user -Notes $note

Hier wird einfach das Info-Feld ausgelesen, die neue Zeile davor gesetzt und dann beim User wieder gesetzt.

Neuerdings trat dabei immer wieder der recht wenig aussagekräftigen Fehler A constraint violation occurred auf. Ein Umschreiben auf die entsprechenden Befehle von Microsoft gab dann eine etwas brauchbarere Meldung: A value for the attribute was not in the acceptable range of values.

$user = Get-ADUser -Identity $uid
$note += "`r`n" + $user.Info
$user |Set-ADUser -Replace @{Info=$note}

Diese Information brachte mich auf die richtige Spur: Attribute im AD haben (nicht wirklich überraschend) eine Maximallänge, beim Info-Feld sind es anscheinend 1024 Zeichen.

Als Workaround habe ich das Skript so umgeschrieben, dass direkt im Notizfeld nur die letzten 10 Meldungen gespeichert werden. Die Meldungen wurden ohnehin schon zusätzlich in einer Datenbank abgelegt, so dass hier nichts verloren geht. Hier das vollständige Skript:

param( [string]$uid, [string]$note )

# Fehler abfangen und als sauberen Text ausgeben
trap [Exception] { 
	"ERROR: " + $_.Exception.Message
	exit
}
# Einschränken was vom AD-Modul geladen wird
$env:ADPS_LoadDefaultDrive = 0
Import-Module ActiveDirectory -Cmdlet Get-ADUser,Set-ADUser

# User-Objekt holen
$user = Get-ADUser -Identity $uid -Properties Info
# Neue Notiz am Anfang einfügen
$note += "`r`n" + $user.Info
# notiz in zeilen auftrennen, erste 10 nehmen, wieder zu string zusammenfügen
$note = (($note -split '[\r\n]+') | Select-Object -First 10) -join [environment]::NewLine
# Neue Notizen wieder ins User-Objekt schreiben
$user |Set-ADUser -Replace @{Info=$note}
"SUCCESS: Die Notiz wurde hinzugefuegt"

Import-PSSession beschleunigen

In ein paar Powershell-Scripten, die Befehle an Domain-Controller und Exchange-Server absetzen störte es mich schon seit geraumer Zeit, dass das initiieren der Scripte relativ lange dauert. Besonders bei Exchange-Zugriffen fiel es extrem auf, also fügte ich ein paar Zeitausgaben ein und analysierte die einzelnen Befehle.

param( [string]$uid, [string]$exhost )

function GetElapsedTime() {
    $runtime = $(get-date) - $script:StartTime
    $retStr = [string]::format("{3}.{4} seconds", `
        $runtime.Days, `
        $runtime.Hours, `
        $runtime.Minutes, `
        $runtime.Seconds, `
        $runtime.Milliseconds)
    $retStr
}

$script:startTime = get-date
write-host "Start: $(GetElapsedTime)"

$session = New-PSSession -Configurationname Microsoft.Exchange -ConnectionUri http://$exhost/powershell
write-host "New-PSSession: $(GetElapsedTime)"

Import-PSSession $session -CommandName "Get-CASMailbox" | Out-Null
write-host "Import-PSSession: $(GetElapsedTime)"

$mailbox = Get-CASMailbox $uid |Select-Object ActiveSyncMailboxPolicy,ActiveSyncEnabled,Name
write-host "Get-CASMailbox: $(GetElapsedTime)"

[string]::format("{0}: {1}, {2}", $mailbox.Name, $mailbox.ActiveSyncEnabled, $mailbox.ActiveSyncMailboxPolicy)

Ausgabe:

Start: 0.0 seconds
New-PSSession: 0.562 seconds
Import-PSSession: 11.296 seconds
Get-CASMailbox: 11.406 seconds
jdoe: True, Default

Fazit: Das größte Problem ist Import-PSSession wenn es sich mit dem Exchange-Server verbindet, es braucht meistens zwischen 11 und 13 Sekunden bis das Script weiter laufen kann. Nach einigem Suchen und Ausprobieren stieß ich auf den Parameter -CommandName, der einschränkt welche Befehle man importieren möchte.

$session = New-PSSession
Import-PSSession $session -CommandName "Get-CasMailBox"

holt nur den angegebenen Befehl in die Session, dafür dauert der Import dann aber auch nur ca 1,5 Sekunden, was die Gesamtlaufzeit des Scriptes immerhin auf ein Zehntel reduziert. Ergebnis:

Start: 0.15 seconds
New-PSSession: 0.468 seconds
Import-PSSession: 1.937 seconds
Get-CASMailbox: 2.156 seconds
jdoe: True, Default

Das ganze bringt natürlich nur einen Vorteil wenn man nur wenige Befehle in einem Script benötigt.

Confluence Seite mit Unterseiten in anderen Space kopieren [Update]

Confluence bietet zwar die Möglichkeit einzelne Seiten in andere Spaces zu kopieren, aber dabei bleiben Anhänge und Unterseiten auf der Strecke. Mit dem Atlassian Command Line Interface lassen sich eine Menge netter Befehle auf der Kommandozeile ausführen, darunter auch dieser:

./confluence.sh -s https://server.local/confluence/ -u username -p secret \
-a copyPage --space currentSpace --title pageTitle --newSpace newSpace \
--parent newParentPage --descendents --copyAttachments --copyComments --copyLabels

Der Befehl verbindet sich mit dem Server und kopiert die Seite pageTitle im Space currentSpace mit all ihren Unterseiten, Dateianhängen und Kommentaren in den Space newSpace als Unterseite von newParentPage.

Die aktuelle Version des Command Line Interface kostet zwar mittlerweile Geld, die letzte freie Version (unter BSD Lizenz) ist jedoch immer noch zum Download verfügbar und kann auch schon eine ganze Menge.

Quelle: (The pain of) managing content in Confluence

Ergänzung 29.10.2012

Mit der hier beschriebenen Methode konnte ich die meisten Seiten migrieren, leider gab es in einem Punkt Probleme: Die Confluence Remote Schnittstelle kommt mit dem Upload von größeren Dateien nicht klar, die Grenze scheint irgendwo bei 5MB oder so zu liegen. Der Fehler ist bereits seit einem Jahr bekannt, hier hat sich jedoch noch nichts getan.

Dafür hat mich die Dokumentation von Confluence zum Löschen von Seiten auf eine Idee gebracht:

  • Seite aus dem alten Space in einen neuen, temporären Space 1 verschieben
  • temporären Space kopieren
  • Seite aus temporärem Space 1 zurück in den alten Space verschieben
  • Seite aus temporärem Space 2 in den Ziel-Space verschieben
  • beide temporäre Spaces löschen

Die Prozedur habe ich noch nicht getestet, ich sehe allerdings keinen Grund wieso es nicht funktionieren sollte.

ESXi 5.1 USB-Stick zur Installation erstellen. [Update]

Nachdem ich einen USB-Stick für die ESXi-Installation nach der Anleitung von VMware erstellt hatte konnte ich nicht davon booten. Ich bekam immer die Fehlermeldung

boot:
menu.c32 not a COM32R image

Keine Ahnung was die Ursache war, in diesem Blogbeitrag schrieb jemand einen Kommentar, dass neuere syslinux-Versionen problematisch seien (ich hatte meinen Stick mit syslinux 4.05 unter Mint Linux 13 erstellt). Mit der Version 494 von UNetbootin solle es gehen. Also probierte ich das aus und erstellte einfach mal einen Stick mit der angegebenen Version, aber ohne weitere Anpassungen zu machen die in dem Beitrag aufgelistet werden.

UNetbootin lief durch, ich habe den Stick in einen Rechner gesteckt, davon gebootet und siehe da, der Installer vom ESXi startet vollkommen problemlos. Die Methode hat auch noch den Vorteil dass man den Stick unter Windows erstellen kann und nicht unbedingt eine Linux-Installation zur Hand haben muss (was die Anleitung von VMware zwingend voraussetzt).

Update 07.10.2013

Mit Version 5.5 vom ESXi funktioniert diese Methode bei mir leider nicht mehr.

Windows Key mit anderer Sprache verwenden

Mit dem Einbau einer SSD stand bei meinem Laptop auch eine Neuinstallation von Windows 7 an.  Da ich mich im Büro mittlerweile an ein englisches Windows gewöhnt habe, und die Vorteile eigentlich nicht mehr missen möchte, dachte ich mir ich probiere mal aus ob der Lizenzschlüssel von meiner deutschen Installations-DVD auch mit einem englischen Windows 7 funktioniert.

Weiterlesen