@-Zeichen und Backslash in GitHub’s Editor Atom

Ich habe letztens den (inzwischen) OpenSource-Editor “Atom” von GitHub für mich entdeckt. Der steckt noch in der Beta-Phase, ist aber modular aufgebaut und es gibt schon zahlreiche Plugins dafür. Im Grossen und Ganzen ist er sehr an den Sublime Text Editor angelehnt und diverse Features, die man von Sublime noch vermissen könnte (wie z.B. die Minimap-Scroll-Leiste oder Highlighting von Wörtern) sind durch Plugins nachrüstbar.

Dass der Editor noch in der Betaphase ist, merkt man daran, dass z.B. Zeichen wie @ oder Backslash nicht out-of-the-box auf einer deutschen Tastatur (unter Windows) funktionieren, da die Standard-Tastaturbelegung des Editors (oder die Belegung von Standard-Plugins) diese Tastenkombinationen schon für diverse Funktionen beanspruchen.

Zuerst hatte ich die jeweiligen Core-Konfigurations-Dateien angepasst, wofür man aber teilweise ggf. Admin-Rechte benötigt. Ausserdem wird bei jedem Update möglicherweise die Datei wieder überschrieben.
Inzwischen habe ich aber herausgefunden, wie man vorhandene Tastenkombinationen nicht nur überschreiben kann, sondern auch auf den System-Zustand zurücksetzen kann. Dafür gib es die Keymap-Konfigurations-Datei im Benutzerverzeichnis (Benutzerverzeichnis\.atom\keymap.cson).

Ich habe folgende Konfigurationen (für die derzeit aktuelle Version 0.138.0) eingetragen um die Tasten wie gewohnt benutzen zu können:

'atom-workspace atom-text-editor:not(.mini)':
  'ctrl-alt-[': 'native!'
'.platform-darwin .editor, .platform-win32 .editor, .platform-linux .editor':
  'alt-ctrl-q': 'native!'
'.platform-win32 .editor, .platform-linux .editor':
  'ctrl-alt-shift-Q': 'autoflow:reflow-selection'

Danach AltGr-R (bzw. Strg-Alt-R) drücken, um die Konfiguration zu laden und fertig.

HTML-Entity-kodierten Text mit JavaScript in mailto-Uri umwandeln

Schneller/kurzer Workaround, um HTML-Entitiy-kodierten Text (zum Beispiel aus einem Service eines Drittanbieters) lesbar in einer mailto-URI unterzubringen:

var source = "Ich sag immer: "Schöner wär's so!"",
text = $('<textarea />').html(source).text(),
mailto = 'mailto:email@address.net?subject=' + encodeURIComponent(text);

Jetzt nur noch die Variable “mailto” in einen Link setzen und fertig.
Z.B. so:
$('body').append('<a href="mailto:' + mailto + '">test</a>');

Git: beliebige alte Version zur aktuellen Master-Branch-Version machen

Das Problem:
Letztens war es notwendig in einem Git-Projekt auf eine alte Version zurückzugehen und diese als den aktuellen Stand im Master-Branch zu machen.

Die Situation:
Aufgrund der Infrastruktur unserer Projekte war es mir nicht möglich einfach einen neuen Branch aufzumachen und diesen zu verwenden. Diverse Automatismen sorgen dafür, dass unser Master-Branch alleine dafür verantwortlich ist, den Live-Server zu beliefern. Normalerweise gibt es bei uns auch einen Develop-Branch, der den Test-Server beliefert und auf dem getestet wird. In diesem speziellen Projekt fällt dieser Branch weg – aus “Gründen”.

Ich habe inzwischen an zig Git-Projekten gearbeitet und durch die Möglichkeit sowohl lokal als auch auf einem Testserver testen zu können, bevor Änderungen in den Master-Branch fliessen (und somit gleich auf den Live-Server), hatte ich nie wirklich die Notwendigkeit gesehen, komplett auf einen alten Versionsstand zurückzugehen. Bis gestern.

Die Lösung:
Ich musste ein wenig im Internet suchen und habe etliche Lösungsansätze gesehen, die alle nicht zu der gewünschten Lösung führten. Irgendwo auf stackoverflow.com – gut versteckt zwischen vielen Antworten auf genau meine Frage – bin ich dann auf die Lösung gestossen. Und die ist eigentlich ziemlich einfach:

git revert --no-commit id_alte_version..HEAD
git commit -m "zurück zu (ur-)alter version"

Passwort in Kimai zurücksetzen

Habe gerade einem Admin-Kollegen geholfen, in seine Kimai-Installation wieder reinzukommen.
Datenbank- und File-Systemzugriff war vorhanden, von daher nur eine Frage, in welcher Form das Passwort gespeichert ist.

Die Lösung: In der Datei includes/autoconf.php gibt es eine Zeile, in der ein $password_salt gesetzt wird.
Dieses nehmen wir und schreiben es vor und hinter das gewünschte neue Passwort und jagen es durch die MD5-Funktion (z.B. in MySQL). Sodann tragen wir dieses zum gewünschten Benutzer in der Tabelle kimai_usr ins Feld pw ein.

Beispiel:
neues Passwort=meinpasswort
$password_salt in includes/autoconf.php: ABCDEFG

in MySQL:
select md5('ABCDEFGmeinpasswortABCDEFG');

liefert als Ergebnis: 4b42ec596d78e884beafbe29387b38a2

Diese Zeichenkette ins pw-Feld des gewünschten Benutzers der Tabelle kimai_usr eintragen und fertig. Jetzt sollte man sich mit dem Passwort ‘meinpasswort’ eintragen können.

tidy HTML per Konsole innerhalb von PHP verwenden

Die Ausgangssituation: Ich möchte auf einem Webserver mit PHP 5.3, der unter Gentoo-Linux läuft, meinen PHP-Output via tidy HTML ausgeben, damit der Code aufgeräumt bzw “sauber” ist.

Das Problem: Mir ist es aus “Gründen” nicht möglich die PHP-Library nachzuinstallieren.

Die Lösung: Ich habe mir die Sources von tidy bei sourceforge.net geholt: http://tidy.cvs.sourceforge.net/viewvc/tidy/?view=tar , dann im Home-Verzeichnis in einem temporären Ordner entpackt und kompiliert (“gmake” im Ordner /tidy/build/gmake/).

Wenn das geklappt hat, sollte im Verzeichnis /tidy/bin/ jetzt die ausführbare Datei “tidy” liegen.

Da das Home-Verzeichnis auf diesem System automatisch zur Umgebungsvariable zählt, habe ich diese Datei direkt ins Home-Verzeichnis kopiert und eine Konfigurations-Datei namens tidy.config dazu erstellt:

output-html: yes
drop-font-tags: yes
drop-empty-paras: yes
hide-comments: yes
join-classes: yes
join-styles: yes
show-body-only: yes
indent: yes
indent-spaces: 3
wrap: 300

So sieht meine Konfiguration für das Projekt aus. Falls jemand vor hat, seine eigene Konfiguration zu erstellen, sollte er sich insbesondere den Punkt “show-body-only” ansehen… da ist normalerweise gewünscht, dass das auf “false” steht ;-)

Damit ich nun unter PHP diese Datei verwenden kann, so wie ich es gewohnt bin, wenn die Library aktiviert ist, schreibe ich eine Funktion, die im Projekt global verfügbar ist:

if (!function_exists(tidy_parse_string))
{
function tidy_parse_string($string)
{
exec ('echo "' . addcslashes($string, '"') . '" | tidy -config ~/tidy.config', $array);
return implode("\n", $array);
}
}

Diese Lösung ist zwar nicht besonders elegant, aber für ein zu migrierendes System, das auf die Funktion tidy_parse_string() setzt, ist es zumindest ein work-around, das bei mir in diesem Fall (bis jetzt) funktioniert hat.

Value ‘0000-00-00′ can not be represented as java.sql.Date

Habe gestern das Problem gehabt, per Quantum DB in Eclipse auf eine MySQL-Datenbank zugreifen zu müssen, in der Date-Felder mit dem Wert ‘0000-00-00′ belegt waren, was anscheinend ein Problem für den MySQL-Connector darstellt. Der meldet sich dann nur noch mit dem Text aus der Überschrift und SQL State: S1009 und Error Code: 0 und verweigert die Ausgabe der Suchanfrage.

Die vorläufige Lösung für mich bestand darin, die Connection URL um den Parameter zeroDateTimeBehavior=convertToNull zu erweitern, sodass solche Datums-Werte in NULL umgewandelt werden, da ‘0000-00-00′ kein valides Datum ist.

Die Connection URL sieht dann etwa so aus:
jdbc:mysql://host:3306/database?zeroDateTimeBehavior=convertToNull

Das reicht mir aktuell, um damit weiterarbeiten zu können, da ich nur SELECTs auf die Datenbank absetzen muss. Wie sich diese Einstellung verhält, wenn man in die Datenbank schreibt, muss sich erst noch zeigen.

VMWare Server: Gast-System kann bei NAT zwar nach draussen pingen, bekommt aber ansonsten keine Verbindung zustande

Habe gerade das Problem gehabt, dass ein Debian-Gastsystem in VMWare (Windows 7 Host) von draussen erreichbar war, DNS auflösen und nach aussen pingen konnte, aber selbst keine Verbindungen aufbauen konnte (wget, telnet, ssh).

Nach vielen Stunden der Suche, konnte mein Kollege sich daran erinnern, dass er das Problem schonmal hatte und gelöst hatte, indem man die vmnat.exe im Verzeichnis c:\Windows\SysWOW64\ durch eine neuere Version ersetzt, die z.B. beim VMWare Player dabei ist.

Die Datei kann man sogar im laufenden System ersetzen, sofern man vorher den Dienst “VMWare NAT Service” beendet und nach dem Ersetzen wieder startet.
Danach klappts auch wieder mit dem Netzwerk. Ich musste dafür bei mir nichtmal das Gastsystem beenden.

Apache2 Reverse Proxy mit Client-IPs

Die Ausgangslage: Ich habe immer wieder mal das Problem, eine Webseite (bzw einen kompletten Virtual Host) auf einen neuen Server umzuziehen. Der häufigste Grund dafür ist eine veraltete Server-Software zu aktualisieren (z.B. von Debian Etch oder Lenny auf Debian Squeeze). In diesen Fällen gehe ich oft so vor, dass ich auf dem neuen Server die gleiche Virtual Host Konfiguration einrichte, wie auf dem Alten. Normalerweise habe ich hier auf beiden Systemen einen Apache2 Webserver, daher sollte das relativ einfach zu übertragen sein. Das hat zum einen den Vorteil, dass ich auf dem Zielsystem gleich testen kann, ob die Webseite noch so funktioniert, wie gewünscht, zum anderen kann ich per Reverse Proxy Konfiguration auf dem alten Server die Webseite schon vom neuen Server holen, obwohl die DNS-Einstellung der Domain noch nicht abgeschlossen ist – und zwar ohne dass der gemeine Webseiten-Besucher davon etwas mitbekommt.
Continue reading “Apache2 Reverse Proxy mit Client-IPs”

ImageMagick auf einem DomainFactory-Managed-Server installieren

Heute musste ich auf einem Managed Server von der Domain Factory ein PHP-Modul nachinstallieren, welches nicht in der Standard-Installation dabei war. Leider fällt eine automatische Installation per PECL (also “pecl install modulname”) auch aus, da PECL (im Gegensatz zu PEAR) nicht installiert ist.
Continue reading “ImageMagick auf einem DomainFactory-Managed-Server installieren”

Reihenfolge von HTML-Elementen in einem Kontainer per jQuery ändern resultiert in einem leeren Kontainer

Die Ausgangssituation: Ich habe einen Kontainer, dessen (direkte) Kind-Elemente ich per jQuery eine neue Reihenfolge verpassen möchte. Dazu erzeuge ich mir einen Array, der alle betreffenden Elemente beinhaltet und ändere die Reihenfolge dieses Arrays. Dann gehe ich die Elemente des Arrays nacheinander durch und hänge sie am Ende des Kontainers wieder an (genauer: per .insertAfter() hinter das letzte Element) – das bedeutet, das Element wird aus dem DOM genommen und nach hinten verschoben. Danach sollte der Kontainer die gewünschte Reihenfolge haben.
Continue reading “Reihenfolge von HTML-Elementen in einem Kontainer per jQuery ändern resultiert in einem leeren Kontainer”