sisyphus.de

rolling stones

Asset UPnP auf FreeBSD

Linn hat sich bei ihren DS Netzwerkplayern wie meinem Klimax Renew DS um das gekümmert, was sie am besten können: Musik spielen. Für alles andere haben sie das Rad nicht neu erfunden, sondern auf das bereits vorhandene DLNA/UPnP-Protokoll gesetzt.

Man benötigt also einen Digital Media Server (DMS) im Netzwerk, der die digitale Musik bereitstellt sowie einen Digital Media Controller (DMC), mit dem man die Wiedergabe dann steuert.

Letzteres löst die Kinsky-Software von Linn recht gut (wenn auch nicht perfekt), die es kostenlos für Mac, Windows und iOS-Geräte gibt.

Für den Medienserver soll natürlich mein FreeBSD-Server herhalten, den ich ohnehin schon am Laufen habe, aber eine wirklich brauchbare DLNA/UPnP Lösung zu finden, die gut mit Audiodaten umgehen kann, ist nicht einfach:

  • MiniDLNA kommt nativ aus den FreeBSD Ports, stürzt aber ständig ab und überträgt keine Coverbilder, was den Spaß am Browsen der Sammlung deutlich mindert.
  • Twonky Media ist zwar ein Linux-Programm und kostet €15, läuft aber ohne großen Aufwand unter FreeBSD und ist halbwegs schnell aufgesetzt. Die Coverbilder werden teilweise angezeigt (nicht alle). Haken: Alles ist schnarchlangsam, vom Scannen der Medienverzeichnisse (damit könnte ich leben) bis zum Browsen durch die Ordner (damit nicht). Dazu kam bei mir ca. 1 Absturz pro Tag.
  • MediaTomb kommt auch aus den FreeBSD-Ports und glänzt durch eine brilliante Idee: Der Server integriert eine Javascript-Engine. Beim Scannen der Medienverzeichnisse wird für jede gefundene Datei ein eigenes, anpassbares Skript aufgerufen, das bestimmt, wo im Navigationsbaum das Medium verlinkt wird. Dieser Mechanismus funktioniert auch recht gut, man müsste sich nur die Zeit nehmen, die Skripten anzupassen. Großes Manko neben ca. einem Absturz pro Woche sind auch hier wieder die fehlenden Coverbilder.

Vermutlich wäre ich mangels besserer Alternativen bei Mediatomb hängengeblieben, hätte ich dann nicht durch Zufall entdeckt, dass es Asset UPnP inzwischen auch für Linux gibt. Vom selben Hersteller kommt auch dBpoweramp, ein ganz hervorragender CD-Ripper für Windows (Wenn man mal 1000+ CDs gerippt hat, weiß man das zu schätzen ;-) ).

Der Server läuft bisher unglaublich stabil und sehr sehr schnell, zeigt alle Coverbilder an und unterstützt dabei sogar Protokollerweiterungen von Linn wie skalierende Cover. Man merkt einfach, dass die Software auf das Verwalten von Audiofiles optimiert ist, Videos oder Bilder werden gar nicht erst übertragen. Dafür werden die Metadaten der Songs wirklich vernünftig ausgewertet und bisher kann ich nur feststellen, dass Asset UPnP hier als erster Mediaserver, den ich mir ansehe einfach alles einfach richtig[tm] macht. Der Navigationsbaum ist zwar nicht ganz so flexibel wie der von Mediatomb, aber dennoch hochgradig (und mit deutlich weniger Aufwand) konfigurierbar.

Die €22 für die Vollversion zahle ich mehr als gerne.

Installation

Die Installation ist eigentlich recht einfach und braucht nur ein wenig Kleber:

Zunächst braucht es eine minimale Linuxumgebung, falls nicht schon vorhanden. Dort hinein installieren wir den Tarball:

1
2
3
$ cd /usr/ports/emulators/linux_base-f10 && make install distclean
$ mkdir /compat/linux/asset
$ fetch -o - http://www.dbpoweramp.com/beta/Asset-Linux-x86.tar.gz | tar xf - -C /compat/linux/asset

Damit Asset UPnP beim Start seine En- und Decoder findet, muss man ein bisschen tricksen:

1
2
$ ln -s /compat/linux/asset/bin/encoder /compat/linux
$ ln -s /compat/linux/asset/bin/decoder /compat/linux

Der Autostart der Linux-ABI und des (noch zu erstellenden) AssetUPnP muss aktiviert werden:

1
2
$ echo 'linux_enable="YES" # enable linux ABI' >> /etc/rc.conf
$ echo 'assetupnp_enable="YES" # enable Asset UPnP server' >> /etc/rc.conf

Jetzt braucht es noch das passende Startup-Skript, das den Server starten und stoppen kann:

/usr/local/etc/rc.d/assetupnp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/sh

# PROVIDE: assetupnp
# REQUIRE: DAEMON cleanvar linux
# BEFORE:  LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name=assetupnp
rcvar=assetupnp_enable
pidfile=/var/run/${name}.pid
pidfile_daemon=/var/run/${name}_daemon.pid

installdir=/compat/linux/asset
command=$installdir/bin/AssetUPnP
command_args="> /var/run/${name}.startup 2>&1"

start_cmd="assetupnp_start"
stop_cmd="assetupnp_stop"

assetupnp_start() {
  /usr/sbin/daemon -c -r -p ${pidfile} -P ${pidfile_daemon} ${command} ${command_args}
}

assetupnp_stop() {
  kill `cat ${pidfile_daemon}`
  sleep 1
  procs=`check_process ${command}`
  kill $procs
  wait_for_pids $procs
}

load_rc_config $name
run_rc_command "$1"

Jetzt sollte alles laufen:

1
2
3
4
5
6
7
$ service assetupnp start
Asset UPnP startup...
Version: Built on Feb 19 2014
Functionality: Trial 15 Days Remaining
Supported formats: .wav .bwf .m4a .mp4 .m4b .aac .opus .mp3 .mp2 .m2a .mpga .mpa .mpx .mpg .mp1 .mpeg .flac .ogg .oga .mpc .mpp .mp+ .wv .aif .aiff .aifc .w64
Starting Asset web interface at http://127.0.0.1:45537
Detected IP address:

Mit dem Browser bekommt man jetzt auf Port 45537 das Wartungsinterface von Asset UPnP.

Ein sauberer Shutdown funktioniert auch:

1
2
3
$ service assetupnp stop
Stopping UPnP service.
Waiting for PIDS: 72350 72351 72352 72354 72355.

Static files for the win!

Octopress blogging frameworkOctopress blogging framework Da ich zuletzt mehr Zeit damit verbracht habe, Security Patches für meine Drupal-Installation einzuspielen als damit, wirklich zu bloggen, habe ich dem Drama jetzt ein Ende bereitet.

Octopress erzeugt mit Ruby und Rake statische HTML Dateien aus Markdown und schiebt sie schliesslich mit Rsync auf den Server. Da dort jetzt keine “beweglichen Teile” mehr involviert sind habe ich jetzt hoffentlich wieder Ruhe. Und vielleicht sogar wieder Zeit zum Bloggen ;-)

Ruby on Rails und Mercurial

Seit einer ganzen Weile bin ich jetzt schon recht glücklich mit Ruby on Rails genauso wie mit dem Mercurial (Hg) VCS.

Leider mögen die beiden sich nicht besonders: Dass sich Rails-Plugins aus Git-Repositories wie Github automatisch installieren lassen, nicht aber aus Mercurial-Repositories wie Bitbucket ist schade, aber erträglich. Anstrengender finde ich, dass beim Anlegen eines neuen Rails Projekts automatisch nur Git-Files angelegt werden (oder mit -G ganz unterdrückt werden).

Mit einem kleinen Shellskript, das ich nach dem Neuanlegen des Projekts aufrufe, habe ich das jetzt wenigstens etwas für mich automatisiert:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/sh

(
  echo '#'; echo '# use glob syntax'; echo '#'
  echo syntax: glob
  cat .gitignore

  # apple stuff
  echo .DS_Store
  echo 'Icon?'

  # rails stuff
  echo public/uploads
  echo public/system/dragonfly

  # regexp section
  echo; echo; echo
  echo '#'; echo '# switch to regexp syntax'; echo '#'
  echo syntax: regexp
  echo '#^\.pc/'

) > .hgignore

find . -name '.git*' | xargs rm
find . -type d -empty -exec touch {}/.keep \;

hg init
hg add
hg ci -m 'initial checkin (converted git => hg)'

Das OSX Terminal

Als jemand, der einen Großteil seiner Arbeit lieber auf der Kommandozeile verrichtet, als mit der Maus habe ich MacOS in den letzten Jahren wirklich schätzen gelernt: Allen Komfort, den ich auch von Windows kannte, mit aktuellen Webbrowsern und Microsoft Office auf der einen Seite und aber einer vollwertigen Unixumgebung auf der anderen Seite. Dabei aber beide Welten perfekt integriert, von Drag&Drop über Skriptsteuerung der GUI-Applikationen bis zu Integration eines SSH-Key-Agents in den systemweiten Schlüsselbund. Traumhaft.

Ich habe mich immer gefragt warum so viele Leute andere Terminalapplikationen verwenden, denn ich bin mit der mitgelieferten Terminal.app sehr zufrieden. Die Antwort ist mir jetzt klar: Ich habe erst mit Mac OS X Snow Leopard (10.6) am Mac angefangen. Das Terminal vorher war wohl katastrophal, so das es für Snow Leopard einen kompletten Rewrite gab. Ebenso funktioniert das SSH-Keyhandling wohl erst seit Snow Leopard so gut. Ein paar hilfreiche Tips vom Autor von Terminal.app gibt es hier: http://www.bestechvideos.com/2008/12/08/rubyconf-2008-terminal-app.

Virtuelle Anteilnahme an virtueller Betroffenheit

Wer erinnert sich noch an den Herbst 1992 und die erste öffentliche Wahrnehmung der zunehmenden Fremdenfeindlichkeit? Erst die furchtbaren Ausschreitungen von Rostock-Lichtenhagen (oder auch treffender “Rostocker Pogrom”), kurz darauf der Mordanschlag von Mölln, die durch die Nachrichten geisterten und jedem klarmachten, dass Rechtsextremismus nicht mehr nur eine skurrile Randerscheinung einiger verstreuter Spinner ist, sondern ein gefährlicher Zündstoff für die gesamte Gesellschaft.

Mit diesen Ereignissen untrennbar verknüpft ist für mich die Erinnerung an die Lichterketten. Die ersten Lichterketten, die nach den Brandanschlägen organisiert wurden, waren in ihrer Spontanität noch ein wichtiges Symbol: „Es sind nicht alle so!“. „Es gibt auch noch viele andere!“. Dem durch die ständige Medienpräsenz der Fremdenfeindlichkeit entstehenden Bild, es handle sich bei um ein breites Phänomen der gesamten Gesellschaft, wurde medial ein Zeichen gegenübergesetzt. Ein naiv-unbedarftes, aber ehrliches Zeichen, das sicherlich nötig war, sei es gegenüber dem Ausland aber auch Ausländern in Deutschland.

In den Monaten und Jahren darauf entwickelten sich Lichterketten dann allerdings zu einem bequemen Betroffenheitsvehikel, zur billigen Gewissensbefreiung mit bestmöglichem Return on Investment. Einfacher konnte man nicht „was tun“ gegen alles, jeden und das Böse überhaupt. Der Gipfel waren die Lichterketten gegen den Golfkrieg: Gut erinnern kann ich mich, wie mich Fragen wie „Was? Du gehst nicht zur Lichterkette? Bist du etwa nicht gegen den Krieg?“ in einer Mischung aus ungläubiger Fassungslosigkeit und Verzweiflung über so viel Einfältigkeit sprachlos resignieren ließen.

Mit Unglauben musste ich jetzt feststellen, dass sich diese Geisteshaltung im 21. Jahrhundert sogar noch toppen lässt. Man kann jetzt sogar die Kerze weglassen und muss auch nicht mehr die bequeme Wohnung verlassen, um seine gesellschaftliches Engagement zu demonstrieren: Einfach der Facebook-Gruppe „Jeder Fan bedeutet eine Kerze für die Opfer in Haiti. Mach mit!“ beitreten, so wie 579.487 andere auch bisher.

virtuelle Kerzen für Haitivirtuelle Kerzen für Haiti

Jetzt bin ich wirklich sprachlos.

Termine in’s Auto

Ein ganz großes Ärgernis meines Studiums an der FOM ist die schlechte Vorausplanbarkeit. Die Termine für die Vorlesungen, werden zwar zum Semesteranfang festgelegt und bekanntgegeben, die Räume aber werden oft erst spät bekannt gegeben und dann auch oft noch mehrmals bis kurz vor der Vorlesung geändert.

Das wäre weiter nicht schlimm, wenn es es sich um Räume im gleichen Gebäude handeln würde, dummerweise entscheidet sich damit aber auch, ob die Vorlesung z.B. im Norden oder im Süden von München stattfindet…

Leider ist die Webseite der FOM, auf der man seine Termine abrufen kann nur über einen Web-Login mit schnell ablaufendem Cookie realisiert, so dass der schnelle Zugriff mit dem iPhone auf der Fahrt leider auch keine Option ist. Zum Glück gibt es genug langweilige hochinteressante Vorlesungen, in denen man nebenher etwas basteln kann.

Das folgende Skript logt sich mit meinem Usernamen und Passwort im Intranet der FOM ein und lädt dort die Liste der anstehenden Termine und Räume herunter und stellt diese als RSS-Feed zur Verfügung. Da mein Auto über einen Connected Drive Internetzugang verfügt, kann ich den RSS-Feed so direkt in mein Autocockpit einbinden. Was ich daran am erstaunlichsten finde: Es funktioniert sogar :-)

Hier sieht man nicht nur, dass ich dringend mal wieder den Innenraum putzen sollte, sondern zudem die nächste Vorlesung samt Raumbelegung. (Das fehlende Leerzeichen ist inzwischen gefixt)Hier sieht man nicht nur, dass ich dringend mal wieder den Innenraum putzen sollte, sondern zudem die nächste Vorlesung samt Raumbelegung. (Das fehlende Leerzeichen ist inzwischen gefixt)

So kann ich direkt im Display meines Autos nachlesen, wo und wann genau die nächste Vorlesung stattfindet. Das Skript ist zwar immer noch im Zustand “grausiger Hack”, aber nachdem es jetzt schon 1,5 Jahre unverändert ist und hervorragend funktioniert: Falls es jemand brauchen kann, bedient euch:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/perl
use strict;
use warnings;
use XML::RSS;
use FindBin '$RealBin';
use YAML::Syck;
use Hoeni::FOM;


my $config = LoadFile("$RealBin/../fom2rss.yml") || die "No config file found";
my $rss = new XML::RSS(version => '2.0', encoding => 'ISO-8859-15');
my $fom = new Hoeni::FOM;
$fom->login(user => $config->{user}, pass => $config->{pass});

$rss->channel(title => 'BWI07 Vorlesungen', ttl => 1);
foreach ($fom->get_lectures()) {
    my $title = sprintf('%s', $_->start->day_abbr);
    if ($_->end) {    # start, end
        $title .= sprintf(
                          " %d:%02d - %d:%02d",
                          $_->start->hour, $_->start->minute,
                          $_->end->hour,   $_->end->minute
        );
    } elsif ($_->start->hour != 0) {    # start only
        $title .= sprintf(" %d:%02d", $_->start->hour, $_->start->minute);
    } else {                            # no start, no end
        $title .= sprintf(" %s", $_->alternative_time);
    }

    if ($_->room) {
        $title .= sprintf(" (%s)", $_->room);
    }

    $rss->add_item(
                   title => $title,                   description =>
                     sprintf("<em>%s</em>\n<br/>%s", $_->title, $_->room_info),
    );
}

print "Content-Type: text/xml\n\n" . $rss->as_string;

In diesem Kernstück lässt sich auch einfach die Ausgabe des RSS-Feeds an eigene Wünsche anpassen, das Pagescraping der FOM ist im lib/ Verzeichnis zu finden. Das Skript ist in Perl geschrieben und benötigt XML::RSS, YAML::Syck, Moose, HTML::TreeBuilder::XPath und WWW::Mechanize (man sieht, es sollte mal was richtiges werden). Einfach den Tarball auspacken, in der fom2rss.yml Datei Username und Passwort eintragen und dafür sorgen, dass .rss als CGI ausgeführt werden kann. Bei Fragen fragen! :-)

Hörbücher und Podcasts in mundgerechten Häppchen

Der grösste Segen meines Autos ist der eingebaute USB-Anschluss. Mit einem USB-Stick voll guter Musik und ein paar interessanten Podcasts (wie z.B. dem Chaosradio Express) verfliegt der schlimmste Stau im Nu und sogar der Münchner Berufsverkehr lässt sich entspannt durchschwimmen.

Dumm ist nur, wenn man mitten in einem Podcast dann doch lieber Musik hören möchte, denn wenn man zurück will, darf man eine Viertelstunde am Fast-Forward-Knopf verbringen (da ist es nur ein schwacher Trost, dass der am Lenkrad ist).

Inzwischen habe ich eine komfortable Möglichkeit gefunden, dieses Problem zu umgehen: Mit dem freien Tool mp3splt lässt sich ohne grossen Aufwand eine MP3-Datei z.B. in mundgerechte Zehn-Minuten-Häppchen unterteilen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mp3splt -t 10.00 -o "@f/@l" CRE139\ Medienkompetenz.mp3
 Processing file 'CRE139 Medienkompetenz.mp3' ...
 info: file matches the plugin 'mp3 (libmad)'
 info: MPEG 1 Layer 3 - 48000 Hz - Joint Stereo - 96 Kb/s - Total time: 97m.07s
 info: starting time mode split
   File "CRE139 Medienkompetenz/a.mp3" created                              
   File "CRE139 Medienkompetenz/b.mp3" created                    
   File "CRE139 Medienkompetenz/c.mp3" created                    
   File "CRE139 Medienkompetenz/d.mp3" created                    
   File "CRE139 Medienkompetenz/e.mp3" created                    
   File "CRE139 Medienkompetenz/f.mp3" created                    
   File "CRE139 Medienkompetenz/g.mp3" created                    
   File "CRE139 Medienkompetenz/h.mp3" created                    
   File "CRE139 Medienkompetenz/i.mp3" created                    
   File "CRE139 Medienkompetenz/j.mp3" created                     
 time split ok

Mit diesen Dateien ist es dann relativ problemlos, wieder die Stelle zu finden, wo man aufgehört hat.

Thunderbird 3 + Dovecot Bug (CONDSTORE)

Der Bug, dass ständig irgendwelche anderen, zufälligen, teils auch alten Nachrichten wieder als ungelesen im Thunderbird erscheinen, scheint zum Glück nicht nur bei mir aufzutreten. Auch viele andere Leute scheinen dieses Problem in Thunderbird 3.0.1 in Kombination mit einem Dovecot IMAP-Server zu haben, in Thunderbird 3.0.2 gibt es bereits einen Fix für dieses Problem.

Bis Thunderbird 3.0.2 released wird, kann man behelfsweise in Thunderbird CONDSTORE abschalten:

EinstellungenErweitertKonfiguration bearbeitenmail.server.default.use_condstore auf false setzen.

Danke Werner, du hast mich vor einem Nervenzusammenbruch bewahrt :-)

Hausarbeitsanschubsoundtrack

Als Motivation für den Semesterendspurt (eine Hausarbeit muss ich noch fertigkriegen, die Klausuren habe ich schon alle durch) gab es heute früh einen Besuch beim Saturn (ich bin jedesmal wieder erstaunt, wie gut die dortige Vinylabteilung sortiert ist).

Death Cab for Cutie: Transatlanticism (2003)

Netter Hintergrund-Indiepop

Julian Plenti: Is … Skyscraper (2009)

Das klingt doch wie… Interpol. Ist es auch irgendwie. Solo-Projekt vom Interpol-Sänger. Sehr nett, wenn auch nicht weltbewegend, also genau das richtige beim Denken… (und für die peinlichen Plastik-Fanfaren in “Unwind” gibt es Abzug in der B-Note)

Emiliana Torrini: Love in the Time of Science (1999)

Ich liebe Emiliana Torrini, auch wenn ich sie erst mit der grandiosen “Fisherman’s Woman” kennengelernt habe, auf der sie sich eher Richtung Singer/Songwriter entwickelt hat. Dass es jetzt ihre frühreren Triphop-Sachen als Vinyl-Reissues gibt, ist hochwillkommen. (und wenn mir jetzt einer mit “Jungle Drum” kommt… keine Ahnung wie das passieren konnte ;-) )

Soulsavers: Broken (2009)

Hatte garnicht mitbekommen, dass es von denen was neues gibt. Aber nach dem brillanten “It’s Not How Far You Fall, It’s The Way You Land” greif’ ich sorglos zu.

Get Well Soon: Vexations (2009)

Das deutsche Wunderkind hat auch was neues…

Eels: End Times (2010)

Gab es von den Eels eigentlich schonmal eine schlechte Platte? Nein? Dann wird das sicher nicht die erste sein, hoffe ich und freue mich auf eine neues Meisterwerk :-)

Verschiedene Künstler: Monsieur Gainsbourg revisited (2006)

Franz Ferdinand, Portishead, Placebo, Cat Power, Rakes uvw. verneigen sich zum 15. Todestag vor Serge Gainsbourg. Ich bin gespannt.

Them Crooked Vultures: same (2009)

Dave Grohl (ex-Nirvana, Foo Fighters), Josh Homme (Queens Of The Stone Age, Eagles of Death Metal) und John Paul Jones (Led Zeppelin) stehen als Besetzung auf dem Cover. Somit ist klar was es wird: Straight, laut, dreckig und spassig statt intellektuell tüdelig-komplex. Genau das was ich jetzt brauche.

Dredg: The Pariah, the Parrot, the Delusion (2009)

Ich habe nicht den blassesten Schimmer, was das ist, aber ich habe die jetzt schon so oft im Indie-Fach beim Saturn stehen gesehen und das Cover ist nett. Eine Überraschung pro Einkauf muss sein :-)

Vinyl vs. CD - Der endgültige Beweis

Endlich hat sich mal jemand die Mühe gemacht und einen nachvollziehbaren Hörtest erstellt, der die klanglichen Unterschiede zwischen Vinyl und CD herausarbeiten soll. Wer die klangliche Überlegenheit von Vinyl jetzt noch nicht bemerkt, dem ist wirklich nicht mehr zu helfen ;-)

Ich geh’ mir jetzt mal eine schöne Platte auflegen…