Sonderzeichen

copy_paste_character

Im Blog Webwork-Tools bin ich heute auf eine kleine aber feine Seite gestoßen: CopyPasteCharacter.com. Hier findet man die gebräuchlichsten Sonderzeichen, Ready for Copy & Paste. Man braucht die Zeichen auch gar nicht mit der Maus markieren – einfach draufgeklickt und schon ist das Zeichen in der Zwischenablage. Nie mehr umständliches Suchen „Sonderzeichen einfügen…“. So genial einfach, da hätte man eigentlich selbst drauf kommen können!

Außerdem gibt es noch HTML Entity Character Lookup. Hier gibt man einfach ein dem gesuchten ähnliches Zeichen ein und erhält eine Auswahl an Zeichen inkl. der Umschreibung als HTML-Entity. Und sowas braucht der Webworker schließlich fast täglich. Auch hier gibt es die Copy-to-Clipboard Funktion.

Mercurial Tipps & Tricks

Seit einiger Zeit bin ich auf das Verteilte Versionskontrollsystem Mercurial umgestiegen. Es bietet einige Vorteile gegenüber altbekannten Systemen wir z.B. CVS. Aber darauf will ich hier nicht eingehen, sondern einige Tipps und Tricks vorstellen, die den täglichen Umgang mit hg vereinfachen.

Push und Update des Ziels in einem

Mit hg push werden die Änderungen des eigenen Repositories in das Eltern-Repo hochgeladen. Dort werden die Änderungen aber nur im Repository eingetragen, das Arbeitsverzeichnis wird aber nicht aktuallisiert. Dies muss normalerweise per Hand mit einem hg update im entsprechenden Verzeichnis erfolgen. Beim Pull-Befehl gibt es den Schalter -u, der ein Update nach dem Pull ausführt – leider gibt es das nicht für das Push-Kommando.

Aber es gibt zwei Möglichkeiten, um diesen Schritt einzusparen (und vor Allem nicht zu vergessen):

Ausführen von Push und Update in einem Befehl

Man kann bei Linux & Co. die Ausführung von mehreren Kommandos auf einer Zeile bewirken, in dem man die Kommandos mit „&&“ verbindet. Außerdem kann man bei hg über den Parameter -R ein Repository angeben, in dem der Befehl ausgeführt werden soll. Somit lässt sich der Push und das Update des Ziel-Repositories verbinden:

  hg push && hg -R pfad_zum_ziel_repository update

Dazu muss man aber den Pfad des Ziels kennen. Dies lässt sich mit hg path ermitteln. Es spricht aber auch nichts dagegen, das direkt auf der Kommandozeile zu integrieren:

  hg push && hg -R `hg path | awk -F = '{ print $2; }'` update

Am Besten legt man sich einen Alias dafür an, in dem man z.B. folgendes in die .bashrc einträgt:

  pushup () { hg push && hg -R `hg path | awk -F = '{ print $2; }'` update ; }

Dann braucht man nur noch pushup eingeben, um ein Push mit nachfolgendem Update des Eltern-Repository zu machen.

Automatisches Update bei jedem Push

Unter 4.15. Any way to ‚hg push‘ and have an automatic ‚hg update‘ on the remote server? in den Mercurial-FAQs ist ein weiterer Weg beschrieben, wie man erzwingt, das bei einem Push auch ein Update des Ziels erfolgt. Dieses Verfahren hat aber aus meiner Sicht zwei Nachteile:

  1. Es wird immer ein Update gemacht, man kann es nicht „mal eben“ ausschalten. Bei der oben beschriebenen Lösung kann man immer den original hg push Befehl ausführen, wenn man gerade nicht will, dass ein Update durchgeführt wird.
  2. Die Änderung wirkt nur in dem Repository, in dem es in die hgrc eingetragen wurde. Arbeitet man in einem anderen Repository (z.B. eines anderen Projektes), in dem diese Änderung nicht durchgeführt wurde, kann das zu Verwirrungen führen, wenn man gewohnt ist, dass ein Push auch ein Update auslöst.

Die beschriebene Lösung über Hooks hat natürlich auch Vorteile (z.B. kann wirklich keiner das Update vergessen) und schlussendlich muss jeder selbst entscheiden, welchen Weg er beschreiten möchte.

Gibt es Unterschiede zwischen Repository und Working-Directory?

Klar, wenn man selbst Änderungen durchgeführt hat, kann man das über hg status erkennen. Was aber, wenn man ein hg pull oder ein hg push auf das Repository ausführt hat (Es kann ggf. auch jemand anderes ein Push auf „mein“ Repository gemacht haben, wenn er die Rechte dazu hat)? Dann hilft ein hg status nicht weiter. Ob es Unterschiede gibt, kann man aber mit

  hg diff -r tip

herausfinden. Will ich nur wissen ob und welche Dateien betroffen sind, verwende ich

  hg diff -r tip | grep '^diff'

Gibt es Änderungen im Eltern-Repository?

Auch hier gibt hg status keine Auskunft. Aber mit hg incoming (oder kurz: hg in erfahren wir, was es an Änderungen gibt, die bei einem Pull übertragen würden. Will ich wissen, welche Dateien sich ändern, setze ich den Schalter -v hinten an.

Ein Verzeichnis mit allen Unterverzeichnissen hinzufügen

Führt man hg add ./images/* aus, so werden nur die Dateien im Verzeichnis ./images hinzugefügt, nicht aber die Dateien, die sich in weiteren Unterverzeichnissen tummeln. Hier kann man sich mit find helfen:

  hg add `find ./images -type d -printf '%p/* '`

Firefox 3.0 – alles anders?

Firefox-Logo

Seit einiger Zeit ist der Firefox in der Version 3.0 veröffentlich. Nun habe ich es auch gewagt, von der 2.0 auf die neuste Version umzusteigen – und schon geht der Ärger los!

Man könnte fast behaupten, dass dies die unausgereifteste Release ist, seit ich Mozilla oder Firefox benutze – und das ist schon verdammt lange. Unter Windows und aktuellen Linux-Distros lässt er sich noch problemlos installieren, aber bei älteren Linux-Versionen muss man wohl bei der 2.0er bleiben, da dort diverse Bibliotheken fehlen und es bislang keinen Build mit statisch gelinkten Bibliotheken gibt.

Ein recht einfach zu behebendes Problem ist die Tatsache, dass auch in der deutschen Version des freien Browsers die Google-Suche auf google.com eingestellt ist und man somit keine deutschen Ergebnisse bekommt. Zum Glück gibt es unter http://mycroft.mozdev.org/google-search-plugins.html jede Menge Search-Engine-Plugins, darunter auch „Google DE – Das Web“, „Google DE – Seiten auf Deutsch de-DE“ usw. (Hinweis zuerst gefunden im Blog von Felix Wunderwald)

Ein Aufreger ist auch, dass es wohl Probleme mit dem DOM-Inspector beim Update unter Windows gibt. Will man ihn benutzen, bekommt man die Meldung, er sei nicht installiert oder deaktiviert. Ich hatte ihn jedoch installiert – zumindest hatte ich „Benutzerdefiniert“ gewählt. Allerdings wurde ich nicht nach weiteren Einstellungen gefragt… Folgt man dem Link in der Fehlermeldung, so bekommt man den Hinweis, man müsse als Abhilfe den Browser wieder deinstallieren, das übrig gebliebene Verzeichnis löschen und dann die Installation erneut durchführen. Das klappt, auch wenn man wiederum nicht nach den benutzerdefinierten Einstellungen gefragt wird – und man danach wieder sämtliche Plugins wie den Flashplayer usw. neu installieren darf!

Ein weiters Ärgernis, für dass ich noch eine Lösung oder die Ursache finden muss: Unter Windows fragt der FF beim Schließen jetzt, ob die zzt. geöffneten Tabs beim nächsten Mal wieder hergestellt werden sollen. Unter Linux gibt es diese Frage nicht, hier sieht man leider noch das alte Verhalten.

Dies ist sicher nicht das Ende der Fahnenstange. Wenn ich den 3.0er weiter benutze, werden mir sicher noch weiter Unannehmlichkeiten auffallen. Eines steht jetzt jedoch schon fest: Mit dem anscheinend etwas übereilten Release hat sich die Firefox-Gemeinde keinen Gefallen getan.

Rechnernamen mir der TLD .local können nicht aufgelöst werden

Das Problem: Verwendet ein lokales Netzwerk die Domain .local kann ein neuerer Linux-Client die lokalen Namen nicht auflösen.

Der Grund: .local wird Zeroconf-Diensten wie z.B. Rendezvous verwendet. Zeroconf ist eine Technik zur konfigurationsfreien Vernetzung von Geräten in lokalen Rechnernetzen.
Neuere Linux-Distributionen sind darauf vorbereitet und senden DNS-Anfragen für Adressen mit der Top-Level-Domain per Multicast an den Port 5353 (mdns) der Adresse 224.0.0.251.

In Wikipedia gibt es einen Artikel zu Zeroconf, der die Hintergründe beschreibt. U.a. ist dort zu lesen:

Alle DNS-Abfragen für Namen, die auf .local enden, müssen mit UDP und IP Multicast an die mDNS-Multicast-Adresse 224.0.0.251 Port 5353 gesendet werden.

Und weiter ist zu lesen:

Natürlich kann es in der Praxis zu Konflikten kommen, von den Erfindern von mDNS wurde das aber als sehr unwahrscheinlich angenommen.

Dummerweise wird die TLD .local recht häufig verwendet – bei der IETF existiert sogar ein Draft, (http://www.ietf.org/proceedings/99nov/I-D/draft-ietf-dnsind-local-names-07.txt), in dem die Verwendung der Top-Level Domain „.local“ im Intranet vorgeschlagen wird, speziell wenn der lokale Adressbereich nach RFC1918 zum Einsatz kommt.

Die Lösung: Auch diese findet sich im o.g. Wikipedia-Artikel:

Damit unter Linux die Namensauflösung bei der Top-Level-Domain .local wie gewohnt über den DNS-Server (z. B. Bind) abgewickelt wird, ist der Eintrag mDNS off in der Datei /etc/host.conf erforderlich.

Bei neueren (SuSE-)Distributionen funktioniert das aber nicht mehr, da /etc/host.conf ignoriert wird. Stattdessen muss die Datei /etc/nsswitch.conf bearbeitet werden. Dort findet sich eine Zeile

hosts: files mdns4_minimal [NOTFOUND=return] dns

die wieder in die alte Form

hosts: files dns

geändert werden muss.

Weitere Links zum Thema:

KMail als Mailer für Firefox einstellen

Unter Linux funktionieren standardmäßig das „Link senden…“ und „Mailto:“-Links nicht. Damit KMail als Mailprogramm benutzt wird, muss in about:config ein neuer String namens network.protocol-handler.app.mailto eingefügt werden, als Wert wird kmailservice eingetragen.

Mehr Infos dazu gibt’s im MeinerEiners NotizBlog von Daniel Di Giacomo.

Nachtrag:

Bei Firefox 3.x geht das nun (endlich) über Bearbeiten » Einstellungen » Anwendungen. Dort gibt es eine Zeile „mailto“. Man wählt aus dem Auswahlfeld „Andere Anwendung“ aus und navigiert im folgenden Dialog zu /opt/kde3/bin/kmailservice (oder wo immer sich kmailservice befindet).

OpenVPNPortable

OpenVPN für den USB-Stick

Ich habe gerade entdeckt, dass es auch ein Tool gibt, um OpenVPN auf einem USB-Stick zu installieren und zu Starten. Auf Sourceforge findet sich OpenVPNPortable, zzt. in der Version 1.5.2.

Man führt die EXE aus, ein Wizzard installiert dann OpenVPN 2.1_rc7 für Windows, OpenVPN-GUI 1.0.3 und weitere notwendigen Dateien auf dem Stick. Lediglich die Keys und Zertifikate muss man selbst noch in das Unterverzeichnis data/config kopieren. Das diese mit einer Passphrase geschützt sind, sollte selbstverständlich sein. In diesem Verzeichnis muss auch noch eine entspr. *.ovpn Konfig-Datei erstellt werden, das OpenVPN-GUI findet diese dann selbstständig. In dieser Datei muss übrigens kein Pfad für die Keys und Zertifikate angegeben werden, da diese in dem Verzeichnis gesucht werden, in dem auch die Konfig-Datei liegt.

Wird dann die installierte Anwendung gestartet, so wird zunächst das TAP-Interface installiert, wozu zwingend Administrator-Rechte notwendig sind. Ggf. muss Das Programm über runas gestartet werden. Bei der Beendigung des Tools wird man gefragt, ob man das Interface wieder deinstallieren möchte.

Nach dem das Tool gestartet ist, findet sich in der Taskleiste wie gewohnt das OpenVPN-GUI-Icon, über das man die Verbindung(en) aufbauen und trennen kann.

Backup-Differenzen mit rsync feststellen und zurückspielen

Sowas passiert: Platten-Crash! Aber man hatte ja vorgesorgt und ein Platten-Image gezogen und auch immer schön die wichtigsten Dateien und Verzeichnisse in Sicherheit gebracht, z.B. mit dem in „Verzeichnisse auf einen anderen Rechner übertragen“ beschriebenen Verfahren. Das Image ist schnell auf die neue Platte gespielt, aber wie bekommt man nun die aktuellen Backupdateien wieder ins System, ohne sich beispielsweise die neuere LVM-Config zu zerschießen?

Hier kann das Tool rsync sehr hilfreich sein – auch wenn die Daten gar nicht mit rsync gesichert wurden. Zunächst wechselt man in das Verzeichnis, in dem die Backupdateien liegen. Hatte man ein (komprimiertes) Tar-Archiv angelegt, muss dieses in ein temporäres Verzeichnis entpackt werden.

Nun kann der Inhalt dieses Verzeichnisses gegen den wiederhergestellten Rechner verglichen werden:

rsync -rznciuK -e ssh ./ root@meinLinuxPC:/ | grep -v skipp

Durch den Schalter -n werden keine Daten übertragen, sondern nur angezeigt, welche Dateien aus dem Backup neuer sind als auf dem wiederhergestellten System:

  <fcsT.... etc/SnmpAgent.d/snmpd.conf
  <fcsT.... etc/rc.config.d/SnmpHpunix
  <fcsT.... etc/rc.config.d/SnmpMaster
  <fcsT.... etc/rc.config.d/SnmpMib2
  <fcsT.... var/spool/cron/crontabs/root

Zur Bedeutung von <fcsT.... siehe man rsync, –itemize-changes.

Wenn man die Dateien nicht von Hand übertragen will, kann man das auch rsync machen lassen:

rsync -rzciuKb --suffix=~rsync -e ssh ./ root@meinLinuxPC:/ | grep -v skipp

Hier fehlt der Schalter -n, der oben dafür sorgt, dass keine Dateien übertragen werden. Die Optionen -b und --suffix=~rsync sorgen dafür, dass auf dem Zielrechner die Original-Dateien mit dem Suffix ~rsync erhalten bleiben.

Das Quartal mit date berechnen

Das Unix-Kommando date kennt viele Format-Parameter aber leider keinen, der uns das Quartal ausgibt. Zum Glück lässt sich das aber mit Hilfe von expr berechnen.

Wir können mit dem date-Befehl einen Ausdruck erstellen, den expr dann für uns ausrechnet. Wir bekommen das das aktuelle Quartal oder, wenn wir mit -d ein anders angeben, das des gefragten Datums:

expr `date "+( %m - 1 ) / 3 + 1"`

expr `date -d "2007-05-01" "+( %m - 1 ) / 3 + 1"`