ArchLinux: Activate mirrors of a country

When updating the mirrorlist all servers are commented out.

To update the list to habe the first eight servers of „Germany“ activated I use the following awk script:

#!/bin/sh

mv /etc/pacman.d/mirrorlist /etc/pacman.d/_mirrorlist ; cat /etc/pacman.d/_mirrorlist | awk '/^## Germany/ { inCountry = 1; counter = 0 } /^$/ { inCountry = 0; counter = 0 } /(^#Server =.*)/ { if (inCountry && (counter < 8)) { $0 = substr($0, 2); counter ++ } } { print } ' > /etc/pacman.d/mirrorlist

 

Bequeme ssfs-Mounts in zsh (Linux, OSX)

Im Rahmen meiner Arbeit, aber auch bei Zugriff auf Fileebene auf meine Websiteprojekte, setze ich auf eine umfangreiche .ssh/config-Datei, in der ich für jeden SSH-Login einen Kurznamen definiere:

Host bla
  Username x92762361
  ForwardAgent yes
  Hostname hosted.someprovider.net
...

Diese bei „Host“ angegebenen Kurznamen kann man sowohl für „ssh“, „scp“, als auch für Mounts per „sshfs“ verwenden:

ssh bla
scp archive.tgz bla:files/
sshfs bla: /mnt/bla

Das geht witzigerweise auch für „Hosts in Hosts“, also etwa KVM-Clients:

Host redmine
  User redmine
  Hostname prosystem413
  ForwardAgent yes
  ProxyCommand ssh -q -a -x myuser@otherhost nc %h 22
...

Mein neuster Hack dabei sind drei ZSH-Functions (in .zshrc), die mir das lokale Mounten von Remote-Filesystemen erheblich erleichtern. Dazu habe ich mir als Kommandonamen „mox“ (mount external) bzw. „umox“ ausgedacht:

function mox()
{
   MOUNTPOINT="$HOME/extern/$1"
   if [ ! -d "$MOUNTPOINT" ]; then
      mkdir "$MOUNTPOINT"
   fi
   sshfs "$1:" "$MOUNTPOINT"
   cd "$MOUNTPOINT"
}

function umox()
{
   fusermount -u "$HOME/extern/$1"
}

function moxpoints
{
   reply=(`grep 'Host ' ~/.ssh/config | awk '{print $2}'`)
}

function umoxpoints
{
   reply=(`mount | grep "$HOME/extern" | awk -F: '{print $1}'`)
}

compctl -K moxpoints mox
compctl -K umoxpoints umox

„moxpoints“ dient der Completion, d.h. „mox redTAB“ würde mir das zu „mox redmine“ completen. Ähnlich bei „umox“ zum fuse-umounten des sshfs-Mounts: hier suche ich in der Ausgabe von „mount“ nach passenden gemounteten Mountpoints.

Unoptimal ist noch, dass ich nicht Unterverzeichnisse im Remotefilesystem als Basisverzeichnis für sshfs angeben kann. Hierzu müsste man irgendwelche speziellen Kommentare in der „.ssh/config“ einbauen, nur reicht dann nicht mehr ein Grep zur Ermittlung der Hosts. Die Praxis hat aber gezeigt, dass man auch ohne tiefe Remotemountdirs auskommt.

Unter OSX (zsh, fuse, sshfs per homebrew installieren) funktioniert „mox“ auch prima. Leider zeigt der Finder dort aber nicht die Namen der Mountverzeichnisse an. Da verliert man schnell die Übersicht. Außerdem braucht OSX spezielle Optionen, um die Remoteuser auf den lokalen User zu mappen. Die .zshrc wäre dann anzupassen.

Ich gehe davon aus, dass man mox/umox mit Completion auch in bash realisieren kann. Aber wer nutzt schon bash? :-)

Game of life

Wie kam ich eigentlich darauf, irgendwie stolperte ich die Tage über das alterwürdige Game of Life von Conway, in Form eines Livehintergrunds für mein Androidhandy. Schockierenderweise kennen einige meiner Kollegen und Verwandten/Freunde das nicht. Sapperlot!

Ich meine, wir hatten das damals schon auf dem ZX81 programmiert, aber vielleicht wars auch auf dem Atari oder Amiga. Das ist schon eine Weile her.

Gestern hatte ich im HaSi etwas Zeit, und herausgekommen ist eine Javascript-Version (aktuell abrufbar auf http://www.taponet.de/canvas/canvas1.html).

Die Regeln holte ich mir aus der Wikipedia, die in einem langen Artikel auch Dinge wusste, die mir noch nicht bekannt waren. Hey damals war ich noch ein Kind.

Hier ein paar Links:

Versteckte Tasten, Optimierungen usw in OSX (Lion)

Schön aufgeräumt kommt die Tastatur vom MacBook Pro daher — nur wo findet man die ganzen Zeichen, die man so im Alltag benötigt? Hier eine kurze Auflistung (da muss es aber noch mehr geben, etwa Anführungsstriche oben und unten usw):


alt 5, 6: [ ]
alt 8, 9: { }
alt 7: |
shift-alt 7: \
alt n: ~
alt Backspace: Wort nach links löschen
fn up/down: Page up/down
ctrl a: Pos 1

Desweiteren nervt es, mit mit Cmd-Tab nicht zwischen Unterfenstern wechseln zu können. Entweder tippt man /F3, oder man definiert in Systemeinstellungen/Tastatur/Tastaturkurzbefehle in „Tastatur & Texteingabe“ den Shortcut von „Fokus zum nächsten Fenster bewegen“ auf Cmd-^.
Dann kann man nach Cmd-Tab immerhin mit Cmd-^ die Fenster der Anwendung wechseln.

Zu den wichtigsten Installs gehört für mich:
* Homebrew
* mit „brew“ dann sshfs, fuse4x, zsh, zshcompletions, pwgen
* VLC Player für MP3s installieren . Dazu im Finder auf ein MP3 Rechtsklick, Informationen, Standard-Player wählen und „für alle anwenden“.
* Als Editor entweder Komodo Edit (kostenlos, OpenSource) oder Sublime Text 2 (kostet, kann aber auch so benutzt werden). Die Tastatursteuerung von Sublime Text 2 ist genial, auch die Fuzzy Search beim Öffnen von Dateien. Gerade bei Symfonyprojekten ist das unschlagbar.
* iterm2 als Ersatz fürs Terminal. Aber nicht das Fenster maximieren, weil Cmd-Tab dann mit anstrengenden optischen Effekten nervt.

Weiteres folgt.

Nützliche Inhalte in QR-Codes

Dies ist ein Repost eines Artikels aus meinem alten Blog. Ich brauche diese Sachen sporadisch selber, und nach Abschaltung des alten Blogs hatte ich keinen Ort mehr, wo ich sie nachlesen konnte.

Wo ich ja jetzt ein Android-Telefon habe interessiere ich mich naturgemäß wieder mehr für 2D-Barcodes wie QR-Code und Datamatrix. So zeigen viele AppStores und Sites QR-Codes mit market-Urls an, die man beispielsweise mit der App „Barcode Scanner“ vom Bildschirm ablesen kann. Diese market-Urls sind einfache Texte, die wegen des Textanfangs „market:..“ vom Scanner als market-Url erkannt werden. Neben „market:“ gibt es noch eine ganze Reihe weiterer verbreiteter Schlüsselwörter, mit denen man sein mobiles Leben vereinfachen kann.

Damit ich mir die nicht immer wieder neu zusammensuchen muss, will ich hier alle mir bekannten Inhaltsformate aufführen. Ausprobieren kann man die — meist unter Wahl einer einfachen Klapplistenoption — mit einem der Online-Barcode-Generatoren (s.u.). Es gibt aber auch Linuxtools wie „qrencode“, mit denen man das lokal auf das Kommandozeile machen kann. Das hat den Vorteil, dass man dann beispielsweise seinen Wifi-Zugang (siehe unten) nicht unverschüsselt übers Netz überträgt.

Sämtliche Formate sind Variationen des Textformats. Man kann sie also alle auch mit einem einfachen Text-Code-Generator erzeugen.

Online-Generatoren

Dann möchte ich noch auf die Firefox-Extension Mobile Barcoder hinweisen, mit der man in Firefox einen QR-Code der aktuellen Browseradresse erzeugen kann. So kann man eine Website leicht vom Desktop aufs Android-Telefon übernehmen.

Inhaltsformate

TEXT

Einfacher Text. Alle anderen Formate basieren hierdrauf.

Android-Market

Folgende Formate sind mir begegnet:

Beispiel

Termin/Kalendereintrag

BEGIN:VEVENT
SUMMARY:Meine Party
DTSTART:20110218T072200Z
DTEND:20110218T092200Z
LOCATION:Am Nordpol
DESCRIPTION:Warm anziehen
END:VEVENT

Hinweise: Die Zeilenumbrüche sollten als 0d0a codiert werden. Die Uhrzeiten sind offenbar UTC-Uhrzeiten. Man müsste mal ausprobieren, anstelle des Z etwa CET anzugeben.

Visitenkarte

Textinhalt: "MECARD:N:Myname;TEL:01234;URL:www.taponet.de;EMAIL:my@company.com;ADR:Address1 Address2;NOTE:MyMemo;;"

Das MECARD-Format kann noch am ehesten von Handys verstanden werden, im Gegensatz zu VCARD. Bevor man das itw verwendet, sollte man es mit den Zielgeräten ausprobieren.

E-Mailadresse


Textinhalt: "mailto:bla@fasel.de"


Geo-Koordinaten

geo:50.1,8.0

Hinweise: Offenbar wird einfach angenommen, dass es WGS84-Koordinaten sind. Dabei gibt es eine ganze Reihe weiterer Systeme, etwa UTM.

Telefonnummer

tel:…. (Beispiel: "tel:+4012341234")

SMS

Beispiel: "smsto:01700000000:Hallo der Text"

URL

Dies ist einfach eine Url (»http://de.wikipedia.org/wiki/Code128«) im Textformat. Die meisten Reader erkennen die Url dann am »http:« und bieten das Öffnen eines Browsers an. Code128 ist übrigens auch interessant, der barcode wird nur schnell so breit, dass er vom Reader nicht mehr aufgenommen werden kann.

Nachtrag: Man kann auch mit Newlines formatierten Text, der auch Urls enthalten kann, in einen QR-Code tun.

Wifi

Dies ist ein sehr interessantes Format, um Gästen einen einfachen Zugang zum eigenen WLAN zu ermöglichen:

  • WPA/PSK: "WIFI:S:MySSid;T:WPA;P:MyPass;;"
  • WEP: "WIFI:S:MySSid;T:WEP;P:MyWEPPass;;"
  • Offen: "WIFI:S:MySSid;T:nopass;P:MyWEPPass;;" (vermutlich kann dann „P:MyPass“ entfallen?)

So, ich hoffe das war auch für deinen Einen oder Anderen da draußen interessant.

fugrep – unscharfe Suche

Ich hatte die Idee, sowas wie grep haben zu wollen, mit dem man aber unscharf suchen kann. Fuzzy Search also. Durch die Wikipedia-Beschreibung der  Levenshtein-Distance bin ich nicht ganz durchgestiegen. Zum Glück schaute ich mal mit apt-get, was es an Paketen schon gibt, und stieß auf das Paket »python-levenshtein«.

Folgendes kleines Script »fugrep« ist ein erster Versuch einer Realisierung. Wobei mir noch nicht ganz klar ist, wozu ich es jetzt sinnvoll einsetzen kann :-).

#!/usr/bin/env python
# This Python file uses the following encoding: utf-8

# Idea: second parameter to provide minimum Levenshtein distance for output

import sys
from Levenshtein import *
import argparse

desc = """
fugrep is a fuzzy search tool.
It prefixes ever line of input (stdin) with the Levenshtein distance between the line and the search string parameter.
The output can be sorted or filtered by other tools.

Example: find . -name \*php -printf "%f\n" | fugrep book | sort -n | uniq | head
"""

parser = argparse.ArgumentParser(description=desc)
parser.add_argument('search', type=str, nargs=1)
args = parser.parse_args()
search = args.search[0]

for line in sys.stdin:
   line = line.rstrip("\n")	
   print "%d %s" % (distance(line, search), line)

Eventuell wäre es sinnvoll, das ganze doch in ein Programm abzuändern, das alle Worte eines Files unscharf mit dem Suchwort abgleicht. Aber ob man DAS dann sinnvoll einsetzen kann, ist dann die sich auch daran anschließende Frage.

JS CoolClock als WP-Widget einbinden

Nachdem mir keine der WP-Uhrenplugins richtig gefallen hatte, habe ich einfach selber ein WP-Plugin geschrieben, das die JS CoolClock Analog Clock als WP-Widget integriert. Siehe Startseite, in der rechten Spalte oben. Ich habe direkt noch ein weiteres Clock-Design erstellt, das zu dem dunklen Theme passt.

Wer Interesse daran hat, kann sich gerne bei mir melden.

Python argparse-Modul

In Python 3.2 gibt es das argparse-Modul zum Verarbeiten von Aufrufoptionen. Um nicht jedes Mal die verflixt umfangreiche Dokumenation lesen zu müssen, wenn einfache Optionen verarbeitet werden sollen, schreibe ich hier mal ein einfaches Beispiel auf:

#!/usr/bin/env python3

# ./prg [--mask='foobar' addsub ./]
import argparse

parser = argparse.ArgumentParser(description='fnord')
parser.add_argument('--mask', action='store', nargs=1)
parser.add_argument('cmd', metavar='cmd', type=str, nargs=1)
parser.add_argument('para', type=str, nargs='*')

args = parser.parse_args()
print(args)
# Namespace(cmd=['info'], mask=['foo bar'], para=['./'])

print(args.mask)
#print(parser.cmd)
#print(parser.para)
...

Das Argument „–mask“ nimmt einen zusätzlichen Wert aus den Argumenten. Diese wird in „args.mask“ gespeichert (Liste von einem Wert).

Wozu „metavar“ gut sein könnte (ist aus einem Beispiel), kapiere ich nocht nicht ;^).

Von „para“ kann es beliebig viele geben. Wenn „nargs“ eine Zahl ist, darf man sie nicht als ‚String‘ schreiben.

Ja, so in etwa ist das ;-)