Joachim-Neu.de » RSS2 Feedhttp://www.joachim-neu.de/Dieses RSS2-Feed der Seite Joachim-Neu.de enthält alle Blog-Beiträge sortiert nach dem Datum der letzten Aktualisierung.de-deThu, 27 Feb 2014 01:13:13 +0100PulseAudio http://www.joachim-neu.de/post/148/pulseaudio/<p>Die Einrichtung von PulseAudio unter ArchLinux war erstaunlich einfach und reibungslos. Zun&auml;chst musste ich einige Pakete aus den Repositories installieren:</p> <ul> <li>pulseaudio</li> <li>pulseaudio-alsa</li> <li>gst-plugins-good oder gstreamer0.10-good-plugins</li> <li>lib32-libpulse (f&uuml;r Skype)</li> <li>paprefs (f&uuml;r PulseAudio Einstellungen)</li> <li>pavucontrol (um PulseAudio &uuml;ber eine grafische Oberfl&auml;che steuern zu k&ouml;nnen)</li> <li>ponymix (um PulseAudio &uuml;ber die Konsole steuern zu k&ouml;nnen)</li> </ul> <p>Anschlie&szlig;end f&uuml;gte ich der Datei /etc/pulse/default.pa die folgenden Zeilen hinzu:</p> <pre>### Load the integrated PulseAudio equalizer and D-Bus module<br />load-module module-equalizer-sink<br />load-module module-dbus-protocol<br /></pre> <p>Anschlie&szlig;end startete ich PulseAudio:</p> <pre>pulseaudio --start<br /></pre> <p>Und fertig!</p> <h2>Netzwerkzugriff auf entfernte Audiohardware</h2> <p>Nun wollte ich von meinem Laptop aus Musik auf meinem RaspberryPi wiedergeben. Dabei half mir diese Anleitung: <a href="http://www.raspberrypi.org/forum/viewtopic.php?f=38&amp;t=11124" target="_blank">http://www.raspberrypi.org/forum/viewtopic.php?f=38&amp;t=11124</a></p> <pre>sudo rpi-update<br />echo "" &gt;&gt; /etc/modules<br />echo "snd_bcm2835" &gt;&gt; /etc/modules<br />sudo apt-get install pulseaudio pulseaudio-module-zeroconf avahi-daemon<br />echo "" &gt;&gt; /etc/pulse/system.pa<br />echo "load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.178.0/24" &gt;&gt; /etc/pulse/system.pa<br />echo "load-module module-zeroconf-publish" &gt;&gt; /etc/pulse/system.pa</pre> <p>Anschlie&szlig;end noch in /etc/default/pulseaudio die Variable PULSEAUDIO_SYSTEM_START auf 1 setzen, RaspberryPi rebooten und: Ebenfalls fertig!</p> <ol> </ol> Thu, 27 Feb 2014 01:13:13 +0100http://www.joachim-neu.de/post/148/pulseaudio/lxml http://www.joachim-neu.de/post/147/lxml/<p>Die Python-Bibliothek "lxml" macht ein einfaches und sehr angenehmes Parsen von HTML-Seiten m&ouml;glich: &Auml;hnlich jQuery erlaubt sie den Zugriff auf Seitenelemente &uuml;ber CSS-Selektoren. Auf diese Weise l&auml;sst sich beispielsweise der Inhalt einer HTML-Seite gut automatisiert auslesen und verarbeiten.</p> <p>Der folgende Code lie&szlig;t alle von der Startseite meiner Internetseite &uuml;ber die Navigation erreichbaren Seiten aus. Dazu parst er zun&auml;chst die Seite (der Funktion "parse" k&ouml;nnen neben URLs z.B. auch Datei-Objekte &uuml;bergeben werden), anschlie&szlig;end werden mit einem CSS-Selektor alle Links der Navigation herausgefiltert, von denen schlie&szlig;lich die Link-Ziele extrahiert werden:</p> <pre>from lxml.html import parse<br />tree = parse('http://www.joachim-neu.de/')<br />node_root = tree.getroot()<br />print [ a.get('href') for a in node_root.cssselect('td#navigation div a') ]</pre> Sat, 29 Sep 2012 02:30:05 +0200http://www.joachim-neu.de/post/147/lxml/html5shiv http://www.joachim-neu.de/post/146/html5shiv/<p>Mit HTML5 kamen auch einige neue HTML-Layout-Tags wie &lt;section&gt;, &lt;article&gt;, &lt;header&gt; oder &lt;footer&gt;. In Layout-Belangen funktionieren sie wie herk&ouml;mmliche &lt;div&gt;-Tags, strukturieren den Inhalt der Webseite aber in einer f&uuml;r Maschinen verst&auml;ndlichen Form. Leider werden sie in alten Browsern (Internet Explorer 7 und 8) nicht einfach wie &lt;div&gt;-Tags behandelt, insbesondere k&ouml;nnen sie nicht einfach mit CSS gestyled werden.</p> <p>Das kleine Script "html5shiv" schafft hier Abhilfe. Es r&uuml;stet diese neuen HTML5-Tags mit semantischer Bedeutung in alten Browsern nach, sodass HTML5-Code in alten Browsern ohne Anpassungen verwendet werden kann. Neue HTML5-Tags, die nicht das Layout betreffen, sondern zus&auml;tzliche Funktionen mitbringen (wie &lt;video&gt; oder &lt;canvas&gt;) werden von dem Script jedoch nicht nachger&uuml;stet!</p> <p>Die Verwendung ist denkbar einfach:</p> <pre>&lt;!--[if lt IE 9]&gt;<br />&lt;script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"&gt;&lt;/script&gt;<br />&lt;![endif]--&gt;<br /></pre> <p>Wer nicht m&ouml;chte, dass die Datei von Google abgerufen wird, kann die Datei auch herunterladen, auf seinem Webspace hosten und oben dann den entsprechenden Pfad angeben.</p> <p>Der Quellcode f&uuml;r "html5shiv" findet sich hier: <a href="https://github.com/aFarkas/html5shiv" target="_blank">https://github.com/aFarkas/html5shiv</a></p> Fri, 28 Sep 2012 23:50:43 +0200http://www.joachim-neu.de/post/146/html5shiv/badblocks http://www.joachim-neu.de/post/145/badblocks/<p>Das Programm "badblocks" (kommt meist mit "mkfs.ext3" und "mkfs.ext4" und ist somit auch in Linux-Installations-Images verf&uuml;gbar) kann unter Linux verwendet werden, um eine Festplatte vollst&auml;ndig nach fehlerhaften Sektoren zu durchsuchen. Dabei gibt es verschiedene Betriebsmodi:</p> <ul> <li>Der schnellste Test ist ein reiner Lese-Test, er kann auch auf Festplatten angewendet werden, die bereits Daten enthalten.</li> <li>L&auml;nger dauert der Schreib-Test. Hier wird ein (oder mehrere) vorher festgelegtes Pattern auf die Festplatte geschrieben und anschlie&szlig;end wieder eingelesen, um zu testen, ob beim Schreib- und Lese-Vorgang Daten verloren gehen. <strong>ACHTUNG: DABEI WERDEN ALLE DATEN AUF DER FESTPLATTE &Uuml;BERSCHRIEBEN! </strong>Dieser Test darf also nur bei neuen Datentr&auml;gern oder solchen Datentr&auml;gern eingesetzt werden, die nichtmehr ben&ouml;tigt werden.</li> <li>Am l&auml;ngsten dauert der Daten-erhaltende Schreib-Test. Hier werden die vorhandenen Daten gelesen, dann ein Schreib-Test durchgef&uuml;hrt, und anschlie&szlig;end die zwischengespeicherten alten Daten wieder geschrieben. <strong>ACHTUNG: DIESER TEST DARF NICHT BEI FESTPLATTEN EINGESETZT WERDEN, DIE GEMOUNTED SIND, AUCH NICHT READ-ONLY!</strong></li> </ul> <p>Der Schreib-Test testet in den Standard-Einstellungen mit 4 Testmustern. Bei einer neuen 2 TB Festplatte mit 5900 U/min und SATA III dauert ein Durchgang mit einem Testmuster 11 Stunden; f&uuml;r vier Testmuster sind also bereits zwei Tage Dauertest notwendig. Mit dem Parameter "-t" k&ouml;nnen die Testmuster angegeben werden.</p> <p>Die Ausgabe von "badblocks" kann z.B. f&uuml;r "mkfs.ext4" verwendet werden, um beim Anlegen des Dateisystems defekte Bl&ouml;cke zu umschiffen. Empfohlen wird jedoch, die Option "-c" von "mkfs.ext4" zu verwenden, sodass "mkfs.ext4" "badblocks" selbst mit den korrekten Parametern aufruft und keine separate manuelle Pr&uuml;fung auf fehlerhafte Sektoren durchgef&uuml;hrt werden muss.</p> <p>Weitere Details zu "badblocks" und der Verwendung mit "mkfs.ext4" verraten wie &uuml;blich die Man-Pages der beiden Programme:</p> <pre>man badblocks<br />man mkfs.ext4<br /></pre> Sun, 23 Sep 2012 14:39:59 +0200http://www.joachim-neu.de/post/145/badblocks/Grub2, BIOS, GPT http://www.joachim-neu.de/post/144/grub2-bios-gpt/<p>M&ouml;chte man Grub2 auf einem PC mit traditionellem BIOS auf einer Festplatte installieren, die eine <a title="GUID Partition Table" href="http://de.wikipedia.org/wiki/GUID_Partition_Table" target="_blank">GUID Partition Table</a> statt einem <a title="Master Boot Record" href="http://de.wikipedia.org/wiki/Master_Boot_Record" target="_blank">Master Boot Record</a> hat, so ist es zwingend notwendig, eine extra <a href="http://en.wikipedia.org/wiki/BIOS_Boot_partition" target="_blank">BIOS Boot Partition</a> anzulegen, in der Grub2 Teile seines Programmcodes ablegen kann. Es handelt sich dabei um einen speziellen Partitionstyp, den man im Installer des Betriebssystems ausw&auml;hlen k&ouml;nnen sollte. Die Partition muss nur etwa 1 bis 2 MB gro&szlig; sein.</p> <p>Sollte man dies vergessen, warnt auch beispielsweise der Installer von Debian 6.0 nicht vor dem Fehler (schlie&szlig;lich ist zu diesem Zeitpunkt noch nicht bekannt, ob Grub2 als Bootloader installiert werden soll) -- erst das Installieren des Grub2 auf die Festplatte zum Abschluss der Installation schl&auml;gt fehl und die Installation muss von der Partitionierung der Festplatten an wiederholt werden.</p> <p>Weiterf&uuml;hrende Informationen zu dem Thema finden sich hier: <a href="https://wiki.archlinux.org/index.php/GRUB2#GPT_specific_instructions" target="_blank">https://wiki.archlinux.org/index.php/GRUB2#GPT_specific_instructions</a></p> Sun, 23 Sep 2012 14:25:41 +0200http://www.joachim-neu.de/post/144/grub2-bios-gpt/TLP / HDAPS http://www.joachim-neu.de/post/143/tlp-hdaps/<h2>TLP</h2> <p>Bei herk&ouml;mmlichen Laptops regelt unter Ubuntu das Paket "laptop-mode-tools" das Wechseln zwischen verschiedenen Energiespareinstellungen beim &Uuml;bergang von Netz- auf Akku-Betrieb und zur&uuml;ck. F&uuml;r ThinkPads gibt es das Programm "tlp", das eine &auml;hnliche Aufgabe erf&uuml;llt, jedoch speziell f&uuml;r ThinkPads zugeschnitten ist.</p> <p>Installiert wird es &uuml;ber ein zus&auml;tzliches APT-Repository, davor muss das Paket "laptop-mode-tools" deinstalliert werden. Eine Installationsanleitung f&uuml;r Ubuntu findet sich hier: <a href="http://thinkwiki.de/TLP_-_Linux_Stromsparen#Installieren" target="_blank">http://thinkwiki.de/TLP_-_Linux_Stromsparen#Installieren</a></p> <p>Anschlie&szlig;end lassen sich in der Datei "/etc/default/tlp" einige Einstellungen vornehmen: <a href="http://thinkwiki.de/TLP_Einstellungen" target="_blank">http://thinkwiki.de/TLP_Einstellungen</a> "tlp" selbst wird beim Systemstart gestartet und f&uuml;hrt die &Auml;nderungen der Energiespareinstellungen dann automatisch im Hintergrund durch.</p> <h2>HDAPS</h2> <p>HDAPS steht f&uuml;r Hard Drive Active Protection System und bezeichnet folgendes System: Im Laptop ist ein Beschleunigungssensor verbaut. Dieser kann starke Beschleunigungen erkennen und das Betriebssystem (bzw. ein Daemon) kann daraufhin das Parken des Festplattenkopfes veranlassen. Dies sch&uuml;tzt die Festplatte vor eben diesen starken Beschleunigungen.</p> <p>Um HDAPS zu verwenden, sind die Pakete "tp-smapi-dkms" und "hdapsd" aus den Standard-Repositories zu installieren:</p> <pre>sudo apt-get install tp-smapi-dkms hdapsd</pre> <p>Nach der Installation sollte man unbedingt einen Funktionstest ausf&uuml;hren um sicherzustellen, dass der "hdapsd" richtig konfiguriert ist, schlie&szlig;lich will man sich in der Zukunft ja auf dieses System verlassen: <a href="http://wiki.ubuntuusers.de/Festplattenschutz#Funktionstest" target="_blank">http://wiki.ubuntuusers.de/Festplattenschutz#Funktionstest</a></p> <p>Eine gute Erkl&auml;rung zur Funktionsweise und Verwendung von HDAPS findet sich hier: <a href="http://wiki.ubuntuusers.de/Festplattenschutz" target="_blank">http://wiki.ubuntuusers.de/Festplattenschutz</a></p> Tue, 18 Sep 2012 04:48:19 +0200http://www.joachim-neu.de/post/143/tlp-hdaps/iotop / ionice http://www.joachim-neu.de/post/142/iotop-ionice/<p>Die CPU-Zuteilung unter Linux erfolgt durch einen Scheduler im Kernel, der anhand der Priorit&auml;ten der Prozesse, die Bedarf an Rechenzeit signalisiert haben, hunderte Male in der Sekunde entscheidet, wer als n&auml;chstes rechnen darf, und diesem Prozess die CPU "gibt". Dazu gibt es unter Linux die sogenannten Nice-ness-Werte; jeder Prozess hat einen Nice-ness-Wert von -20 bis +20, der seine Priorit&auml;t wiederspiegelt. -20 ist h&ouml;chste Priorit&auml;t, +20 ist geringste Priorit&auml;t. Die genaue Zuteilung der CPU-Ressourcen in Zeit-Anteilen oder &Auml;hnlichem l&auml;sst sich damit nicht angeben, wohl aber verschiedene Prozesse zueinander in Verh&auml;ltnis setzen. Neue Prozesse werden immer mit dem normalen Nice-ness-Wert 0 gestartet. Der Nice-ness-Wert kann mit den Kommandozeilen-Programmen "nice" (zum Starten von neuen Programmen mit bestimmtem Nice-ness-Wert) und "renice" (zum &Auml;ndern des Nice-ness-Wertes von laufenden Programmen) gesteuert werden.</p> <p>Ein &auml;hnliches Verfahren findet Anwendung, um &uuml;ber die Zuteilung der IO-Ressourcen (IO: Input/Output, gemeint ist Peripherie wie Festplatte, Netzwerk, ...) zu entscheiden. Hier gibt es 4 unterschiedliche IO-Scheduling-Klassen: 0/none: kein besonderes IO-Scheduling, 1/real time: besonders kurze Reaktionszeiten des Programms auf es betreffende IO-Anfragen, 2/best-effort: das "normale" IO-Scheduling, 3/idle: diese Programme kriegen nur dann IO-Ressourcen, wenn sonst kein anderes Programm IO-Ressourcen ben&ouml;tigt. Die Scheduling-Klassen 1 und 2 sehen zus&auml;tzlich IO-Priorit&auml;ten f&uuml;r die Prozesse vor, sodass auch unter Prozessen in der gleichen Scheduling-Klasse eine bedarfsgerechte Reihenfolge zur Zuteilung ermittelt bzw. eingestellt werden kann. Detailierte Informationen dazu finden sich in der Man-Page des Kommandozeilen-Tools "ionice":</p> <pre>man ionice</pre> <p>Das Kommandozeilen-Tool "ionice" erledigt f&uuml;r IO-Priorit&auml;t das, was "nice" und "renice" f&uuml;r CPU-Priorit&auml;t erledigen: Neue Programme in einer speziellen IO-Scheduling-Klasse und mit einer speziellen Priorit&auml;t starten oder die Klasse und die Priorit&auml;t eines bestehenden Prozesses ver&auml;ndern. Wie genau das geht, verr&auml;t ebenfalls die Man-Page.</p> <p>Das Programm "iotop" muss aus den Repositories installiert werden:</p> <pre>sudo apt-get install iotop</pre> <p>Dieses Programm (das nur als "root" oder von einem Benutzer mit speziellen Rechten ausgef&uuml;hrt werden kann) zeigt an, welcher Prozess wie viel IO-Ressourcen in Anspruch nimmt. Auf diese Weise kann man herausfinden, ob ein spezieller Prozess &uuml;berm&auml;&szlig;ig viel IO-Last erzeugt und so andere Prozesse oder gar das System beeintr&auml;chtigt.</p> Thu, 23 Aug 2012 16:33:34 +0200http://www.joachim-neu.de/post/142/iotop-ionice/pigz http://www.joachim-neu.de/post/141/pigz/<p>Das beliebte Unix-Kommandozeilen-Util "gzip" zum Komprimieren von Dateien hat ein multi-prozessor-f&auml;higes Pendant namens "pigz" (ausgesprochen: pig-zee). Damit wird beim Komprimieren der Mehrwert von mehreren Prozessorkernen nutzbar, das klassische "gzip" verwendet nur einen Kern.</p> <p>Installiert wird "pigz" einfach &uuml;ber die Standard-Repositories unter Ubuntu und/oder Debian. Au&szlig;erdem gibt es den Sourcecode auf der Website <a href="http://zlib.net/pigz/" target="_blank">http://zlib.net/pigz/</a>.</p> Thu, 23 Aug 2012 02:28:47 +0200http://www.joachim-neu.de/post/141/pigz/RFM12B-868 http://www.joachim-neu.de/post/70/rfm12b-868/<p><strong>ACHTUNG: Ich &uuml;bernehme keine Haftung f&uuml;r durch in diesem Beitrag bereitgestellten Programmcode verursachte Sch&auml;den! Die Benutzung erfolgt ausschlie&szlig;lich auf eigene Gefahr!</strong></p> <p>Mein Touchpanel habe ich auch mit Sensoren ausgestattet, die bisher nur exemplarisch und sehr d&uuml;rftig den Wasserstand meiner Zimmerpflanzen &uuml;berwachen k&ouml;nnen. F&uuml;r die Kommunikation mit der restlichen Hardware habe ich mich f&uuml;r eine Funkverbindung entschieden, weil diese sehr flexibel ist und ohne Verdrahtung auskommt. Als Funkmodul verwende ich ein auf dem RF12-Chip basierendes Funkmodul namens RFM12B im 868-MHz-Frequenzband.</p> <p>Die Ansteuerung der 868-MHz-Variante des Funkmoduls RFM12B war eine langwierige und sehr unangenehme Angelegenheit, nicht zuletzt aufgrund fehlender funktionst&uuml;chtiger Beispielcodes und unvollst&auml;ndiger Datenbl&auml;tter. Letztlich gelang es dennoch nach dem dritten From-Scratch-Neuschreiben des Treibers, mit viel solidarischer Hilfe eines guten Freundes und einer gro&szlig;en Portion Unterst&uuml;tzung aus dem WWW, die ersten Nachrichten erfolgreich &uuml;ber die frische Funkschnittstelle zu &uuml;bermitteln.</p> <p>Alles Weitere lie&szlig; sich dann gl&uuml;cklicherweise schneller umsetzen als der steinige harte Anfang. Und auch wenn die Verbindungsqualit&auml;t derzeit noch miserabel ist (die Reichweite betr&auml;gt etwa 50 cm) und w&uuml;nschenswerte Features wie Interrupt-basierte &Uuml;bertragung fehlen, m&ouml;chte ich den Code hier zur freien Verf&uuml;gung aber <strong>ohne jegliche Art von Garantien</strong> zur Verf&uuml;gung stellen. In der Hoffnung, anderen damit das Leben ein wenig erleichtern zu k&ouml;nnen.</p> <p>Der Treiber besteht aus drei Dateien, "rfm12b.h", "rfm12b.c" und "config.h". <strong>Bei der Benutzung m&uuml;ssen unbedingt die geltenden gesetzlichen Bestimmungen f&uuml;r die verwendete Funkfrequenz beachtet werden! </strong></p> <h3><strong>config.h</strong></h3> <pre>// _I = INPUT PORT // _O = OUTPUT PORT // _P = PORT INDEX // _D = DATA DIRECTION REGISTER <br />// SPI SCK (clock, output)<br />#define RFM12B_SCK_I PINB #define RFM12B_SCK_O PORTB #define RFM12B_SCK_P 2 #define RFM12B_SCK_D DDRB #define RFM12B_SCK_INIT() RFM12B_SCK_D |= (1&lt;&lt;(RFM12B_SCK_P)) #define RFM12B_SCK_LOW() RFM12B_SCK_O &amp;= ~(1&lt;&lt;(RFM12B_SCK_P)) #define RFM12B_SCK_HIGH() RFM12B_SCK_O |= (1&lt;&lt;(RFM12B_SCK_P)) <br />// SPI MISO / SDO (master in slave out, input) #define RFM12B_MISO_I PINB #define RFM12B_MISO_O PORTB #define RFM12B_MISO_P 1 #define RFM12B_MISO_D DDRB #define RFM12B_MISO_INIT() RFM12B_MISO_D &amp;= ~(1&lt;&lt;(RFM12B_MISO_P)) #define RFM12B_MISO_LOW() ~(RFM12B_MISO_HIGH()) #define RFM12B_MISO_HIGH() RFM12B_MISO_I &amp; (1&lt;&lt;(RFM12B_MISO_P)) <br />// SPI MOSI / SDI (master out slave in, output) #define RFM12B_MOSI_I PINB #define RFM12B_MOSI_O PORTB #define RFM12B_MOSI_P 0 #define RFM12B_MOSI_D DDRB #define RFM12B_MOSI_INIT() RFM12B_MOSI_D |= (1&lt;&lt;(RFM12B_MOSI_P)) #define RFM12B_MOSI_LOW() RFM12B_MOSI_O &amp;= ~(1&lt;&lt;(RFM12B_MOSI_P)) #define RFM12B_MOSI_HIGH() RFM12B_MOSI_O |= (1&lt;&lt;(RFM12B_MOSI_P)) <br />// SPI SS / CS (slave select, output) #define RFM12B_SS_I PINB #define RFM12B_SS_O PORTB #define RFM12B_SS_P 4 #define RFM12B_SS_D DDRB #define RFM12B_SS_INIT() RFM12B_SS_D |= (1&lt;&lt;(RFM12B_SS_P)) #define RFM12B_SS_LOW() RFM12B_SS_O &amp;= ~(1&lt;&lt;(RFM12B_SS_P)) #define RFM12B_SS_HIGH() RFM12B_SS_O |= (1&lt;&lt;(RFM12B_SS_P))</pre> <h3><strong><strong>rfm12b.h</strong></strong></h3> <pre>#include "config.h" #include &lt;avr/io.h&gt; <br />uint16_t RFM12B_spi(uint16_t); void RFM12B_init_hard(); void RFM12B_init_soft(); void RFM12B_put(uint8_t); uint8_t RFM12B_get(); void RFM12B_transmit(uint8_t data[], uint8_t length); void RFM12B_receive(uint8_t *data, uint8_t length); <br />#define RFM12B_STATUS RFM12B_spi(0x0000) // INTs #define RFM12B_RGIT() (RFM12B_STATUS &amp; 0x8000) #define RFM12B_WAIT_RGIT() while(!RFM12B_RGIT()) { } #define RFM12B_FFIT() (RFM12B_STATUS &amp; 0x8000) #define RFM12B_WAIT_FFIT() while(!RFM12B_FFIT()) { }</pre> <h3><strong>rfm12b.c</strong></h3> <pre>#include "rfm12b.h" <br />// send and receive a 16bit-word via spi uint16_t RFM12B_spi(uint16_t cmd) { uint8_t i; uint16_t recv = 0; // start communication RFM12B_SCK_LOW(); RFM12B_SS_LOW(); // read 16 bits for(i=0; i&lt;16; i++) { // send bit if(cmd &amp; 0x8000) RFM12B_MOSI_HIGH(); else RFM12B_MOSI_LOW(); // clock RFM12B_SCK_HIGH(); recv&lt;&lt;=1; // receive bit if(RFM12B_MISO_HIGH()) { recv|=0x0001; } // clock RFM12B_SCK_LOW(); cmd&lt;&lt;=1; } // end communication RFM12B_SS_HIGH(); return recv; } <br />// initialize hardware (atmel) (CHECKED) void RFM12B_init_hard() { // set default values RFM12B_SS_HIGH(); RFM12B_MOSI_HIGH(); RFM12B_SCK_LOW(); // init ports RFM12B_SCK_INIT(); RFM12B_MOSI_INIT(); RFM12B_MISO_INIT(); RFM12B_SS_INIT(); } <br />// initialize software (rfm12b) (CHECKED) void RFM12B_init_soft() { RFM12B_spi(0x80D7);//EL,EF,433band,12.0pF RFM12B_spi(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC /* RFM12B_spi(0xA640);//434MHz*/ RFM12B_spi(0xA74E);//869,35 MHz RFM12B_spi(0xC647);//4.8kbps RFM12B_spi(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm RFM12B_spi(0xC2AC);//AL,!ml,DIG,DQD4 RFM12B_spi(0xCA81);//FIFO8,SYNC,!ff,DR RFM12B_spi(0xCED4);//SYNC=2DD4; RFM12B_spi(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN /* RFM12B_spi(0x9850);//!mp,90kHz,MAX OUT*/ RFM12B_spi(0x9820);//!mp,45kHz,MAX OUT*/ RFM12B_spi(0xCC77);//OB1,OB0, LPX,!ddy,DDIT,BW0 RFM12B_spi(0xE000);//NOT USE RFM12B_spi(0xC800);//NOT USE RFM12B_spi(0xC040);//1.66MHz,2.2V } <br />// send a byte (CHECKED) // uint8_t data data to send void RFM12B_put(uint8_t data) { RFM12B_WAIT_RGIT(); RFM12B_spi(0xB800 + data); } <br />// receive a byte (CHECKED) uint8_t RFM12B_get() { RFM12B_WAIT_FFIT(); return RFM12B_spi(0xB000) &amp; 0x00FF; } <br />// transmit multiple bytes (CHECKED) // uint8_t data[] data to transmit // uint8_t length length of the data to transmit void RFM12B_transmit(uint8_t data[], uint8_t length) { uint8_t i; // enable TX RFM12B_spi(0x8238); RFM12B_put(0xAA); RFM12B_put(0xAA); RFM12B_put(0xAA); RFM12B_put(0x2D); RFM12B_put(0xD4); for(i = 0; i &lt; length; i++) { RFM12B_put(data[i]); } RFM12B_WAIT_RGIT(); // disable TX RFM12B_spi(0x8208); } <br />// receive multiple bytes (CHECKED) // uint8_t data[] buffer for received data // uint8_t length length of data to receive void RFM12B_receive(uint8_t *data, uint8_t length) { uint8_t i; // enable RX RFM12B_spi(0x82C8); // set FIFO mode RFM12B_spi(0xCA81); // enable FIFO RFM12B_spi(0xCA83); for(i = 0; i &lt; length; i++) { data[i] = RFM12B_get(); } RFM12B_WAIT_FFIT(); // disable RX RFM12B_spi(0x8208); }<br /></pre> <p>Weitere interessante Ressourcen zum Funkchip RFM12B sind <a href="http://jeelabs.net/projects/cafe/wiki/RF12" target="_blank">http://jeelabs.net/projects/cafe/wiki/RF12</a> und <a href="http://jeelabs.org/2010/02/23/secure-transmissions/" target="_blank">http://jeelabs.org/2010/02/23/secure-transmissions/</a>.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/70/rfm12b-868/Software-RAID (mdadm): Festplattenwechsel http://www.joachim-neu.de/post/140/software-raid-mdadm-festplattenwechsel/<p><strong>ACHTUNG: Beim Umgang mit angeschlagenen/besch&auml;digten RAID-Konfigurationen ist h&ouml;chste Vorsicht geboten! Es besteht die akute Gefahr, bei Fehlern alle Daten unwiderbringlich zu vernichten. Jede Handlung sollte gut &uuml;berlegt sein. Ich &uuml;bernehme KEINERLEI HAFTUNG f&uuml;r die Korrektheit/Aktualit&auml;t/... der folgenden Anleitung! Die Verwendung erfolgt ausschlie&szlig;lich auf eigene Gefahr!<br /></strong></p> <p>Das RAID ist wie ein Fallschirm: Man h&auml;lt es bereit f&uuml;r den Fall der F&auml;lle, aber am meist freut man sich doch, wenn sich die Investition nicht "gerechnet" hat und man die Ausr&uuml;stung garnicht in Anspruch zu nehmen braucht. Wenn der Fall der F&auml;lle dann aber doch mal eintritt, muss jeder Handgriff sitzen, auch wenn man diesem Szenario im Alltag nicht so regelm&auml;&szlig;ig begegnet.</p> <p>Unter Linux verwendet man gerne die Software-RAID-F&auml;higkeiten des Kernels. Dabei kommt ein offenes Format zum Einsatz, was die Abh&auml;ngigkeit von propriet&auml;rer Software und speziellen Hardwarekomponenten aufl&ouml;st. Sehr beliebt ist RAID bei (Web-)Servern; hier kommt h&auml;ufig eine Spiegelung in einem RAID1-Verbund mit 2 baugleichen Festplatten in Frage. F&uuml;r diesen Fall sollen hier die Schritte erl&auml;utert werden, die beim Ausfall einer Festplatte zum Ersetzen eben dieser durchzuf&uuml;hren sind.</p> <p>Der beliebte deutsche Hoster Hetzner hat in seinem Wiki eine sehr ausf&uuml;hrliche Anleitung f&uuml;r diesen Fall: <a href="http://wiki.hetzner.de/index.php/Festplattenaustausch_im_Software-RAID" target="_blank">http://wiki.hetzner.de/index.php/Festplattenaustausch_im_Software-RAID</a></p> <ol> <li><strong>Erkennen eines Ausfalls:</strong> Der Ausfall einer Festplatte macht sich sowohl im Kernel-Log ("dmesg") alsauch in der Datei "/proc/mdstat" bemerkbar. Im "gesunden" Zustand steht hier hinter jeder RAID1-Partition "[UU]". Ist eine der Festplatten defekt, taucht hier "[U_]" oder "[_U]" auf. Auch erscheint dann in der Zeile dar&uuml;ber ein "(F)" ganz am Ende.</li> <li><strong>Identifikation der Festplatte:</strong> Nun gilt es, herauszufinden, welche der beiden Festplatten kaputt ist. "/proc/mdstat" und "sudo mdadm --detail /dev/mdX" k&ouml;nnen dabei ebenso hilfreich sein, wie "sudo smartctl -A /dev/sdX" und "sudo hdparm -i /dev/sdX | grep SerialNo". Wichtig ist, sp&auml;ter die kaputte Festplattenhardware eindeutig identifizieren und ersetzen zu k&ouml;nnen, um nicht versehentlich die intakte Festplatte zu ersetzen. Aus diesem Grund ist es hilfreich, dem Server-Support-Personal z.B. die Seriennummer der intakten Festplatte mitzuteilen.</li> <li><strong>Entfernen der Festplatte aus dem RAID:</strong> Ist im Folgenden "sdX" die kaputte Festplatte und "sdY" die verbliebene intakte Festplatte, so muss "sdX" aus dem RAID-Verbund aktiv entfernt werden. Dies geschieht mittels "sudo mdadm /dev/mdY -r /dev/sdXZ" f&uuml;r alle RAID-Partitionen, in denen Partitionen der kaputten Platte eine Rolle spielen. Dieser Befehl kann unter bestimmten Umst&auml;nden fehl schlagen -- weitere Details in diesen Sonderf&auml;llen bietet die hervorragende Anleitung von Hetzner.</li> <li><strong>Grub-Installation auf verbliebener Festplatte:</strong> Um sicher zu gehen, dass der Server nach dem Festplattentausch noch korrekt hochf&auml;hrt, kann es hilfreich sein, den Grub-Bootloader auf der noch intakten Festplatte erneut zu installieren: "sudo grub-install /dev/sdY"</li> <li><strong>Festplattenaustausch durch das Server-Support-Personal:</strong> Mit Ausz&uuml;gen aus den entsprechenden Log-Files, die den Fehler belegen, kann beim Hoster der Tausch der Festplatte angefordert werden. Dabei kann es sinnvoll sein, einen Termin zu vereinbaren, an dem der Server heruntergefahren, die Festplatte getauscht, und der Server wieder hochgefahren wird. Auch sollten bei dieser Anfrage unbedingt Informationen angegeben werden, die eine eindeutige zweifelsfreie Identifikation der kaputten Festplatte erm&ouml;glichen.</li> <li><strong>Vorbereitung der neuen Festplatte:</strong> Nachdem der Server wieder hochgefahren wurde, muss die neue, vermutlich leere Festplatte (der Festplattenersatz sei "sdX") f&uuml;r die Verwendung im RAID vorbereitet werden. Bei Festplatten mit GPT (GUID Partitionstabelle) muss diese mittels "sudo sgdisk -R /dev/sdX /dev/sdY" von der alten Festplatte auf die neue, leere Festplatte kopiert werden und anschlie&szlig;end mit "sudo sgdisk -G /dev/sdX" eine neue UUID zugewiesen bekommen. Informationen zu Festplatten mit MBR finden sich auf der angegebenen Seite im Hetzner Wiki.</li> <li><strong>Einbinden der neuen Festplatte:</strong> Anschlie&szlig;end kann die neue Festplatte wieder in den RAID-Verbund integriert werden: "sudo mdadm /dev/mdY -a /dev/sdXZ" Die RAID-Partitionen werden daraufhin damit beginnen, die Daten von der alten Festplatte auf die neue Festplatte zu kopieren. Dieser Vorgang kann unter Umst&auml;nden sehr lange Zeit (in der Gr&ouml;&szlig;enordnung von Stunden/wenigen Tagen) beanspruchen. Erst nach Abschluss dieses Vorgangs (der &uuml;ber "/proc/mdstat" &uuml;berwacht werden kann) ist die Ausfallsicherheit des RAID1 wiederhergestellt!</li> <li><strong>Installation des Grub-Bootloaders: </strong>Nun empfielt es sich, den Grub-Bootloader wieder auf alle installierten und intakten Festplatten zu installieren, um im Fall eines Festplattenausfalls von der jeweils anderen Festplatte korrekt booten zu k&ouml;nnen: "sudo grub-install /dev/sdZ"</li> </ol> <p>Nach dem erfolgreichen Abschluss all dieser Schritte sollte das RAID1 wieder vollumf&auml;nglich zur Verf&uuml;gung stehen und seinen Pflichten im n&auml;chsten Fall der F&auml;lle erneut korrekt nachkommen. Es empfielt sich, die Datei "/proc/mdstat" und einschl&auml;ge System-Logs regelm&auml;&szlig;ig zu kontrollieren (idealerweise automatisch zu monitoren), um den Ausfall einer Festplatte fr&uuml;hzeitig zu bemerken. Bei Fragen und Unsicherheiten ist ein Blick in den verlinkten Artikel im Hetzner-Wiki meist sehr lohnenswert.</p> Sun, 12 Aug 2012 03:14:26 +0200http://www.joachim-neu.de/post/140/software-raid-mdadm-festplattenwechsel/nethogs http://www.joachim-neu.de/post/139/nethogs/<p>"Wer/was verbraucht auf diesem Computer/Server die ganze Bandbreite?" Solche oder &auml;hnliche Fragen, welcher Benutzer oder welches Programm welche Netzwerk-Auslastung erzeugt, beantwortet das Kommandozeilen-Tool "nethogs". Unter Ubuntu einfach mit dem gleichnamigen Paket "nethogs" aus den Standard-Repos installiert</p> <pre>sudo apt-get install nethogs<br /></pre> <p>zeigt es nach dem Start &uuml;ber die Konsole dann in einer &uuml;bersichtlichen, minimalistischen, "top"-artigen Ansicht die momentanen &Uuml;bertragungsraten einzelner Programme sowie deren Benutzer an.</p> <p>Weitere Infos: <a href="http://nethogs.sourceforge.net/" target="_blank">http://nethogs.sourceforge.net/</a></p> Sat, 11 Aug 2012 18:21:51 +0200http://www.joachim-neu.de/post/139/nethogs/Debian Squeeze http://www.joachim-neu.de/post/138/debian-squeeze/<p>Beim/nach dem Upgrade von Debian Lenny auf Debian Squeeze sind bei mir die folgenden Probleme aufgetreten:</p> <p><strong>Courier Mail-Server: FAM/Gamin fehlt</strong></p> <p>Nach dem Start des neuen Mail-Servers (genauer: des IMAP-Teils von Courier) hat Thunderbird von diesem die folgende Fehlermeldung angezeigt:</p> <pre>Filesystem notification initialization error -- contact your mail administrator (check for configuration errors with the FAM/Gamin library)</pre> <p>Die L&ouml;sung bestand darin, das Paket "gamin" zu installieren und den Mail-Server neuzustarten:</p> <pre>sudo apt-get install gamin<br />find /etc/init.d/ | grep courier | while read line; do sudo $line restart; done<br /></pre> <p>(siehe <a href="http://phil.lavin.me.uk/2012/02/quick-fix-filesystem-notification-initialization-error-contact-your-mail-administrator-check-for-configuration-errors-with-the-famgamin-library/" target="_blank">http://phil.lavin.me.uk/2012/02/quick-fix-filesystem-notification-initialization-error-contact-your-mail-administrator-check-for-configuration-errors-with-the-famgamin-library/</a>)</p> <p><strong>Roundcube: Fehler durch neue Suhosin Defaults</strong></p> <p>Standardm&auml;&szlig;ig scheint die PHP-Sicherheitserweiterung Suhosin (die mit PHP unter Debian Squeeze ausgeliefert wird) Sessions transparent zu verschl&uuml;sseln. Dies kommt Roundcube in die Quere, sodass man das Feature gezielt in der Konfigurationsdatei "php.ini" bzw. einer &auml;quivalenten Konfigurationsdatei deaktivieren muss. In meiner Konfiguration war die Datei "/etc/php5/conf.d/suhosin.ini" zu editieren und dort der Konfigurationsparameter "suhosin.session.encrypt" auf "off" zu setzen und einzukommentieren.</p> <p>(siehe <a href="http://zeldor.biz/2010/12/roundcube-php-update-conflict/" target="_blank">http://zeldor.biz/2010/12/roundcube-php-update-conflict/</a>)</p> Fri, 01 Jun 2012 03:38:11 +0200http://www.joachim-neu.de/post/138/debian-squeeze/libvirt: vnetX http://www.joachim-neu.de/post/137/libvirt-vnetx/<p>Bei der Verwendung von libvirt im Bridge-Modus und virtuellen Netzwerkschnittstellen zu den einzelnen VMs hin (vnetX), tauchten im Syslog eine Menge Fehlermeldungen der folgenden Art auf:</p> <pre>vnetX: received packet with own address as source address</pre> <p>Google brachte zwar eine Reihe von &auml;hnlichen Fehlermeldungen zu Tage, aber keine davon geh&ouml;rte zu einem &auml;hnlich gelagerten Fall. Nach einigem Suchen ergab sich folgende L&ouml;sung:</p> <p>Man w&auml;hlt f&uuml;r die Netzwerkschnittstellen der G&auml;ste eine zuf&auml;llige MAC Adresse. libvirt legt dazu dann ein TAP-Device an und h&auml;ngt dieses an die Bridge. Das TAP-Device ben&ouml;tigt ebenfalls eine MAC Adresse. Diese generiert libvirt, indem es die MAC-Adresse der Netzwerkschnittstelle nimmt und das erste Byte mit 0xFE &uuml;berschreibt. Beginnt die selbstgew&auml;hlte MAC-Adresse bereits mit 0xFE, erreichen das TAP-Device aus der VM heraus st&auml;ndig Pakete mit der MAC-Adresse des TAP-Devices. Das f&uuml;hrt naturgem&auml;&szlig; zu einiger Verwunderung, die dann entsprechend im Syslog kundgetan wird ...</p> <p>Die L&ouml;sung ist entsprechend simpel: MAC-Adressen w&auml;hlen, die nicht mit 0xFE beginnen. Von libvirt zuf&auml;llig zugeteilte Adressen beginnen immer mit 52:54:00 und k&ouml;nnen gefahrlos verwendet werden.</p> Fri, 01 Jun 2012 03:29:33 +0200http://www.joachim-neu.de/post/137/libvirt-vnetx/Routing: Gateways http://www.joachim-neu.de/post/136/routing-gateways/<p>An dieser Stelle m&ouml;chte ich auf ein ungl&uuml;ckliches Detail von Routen unter Linux in Verbindung mit Gateways hinweisen: Es ist nicht m&ouml;glich, eine Route mit einem Gateway einzutragen, das zum Zeitpunkt der Eintragung nicht erreichbar ist. Statt einer ausdr&uuml;cklichen Fehlermeldung, die darauf hinweist, erh&auml;lt man jedoch von den verschiedensten IP-Tools unter Linux nur &auml;u&szlig;erst cryptische Fehlermeldungen die eher ein Rechteproblem oder ein Problem in den Tiefen des Kernels vermuten lassen, als dass schlicht das Gateway aktuell nicht erreichbar ist und deshalb die Route nicht hinzugef&uuml;gt werden kann...</p> Fri, 01 Jun 2012 03:23:02 +0200http://www.joachim-neu.de/post/136/routing-gateways/Shell: read http://www.joachim-neu.de/post/135/shell-read/<p>Der Command "read" wird auf g&auml;ngigen Unix-/Linux-Shells dazu verwendet, Zeichenketten (von Standard-Eingabe) in Variablen zu lesen. Dies ist relativ einfach zu bewerkstelligen (hier wird eine Zeile in die Variable "variable" gelesen, die dann &uuml;ber $variable verwendet werden kann):</p> <pre>read variable<br /></pre> <p>Gelegentlich soll auch von einem Skript ein Passwort abgefragt und dieses zu weiteren Verwendung in einer Variable gespeichert werden. Dabei ist es wichtig, dass das Passwort bei der Eingabe nicht angezeigt wird. Dazu wird das "echo"-Feature des aktuellen Terminals kurzzeitig abgeschaltet und nach dem Einlesen des Passworts wieder aktiviert:</p> <pre>echo -n 'Password: '; stty -echo; read password; stty echo; echo;</pre> <p>Das Passwort wird hier in der Variable "password" gespeichert.</p> Fri, 01 Jun 2012 03:13:40 +0200http://www.joachim-neu.de/post/135/shell-read/Scapy http://www.joachim-neu.de/post/134/scapy/<p>"Scapy" ist eine Python-Library um schnell und einfach auf Paketebene Netzwerk zu machen, sprich: Sniffen, Pakete auswerten, Pakete generieren, Pakete versenden.</p> <p>Mit nur wenigen Zeilen l&auml;sst sich beispielsweise der Netzwerktraffic mitschneiden und filtern. F&uuml;r jedes Paket wird eine Callback-Routine aufgerufen, die das Paket im Detail analysieren und darauf reagieren kann, indem zum Beispiel Pakete generiert und verschickt werden.</p> <p>Das Erzeugen von Paketen ist sehr elegant gel&ouml;st. Eine Reihe von Klassen f&uuml;r die einzelnen Protokolle existieren. Den Konstruktoren &uuml;bergibt man die Parameter f&uuml;r die Pakete, &uuml;ber den &uuml;berladenen /-Operator kann man die einzelnen Pakete ineinander schachteln.</p> <p>Das folgende Beispielprogramm snifft den kompletten Netzwerkverkehr und gibt eine Kurzfassung aller Pakete aus:</p> <pre>#! /usr/bin/env python<br />from scapy.all import *<br /><br />def monitor_callback(pkt):<br />&nbsp;&nbsp;&nbsp; print pkt.summary()<br /><br />sniff(prn=monitor_callback)<br /></pre> <p>Um &uuml;ber die n&ouml;tigen Rechte zu verf&uuml;gen muss das Programm als root gestartet werden. Weitere Informationen und eine Menge Beispielmaterial und Dokumentation finden sich im Internet.</p> Mon, 09 Apr 2012 01:11:16 +0200http://www.joachim-neu.de/post/134/scapy/pwgen http://www.joachim-neu.de/post/133/pwgen/<p>Schnell und einfach zuf&auml;llige Passw&ouml;rter, z.B. f&uuml;r die Registrierung bei diversen Online Diensten, erzeugen, kann man mit dem Kommandozeilentool "pwgen". Unter Ubuntu einfach unkompliziert aus den Repositories installieren:</p> <pre>sudo apt-get install pwgen</pre> <p>Die Benutzung ist denkbar einfach:</p> <pre>pwgen</pre> <p>Zus&auml;tzlich kennt "pwgen" einige optionale Parameter, mit denen man z.B. die L&auml;nge und Anzahl der erzeugten Passw&ouml;rter und die verwendeten Zeichen einstellen kann. Alle Details verr&auml;t wie immer die Man-Page:</p> <pre>man pwgen</pre> Sat, 31 Mar 2012 21:26:43 +0200http://www.joachim-neu.de/post/133/pwgen/SoundConverter http://www.joachim-neu.de/post/132/soundconverter/<p>Wer unter Linux Audio-Dateien konvertieren m&ouml;chte, ohne sich dabei zu tief in die Parameter und Funktionsweise einschl&auml;giger Kommandozeilentools einzuarbeiten, f&uuml;r den ist das Programm "SoundConverter" (das es auch in den Ubuntu Standard Software Repositories gibt) ein Blick wert. Installieren l&auml;sst es sich einfach &uuml;ber Konsole:</p> <pre>sudo apt-get install soundconverter</pre> <p>Dann startet man die gleichnamige ausf&uuml;hrbare Datei "soundconverter" &uuml;ber die Konsole. Man muss dann nurnoch eine Reihe von Dateien oder Ordnern hinzuf&uuml;gen, die Details einstellen und los geht's! Umbenennen kann "SoundConverter" die Dateien auch gleich.</p> <p>Weitere Infos gibt's unter: <a href="http://www.soundconverter.org/" target="_blank">http://www.soundconverter.org/</a></p> Mon, 05 Mar 2012 23:39:19 +0100http://www.joachim-neu.de/post/132/soundconverter/DBus / d-feet http://www.joachim-neu.de/post/131/dbus-d-feet/<p>DBus ist ein Mechanismus zur Interprozesskommunikation (IPC) auf modernen Linux Desktops. Er erlaubt es Anwendungen, &uuml;ber eine einheitliche Schnittstelle (hier: &uuml;ber ein einheitliches Protokoll, das DBus Protokoll) Funktionalit&auml;t (in Form von Objekten und Methoden) f&uuml;r andere Anwendungen bereitzustellen und diesen den Zugriff darauf zu erm&ouml;glichen.</p> <p>Auf diese Weise k&ouml;nnten beispielsweise Audio/Video-Player die Kontrolle ihres Abspielverhaltens &uuml;ber eine einheitliche Schnittstelle (hier: ein einheitliches Set an Funktionen wie "play()", "pause()", "playPause()", "nextTrack()", "previousTrack()", ...) erm&ouml;glichen, sodass Busteilnehmer, die diese Funktionen aufrufen m&ouml;chten (beispielsweise wenn der Benutzer eine bestimmte Tastenkombination dr&uuml;ckt), nicht f&uuml;r jeden Player ein eigenes Interface lernen m&uuml;ssen, sondern mit einem Interface alle Player bedienen k&ouml;nnen, die sich daran halten.</p> <p>DBus-Kommunikation (wie Funktionsaufrufe oder das Setzen von Eigenschaften von Objekten) findet &uuml;ber Nachrichten auf einem Nachrichten-Bus statt. Auf jedem PC sind meist mehrere Busse aktiv. Meistens gibt es einen systemweiten Nachrichten-Bus (System-Bus) sowie f&uuml;r jede grafische Benutzer-Session einen Session-Bus. Auf dem System-Bus sind Daemons und Server erreichbar, auf dem Session-Bus findet man &uuml;bliche Programme wie Media-Player.</p> <p>Bus-Teilnehmer k&ouml;nnen bei DBus spezielle generische Namen (vergleichbar zu Domains im Internet) registrieren, sodass sie unabh&auml;ngig von ihrer Bus-ID immer &uuml;ber den gleichen Namen ansprechbar sind. Zu DBus geh&ouml;ren auch umfangreiche Introspection-F&auml;higkeiten, mit denen sich Busteilnehmer auf dem Bus umschauen k&ouml;nnen, welche Funktionalit&auml;t andere Teilnehmer bereitstellen.</p> <p>Diese Introspection-Funktionalit&auml;t l&auml;sst sich mit dem Programm "d-feet" ausnutzen. Man kann sich damit auf dem Bus umschauen, welche Funktionen dort angeboten werden, Objekte inspizieren, Eigenschaften derer auslesen und Funktionen aufrufen. Installieren l&auml;sst sich "d-feet" einfach aus den Ubuntu Standard Repositories:</p> <pre>sudo apt-get install d-feet</pre> <p>Nach dem Start muss man den zu inspizierenden Bus &ouml;ffnen und dessen Bus-Adresse eingeben. Den System-Bus findet man zumeist unter "unix:path=/var/run/dbus/system_bus_socket", die Adresse des Session-Bus findet man wie folgt heraus:</p> <pre>env | grep DBUS_SESSION_BUS_ADDRESS</pre> <p>Weitere Informationen zu DBus finden sich unter:</p> <ul> <li><a href="http://www.freedesktop.org/wiki/Software/dbus" target="_blank">http://www.freedesktop.org/wiki/Software/dbus</a></li> <li><a href="http://wiki.meego.com/D-Bus/Overview" target="_blank">http://wiki.meego.com/D-Bus/Overview</a></li> </ul> Sun, 26 Feb 2012 17:06:04 +0100http://www.joachim-neu.de/post/131/dbus-d-feet/indicator-weather http://www.joachim-neu.de/post/130/indicator-weather/<p>Seit Ubuntu auf Unity setzt, wurde dadurch auch das altbekannte GNOME Panel abgel&ouml;st. Und damit sind auch all die vielen GNOME Panel Plugins unbenutzbar geworden. Unity dagegen setzt auf sogenannte "Indicators", die nur lose mit dem Unity Panel gekoppelt sind und als eigenst&auml;ndige Programme laufen. Sie kann man nach Belieben jederzeit installieren und deinstallieren; startet man sie, docken sie sich in das Unity Panel ein. Beendet man sie oder schie&szlig;t man sie ab, werden sie wieder abgedockt. Ein durchaus einfacher und eleganter Mechanismus.</p> <p>Vergeblich sucht man jedoch in der Standardinstallation nach einem Wetter-Applet oder eben: Wetter-Indicator. Das findet sich jedoch in den Repositories, unter dem Paketnamen "indicator-weather". Mit wenigen Tastendr&uuml;cken kriegt man eine solide Wetteranzeige mit gewohntem Feature-Umfang:</p> <pre>sudo apt-get install indicator-weather<br /></pre> Fri, 24 Feb 2012 14:20:27 +0100http://www.joachim-neu.de/post/130/indicator-weather/SSH im Initramfs http://www.joachim-neu.de/post/129/ssh-im-initramfs/<p>Festplattenvollverschl&uuml;sselung ist eine gute Idee, w&auml;re da nur nicht die nervige Passwortabfrage beim Booten. Was beim Laptop oder Desktop den Bootvorgang lediglich ein bisschen verz&ouml;gert, wird bei Maschinen, die nicht &uuml;ber Bildschirm/Tastatur verf&uuml;gen, oder bei denen diese nicht erreichbar sind (beispielsweise weil das Ger&auml;t irgendwo weit weg steht und nur &uuml;ber das Internet erreichbar ist), zum echten Problem. Und obgleich man einen Server idealerweise ohnehin nicht herunterf&auml;hrt: Auch hier gibt es hin und wieder Kernel-Updates, die einen Reboot erforderlich machen. Ist dann das Eingeben des Passworts nur kompliziert, geh&ouml;rt man zu den Gl&uuml;cklichen. Ist es unm&ouml;glich, ist das ziemlich ungl&uuml;cklich.</p> <p>Abhilfe schafft es, einen SSH-Server in's Initramfs zu installieren. Unter Debian kommt dazu der minimalistische SSH-Server "Dropbear" zum Einsatz. Da der Kernel und das Initramfs ohnehin unverschl&uuml;sselt irgendwo liegen m&uuml;ssen, kann dann der SSH-Server automatisch starten und einen Zugang zur Passworteingabe bieten. Unter Debian ist die Installation denkbar einfach:</p> <pre>apt-get install openssh-server dropbear busybox<br /></pre> <p>Anschlie&szlig;end muss man noch die SSH-Schl&uuml;ssel kopieren, mit denen man dann sp&auml;ter passwortlosen root-Zugang hat:</p> <pre>scp root@[Server-IP/-Hostname]:/etc/initramfs-tools/root/.ssh/id_rsa id_rsa.initramfs</pre> <p>Die Schl&uuml;sseldatei sollte man sehr gut aufheben, denn sie wird einerseits ben&ouml;tigt, um das Passwort aus der Ferne einzugeben, und andererseits erlaubt sie eben diesen Zugriff auf die Maschine; es w&auml;re also sehr ung&uuml;nstig, wenn der Schl&uuml;ssel einem Dritten in die H&auml;nde fallen w&uuml;rde. Hier wird angenommen, dass der Rechner seine IP-Adresse automatisch &uuml;ber DHCP aus dem Netzwerk bezieht. Ist dies nicht der Fall, ist zus&auml;tzlich eine h&auml;ndische Konfiguration notwendig, siehe dazu den untenstehenden Link.</p> <p>Jetzt den Server neustarten und schon kann man sich via SSH einloggen. Zumindest, wenn man die IP-Adresse des Hosts wei&szlig;. Leider kann sich die Adressverteilung via DHCP im lokalen Netz immer mal wieder ver&auml;ndern, sodass Maschinen regelm&auml;&szlig;ig neue Adressen zugewiesen bekommen. Mit folgendem Snippet kann man sich in einem herk&ouml;mmlichen Heimnetz mit IP-Adressen im Bereich 192.168.178.0/24 die IP-Adressen anzeigen, die auf Pings reagieren:</p> <pre>nmap -sP 192.168.178.0/24 | grep 192.168.178<br /></pre> <p>Mit ein bisschen Knobeln und Ausprobieren sollte man den Rechner schnell finden, sodass man sich mit dem folgenden Befehl einloggen kann:</p> <pre>ssh -o "UserKnownHostsFile=known_hosts.initramfs" -i "id_rsa.initramfs" root@[Server-IP/-Hostname]<br /></pre> <p>Dabei wird der Fingerprint des Dropbear SSH Servers in der Datei "known_hosts.initramfs" abgelegt und der SSH-Schl&uuml;ssel f&uuml;r den Login aus der Datei "id_rsa.initramfs" geladen, die man sich zuvor von dem entsprechenden Rechner kopiert hat.</p> <p>Nun nurnoch das Passwort eingeben und damit die Festplatten entsperren:</p> <pre>echo -ne '[Passwort]' &gt; /lib/cryptsetup/passfifo; exit</pre> <p>Hier wird davon ausgegangen, dass beim Booten nur nach einem Passwort gefragt wird. Die &uuml;brigen Schl&uuml;ssel f&uuml;r die Festplattenverschl&uuml;sselung k&ouml;nnte man in der einen Partition, deren Passwort zu Beginn abgefragt wird, hinterlegen. M&ouml;glicherweise kann man die &uuml;brigen Passw&ouml;rter auch noch im weiteren Verlauf des Bootprozesses auf die gleiche Art und Weise eingeben.</p> <p>Als wichtig hat sich erwiesen, nach dem Eingeben des Passworts den SSH-Server auf direktem Wege mit "exit" zu verlassen. Andernfalls l&auml;sst sich das Initramfs nicht aush&auml;ngen und der Boot-Vorgang kann in's Schlingern kommen. Die Maschine sollte nach erfolgreicher Passwort-Eingabe den Boot-Vorgang fortsetzen. Dropbear wird dazu heruntergefahren und nach einer kurzen Zeit sollte sich der Standard-OpenSSH-Server auf dem gleichen Port wieder melden. Das System kann nun wie gewohnt verwendet werden.</p> <p>(basierend auf: <a href="http://blog.neutrino.es/2011/unlocking-a-luks-encrypted-root-partition-remotely-via-ssh/" target="_blank">http://blog.neutrino.es/2011/unlocking-a-luks-encrypted-root-partition-remotely-via-ssh/</a>)</p> Wed, 01 Feb 2012 18:28:33 +0100http://www.joachim-neu.de/post/129/ssh-im-initramfs/TunesViewer http://www.joachim-neu.de/post/128/tunesviewer/<p>An vielen Universit&auml;ten werden immer h&auml;ufiger Vorlesungen und andere Veranstaltungen aufgezeichnet, um sie sp&auml;ter Studenten und Interessierten &uuml;ber das Internet zur Verf&uuml;gung zu stellen. Leider kommt dazu nicht selten, wohl wegen der unkomplizierten Handhabe, iTunes U, ein spezieller Bereich des iTunes Shops, zum Einsatz. Jeder, der iTunes hat, kann sich dann die Vorlesungen problemlos herunterladen -- wer kein iTunes hat ist wohl oder &uuml;bel gezwungen, sich eines zuzulegen. Wer sich iTunes nicht einfach so zulegen kann oder will, bleibt au&szlig;envor.</p> <p>Nat&uuml;rlich w&auml;re es w&uuml;nschenswert, wenn Universit&auml;ten ihre Inhalte in einem freien Format gut und einfach zug&auml;nglich beispielsweise via RSS-Feed und/oder BitTorrent verbreiten w&uuml;rden. Wer dennoch nicht warten will, bis sich diese Einsicht durchgesetzt hat, kann unter Linux das Programm "TunesViewer" von SourceForge herunterladen (Google hilft beim Auffinden), installieren und dann nach Lust und Laune das Vortragsangebot durchst&ouml;bern. "TunesViewer" kommt sogar mit Browser-Integration -- stolpert man einmal &uuml;ber einen iTunes U Link im Web, kann man die Informationen auf diese Weise schnell und unkompliziert abrufen.</p> Sat, 21 Jan 2012 14:19:56 +0100http://www.joachim-neu.de/post/128/tunesviewer/nautilus STRG+L http://www.joachim-neu.de/post/127/nautilus-strgl/<p>Eine weitere Konfigurationsm&ouml;glichkeit, die mit GNOME 3 unter Ubuntu 11.10 wohl endg&uuml;ltig "wegrationalisiert" wurde (es gibt weder eine Option dazu im Benutzerinterface, noch kann man wie fr&uuml;her direkt in der gconf den entsprechenden Wert anpassen), ist, ausw&auml;hlen zu k&ouml;nnen, ob man die Adressleiste im Dateibrowser Nautilus in Button-Form oder als Text-Eingabefeld haben m&ouml;chte -- Standardeinstellung ist die Button-Form und daran &auml;ndert man nun auch nichts mehr.</p> <p>Das macht es schwierig, Orte zu erreichen, die nicht im Verzeichnisbaum repr&auml;sentiert sind -- beispielsweise (S)FTP-Freigaben. Fr&uuml;her konnte man deren Pfad direkt in die Adresszeile eingeben. Und nun? Gl&uuml;cklicherweise gibt es das sehr versteckte Feature, &uuml;ber STRG+L die Button-Adressleiste vor&uuml;bergehend in eine Texteingabe-Adressleiste umzuwandeln. Dort kann man dann wie gewohnt die URL eingeben und die entsprechende Ressource wird ge&ouml;ffnet.</p> <p>Schade, dass auch dieser Konfigurationsparameter geopfert wurde -- zumal die Funktionalit&auml;t offensichtlich noch implementiert ist (und hoffentlich auch weiterhin implementiert bleibt, sonst ist Nautilus als Standard-Dateibrowser quasi unbrauchbar/unbenutzbar, sobald man mehr als seine lokalen Dateien verwalten will). Ob der Trend zu weniger Benutzer-Freiheit positiv ist, darf stark bezweifelt werden.</p> Sat, 08 Oct 2011 18:11:08 +0200http://www.joachim-neu.de/post/127/nautilus-strgl/gnome-tweak-tool http://www.joachim-neu.de/post/126/gnome-tweak-tool/<p>Nachdem GNOME 3 / Ubuntu 11.10 weiterhin sukzessiven Abbau der Konfigurationsoptionen betreibt und man so einige Stellschrauben in den Systemeinstellungen nichtmehr findet, muss man sich alternativer Tools bedienen, die direkt auf die zugrundeliegende (neuerdings mit GNOME 3 dconf-/gsettings-basierte Konfiguration) Einfluss nehmen. Das Tool "gnome-tweak-tool" gibt einige der verlorengegangenen Hebel und Kn&ouml;pfe zur&uuml;ck und kann &uuml;ber die Ubuntu Repositories installiert werden. Auf diese Weise lassen sich beispielsweise Detailparameter des Schrift-Renderings wieder einstellen.</p> Wed, 05 Oct 2011 14:06:16 +0200http://www.joachim-neu.de/post/126/gnome-tweak-tool/Firefox Session Restore http://www.joachim-neu.de/post/124/firefox-sitzungswiederherstellung/<p>Mit den neuerlichen Firefox Versionen (zumindest seit Version 3 oder so ;)) wurde die Sitzungswiederherstellung etwas angepasst. Um automatisch beim Start von Firefox die alte Sitzung mit ihren ge&ouml;ffneten Tabs wiederherzustellen, w&auml;hlt man unter "Bearbeiten" &gt; "Einstellungen" &gt; "Allgemein" bei "Wenn Firefox gestartet wird" die Option "Fenster und Tabs der letzten Sitzung anzeigen".</p> <p>Wenn man unter "Bearbeiten" &gt; "Einstellungen" &gt; "Datenschutz" bei "Firefox wird eine Chronik" "nach benutzerdefinierten Einstellungen anlegen" ausgew&auml;hlt hat, geht das jedoch nur, wenn man unter "Bearbeiten" &gt; "Einstellungen" &gt; "Datenschutz" &gt; "Die Chronik l&ouml;schen, wenn Firefox geschlossen wird" &gt; "Einstellungen..." das H&auml;kchen bei "Besuchte Seiten" entfernt. Hat man den Haken bei "Bearbeiten" &gt; "Einstellungen" &gt; "Datenschutz" &gt; "Besuchte Seiten speichern" nicht gesetzt, erreicht man damit, was man vermutlich will: Firefox l&ouml;scht beim Beenden die Chronik (mit etwaigen gespeicherten Passw&ouml;rtern, Formularinhalten, Cookies, Downloads, ...), speichert keine Chronik &uuml;ber die besuchten Seiten, kann aber trotzdem die beim letzten Mal ge&ouml;ffneten Tabs wiederherstellen.</p> <p>Setzt man die H&auml;kchen dagegen falsch, z.B. man l&ouml;scht die besuchten Seiten immer beim Beenden von Firefox, so ist Firefox nicht imstande, die alte Sitzung wiederherzustellen.</p> Mon, 03 Oct 2011 15:51:50 +0200http://www.joachim-neu.de/post/124/firefox-sitzungswiederherstellung/hamster-indicator http://www.joachim-neu.de/post/125/hamster-indicator/<p>Mit dem Wechsel von Ubuntu 10.04 zu Ubuntu 11.10 ging auch ein Wechsel der Standard-Desktop-Oberfl&auml;che einher: Statt GNOME Desktop und GNOME Panels (oder der GNOME 3 Neuerung GNOME Shell) ziert jetzt eine Leiste genannt Unity den oberen Bildschirmrand.</p> <p>Das bedeutet auch, dass die bisher verwendeten GNOME Panel Applets nicht weiter funktionieren, sondern auf Unity portiert werden m&uuml;ssen. Gl&uuml;cklicherweise ist das mit einem mir sehr wichtigen Applet, dem Hamster Applet zur Zeiterfassung, bereits geschehen. Das hat zwar noch nicht den Weg in die Standard-Repositories gefunden, l&auml;sst sich aber mit ein paar Handgriffen in der Konsole schnell installieren:</p> <pre class="linux-code"><code>sudo add-apt-repository ppa:albertomilone/hamster-indicator sudo apt-get update sudo apt-get install hamster-indicator</code></pre> <p>Jetzt noch ein Kommando, dass in der Leiste auch die bereits mit der momentanen T&auml;tigkeit verstrichene Zeit anzeigt:</p> <pre class="linux-code"><code>gconftool-2 --set "/apps/hamster-indicator/show_label" --type bool "true"</code></pre> <p>Fehlt nurnoch, dass "hamster-indicator" automatisch nach dem Login startet. Dazu legt man in der Konfiguration einen entsprechenden Start-Eintrag an. Einfach in Unity nach "Startprogramme" suchen und dort einen Eintrag mit Kommando "hamster-indicator" hinzuf&uuml;gen. Fertig!</p> <p><a href="http://www.webupd8.org/2011/07/install-hamster-indicator-time-tracking.html" target="_blank">http://www.webupd8.org/2011/07/install-hamster-indicator-time-tracking.html</a></p> Tue, 04 Oct 2011 03:32:52 +0200http://www.joachim-neu.de/post/125/hamster-indicator/exiftran http://www.joachim-neu.de/post/123/exiftran/<p>Fr&uuml;her war es eine einfache Angelegenheit mit Quer- und Hochformatfotos bei Digitalkameras: Die Kamera hatte keine Ahnung was ich tue und hat stur die Pixel vom Fotosensor auf die SD-Karte geschaufelt, zumeist unter der Annahme, ich w&uuml;rde ein Querformatfoto aufnehmen. War das Foto aber im Hochformat gew&uuml;nscht, musste ich die Fotos hinterher h&auml;ndisch mit einem Grafikprogramm drehen, das wiederum die Pixel an die intendierte Stelle geschoben hat.</p> <p>Heute hat sich daran im Prinzip wenig ge&auml;ndert -- die Fotos werden nach wie vor im Querformat abgelegt. Aber immer mehr Kameras verf&uuml;gen &uuml;ber einen Orientierungssensor, der ihnen erlaubt, zu erkennen, wie das Bild gedreht werden muss, um nicht auf dem Kopf zu stehen. Diese Information legen sie dann in den sogenannten EXIF-Metadaten des JPEG-Bildes ab. Manche Programme drehen das Bild automatisch zum Anzeigen. Andere ignorieren die EXIF-Angaben: Das Bild ist dann unter Umst&auml;nden auf dem Kopf oder auf der Seite liegend, so wie die tats&auml;chlichen Pixel in dem JPEG-File.</p> <p>Aus diesem Grund will ich mich nicht auf die EXIF-Metadaten verlassen und die Pixel an sich lieber richtig drehen. Unter Linux gibt es dazu das komfortable Programm "exiftran". Unter Ubuntu einfach aus den Repos installieren und &uuml;ber alle einzulesenden Dateien laufen lassen: (Vor dem ersten Testlauf Sicherungskopie der Fotos nicht vergessen!)</p> <pre>sudo apt-get install exiftran<br />exiftran -ai *.jpg</pre> <p>Weitere Details verr&auml;t die "man"-Page.</p> <p>Warum bauen die Hersteller eigentlich keine Kameras die die Bilder gleich drehen, wenn sie doch wissen, wo oben und unten ist? Dar&uuml;ber kann ich nur spekulieren. Ich vermute es br&auml;uchte einiges mehr an (Speicher- und Rechen-)ressourcen in den verbauten hochoptimierten Chips.</p> Thu, 14 Jul 2011 00:10:14 +0200http://www.joachim-neu.de/post/123/exiftran/dhclient http://www.joachim-neu.de/post/122/dhclient/<p>DHCP wird in den meisten (zumindest kleinen SoHo-) Netzwerken verwendet nicht nur um IP-Adressen sondern auch um weitere Konfigurationsparameter (DNS-Server, Gateways, ...) zu verteilen. Unter Ubuntu Linux kommt dabei unter der Haube "dhclient" zum Einsatz, unabh&auml;ngig davon, ob man seine Netzwerkverbindungen im Retro-Style &uuml;ber die Datei "/etc/network/interfaces" oder lieber modern (aber etwas weniger konsolenfreundlich) &uuml;ber den NetworkManager konfiguriert.</p> <p>M&ouml;chte man auf "dhclient" Einfluss nehmen, kann man das &uuml;ber die Konfigurationsdatei "/etc/dhcp3/dhclient.conf" tun. Hier kann man beispielsweise den DNS-Server dauerhaft &uuml;berschreiben. "dhclient" wird dann nichtmehr die vom Netzwerk angebotenen sondern den speziell angegebenen DNS-Server verwenden. So spart man sich, die Datei "/etc/resolv.conf" nach jedem Neustart einer Netzwerkverbindung erneut anzupassen. Mit folgender Zeile &uuml;berschreibt man den DNS-Server:</p> <pre>supersede domain-name-servers [IP-Adresse];<br /></pre> Mon, 11 Jul 2011 05:58:48 +0200http://www.joachim-neu.de/post/122/dhclient/SMTP filtered http://www.joachim-neu.de/post/121/smtp-filtered/<p>Bei der Spam-Bek&auml;mpfung gehen manche (offenbar sehr verzweifelte) Internetprovider ungew&ouml;hnliche und abenteuerliche Wege. &Uuml;ber einen davon bin ich gerade gestolpert: Um dem horrenden Spam-Aufkommen von Malware-infizierten Home-Computern Herr zu werden, blockt beispielsweise der kanadische Internetanbieter Shaw bei Heim-DSL-Anschl&uuml;ssen kurzerhand allen Traffic auf TCP Port 25, der nicht zu den hauseigenen SMTP-Mailservern geht. Folge: Eigene oder SMTP-Anbieter von Drittanbietern k&ouml;nnen nichtmehr verwendet werden: <a href="http://www.theblog.ca/shaw-telus-smtp" target="_blank">http://www.theblog.ca/shaw-telus-smtp</a> Dass Kunden dagegen nicht Sturm laufen deutet wohl darauf hin, dass die meisten Privatkunden ihre Shaw-eMail-Adresse mit den zugeh&ouml;rigen Mailservern verwenden.</p> <p>Wie damit umgehen? Im Wesentlichen gibt es drei Wege. Der erste ist nur f&uuml;r den Besitzer des Anschlusses bzw. permanente Mitbewohner eine Option: Die SMTP-Server von Shaw verwenden.</p> <p>Wer einen eigenen SMTP-Server betreibt, kann ihn auf einen anderen Port konfigurieren. H&auml;ufig verwenden SMTP Server neben TCP 25 auch TCP 465 und/oder weitere Alternativports. Jedoch gelang es mir nicht, Evolution so zu konfigurieren, dass es diese Alternativports auch verwendet -- was ger&uuml;chteweise aber m&ouml;glich sein soll.</p> <p>Die m&ouml;glicherweise einfachste Option (insbesondere wenn die Behinderung nur vor&uuml;bergehend ist, z.B. weil man sich auf einer Reise befindet und ohnehin bald einen anderen Internetanschluss verwenden wird) besteht in der Verwendung eines Webmailers. Viele Drittanbieter (wie web.de und GMX) bieten dies ohnehin an, Betreibern von eigenen Web- und Mail-Servern steht mit Roundcube (<a href="http://www.roundcube.net/" target="_blank">http://www.roundcube.net/</a>) eine gute OpenSource Software basierend auf PHP zur Verf&uuml;gung.</p> Sat, 09 Jul 2011 08:12:18 +0200http://www.joachim-neu.de/post/121/smtp-filtered/USB Programmer http://www.joachim-neu.de/post/120/usb-programmer/<p>Heute ist es mir gelungen, meine seit einiger Zeit unbrauchbare (weil beim RF Flashen abgest&uuml;rzt und deshalb fehlerhaft geflasht) eZ430-Chronos mit dem mitgelieferten USB Programmer wiederzubeleben. M&ouml;glich war das mittels "mspdebug", einem Programm auf dessen Installation ich in einem gesonderten Post eingehe.</p> <p>Startet man es mittels dem folgenden Aufruf</p> <pre>mspdebug rf2500</pre> <p>wenn der USB Programmer am PC angeschlossen und die Uhr mit dem Programmer verbunden ist, bekommt man nach erfolgreicher Initialisation eine interaktive Konsole, wo man mit dem Befehl "prog" eine der mitgelieferten eZ430-Chronos Firmwares in das Ger&auml;t laden kann. Jetzt das Ger&auml;t noch abstecken und mit Strom versorgen und schon bootet die Uhr wieder. Bis zum n&auml;chsten Funk-Flash-Versuch, der schief geht. ;)</p> Sun, 15 May 2011 03:10:16 +0200http://www.joachim-neu.de/post/120/usb-programmer/xdotool http://www.joachim-neu.de/post/119/xdotool/<p>H&auml;ufig finde ich mich in der Situation wieder, dass ich gerne GUI-Programme &uuml;ber ein Script fernsteuern und dazu oder aus anderen Gr&uuml;nden GUI-Eingaben/-Events von der Konsole oder aus Python heraus abfeuern w&uuml;rde. Dazu gibt es das sehr komfortable Programm "xdotool", das eine sehr umfangreiche Sammlung von Funktionen zum Abfragen von Informationen aus dem X11-System und zur Interaktion damit zur Verf&uuml;gung stellt.</p> <p>Die Installation geht wie unter Ubuntu gewohnt ganz einfach via APT:</p> <pre>sudo apt-get install xdotool</pre> <p>Die Programm-Website verschafft einen ersten &Uuml;berblick:</p> <p><a href="http://www.semicomplete.com/projects/xdotool/" target="_blank">http://www.semicomplete.com/projects/xdotool/</a></p> <p>Beim allt&auml;glichen Einsatz hilft nat&uuml;rlich die Man-Page weiter:</p> <pre>man xdotool<br /></pre> Sat, 14 May 2011 17:00:55 +0200http://www.joachim-neu.de/post/119/xdotool/MAC Spoofing http://www.joachim-neu.de/post/118/mac-spoofing/<p>So mancher vertraut bei der Sicherung seines WLAN der Verschl&uuml;sselung mit einem hinreichend langen Passwort alleine nicht, sondern schw&ouml;rt auf eine Whitelist f&uuml;r MAC-Adressen. Eine MAC-Adresse ist die physikalische Kennung, die (theoretisch) in jeder Netzwerkschnittstelle fest eingebaut ist und weltweit nur einmal vergeben wird. Damit w&auml;re es theoretisch m&ouml;glich, den Zugang zum WLAN nur auf bekannte Netzwerk-Ger&auml;te einzuschr&auml;nken, die man anhand ihrer MAC-Adressen identifiziert.</p> <p>Ganz so gut funktioniert das in der Praxis nicht, da sich MAC-Adressen meist &uuml;ber den Treiber von der Software &auml;ndern lassen. Aus diesem Grund sind MAC-Whitelists mehr ein kleines nerviges Hindernis als ein wirklich wirksamer Schutz.</p> <p>Problematisch werden MAC-Adressen-Filter, wenn gewollter Besuch ins heimische Netz kommt. Es reicht dann nichtmehr, den Schl&uuml;ssel zum WLAN weiterzugeben, sondern f&uuml;r jedes Ger&auml;t das Zugriff zum Netzwerk erhalten soll muss dessen MAC-Adresse h&auml;ndisch im Router der Whitelist hinzugef&uuml;gt werden. Das ist unn&ouml;tig aufwendig und bisweilen (wenn ein Dritter das Netz konfiguriert hat) fehlt dem Betreiber des Netzwerks das Wissen dazu.</p> <p>In diesem Fall kann es n&ouml;tig oder deutlich unkomplizierter sein, die MAC-Whitelist durch sogenanntes MAC-Adressen Spoofing zu umgehen. Die Idee dabei ist, wenn man den Verschl&uuml;sselungs-Key des Netzwerks besitzt, die MAC-Adresse eines zugelassenen Ger&auml;ts in einem anderen Ger&auml;t zu &uuml;bernehmen und den Router so auszutricksen.</p> <p>Dazu findet man zuerst von einem im Netzwerk befindlichen Ger&auml;t die MAC-Adresse heraus. Dies geht, indem man Netzwerk-Verkehr mitschneidet oder direkt an einem solchen Ger&auml;t in den Einstellungen nachliest.</p> <p>Anschlie&szlig;end muss man die MAC-Adresse in dem neuen Ger&auml;t &uuml;bernehmen. Dies geht unter Linux ganz einfach mit dem folgenden Kommando:</p> <pre>sudo ifconfig [Interface] down<br />sudo ifconfig [Interface] hw ether [MAC-Adresse]<br />sudo ifconfig [Interface] up<br /></pre> <p>Nun hat die eigene Netzwerkschnittstelle die "geklaute" MAC-Adresse. Damit beim Aushandeln der Verschl&uuml;sselung (via WPA) diese &Auml;nderung auch &uuml;bernommen wird, muss der WPA-Supplicant-Daemon, der zumindest bei aktuelleren Versionen der Ubuntu Distribution im Hintergrund seinen Dienst verrichtet, neu gestartet werden:</p> <pre>sudo killall wpa_supplicant<br /></pre> <p>Ber&uuml;cksichtigt man diesen Schritt nicht, kann man im Syslog nachvollziehen, dass die Anmeldung am Netzwerk eigentlich vielversprechend beginnt, aber bei 4-Way-Handshake pl&ouml;tzlich abbricht. Urs&auml;chlich daf&uuml;r ist, dass der WPA-Supplicant beim 4-Way-Handshake &uuml;ber die MAC-Adressen von Access Point und Client versucht, die Verschl&uuml;sselung auszuhandeln. Wird der WPA-Supplicant nicht neu gestartet, verwendet er bei der Aushandlung die alte MAC-Adresse w&auml;hrend der Access Point die neue MAC-Adresse sieht; das Aushandeln scheitert, die Verbindung kommt nicht zustande.</p> <p>Hat man die MAC-Adresse erfolgreich ge&auml;ndert und den WPA-Supplicant neu gestartet, kann man wie gewohnt &uuml;ber das NetworkManager Applet die Verbindung zum gew&uuml;nschten WLAN aufbauen -- vorausgesetzt man kennt den Schl&uuml;ssel f&uuml;r die Verschl&uuml;sselung.</p> Sun, 24 Apr 2011 23:28:24 +0200http://www.joachim-neu.de/post/118/mac-spoofing/Prism2 http://www.joachim-neu.de/post/4/prism2/<p>Bis gerade eben hatte ich meine Wireless LAN Verbindung unter Linux mit "ndiswrapper" betrieben. Dieser verwendet Windows-Treiber unter Linux.</p> <p>Da mir diese L&ouml;sung unpassend schien und mich au&szlig;erdem die Information erreichte, dass meine Netzwerkkarte (NetGear MA111 WiFi [v1], USB-ID 0846:4110) auch mit Linux-Treibern funktionieren w&uuml;rde, entschied ich mich, dies auszuprobieren.</p> <p>Aus verschiedenen Anleitungen erfuhr ich, dass dazu das Paket "linux-wlan-ng" n&ouml;tig ist. Dies installierte ich mit dem folgenden Konsolen-Befehl:</p> <pre>sudo apt-get install linux-wlan-ng*</pre> <p>Leider war hier das notwendige Kernel-Modul "prism2_usb" nicht vorhanden. Deshalb entschied' ich, es selber zu bauen. Mit den folgenden Befehlen downloadete ich den Quelltext aus dem Repository:</p> <pre>cd ~/Desktop<br />mkdir linux-wlan-ng<br />cd linux-wlan-ng<br />apt-get source linux-wlan-ng<br />cd linux-wlan-ng-0.2.5+dfsg+prism2dl</pre> <p>Jetzt startete ich die Konfiguration mit diesem Befehl:</p> <pre>make config</pre> <p>Ich beantwortete die Fragen, welche Module ich bauen wolle (erst, als ich alle au&szlig;er dem USB-Modul mit "n" abw&auml;hlte und das USB-Modul mit "y" aktivierte, funktionierte der Make-Prozess!), bei allen anderen Fragen &uuml;bernahm ich die Default-Vorschl&auml;ge.</p> <p>Dann startete ich den Make-Prozess mit diesem Befehl:</p> <pre>make all</pre> <p>Einige Sekunden sp&auml;ter waren alle Treiber gebaut, die ich mit dieser Eingabe installierte:</p> <pre>sudo make install</pre> <p>Anschlie&szlig;end entfernte ich den "ndiswrapper" mit dem folgenden Befehl aus meinem Kernel:</p> <pre>sudo rmmod ndiswrapper</pre> <p>Das "prism2_usb"-Modul lud ich mit dieser Eingabe:</p> <pre>sudo modprobe prism2_usb prism2_doreset=1</pre> <p>Die WLAN-Verbindung konfigurierte ich mit den folgenen Zeilen:</p> <pre>sudo wlanctl-ng wlan0 lnxreq_ifstate ifstate=enable<br />sudo wlanctl-ng wlan0 lnxreq_autojoin ssid=[SSID des WLAN Netzwerks] authtype=sharedkey</pre> <p>Nach diesen beiden Befehlen war mein Funknetzwerk wieder in vollem Umfang einsatzbereit:</p> <pre>sudo ifdown wlan0<br />sudo ifup wlan0</pre> <p>Alle anderen Einstellungsparameter (DHCP, ...) sind bei mir durch Eintr&auml;ge in der Datei /etc/network/interfaces festgelegt.</p> <p>Um sicherzustellen, dass das Modul "prism2_usb" auch tats&auml;chlich beim Hochfahren geladen wird, trug ich es an Stelle des "ndiswrappers" in die Datei /etc/modules ein.</p> <h3>Update</h3> <p>F&uuml;r Ubuntu Hardy wurde das Paket linux-wlan-ng auf eine Version geupdatet, deren USB-Modul sich nichtmehr mit f&uuml;r den Standard Hardy Kernel kompilieren l&auml;sst, zumindest bei mir.</p> <p>Stattdessen habe ich die Ger&auml;te-Firmwares neu gebaut, installiert und dann meinen USB-Stecker aus und wieder ein gesteckt:</p> <pre>sudo apt-get install debhelper fakeroot make<br />sudo apt-get install linux-wlan-ng-firmware<br />linux-wlan-ng-build-firmware-deb<br />sudo dpkg -i linux-wlan-ng-firmware-files*.deb</pre> <h3>Update 2</h3> <p>Auch unter Debian Lenny l&auml;sst sich der Quellcode des Paketes linux-wlan-ng nichtmehr kompilieren. Hier ist auch keine vorkompilierte Version des Modules prism2_usb mitgeliefert. Man kann jedoch das Kernelmodul auf Basis der SVN-Version des Prism2-Treibers bauen.</p> <p>Dazu l&auml;d man den Quellcode des Prism2-Treibers herunter:</p> <pre>svn co svn://svn.shaftnet.org/linux-wlan-ng/trunk linux-wlan-ng</pre> <p>Anschlie&szlig;end verf&auml;hrt man damit wie mit dem Quellcode des Paketes oben beschrieben.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/4/prism2/NAT-Routing http://www.joachim-neu.de/post/13/nat-routing/<p>In manchen F&auml;llen (z.B. wenn man nur eine Internetleitung hat) ist es n&ouml;tig, den Verkehr mehrerer Rechner &uuml;ber einen zentralen Rechner zu leiten, der die Abfragen ins Internet schickt und die Antworten wieder auf die wartenden PCs verteilt.</p> <p>Dieses Vorgehen nennt man "NAT-Routing". Es wird z.B. in allen DSL-Routern angewandt. Unter Linux kann man ganz einfach NAT-Routing machen. Dazu bedarf es nur zwei Befehle:</p> <pre>su<br />iptables -t nat -A POSTROUTING -o [ausgehende Netzwerkschnittstelle] -j SNAT --to-source [eigene IP auf der ausgehenden Netzwerkschnittstelle]<br />echo 1 &gt; /proc/sys/net/ipv4/ip_forward</pre> <p>Schon ist NAT-Routing auf dem Rechner aktiviert und der Rechner sendet alle einkommenden Pakete &uuml;ber die vorgegebene Schnittstelle weiter und verteilt die zur&uuml;ckkommenden Antworten auf die Absender.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/13/nat-routing/VPN-Tunnel http://www.joachim-neu.de/post/14/vpn-tunnel/<p>Wer, wie ich, h&auml;ufiger mobil unterwegs ist und den Laptop dabei hat, kennt sicher das unwohle Gef&uuml;hl, das man hat, wenn man gerade &uuml;ber einen &ouml;ffentlichen WLAN-Hotspot surft und dabei denkt, was der Tischnachbar wohl grade von einem mitlie&szlig;t.</p> <p>Das muss nicht sein. Wer einen eigenen kleinen Server als VPN-Server betreibt und darauf NAT-Routing aktiviert hat, kann sehr einfach seinen kompletten Traffic durch dieses VPN schleusen und somit f&uuml;r andere WLAN-Clients unlesbar machen.</p> <p>Vorausgesetzt wird hierzu ein intaktes VPN, in dem der VPN-Server zus&auml;tzlich NAT-Router ist.</p> <p>Zuerst leiten wir s&auml;mtlichen Traffic per-default durch das verschl&uuml;sselte virtuelle VPN-Interface:</p> <pre>route add -net default dev [Interface des VPN]</pre> <p>Dann muss man nurnoch daf&uuml;r sorgen, dass der VPN-Verkehr nicht durch "sich selbst", also nicht &uuml;ber den default-Weg durch das zugeh&ouml;rige virtuelle Interface geschleust wird.</p> <pre>route add -host [IP des VPN-Servers] gw [IP des WLAN-Hotspots] dev [WLAN-Interface]</pre> <p>Fertig!</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/14/vpn-tunnel/ethtool http://www.joachim-neu.de/post/21/ethtool/<p>Herk&ouml;mmliche Netzwerkeinstellungen erledigt unter Linux das Konsolenprogramm "ifconfig". Damit lassen sich beliebig IP-Adressen, Netzmasken, Router, Gateways und vieles mehr setzen.</p> <p>Wer jedoch weitere Einstellungsparameter direkt an der Netzwerkkarte manipulieren will, sollte zu dem Tool "ethtool" greifen. Mit ihm kann man neben der &Uuml;bertragungsgeschwindigkeit und dem &Uuml;bertragungsmodus auch eine gro&szlig;e Menge anderer Optionen einstellen.</p> <p>Wer beispielsweise gezwungen ist, seine Netzwerkkarte (im Beispiel "eth0") auf 10MBit/s Full Duplex Mode zu drosseln, weil die Leitungen keine 100MBit/s hergeben, kann sich dazu des Programmes "ethtool" bedienen:</p> <pre>sudo ethtool -s eth0 duplex full speed 10 autoneg off</pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/21/ethtool/IPv6/6to4 http://www.joachim-neu.de/post/89/ipv66to4/<p>IPv6, die "n&auml;chste Generation" Internet, ist zwar schon seit Jahren bekannt und seit l&auml;ngerem besteht auch die n&ouml;tige Softwareunterst&uuml;tzung, und dennoch hat es sich noch nicht &uuml;berall durchgesetzt. Zu gro&szlig; sind die H&uuml;rden und zu kompliziert der nahtlose &Uuml;bergang zwischen IPv4 und IPv6.</p> <p>Wer dennoch einmal an der "neuen Technologie" schnuppern m&ouml;chte, k&ouml;nnte sich f&uuml;r 6to4-Tunnel interessieren. Mit ihnen kann man durch ein IPv4-Netz, in dem man sich befindet, IPv6-Pakete schleusen und zu einem Einstiegspunkt in das IPv6-f&auml;hige Netz transportieren. Als IPv6-Adresse wird hier die zur eigenen IPv4-Adresse geh&ouml;rige IP-Adresse verwendet. Was am heimischen DSL-Anschluss nicht funktioniert klappt auf einem Server im Internet problemlos.</p> <p>Auf der folgenden Seite kann man seine IPv4-Adresse eingeben und erh&auml;lt dann ein paar Zeilen Konsolen-Befehle, mit denen man einen IPv6-Tunnel einrichten kann:</p> <p>http://6to4.64x.org/e107_plugins/nwtools/64.php</p> <p>Dabei wird das Kommandozeilenprogramm "ip" verwendet, dass unter Debian/Ubuntu im Paket "iproute" verpackt ist und mit dem folgenden Befehl installiert werden kann:</p> <pre>sudo apt-get install iproute<br /></pre> Sat, 16 May 2009 19:08:55 +0200http://www.joachim-neu.de/post/89/ipv66to4/mtr http://www.joachim-neu.de/post/93/mtr/<p>Eine Mischung aus "traceroute" und "ping" ist das Kommandozeilen-Tool "mtr". Mit ihm kann man den Weg von Daten-Paketen durch ein Netzwerk zu einem Zielrechner verfolgen und die beteiligten Router, die Laufzeit, den Paketverlust und einiges mehr herausfinden. Beim Programmstart &uuml;bergibt man als Parameter den Zielhost:</p> <pre>mtr web.de</pre> <p>Anschlie&szlig;end sieht man in einer sich immer wieder automatisch aktualisierenden &Uuml;bersicht alle relevanten Informationen. Sollte das Programm noch nicht auf dem Rechner installiert sein, kann man es unter Debian-basierten Distributionen aus dem gleichnamigen Paket installieren:</p> <pre>sudo apt-get install mtr<br /></pre> Sun, 31 May 2009 10:49:49 +0200http://www.joachim-neu.de/post/93/mtr/dnsutils/dig http://www.joachim-neu.de/post/90/dnsutilsdig/<p>Das Konsolentool "dig" zum genaueren Inspizieren des DNS ist Bestandteil des Debian/Ubuntu-Paketes "dnsutils" und kann deshalb so installiert werden:</p> <pre>sudo apt-get install dnsutils</pre> <p>Mit "dig" lassen sich nicht nur einfache DNS-Abfragen durchf&uuml;hren:</p> <pre>dig example.com</pre> <p>Man kann auch gezielt nach einem bestimmten Eintrag fragen:</p> <pre>dig web.de MX</pre> <p>Oder bei der Befragung einen speziellen DNS-Server verwenden:</p> <pre>dig web.de MX @A.NIC.de</pre> <p>Auch ein Reverse DNS-Lookup ist m&ouml;glich:</p> <pre>dig -x 217.72.199.153<br /></pre> <p>So lassen sich mit "dig" DNS-Umstellungen ohne Leeren des DNS-Caches oder gar abwarten der TLL &uuml;berwachen.</p> Sat, 16 May 2009 19:26:16 +0200http://www.joachim-neu.de/post/90/dnsutilsdig/HUAWEI E161 http://www.joachim-neu.de/post/110/huawei-e161/<p>Heute morgen lieferte FONIC mir einen HUAWEI E161 Surfstick und eine dazugeh&ouml;rige SIM-Karte. Ich aktivierte die SIM-Karte online und versuchte einige Zeit sp&auml;ter, die Hardware in Betrieb zu nehmen.</p> <p>Das funktionierte unter Ubuntu 9.10 auf Anhieb einwandfrei. Das Ger&auml;t wurde sowohl als Massenspeicher (f&uuml;r die eingesteckte microSD-Karte und die Programmdaten des Betreibers) alsauch als UMTS-Modem erkannt. &Uuml;ber den NetworkManager konnte ich mit einem Assistenten schnell und bequem eine neue GSM-Netzwerkverbindung einrichten. Nach wenigen Klicks stand der Internetzugang.</p> <p>Unter Xubuntu 10.04 verlief das ganze nicht ganz so reibungslos. Der Stick wurde nicht als UMTS-Modem sondern nur als Datenspeicher erkannt. Das lag, wie sich nach einigem Ausprobieren herausstellte, nicht an meiner nur-USB-1.1-Schnittstelle sondern am Fehlen des Pakets "usb-modeswitch". Dieses ist daf&uuml;r zust&auml;ndig, dass UMTS-Sticks, die nicht nur Modem sondern auch Speicherstick sind, als beides erkannt und benutzbar gemacht werden. H&auml;tte ich zu diesem Zeitpunkt kein Internet via WLAN gehabt, h&auml;tte ich mir von einem anderen Internetanschluss aus die n&ouml;tigen Pakete aufwendig besorgen m&uuml;ssen, um meinen Laptop in die Lage zu versetzen, den HUAWEI E161 zu verwenden - ein bisschen &auml;rgerlich. Da das aber nicht der Fall war konnte ich "usb-modeswitch" einfach via APT installieren, zur Sicherheit, dass auch wirklich alles aktualisiert wird, den Laptop neustarten und danach den Surfstick ebenso einfach mittels NetworkManager verwenden wie unter Ubuntu 9.10.</p> <pre>sudo apt-get install usb-modeswitch</pre> Mon, 10 May 2010 23:06:01 +0200http://www.joachim-neu.de/post/110/huawei-e161/vnstat http://www.joachim-neu.de/post/113/vnstat/<p>Gerade wenn man einen UMTS-Stick mit Traffic-Begrenzung verwendet, aber auch aus reiner Neugier, kann es interessant sein, das Netzwerk-&Uuml;bertragungsvolumen aufzeichnen und auf verschiedene Weisen statistisch auswerten zu lassen. Unter Linux eignet sich dazu das Kommandozeilentool "vnstat". Aus den Standardrepositories (u.A. unter Ubuntu) l&auml;sst es sich einfach installieren:</p> <pre>sudo apt-get install vnstat</pre> <p>Anschlie&szlig;end muss man f&uuml;r jedes zu &uuml;berwachende Netzwerk-Interface eine Datenbank anlegen (vnstat moniert das Fehlen einer solchen Datenbank, wenn man es nach der Installation ohne jegliche Parameter aufruft, und gibt einen Hinweis, wie man eine solche Datenbank anlegt). M&ouml;chte man beispielsweise den Traffic auf dem Interface eth0 &uuml;berwachen, f&uuml;gt man auf diese Weise eine Datenbank hinzu:</p> <pre>sudo vnstat -u -i eth0</pre> <p>Mit diesem Aufruf kann man auch immer wieder zwischendurch die Statistik f&uuml;r ein Interface manuell aktualisieren (ohne Parameter -i werden die Statistiken aller Interfaces aktualisiert). Automatisch aktualisiert wird die Statistik alle 5 Minuten &uuml;ber einen Cronjob, der in /etc/cron.d/vnstat residiert.</p> <p>Startet man vnstat ohne Parameter, bekommt man eine kurze &Uuml;bersicht &uuml;ber das Transfervolumen der einzelnen Interfaces. Die Statistik l&auml;sst sich auch in unterschiedliche Zeitabschnitte stunden-, tage- oder monateweise aufteilen:</p> <pre>vnstat --hours<br />vnstat --days<br />vnstat --months<br /></pre> <p>Unz&auml;hlige weitere sch&ouml;ne Optionen verr&auml;t wie immer die man-Datenbank zum entsprechenden Programm:</p> <pre>man vnstat<br /></pre> <p>Vielen Dank an der Stelle an meinen Freund Thomas, der mir den Tipp zu diesem Programm gegeben hat.</p> Fri, 02 Jul 2010 11:03:22 +0200http://www.joachim-neu.de/post/113/vnstat/Firefox Add-Ons http://www.joachim-neu.de/post/117/firefox-add-ons/<p>An dieser Stelle m&ouml;chte ich eine (nat&uuml;rlich nie vollst&auml;ndige und sich st&auml;ndig erweiternde!) Liste aller Firefox Add-Ons sammeln, die ich f&uuml;r unverzichtbar halte.</p> <ul> <li>AdBlock Plus - "Werbung war gestern!"</li> <li>Firebug - "Web Development Evolved."</li> <li>Flashblock - um Flash Applets an der automatischen Ausf&uuml;hrung zu hindern</li> <li>Ghostery - um im Web wenigstens ein St&uuml;ckchen Privatsph&auml;re zu behalten</li> <li>Tab Mix Plus - bietet flexiblere Konfigurationsm&ouml;glichkeiten der Tab-Leiste</li> </ul> <p>Alle Add-Ons sollten popul&auml;r genug sein um von jeder g&auml;ngigen Suchmaschine gefunden zu werden. ;)</p> Mon, 21 Mar 2011 22:28:44 +0100http://www.joachim-neu.de/post/117/firefox-add-ons/Desktop-Icons http://www.joachim-neu.de/post/8/desktop-icons/<p>Wer Ubuntu (Gutsy Gibbon) installiert wird sich nach kurzer Zeit fragen, wo die Standardverkn&uuml;pfungen auf dem Desktop (Computer, Pers&ouml;nlicher Ordner, ...) hin sind.</p> <p>Vielleicht wird der ein oder andere versuchen, das Problem zu l&ouml;sen, indem er die entsprechenden Icons aus dem Orte-Men&uuml; kopiert. Das hilft zwar, die Nachteile zeigen sich aber sp&auml;testens beim automatischen Sortieren der Icons nach Namen, wenn sich die Icons pl&ouml;tzlich unter herk&ouml;mmlichen Dateien tummeln.</p> <p>Das Problem ist sehr einfach. Einige Standard-Konfigurationsparameter sind unter Ubuntu (Gutsy Gibbon) per default deaktiviert, sodass Nautilus die Icons nicht anzeigt.</p> <p>Das Problem l&auml;sst sich eben so einfach l&ouml;sen. Gibt man in einer Konsole</p> <pre>gconf-editor</pre> <p>ein, so &ouml;ffnet sich ein Konfigurationseditor. Hier kann man sich durch die Hierarchie nach /apps/nautilus/desktop hangeln. Dort findet man die Konfigurationsparameter "computer_icon_visible", "network_icon_visible", "trash_icon_visible", "home_icon_visible" und "volumes_visible". Hier kann man nach Lust und Laune H&auml;kchen setzen und zusehen, wie die entsprechenden Icons auf dem Desktop erscheinen.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/8/desktop-icons//desktop/gnome/interface http://www.joachim-neu.de/post/116/desktopgnomeinterface/<p>Irgendwie finde ich gerade unter Ubuntu 10.04 in all den unterschiedlichen grafischen Konfigurationsassistenten und -einstellungsdialogen nicht den richtigen Schalter, um das Aussehen der GTK Men&uuml;leisten und GTK Toolbars anzupassen. Aber kein Problem: Das ist alles in gconf hinterlegt, unter /desktop/gnome/interface. Einfach mit gconf-editor bearbeiten:</p> <pre>gconf-editor /desktop/gnome/interface</pre> <p>Auf welche Weise wird bei jedem einzelnen Schl&uuml;ssel beschrieben.</p> Wed, 04 Aug 2010 16:38:29 +0200http://www.joachim-neu.de/post/116/desktopgnomeinterface/GObject http://www.joachim-neu.de/post/97/gobject/<p>GObject aus dem Python Modul "gobject" ist der objekt-orientierte Unterbau der in quasi allen GNOME-verwandten Projekten (Anwendungen, Programmbibliotheken, ...) Verwendung findet. Insbesondere im C-Umfeld ist GObject wichtig, hier ersetzt es die fehlende OOP-Funktionalit&auml;t. Au&szlig;erdem erlaubt es durch seinen beschreibenden Charakter einfach Hochsprachenbindings f&uuml;r bestehende Bibliotheken zu bauen weil die Attribute und die Vererbungshierarchie in C umgesetzter Klassen mittels GObject bereits definiert wird. Aber auch au&szlig;erhalb der Programmiersprache C gibt es gute Gr&uuml;nde, GObject zu verwenden.</p> <p>Mit GObject l&auml;sst sich angenehm trennen zwischen den Attributen eines Objektes, die zum Speichern objekt-spezifischer Daten verwendet werden (normale Attribute), und den Attributen, die von au&szlig;en als Schnittstelle zu dem Objekt fungieren (mit GObject definierte Attribute). Au&szlig;erdem erweitert die Basisklasse GObject ihre Erben um eine Signal-Funktionalit&auml;t. Damit ist es Objekten m&ouml;glich, einander zu informieren, wenn ein Ereignis eintritt. Eine Sonderform davon ist, dass ein anderes Objekt sich Bescheid geben lassen kann, wenn sich die (GObject-)Attribute eines anderen Objektes &auml;ndern.</p> <p>Leider gibt es von "offizieller Seite" keine Dokumentation f&uuml;r die Python-GObject-Features. Die folgende Anleitung ist nach dem Prinzip "Try &amp; Error" und unter Mithilfe des PyGTK-IRC-Channels entstanden und weist deshalb noch die ein oder anderen L&uuml;cken auf.</p> <h2>GObject verwenden</h2> <p>GObject l&auml;sst sich einfach als Basis f&uuml;r eigene Klassen verwerwenden indem man von ihm erbt:</p> <pre>import gobject<br /><br />class MyClass(gobject.GObject):<br /> ...</pre> <p>Damit ist der Grundstein gelegt und die Verwendung der GObject-Features f&uuml;r Instanzen dieser Klasse m&ouml;glich.</p> <p>M&ouml;chte man die Klassendefinition noch etwas vollst&auml;ndiger machen, gibt man der Klasse mit dem Attribut "__gtype_name__" noch einen GObject-spezifischen Namen:</p> <pre>import gobject<br /><br />class MyClass(gobject.GObject):<br /> __gtype_name__ = 'GMyClass'<br /> ...</pre> <h2>Attribute</h2> <p>Attribute sind die Eigenschaften die Instanzen einer bestimmten Klasse besitzen. Die Klasse beschreibt, welche Attribute es gibt und kann definieren, welchen Datentyp dort hinterlegte Werte haben m&uuml;ssen, was der anf&auml;ngliche Wert ist und ob ein Attribut nur lesbar oder auch schreibbar ist. Der eigendliche Wert des Attributs kann sich dann w&auml;hrend der Laufzeit &auml;ndern und ist von Objekt zu Objekt unterschiedlich.</p> <p>GObject-Attribute kann man &uuml;ber das Attribut "__gproperties__" definieren. Ihm weist man ein Dictionary zu dessen Keys die Namen der Attribute sind. Die Werte sind Tuples deren Elemente den Datentyp, den Namen, eine Beschreibung, den Anfangswert und den Modus beschreiben:</p> <pre>import gobject<br /><br />class MyClass(gobject.GObject):<br /> __gtype_name__ = 'GMyClass'<br /> __gproperties__ = {<br /> 'my-attribute': ( gobject.TYPE_BOOLEAN, 'my-attribute', 'this is my attribute', False, gobject.PARAM_READWRITE ),<br /> } <br /> ...</pre> <p>Hier wird also ein Attribut mit dem Namen "my-attribute" vom Datentyp "Boolean" (True oder False) erzeugt. dessen Default-Wert False ist und das von au&szlig;en sowohl gelesen alsauch geschrieben werden kann. Selbstverst&auml;ndlich kann man auch andere Datentypen und Zugriffsmodi verwenden. Eine halbwegs vollst&auml;ndige Liste findet sich hier: <a href="http://www.pygtk.org/docs/pygobject/gobject-constants.html" target="_blank">http://www.pygtk.org/docs/pygobject/gobject-constants.html</a></p> <p>Um das Attribut auch verwenden zu k&ouml;nnen muss der Code noch etwas erweitert werden. Mit "gobject.PARAM_CONSTRUCT" wird GObject mitgeteilt, dass es das Attribut bei der Instanziierung eines Objektes auf den Default-Wert zu setzen hat. Au&szlig;erdem wird in "__init__" ein Pl&auml;tzchen f&uuml;r die tats&auml;chlich gespeicherten Werte der Attribute in "_props" angelegt. Anschlie&szlig;end wird die GObject-Initialisierung durchgef&uuml;hrt. Die beiden Methoden "do_get_property" und "do_set_property" sorgen daf&uuml;r, dass die Werte der Attribute sp&auml;ter ihren Weg dorthin finden, wo sie gespeichert werden:</p> <pre>import gobject<br /><br />class MyClass(gobject.GObject):<br /> __gtype_name__ = 'GMyClass'<br /> __gproperties__ = {<br /> 'my-attribute': ( gobject.TYPE_BOOLEAN, 'my-attribute', 'this is my attribute', False, gobject.PARAM_READWRITE | gobject.PARAM_CONSTRUCT ),<br /> } <br /> <br /> def __init__(self):<br /> self._props = {}<br /> gobject.GObject.__init__(self)<br /> <br /> def do_get_property(self, pspec):<br /> return self._props[pspec.name]<br /> <br /> def do_set_property(self, pspec, value):<br /> self._props[pspec.name] = value</pre> <p>Nun kann man auf dreierlei Wegen auf die Property zugreifen:</p> <pre>myobj = MyClass()<br />print myobj.get_property('my-attribute')<br />print myobj.get_properties('my-attribute')<br />print myobj.props.my_attribute</pre> <p>Zu beachten ist dabei, dass beim Zugriff &uuml;ber "props" aus dem '-' ein '_' wird, andernfalls best&uuml;nde Verwechlungsgefahr mit dem Minus-Zeichen.</p> <h2>Signale</h2> <p>Signale sind eine einfache M&ouml;glichkeit im Falle eines auftretenden Ereignisses andere Objekte dar&uuml;ber in Kenntnis zu setzen und so Programmabl&auml;ufe anzusto&szlig;en. Ein Beispiel daf&uuml;r ist ein Button der mit dem Signal "clicked" allen Objekten, die sich bei ihm f&uuml;r dieses Ereignis interessieren, mitteilt, dass das Event nun ausgel&ouml;st wurde. Die anderen Objekte k&ouml;nnen Funktionen mit diesen Ereignissen verkn&uuml;pfen die aufgerufen werden, sobald die zugeh&ouml;rigen Ereignisse ausgel&ouml;st werden. Ein Programm k&ouml;nnte beispielsweise das aktuell ge&ouml;ffnete Dokument abspeichern sobald der Speichern-Button das "clicked" Signal ausl&ouml;st.</p> <p>Es ist auch m&ouml;glich, f&uuml;r eigene Klassen Signale zu definieren und im entsprechenden Moment auszul&ouml;sen. Die Verwaltung der Verkn&uuml;pfungen zwischen den Ereignissen und den f&uuml;r ein Signal registrierten Funktionen (den sogenannten Callbacks - das Objekt ruft zur&uuml;ck, wenn etwas passiert ist) &uuml;bernimmt GObject.</p> <p>Jedes m&ouml;gliche Signal wird &auml;hnlich wie die Properties im Attribut "__gsignals__" angegeben. "__gsignals__" enth&auml;lt ein Dictionary, dessen Namen die Namen der Signale sind. Der Wert ist erneut ein Tuple dessen Elemente das Signal genauer beschreiben. Der erste Wert beschreibt den Modus des Signals genauer - mehr konnte ich dar&uuml;ber noch nicht in Erfahrung bringen, f&uuml;r sachdienliche Hinweise bin ich jederzeit dankbar! Auch &uuml;ber die Funktionsweise des zweiten Wertes konnte ich bisher nur das folgende in Erfahrung bringen: M&ouml;chte man die weitere Abarbeitung eines Signals abbrechen k&ouml;nnen, indem man im Callback True zur&uuml;ck gibt, w&auml;hlt man hier den Datentyp "Boolean" und verwendet f&uuml;r den ersten Wert "gobject.SIGNAL_RUN_LAST". In allen anderen F&auml;llen steht hier "gobject.TYPE_NONE" und an erster Stelle "gobject.SIGNAL_RUN_FIRST". Das letzte Element ist ein Tuple das die Datentypen der dem Callback zus&auml;tzlich &uuml;bergebenen Parameter beschreibt:</p> <pre>import gobject<br /><br />class MyClass(gobject.GObject):<br /> __gtype_name__ = 'GMyClass'<br /> __gsignals__ = {<br /> 'my-signal': ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ( gobject.TYPE_PYOBJECT, ) ),<br /> }<br /> ...</pre> <p>Die Handler (Callbacks) die auf dieses Signal hin ausgef&uuml;hrt werden bekommen also das Objekt, dessen Signal ausgel&ouml;st wurde, als erstes und ein Python-Objekt als zweiten Parameter &uuml;bergeben.</p> <p>Ein Signal l&auml;sst sich mit der Methode "emit" ausl&ouml;sen. Ihr &uuml;bergibt man den Namen des auszul&ouml;senden Signals und die weiteren Argumente die an die registrierten/verkn&uuml;pften Callbacks &uuml;bergeben werden sollen:</p> <pre>import gobject<br /><br />class MyClass(gobject.GObject):<br /> __gtype_name__ = 'GMyClass'<br /> __gsignals__ = {<br /> 'my-signal': ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ( gobject.TYPE_PYOBJECT, ) ),<br /> }<br /> <br /> def do_something(self):<br /> self.emit('my-signal', object())<br /><br />myobj = MyClass()<br />myobj.do_something()</pre> <p>Interessiert man sich f&uuml;r ein Signal eines Objekts und m&ouml;chte eine Funktion ausf&uuml;hren, wenn das Signal ausgel&ouml;st wird, verkn&uuml;pft man mit der Methode "connect" das Signal mit einer Funktion:</p> <pre>import gobject<br /><br />class MyClass(gobject.GObject):<br /> __gtype_name__ = 'GMyClass'<br /> __gsignals__ = {<br /> 'my-signal': ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ( gobject.TYPE_PYOBJECT, ) ),<br /> }<br /> <br /> def do_something(self):<br /> self.emit('my-signal', object())<br /><br />def my_callback(obj, *args, **kwargs):<br /> print 'my_callback:', obj, args, kwargs<br /><br />myobj = MyClass()<br />myobj.connect('my-signal', my_callback)<br />myobj.do_something()</pre> <p>Die Methode "connect" gibt eine ID zur&uuml;ck mit der man die Verkn&uuml;pfung mittels "disconnect" sp&auml;ter auch wieder losl&ouml;sen kann:</p> <pre>import gobject<br /><br />class MyClass(gobject.GObject):<br /> __gtype_name__ = 'GMyClass'<br /> __gsignals__ = {<br /> 'my-signal': ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ( gobject.TYPE_PYOBJECT, ) ),<br /> }<br /> <br /> def do_something(self):<br /> self.emit('my-signal', object())<br /><br />def my_callback(obj, *args, **kwargs):<br /> print 'my_callback:', obj, args, kwargs<br /><br />myobj = MyClass()<br />hid = myobj.connect('my-signal', my_callback)<br />myobj.do_something()<br />myobj.disconnect(hid)<br />myobj.do_something()</pre> <p>Ein besonderes Schmankerl ist das Signal "notify". Es ist in GObject bereits mitgeliefert und wird immer emittiert wenn sich ein Attribut des zugeh&ouml;rigen Objektes &auml;ndert. Zudem wird f&uuml;r jedes Attribut das Signal "notify::attribut-name" emittiert wenn sich sein Wert &auml;ndert:</p> <pre>import gobject<br /><br />class MyClass(gobject.GObject):<br /> __gtype_name__ = 'GMyClass'<br /> __gproperties__ = {<br /> 'my-attribute': ( gobject.TYPE_BOOLEAN, 'my-attribute', 'this is my attribute', False, gobject.PARAM_READWRITE | gobject.PARAM_CONSTRUCT ),<br /> } <br /> <br /> def __init__(self):<br /> self._props = {}<br /> gobject.GObject.__init__(self)<br /> <br /> def do_get_property(self, pspec):<br /> return self._props[pspec.name]<br /> <br /> def do_set_property(self, pspec, value):<br /> self._props[pspec.name] = value<br /><br />def my_callback(obj, *args, **kwargs):<br /> print 'my_callback:', obj, args, kwargs<br /><br />myobj = MyClass()<br />myobj.connect('notify::my-attribute', my_callback)<br />print myobj.props.my_attribute<br />myobj.props.my_attribute = True<br />print myobj.props.my_attribute</pre> <p>Insbesondere diese Verkn&uuml;pfung von Attributen und Signalen ist ein h&auml;ufig gebrauchtes und von GObject mitgebrachtes Feature. Die Verwendung von GObject ist also allemal eine &Uuml;berlegung wert.</p> Wed, 26 Aug 2009 15:03:31 +0200http://www.joachim-neu.de/post/97/gobject/Mainboard- bzw. Grafikkarten-Fehler http://www.joachim-neu.de/post/115/mainboard-grafikkarten-fehler/<p>Irgendwann trifft es wohl jeden einmal: Meistens ist man furchtbar in Eile, will noch schnell was erledigen, dr&uuml;ckt hastig auf den Anschalter des PCs, die Platten und L&uuml;fter heulen auf, aber das obligatorische kurze "Piep" des BIOS zum Zeichen "ich habe erfolgreich meine eigene Hardware gecheckt" bleibt aus, auf dem Bildschirm kommt kein Bild und irgendwann fr&uuml;her oder sp&auml;ter f&auml;ngt der Rechner wild das Piepsen an.</p> <p>Diese Pieps-Codes signalisieren, dass es Probleme mit irgendeinem unabk&ouml;mmlichen Hardware-Bauteil gibt, sodass das Booten nichtmehr weiter geht. Wer jetzt in Eile ist, gibt am besten gleich auf, denn was jetzt kommt, braucht Zeit, Geduld und vermutlich auch Geld. Die L&auml;nge der einzelnen Piepst&ouml;ne, selten auch mal die Frequenz, gibt Auskunft dar&uuml;ber, was der PC will. N&auml;heres dazu gibt es auf vielen Internetseiten zu lesen, nicht zuletzt auch auf der Wikipedia: <a href="http://de.wikipedia.org/wiki/Liste_der_BIOS-Signalt%C3%B6ne" target="_blank">http://de.wikipedia.org/wiki/Liste_der_BIOS-Signalt%C3%B6ne</a></p> <p>Problematischer ist, dass man diesem Piepsen nicht immer trauen kann. In meinem j&uuml;ngsten Fall hat der Rechner 1x lang und 3x kurz gepiepst. Den Listen nach ein klarer Fall: Grafikkarte kaputt. Also: Eine neue Grafikkarte muss her! Aber auch die konnte keine Abhilfe schaffen, das seltsame Piepsen h&ouml;rte nicht auf. Um weitere Fehlerquellen auszuschlie&szlig;en, habe ich alle anderen Ger&auml;te soweit m&ouml;glich abgest&ouml;pselt. Um auch den RAM als Fehlerquelle ausschlie&szlig;en zu k&ouml;nnen, habe ich ihn ausgebaut und geh&ouml;rt, was der Computer dann so piepst. Au&szlig;erdem war der betroffene PC zuvor noch nie im laufenden Betrieb abgest&uuml;rzt oder &Auml;hnliches - es gab also keine weiteren Hinweise auf RAM-Versagen.</p> <p>Letztlich konnte ich den Fehler auf Mainboard oder CPU eingrenzen. Da mir CPU eher unwahrscheinlich schien (wenn die CPU kaputt ist, h&auml;tte man das vermutlich vorher schon an Systemabst&uuml;rzen gemerkt, au&szlig;erdem: wer soll dann die Piepst&ouml;ne koordinieren?), habe ich ein neues Mainboard gekauft und siehe da: Der Rechner l&auml;uft wieder einwandfrei!</p> <p>Dank der genialen Arbeit der Linux Kernel Entwickler lief das Tauschen des Mainboards komplett ohne Probleme mit meiner bestehenden Linux Installation ab. Es gab keine Probleme, nichtmal neue Treiber mussten installiert werden. Wenn das mal nicht komfortabel, zuverl&auml;ssig und robust ist!</p> Fri, 16 Jul 2010 04:33:22 +0200http://www.joachim-neu.de/post/115/mainboard-grafikkarten-fehler/Encodings: mac-* http://www.joachim-neu.de/post/114/encodings-mac-/<p>Der nur unzureichend informierte Python Programmierer k&ouml;nnte meinen, mit latin-1 und anderen Microsoft-Anwandlungen bereits alle Ekelheiten gesehen zu haben, die das Ph&auml;nomen Encodings zu bieten hat. Dann freut man sich, dass die Freie Software Welt mit utf-8 schon seit langem ihren Quasi-Standard gefunden hat, der obendrein quasi alle Probleme meistern kann.</p> <p>Aber nein! Auch die Mac-Welt macht in Sachen Encodings ihre eigenen Spielchen statt das Problem unter Einsatz von utf-8 ein f&uuml;r allemal zu l&ouml;sen. Aber nat&uuml;rlich nicht die gleichen Spielchen, wie Windows. Nix latin-1 und Co, Mac hat nat&uuml;rlich seine eigenen Encodings.</p> <p>Als ganz besonderes Schmankerl stellt sich heraus, dass sich Software des gleichen Herstellers unterschiedlich verh&auml;lt, wenn sie auf unterschiedlichen Betriebssystemen eingesetzt wird. Man sollte meinen, Microsofts Excel w&uuml;rde CSV-Dateien latin-1 encodiert exportieren. Aber weit gefehlt! Unter Mac kommt ein Encoding zum Einsatz, das in Python mac-roman hei&szlig;t.</p> <p>Wer also Mac-Dateien, insbesondere Mac-CSV-Dateien von Mac-Excel, mit Python lesen will, sollte zuvor den Inhalt mit mac-roman dekodieren und dann mit dem vertrauten utf-8 arbeiten. Andere Mac-Versionen aus anderen Regionen der Erde setzen vermutlich nicht mac-roman sondern ein anderes mac-* Encoding ein ...</p> Tue, 13 Jul 2010 15:18:11 +0200http://www.joachim-neu.de/post/114/encodings-mac-/LAME http://www.joachim-neu.de/post/112/lame/<p>LAME (LAME Ain't an MP3 Encoder, unter Ubuntu Teil des Paketes "lame") ist DER Weg, unter Linux Audiodaten in MP3 zu encodieren. Die Benutzung ist denkbar einfach:</p> <pre>lame [Dateiname]</pre> <p>Leider versteht sich LAME nicht so gut mit allerhand anderen Formaten und Codecs. Deshalb ist es manchmal n&ouml;tig, die Daten vorher in WAV umzuwandeln und dann zu encodieren. Dabei geht dann auch gleich die Videospur verloren und zur&uuml;ck bleibt nurnoch Audio:</p> <pre>ffmpeg -i [Dateiname] -acodec pcm_s16le -ac 2 -vn [Dateiname].wav<br />lame [Dateiname].wav</pre> Tue, 15 Jun 2010 17:09:10 +0200http://www.joachim-neu.de/post/112/lame/convert http://www.joachim-neu.de/post/74/convert/<p>F&uuml;r alle, die an gr&ouml;&szlig;eren Mengen von Bild-Dateien die gleichen Operationen vornehmen m&uuml;ssen (Resizen, Zurechtschneiden, ...), aber keine Lust haben, daf&uuml;r GIMP zu scripten oder einen kleinen Python-Code zu zimmern, lohnt es sich, einen Blick auf das zu ImageMagick geh&ouml;rende Konsolen-Tool "convert" zu werfen.</p> <p>Das Programm geh&ouml;rt unter Ubuntu zum Paket "imagemagick". Die Syntax ist denkbar einfach. Man spezifiziert die Input-Datei, die auszuf&uuml;hrenden Operationen, und die Output-Datei.</p> <p>Die meisten Anweisungen sind selbsterkl&auml;rend und funktionieren meist auf Anhieb. Besondere Beachtung verdient aber das Geometry-String-Format (http://www.imagemagick.org/script/command-line-processing.php#geometry), das bei manchen Operationen (und auch abh&auml;ngig von den verwendeten Dateiformaten) zu ungew&ouml;hnlichen und auf den ersten Blick nicht reproduzierbaren Ergebnissen f&uuml;hren kann.</p> <p>M&ouml;chte man beispielsweise ein Bild auf die Maximalh&ouml;he von 100 Pixeln zurechtschneiden, verwendet man intuitiv den folgenden Befehl:</p> <pre>convert input.gif -crop x100 output.gif</pre> <p>Die daraus resultierende GIF-Datei enth&auml;lt mit "eog" zwar das gew&uuml;nschte Ergebnis, im FireFox wird jedoch weiterhin eine scheinbar alte Version der Datei mit unver&auml;nderter Gr&ouml;&szlig;e angezeigt. &Ouml;ffnet man die Datei mit GIMP, er&ouml;ffnet sich die Ursache: "convert" erzeugt offenbar zwei Ebenen untereinander, die eine mit dem abgeschnittenen, die andere mit dem &uuml;briggebliebenen Inhalt. "eog" zeigt nur erstere an, FireFox und andere Programme beide.</p> <p>Abhilfe schafft bei diesem Verhalten der Geometry-Zusatz "!". Er sorgt daf&uuml;r, dass der Verschnitt auch wirklich verschwindet und nur der gewollte Rest &uuml;berbleibt. Der fertige Befehl sieht also wie folgt aus:</p> <pre>convert input.gif -crop x100! output.gif<br /></pre> <h2>Update</h2> <p>Um alle Bilder eines Ordners beispielsweise auf 75% zu verkleinern, gen&uuml;gt der folgende Befehl:</p> <pre>for a in *; do convert $a -resize 75% -antialias -quality 100% $a; done<br /></pre> <h2>Update 2</h2> <p>Um alle EPS-Dateien eines Ordners in JPEG-Dateien mit 600dpi Aufl&ouml;sung zu konvertieren, kann man den folgenden Befehl verwenden:</p> <pre>for a in `ls | grep .eps`; do convert -density 600 -background white -quality 100 $a ${a//.eps}.jpg; done<br /></pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/74/convert/Ubuntu 10.04 &quot;Lucid&quot; http://www.joachim-neu.de/post/111/ubuntu-1004-lucid/<p>Einige Zeit nach dem eigentlichen Release habe ich meinen Desktop-Rechner auch auf Ubuntu Lucid umgestellt.</p> <p>Gleich auf den ersten Blick sieht man das neue Standard-Theme - grausam. Zum Gl&uuml;ck l&auml;sst es sich unter System &gt; Erscheinungsbild schnell &auml;ndern. Ich pr&auml;feriere weiterhin Human-Clearlooks.</p> <p>Beim Booten funktionieren nun dank Plymouth auch nicht-triviale Umgebungen mit Festplattenverschl&uuml;sselung wieder, ein unertr&auml;glicher Bug in 9.10, der das Booten zu Russischem Roulette werden lie&szlig;, wurde so behoben. Leider ist es mir nicht gelungen, alle Formen von grafischem Boot-Klimbim komplett auszuschalten. Und so verwirrt meine Grafikkarte weiterhin durch das h&auml;ufige Modus-Wechseln beim Booten (BIOS, Grub, Splashscreen, X-Server) meinen Bildschirm (HH241 von HANNS-G), der leider furchtbar lange braucht, um beim Wechseln des Video-Modus den Anschluss wieder zu finden - insbesondere, wenn er zwischenzeitlich mit "No Signal" den Dienst quittiert. Aber nachdem ich im Bildschirm-Men&uuml; unter "Input Setting" die Option "Auto Search" ausgeschaltet habe (als Anschluss verwende ich HDMI), funktioniert wenigstens das automatische Anschalten nach einem "No Signal"-Ende wieder und ich muss den Bildschirm nichtmehr jedes Mal aus und wieder an schalten.</p> <p>Die Standardaufl&ouml;sung beim Booten war (wohl aufgrund von Widescreen und propriet&auml;ren nVidia-Treibern) unertr&auml;glich klein. Mit der folgenden Anleitung konnte ich sie erfolgreich &auml;ndern: <a href="http://www.namanb.com/2010/05/changing-bootup-resolution-plymouth-in-ubuntu-10-04-lucid-lynx.html" target="_blank">http://www.namanb.com/2010/05/changing-bootup-resolution-plymouth-in-ubuntu-10-04-lucid-lynx.html</a></p> <p>Bei der Gelegenheit lohnt es sich auch, einen Blick auf die neuen Grub2-Features und die Art und Weise der Konfiguration zu werfen: <a href="http://ubuntuforums.org/showthread.php?t=1195275" target="_blank">http://ubuntuforums.org/showthread.php?t=1195275</a></p> <p>Auf dem Desktop sind nur Detailverbesserungen bemerkbar, nichts, was die Benutzung radikal ver&auml;ndert oder gar einschr&auml;nkt. Leider dauert der Login bei mir nun merklich l&auml;nger als zuvor.</p> <p>Insgesamt l&auml;sst sich zu diesem Release aber sagen, dass es seit langer Zeit wieder Hoffnung macht. Im Moment ist vieles im Umbruch, f&uuml;r viele grundlegende Dinge (z.B. der Boot-Splash) m&uuml;ssen erst noch stabile und vorallem flexible und ausbauf&auml;hige L&ouml;sungen gebaut werden, mit denen sich eben auch alle komplexen Anwendungsszenarien abdecken lassen. Daran wird aber mit Hochdruck gearbeitet; die ersten Fr&uuml;chte lassen sich bereits ernten und machen Hoffnung darauf, dass in absehbarer Zeit hier etwas mehr Kontinuit&auml;t und eine wirklich gute und dauerhafte L&ouml;sung entsteht.</p> Sat, 12 Jun 2010 16:12:21 +0200http://www.joachim-neu.de/post/111/ubuntu-1004-lucid/Ubuntu 9.10 &quot;Karmic&quot; http://www.joachim-neu.de/post/108/ubuntu-910-karmic/<p>Nach den Erfahrungen der letzten Ubuntu-Upgrades habe ich diesmal l&auml;nger gewartet, bis ich auf die neue Version 9.10 "Karmic" umgestiegen bin - mit durchwachsenem Erfolg wie sich herausstellte. Wichtigste Gr&uuml;nde f&uuml;r eine Neuinstallation waren f&uuml;r mich der Umstieg auf die AMD64-Architektur und die uneingeschr&auml;nkte Verwendung von ext4 als Standarddateisystem, beides w&auml;re mit einem reinen Upgrade nicht uneingeschr&auml;nkt m&ouml;glich gewesen.</p> <h2>64bit Software</h2> <p>Erstaunlich problemlos ging der Umstieg auf 64bit-Software. Da ich lange genug gewartet hatte, kam ich in den Genuss der erst j&uuml;ngst von Adobe ver&ouml;ffentlichten 64bit-Flash-Player-Beta-Version f&uuml;r Firefox, die bei mir problemlos funktioniert, im Gegensatz zu dem in den Standardrepositories vertretenen Flash-Player-Paket. Auch meine verbliebene 32bit-Windows-Software l&auml;uft in WINE anstandslos weiter.</p> <h2>Firebug</h2> <p>Ein wenig problematisch ist die Verwendung von Firebug in Firefox unter AMD64-Architektur. Der in Ubuntu Karmic mitgelieferte, von Ubuntu modifizierte Firefox 3.5.7 enth&auml;lt hier Fehler, die das Zusammenspiel mit dem automatisch aktualisierten Firebug in Version 1.5.0 unm&ouml;glich machen - der Browser st&uuml;rzt ab. Die Verantwortung daf&uuml;r wird zwischen Firebug-Programmierern, Firefox-Programmierern und den Firefox-Verwaltern bei Ubuntu hin und her geschoben, ist aber wohl bei Ubuntu zu suchen, da Firebug im unver&auml;nderten Firefox funktioniert. Das Geschehen l&auml;sst sich hier gut nachvollziehen: <a href="https://bugs.launchpad.net/ubuntu/+source/firefox-3.5/+bug/449744">https://bugs.launchpad.net/ubuntu/+source/firefox-3.5/+bug/449744</a> Umgehen l&auml;sst sich das Problem, indem man Firebug in Version 1.4.5 verwendet. Dieser steht hier zum Download zur Verf&uuml;gung: <a href="http://getfirebug.com/releases/firebug/1.4/">http://getfirebug.com/releases/firebug/1.4/</a></p> <h2>gnome-terminal</h2> <p>Leider l&auml;sst sich die Standardgr&ouml;&szlig;e des Gnome-Terminal nicht(mehr) festlegen. M&ouml;chte man dennoch ein gr&ouml;&szlig;eres Terminal-Fenster mit einem Tastenk&uuml;rzel &ouml;ffnen, muss man ein eigenes solches anlegen. Der Parameter "--geometry" hilft dabei, die gew&uuml;nschte Gr&ouml;&szlig;e festzulegen. Unter den Systemeinstellungen l&auml;sst sich eine neue Tastenkombination mit einem beliebigen Befehl festlegen. Zus&auml;tzlich sollte man hier noch das gew&uuml;nschte Arbeitsverzeichnis mit "--working-directory" angeben:</p> <pre>gnome-terminal --geometry=[X]x[Y] --working-directory=/home/[Benutzername]<br /></pre> <h2>Splash-Screen-Aufl&ouml;sung</h2> <p>Ist der Splash-Screen in seiner Standardaufl&ouml;sung zu pixelig, l&auml;sst sich diese in der Datei /etc/usplash.conf &auml;ndern. Dort tr&auml;gt man die gew&uuml;nschte X- und Y-Aufl&ouml;sung ein:</p> <pre>xres=[Breite]<br />yres=[H&ouml;he]<br /></pre> <p>Anschlie&szlig;end sollten die initramfs neu gebaut werden:</p> <pre>sudo update-initramfs -k all -u<br /></pre> <p>Leider l&auml;sst sich Full-HD-Aufl&ouml;sung von 1920x1080 so nicht erreichen - vermutlich, weil kein entsprechender VESA-Modus spezifiziert ist.</p> <h2>Qt4-Schriftarten</h2> <p>Auf Qt4 basierende Programme wie KolourPaint4 oder VLC zeigten bei mir nach der Installation eine unm&ouml;glich verpixelte Schrift auf den Oberfl&auml;chen. Auch das Tool "qtconfig-qt4", mit dem man normalerweise den Look von Qt4-Programmen anpassen kann, konnte dies nicht beheben. Abhilfe schaffte eine Datei ".fonts.conf" im Home-Verzeichnis mit folgendem Inhalt:</p> <pre>&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE fontconfig SYSTEM "fonts.dtd"&gt;<br />&lt;fontconfig&gt;<br /> &lt;match target="font"&gt;<br /> &lt;edit name="rgba" mode="assign"&gt;<br /> &lt;const&gt;rgb&lt;/const&gt;<br /> &lt;/edit&gt;<br /> &lt;edit name="hinting" mode="assign"&gt;<br /> &lt;bool&gt;true&lt;/bool&gt;<br /> &lt;/edit&gt;<br /> &lt;edit name="antialias" mode="assign"&gt;<br /> &lt;bool&gt;true&lt;/bool&gt;<br /> &lt;/edit&gt;<br /> &lt;edit name="hintstyle" mode="assign"&gt;<br /> &lt;const&gt;hintfull&lt;/const&gt;<br /> &lt;/edit&gt;<br /> &lt;/match&gt;<br />&lt;/fontconfig&gt;<br /></pre> <h2>python-notify</h2> <p>Im Python Modul "pynotify" aus dem Paket "python-notify" scheint derzeit die Methode "Notification.close()" nicht zu funktionieren. Sie hat schlicht keinen Effekt. Ein entsprechender Bugreport existiert: <a href="https://bugs.launchpad.net/ubuntu/+source/notify-python/+bug/521951">https://bugs.launchpad.net/ubuntu/+source/notify-python/+bug/521951</a></p> <h2>Compiz Fusion</h2> <p>Bei Compiz ist alles beim Alten geblieben. Wer, wie ich, weiterhin mit dem Mausrad auf dem Desktop scrollend von einer zur anderen Arbeitsfl&auml;che wechseln m&ouml;chte, muss im Modul "Arbeitsfl&auml;chenumschalter" unter "Arbeitsfl&auml;chenumschaltung auf dem Desktop" die Mausk&uuml;rzel f&uuml;r "N&auml;chste" und "Vorherige" auf "Button5" und "Button4" einstellen.</p> <h2>Grub2</h2> <p>Mit der Migration auf Grub2 hat sich einiges ver&auml;ndert. Die Konfiguration /boot/grub/menu.lst sucht man nun vergeblich, Grub2 wird &uuml;ber /etc/default/grub und /etc/grub.d/* konfiguriert.</p> <h2>S.M.A.R.T.</h2> <p>Ger&uuml;chteweise werden Festplatten nun automatisch via S.M.A.R.T. &uuml;berwacht - von Programmen des Paketes "gnome-disk-utility". Diese sollen den User automatisch warnen, wenn eine Platte kurz vor dem Ausfall steht. Das w&uuml;rde eine manuelle oder manuell eingerichtete Laufwerks&uuml;berwachung &uuml;berfl&uuml;ssig machen. Leider habe ich noch keine Best&auml;tigung bzw. eigene Erfahrungen zu diesem Thema, weshalb diese Information hier mit gro&szlig;er Vorsicht zu genie&szlig;en ist - lieber nicht darauf verlassen.</p> <h2>dm-crypt / cryptsetup / mountall / usplash / upstart</h2> <p>Das gr&ouml;&szlig;te Problem hatte ich mit meinen verschl&uuml;sselten Partitionen. Wiedereinmal ist es Ubuntu nicht gelungen, eine reibungslose Integration der Festplattenverschl&uuml;sselung in den Boot-Prozess zu erreichen. Doch diesmal sind die Probleme weit beeintr&auml;chtigender.</p> <p>W&auml;hrend / sich weit zu Beginn des Boot-Vorgangs noch im initramfs problemlos entschl&uuml;sseln l&auml;sst, wird /home erst in einer Phase entschl&uuml;sselt, die von "upstart" verwaltet wird. In diesem Schritt laufen bereits mehrere durch "upstart" gestartete Programme, unter anderem "mountall", das f&uuml;r das Einbinden der Dateisysteme zust&auml;ndig ist, deren Device-Dateien bereits bestehen. Wenn "mountall" und "cryptsetup" gleichzeitig auf die Tastatureingabe zugreifen, ist es ein Gl&uuml;cksspiel, wer das Passwort erh&auml;lt, und ob der Boot-Vorgang &uuml;berhaupt erfolgreich abgeschlossen werden kann. Unter Umst&auml;nden ist es n&auml;mlich nicht m&ouml;glich, die Partition zu entschl&uuml;sseln, und so das System fertig zu booten.</p> <p>"mountall" scheint au&szlig;erdem daf&uuml;r verantwortlich zu sein, dass der Splash-Screen "usplash" f&uuml;r einen Moment ausgesetzt wird, was das Problem zus&auml;tzlich versch&auml;rft. Hier kann es passieren, dass das die Passwort-Abfrage auf der Konsole gestellt wird, dann der Splash-Screen wieder erscheint, und so eine Eingabe des Passworts nichtmehr m&ouml;glich ist.</p> <p>Das Problem l&auml;sst sich nicht verhindern, indem man nur den Splash-Screen abschaltet. "mountall" und "cryptsetup" streiten sich weiterhin um die Eingaben.</p> <p>Leider gibt es f&uuml;r dieses Problem, obgleich es von Anfang an bekannt war, keine L&ouml;sung und auch keine Bestrebungen zu einer L&ouml;sung. Die User werden sich irgendwie damit arrangieren m&uuml;ssen. Einziger Lichtblick: In Ubuntu 10.04 "Lucid" soll das Problem endlich gel&ouml;st und die Zusammenarbeit von Verschl&uuml;sselung und Splash-Screen erstmals gelungen sein. Ich bin sehr gespannt, in diesem Feld sehe ich derzeit noch einen sehr gro&szlig;en Bedarf an guten L&ouml;sungen.</p> <p>Nach einigem T&uuml;fteln habe ich f&uuml;r mich einen brauchbaren Workaround gefunden, den ich hier grob umrei&szlig;en m&ouml;chte. (Da der Workaround einen recht tiefen Eingriff in das System darstellt, der, wenn er schief geht, das ganze System unbrauchbar machen kann, wird ihm eine einfachen Schritt-f&uuml;r-Schritt-Anleitung nicht gerecht. Wer ein tieferes Verst&auml;ndnis von dem, was er tut, hat, wird sich mit dieser groben Skizze auf eigene Gefahr hin zurechtfinden und ist in der Lage, selbst zu erkennen, wenn das Vorgeschlagene auf seinem System nicht klappt oder einer Anpassung bedarf.)</p> <p>In /usr/share/initramfs-tools/scripts/local-top findet sich das Script "cryptroot", das f&uuml;r das Entschl&uuml;sseln der Root-Partition im initramfs zust&auml;ndig ist. Dieses Script l&auml;sst sich geringf&uuml;gig modifiziert unter einem anderen Namen, z.B. "crypthome", &uuml;ber /etc/initramfs-tools/scripts/local-top ein zweites Mal in das initramfs einf&uuml;gen. So l&auml;sst sich das Entschl&uuml;sseln der &uuml;brigen Crypto-Partitionen nach vorne in den noch nicht parallelisierten Teil des Boot-Vorgangs verschieben und die Probleme mit "mountall" umgehen. Modifiziert sollte das Script derart werden, dass es daf&uuml;r sorgt, nicht als letztes sondern als vorletztes in "local-top" ausgef&uuml;hrt zu werden (die Dependencies zu Beginn sollten angepasst werden), und dass es die Crypt-Informationen nicht aus den Kernelparametern oder einer Datei bezieht, sondern gleich fest eincodiert bekommt. Crypt-Informationen k&ouml;nnen z.B. den folgenden Aufbau haben:</p> <pre>target=[Partition]_crypt,source=/dev/disk/by-uuid/[UUID],key=none<br /></pre> <p>Nach einem Update des initramfs sollte beim n&auml;chsten Reboot zuerst das Passwort f&uuml;r /home und dann das f&uuml;r / ziemlich zu Beginn des Boot-Vorgangs abgefragt werden.</p> <h2>Update</h2> <p>Irgendjemand hielt es f&uuml;r hilfreich, wenn k&uuml;nftig bei anstehenden Systemaktualisierungen nichtmehr ein kleines Icon im Benachrichtigungsfeld erscheint, sondern gleich das Update-Fenster aufgeht. Ich finde das furchtbar nervig.</p> <p>Mit dem folgenden Befehl l&auml;sst sich angeblich das alte Verhalten wiederherstellen:</p> <pre>gconftool -s --type bool /apps/update-notifier/auto_launch false</pre> Wed, 17 Feb 2010 15:04:14 +0100http://www.joachim-neu.de/post/108/ubuntu-910-karmic/Links http://www.joachim-neu.de/post/109/links/<p>(M)eine kleine unkommentierte und unsortierte Linkliste:</p> <ul> <li><a href="http://www.markus-reinert.de.vu/" target="_blank">http://www.markus-reinert.de.vu/</a></li> </ul> Mon, 03 May 2010 20:59:07 +0200http://www.joachim-neu.de/post/109/links/locales http://www.joachim-neu.de/post/107/locales/<p>Bei manchen vServer-Anbietern sind die "locales" der Debian-Installation falsch konfiguriert. Das &auml;u&szlig;ert sich darin, dass beim Zugriff via SSH Sonderzeichen nicht richtig angezeigt werden. Das Problem l&auml;sst sich einfach beheben, indem man das Paket "locales" mit folgendem Befehl neu konfiguriert:</p> <pre>dpkg-reconfigure locales<br /></pre> <p>Dort w&auml;hlt man ein UTF-8-Locale aus (z.B. "de_DE.UTF-8") und gibt dieses als Standard an. Nach dem n&auml;chsten Login werden dann die Sonderzeichen korrekt angezeigt.</p> <h2>Update</h2> <p>Anschlie&szlig;end sollte man au&szlig;erdem die Datei "/etc/environment" aktualisieren und dort die Werte LANG und LANGUAGE richtig setzen. Eine m&ouml;gliche L&ouml;sung f&uuml;r "de_DE.UTF-8" sieht so aus:</p> <pre>LANGUAGE="de_DE:de:en_GB:en"<br />LANG=de_DE.UTF-8<br /></pre> <p>Etwaige andere Werte in der Datei sollten nicht gel&ouml;scht/editiert werden!</p> Sat, 02 Jan 2010 16:47:40 +0100http://www.joachim-neu.de/post/107/locales/Rhythmbox APEv2-Tags http://www.joachim-neu.de/post/106/rhythmbox-apev2-tags/<p>Der pupul&auml;re, zu GNOME geh&ouml;rende Musikplayer Rhythmbox hat Probleme, die Tags einer MP3-Musikdatei zu &auml;ndern, wenn diese sowohl APEv2- alsauch ID3-Tags enth&auml;lt. &Auml;ndert man die Tags, werden die &Auml;nderungen nach einigen Sekunden, sp&auml;testens aber wenn man das n&auml;chste Mal die Datei anspielt, zur&uuml;ckgesetzt.</p> <p>Dieser Bug ist im wahrsten Sinne des Wortes seit Jahren bekannt und obwohl er ziemlich nervig ist scheint er niemanden zu interessieren. Das ist schade, setzt aber meine Reihe von &auml;hnlichen Erfahrungen mit GNOME-Projekten konsequent fort - Bugs sind seit Jahren bekannt aber niemand k&uuml;mmert sich darum, stattdessen erfindet man neue Features mit noch mehr Bugs, die, wenn nicht sofort nach dem ersten Auftreten, auch in den kommenden Jahren wohl nicht beseitigt werden.</p> <p>Dieser Bug l&auml;sst sich umschiffen, wenn man die APEv2-Tags aus der MP3-Datei entfernt. Rhythmbox verwendet dann die &uuml;brig gebliebenen ID3-Tags die sich problemlos &auml;ndern lassen. Das folgende kleine Python-Programm entfernt mit Hilfe der Mutagen-Library aus dem Paket "python-mutagen" die APEv2-Tags der in den Kommandozeilenargumenten &uuml;bergebenen Dateien.</p> <p><strong>Wie immer gilt auch f&uuml;r diesen Code-Fitzel: Ich &uuml;bernehme keine Haftung f&uuml;r Sch&auml;den die dieser Code verursacht, egal welcher Art! Die Benutzung erfolgt ausschlie&szlig;lich auf eigene Gefahr!</strong></p> <pre>#! /usr/bin/python<br /># -*- encoding: utf-8 -*-<br /><br />import mutagen<br />import mutagen.mp3<br />import mutagen.apev2<br /><br />import sys<br /><br />for fn in sys.argv[1:]:<br /> f = mutagen.File(fn)<br /> f.load(fn, ID3=mutagen.apev2.APEv2)<br /> f.delete()<br /> f.save()</pre> Sat, 02 Jan 2010 01:00:39 +0100http://www.joachim-neu.de/post/106/rhythmbox-apev2-tags/JavaScript: Date http://www.joachim-neu.de/post/105/javascript-date/<p>Das JavaScript Objekt "Date" f&uuml;r alle m&ouml;glichen zeit- und datumsbezogenen Funktionen leidet f&uuml;r meinen Geschmack an einer sehr ungl&uuml;cklichen Schnittstelle. Zwar kann man detailiert einzelne Parameter eines Zeitpunktes abfragen (Tag, Monat, Jahr, ...), doch zeigt sich das Interface dabei unerwartet uneinheitlich.</p> <p>So werden die Monate generell von 0 bis 11 durchnummeriert, die Tage des Monats beginnen aber bei 1. Das sollte man unbedingt ber&uuml;cksichtigen, anders landet man leicht einen Monat in der Zukunft, kann den Januar nicht auffinden oder kriegt Probleme mit dem Dezember.</p> <p>Spricht man also von dem 1. Januar 1970, schreibt man:</p> <pre>new Date(1970, 0, 1);<br /></pre> Thu, 08 Oct 2009 20:18:18 +0200http://www.joachim-neu.de/post/105/javascript-date/background-position http://www.joachim-neu.de/post/104/background-position/<p>Der Internet Explorer in allen seinen Versionen steht schon l&auml;nger f&uuml;r seine "kreativen" Auslegungen von HTML und CSS in der Kritik. Besonders merkw&uuml;rdig ist der Umgang mit der CSS-Eigenschaft "background-position". Mit dieser l&auml;sst sich unter Anderem festlegen, ob das Hintergrundbild auf der X- und Y-Achse zentriert, links oder rechts bzw. oben oder unten ausgerichtet werden soll.</p> <p>Beim Internet Explorer (scheinbar relativ unabh&auml;ngig von der Version) kann es beim Zentrieren auf der X-Achse passieren, dass das Hintergrund etwa 10 Pixel im Vergleich zu anderen Browsern verschoben ist. Eigendlich sollte man meinen, die zentrierte Positionierung sei ziemlich exakt und zweifelsfrei bestimmbar, in Redmond ist man dazu offenbar anderer Meinung.</p> <p>Urs&auml;chlich sind offenbar die Margins in der Seite verwendeter Elemente. Der folgende CSS-Schnipsel l&ouml;st das Problem f&uuml;r alle Versionen, bringt aber den etwas unangenehmen Nebeneffekt mit sich, dass man alle voreingestellten Margins neu setzen muss:</p> <pre>* { margin: 0px; }</pre> Thu, 01 Oct 2009 21:34:25 +0200http://www.joachim-neu.de/post/104/background-position/Stronghold Crusader http://www.joachim-neu.de/post/103/stronghold-crusader/<p>Stronghold Crusader l&auml;sst sich unter Ubuntu 9.04 "Jaunty" relativ einfach mit Wine zum Laufen bringen. Nach dem Installieren ben&ouml;tigt man noch einige DLLs. Diese findet man hier: <a href="http://www.thehandofagony.com/alex/dll/dplaydlls-win98se.tar.bz2" target="_blank">http://www.thehandofagony.com/alex/dll/dplaydlls-win98se.tar.bz2</a></p> <p>Alle in dem Archiv enthaltenen Dateien kopiert man in den Ordner "windows/system32". Anschlie&szlig;end startet man die Wine-Konfiguration mittels</p> <pre>winecfg</pre> <p>Es &ouml;ffnet sich ein Konfigurationsdialog. Die Registerkarte "Bibliotheken" bietet was ben&ouml;tigt wird. Dort f&uuml;gt man f&uuml;r die folgenden Bibliotheken eine &Uuml;berschreibung hinzu: "dplayx", "dpnet", "dpnhpast" und "dpwsockx". Dann best&auml;tigt man die &Auml;nderungen.</p> <p>Nun kann man Stronghold Crusader spielen, auch mit Multiplayer Modus! Weitere Informationen dazu gibt es hier: <a href="http://appdb.winehq.org/objectManager.php?sClass=version&amp;iId=3906" target="_blank">http://appdb.winehq.org/objectManager.php?sClass=version&amp;iId=3906</a></p> Sun, 27 Sep 2009 13:01:04 +0200http://www.joachim-neu.de/post/103/stronghold-crusader/enumerate http://www.joachim-neu.de/post/102/enumerate/<p>Manchmal m&ouml;chte man eine Sequenz so umwandeln, dass sie zu jedem Element auch noch dessen Index kennt. Diese Aufgabe erf&uuml;llt die Funktion "enumerate". So muss man beispielsweise in einer for-Schleife keinen Counter mitlaufen lassen, bei welchem Element man sich gerade befindet.</p> <p>"enumerate" macht aus der Liste</p> <pre>['a', 'b', 'c']</pre> <p>einen Generator f&uuml;r die folgende Liste:</p> <pre>[(0, 'a'), (1, 'b'), (2, 'c')]</pre> <p>Der folgende Code</p> <pre>i = 0<br />for e in ['a', 'b', 'c']:<br /> print str(i) + '-tes Element:', e<br /> i += 1<br /></pre> <p>l&auml;sst sich mit "enumerate" umstrukturieren zu:</p> <pre>for i, e in enumerate(['a', 'b', 'c']):<br /> print str(i) + '-tes Element:', e<br /></pre> Fri, 11 Sep 2009 22:45:32 +0200http://www.joachim-neu.de/post/102/enumerate/rsnapshot http://www.joachim-neu.de/post/101/rsnapshot/<p>Backups - diese leidige Sache ist leider im Falle des Falles ebenso &uuml;berlebensnotwendig wie generell heikel und l&auml;stig. Regelm&auml;&szlig;ige Backups zu machen erfordert einiges an Disziplin und ist doch wichtig um bei einem Daten-GAU wieder dort weitermachen zu k&ouml;nnen, wo man aufgeh&ouml;rt hat.</p> <p>Um die optimale Backupstrategie wird viel gestritten, den Heiligen Grahl gibt es nicht. Spiegelt man seine Platten in einem RAID kann man zwar bei einem Ausfall vor&uuml;bergehend ungest&ouml;rt weiterarbeiten, steht aber dumm da wenn ein wild gewordenes Shell-Script ganze Verzeichnishierarchien abges&auml;belt hat. Macht man in regelm&auml;&szlig;igen Zeitabst&auml;nden Kopien der Datenbest&auml;nde und h&auml;lt auch noch mehrere dieser gleichzeitig f&uuml;r l&auml;ngere Zeit auf Vorrat, kann man zwar eine ganze Ewigkeit in die Vergangenheit blicken und versehentlich gel&ouml;schte oder ge&auml;nderte Dateien wieder ausgraben, braucht aber ein Vielfaches an Speicherplatz und im Falle des Ausfalles hat man einige Tage bis Wochen Arbeit verloren.</p> <p>Zumindest das Problem des Platzverbrauchs l&auml;sst sich etwas eind&auml;mmen: Bei "inkrementellen Backups" werden nur die seit dem letzten Backup ver&auml;nderten oder hinzugef&uuml;gten Dateien kopiert. Dadurch werden die Backups jedoch voneinander abh&auml;ngig (das inkrementelle Backup basiert auf dem letzten vollst&auml;ndigen Backup) was nicht grade f&uuml;r die Robustheit des Systems zutr&auml;glich ist.</p> <p>Weiterhin stellt sich die Frage, in welcher Form man die Dateien und Ordner speichern will. Spiegelt man die Festplatten auf Hardware-Ebene, muss man sich darum keine Sorgen machen. H&auml;lt man jedoch Kopien vor, hat man die Wahl: Kopiert man die Verzeichnisstruktur? Legt man ein .tar-Archiv an? Packt man dieses vielleicht unter Umst&auml;nden noch in ein .tar.gz-Archiv? Letztere sind kleiner, brauchen jedoch beim Sichern und Wiederherstellen erheblich mehr Rechenleistung und somit mehr Zeit.</p> <p>Das Paket "rsnapshot" hat eine ebenso einfache wie effiziente L&ouml;sung f&uuml;r diese Probleme parat. Es arbeitet auf Datei- und Ordner-Basis, erstellt also Kopien von Verzeichnishierarchien auf einer Backup-Partition. Die Dateien werden dabei weder in Archive gepackt noch komprimiert. Die Sicherung erfolgt in regelm&auml;&szlig;igen Zeitabst&auml;nden. Dabei werden nur die Dateien wirklich kopiert, die seit einem etwaigen vorherigen Backup hinzugef&uuml;gt oder ge&auml;ndert wurden (inkrementelles Backup). Die &uuml;brigen Dateien werden aber nicht etwa ausgespart. Stattdessen macht "rsnapshot" Gebrauch von einem in der Computer-Welt einmaligen Feature: Hardlinks. Statt unver&auml;nderte Dateien in einem inkrementellen Backup erneut zu kopieren wird ein Link auf die bereits bestehenden Daten angelegt. Dieser unterscheidet sich nicht von dem Original-Verweis der Datei im vorherigen Backup auf die Daten. Wird sp&auml;ter das zu Grunde liegende Backup gel&ouml;scht, bleiben die Daten trotzdem erhalten, weil noch der Hardlink des inkrementellen Backups auf sie verweist. Eine Unterscheidung zwischen "vollst&auml;ndigem" und "inkrementellem Backup" ist so weder n&ouml;tig noch m&ouml;glich; die Backups verlieren ihre Bindung untereinander, die Vorteile inkrementeller Backups (geringerer Speicherplatzbedarf) bleiben.</p> <p>"rsnapshot" ist auch beim Remote-Backup entfernter &uuml;ber das Internet erreichbarer Server hilfreich. Dort muss als einzige Voraussetzung ebenso wie auf dem lokalen Rechner das Programm "rsync" installiert sein. "rsnapshot" greift dann via SSH auf den Remote-Host zu (es ist zweckm&auml;&szlig;ig, den Remote-Host so zu konfigurieren, dass der lokale Host sich via Zertifikaten ohne Passwort einloggen kann) und kopiert von dort die gew&uuml;nschten Dateien und Ordner in das Backup-Verzeichnis. Auch hier werden nur die Dateien &uuml;bertragen, die neu sind oder seit dem letzten Backup ver&auml;ndert wurden.</p> <p>"rsnapshot" eignet sich hervorragend f&uuml;r automatisierte, Cron-gesteuerte Backups. Wie viele Versionen f&uuml;r eine angegebene Periode (hourly, daily, weekly, ...) behalten werden wird in der Konfigurationsdatei angegeben. Die Backups werden automatisch rotiert bis sie nach entsprechender Zeit automatisch gel&ouml;scht werden.</p> <p>Unter Ubuntu installiert sich "rsnapshot" einfach &uuml;ber das gleichnamige Paket. "rsync" wird dabei automatisch mitinstalliert:</p> <pre>sudo apt-get install rsnapshot<br /></pre> <p>Auf einem Remote-Host muss nur "rsync" installiert werden:</p> <pre>sudo apt-get install rsync<br /></pre> <p>Anschlie&szlig;end wird "rsnapshot" &uuml;ber die Konfigurationsdatei "/etc/rsnapshot.conf" eingestellt. Detailierte Informationen &uuml;ber die einzelnen Parameter enth&auml;lt die zugeh&ouml;rige Man-Page:</p> <pre>man rsnapshot</pre> <p>Eine Konfigurationsdatei k&ouml;nnte etwa so aussehen:</p> <pre>config_version 1.2<br /><br />snapshot_root /backup/<br /><br />cmd_cp /bin/cp<br />cmd_rm /bin/rm<br />cmd_rsync /usr/bin/rsync<br />cmd_ssh /usr/bin/ssh<br />cmd_logger /usr/bin/logger<br />cmd_du /usr/bin/du<br /><br />interval weekly 4<br />interval monthly 3<br /><br />verbose 3<br />loglevel 3<br /><br />logfile /var/log/rsnapshot<br />lockfile /var/run/rsnapshot.pid<br /><br /># LOCALHOST<br />backup /home/ localhost/<br />backup /etc/ localhost/<br />backup /usr/local/ localhost/<br />backup /var/ localhost/<br />exclude /var/tmp/***<br />exclude /var/cache/***<br /><br /># SERVER<br />backup root@example.de:/var/ server/<br />backup root@example.de:/etc/ server/<br />backup root@example.de:/usr/local/ server/<br />backup root@example.de:/root/ server/<br />exclude /var/tmp/***<br />exclude /var/cache/***<br /></pre> <p>In diesem Fall w&uuml;rde man einmal pro Woche "rsnapshot" wie folgt ausf&uuml;hren:</p> <pre>sudo rsnapshot weekly<br /></pre> <p>Im Verzeichnis "/backup" w&uuml;rden dann vier w&ouml;chentliche und drei monatliche Backups abgelegt werden.</p> Fri, 11 Sep 2009 21:23:38 +0200http://www.joachim-neu.de/post/101/rsnapshot/Firefox 3.5 http://www.joachim-neu.de/post/98/firefox-35/<p>Wo doch der neue Firefox 3.5 seit geraumer Zeit der Welt als neuer Heiland angepriesen wird, konnte ich es mir nicht verkneifen, auch einen Blick auf die neue Version zu werfen.</p> <p>Unter Ubuntu 9.04 haben entsprechende Pakete ihren Weg in die Standardrepositories gefunden. So muss man nur "firefox-3.5" installieren. Bei mir wurde das Paket "firefox-3.5-gnome-support" nicht automatisch installiert, also habe ich es nachtr&auml;glich dazu genommen.</p> <p>Nach dem ersten Start legt Firefox 3.5 dankenswerter Weise offenbar eine 1 zu 1 Kopie des bestehenden Profil-Ordners an. Sollten ben&ouml;tigte Plugins noch nicht f&uuml;r die neue Version zur Verf&uuml;gung stehen oder andere kritische Probleme zu Tage treten kann man so leicht wieder zur&uuml;ck auf die "alte" Version wechseln. Auch wird die Firefox 3.5 Binary nicht automatisch zum Ziel des Links "/usr/bin/firefox", man muss sich also entweder selbst darum k&uuml;mmern oder das Programm "firefox-3.5" explizit starten.</p> <p>Nach dem ersten Start fiel mir sofort ein seltsamer Name, "Shiretoko", auf. Das ist der Release-Name des Firefox 3.5, mit Installation des Paketes "firefox-3.5-gnome-support" hei&szlig;t er nun wieder "Mozilla Firefox". Geblieben ist ein un&uuml;bliches, nicht-originales Logo.</p> <p>Viele meiner Plugins waren bereits f&uuml;r Firefox 3.5 verf&uuml;gbar, die Ubuntu Sprachpakete wurden jedoch nicht automatisch aktualisiert. Eine deutsche Sprachdatei musste ich mir erst suchen und wurde hier f&uuml;ndig: <a href="ftp://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.5.2/linux-i686/xpi/de.xpi" target="_blank">ftp://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.5.2/linux-i686/xpi/de.xpi</a></p> <p>"Tab Mix Plus" zeigt noch einige Probleme wenn es darum geht, die Tabs mehrzeilig anzuzeigen; &ouml;ffnet man zu viele Tabs, verschwinden die untersten Tabs, die &uuml;blichen Scroll-Buttons auf der rechten Seite erscheinen jedoch nicht, sodass man sie nicht hervorholen kann. Erste Abhilfe daf&uuml;r schafft ein Button rechts oben in der Ecke, mit dem man alle ge&ouml;ffneten Tabs auflisten und den gew&uuml;nschten ausw&auml;hlen kann.</p> <p>Ebenfalls auf quasi den ersten Blick ist mir aufgefallen, dass sich Firefox 3.5 in meinem Desktop schwer tat, sich an die geltenden Schriftart-Rendering-Vorgaben zu halten. Eine Google-Trefferliste sp&auml;ter war klar: Viele andere hatten das Problem mit den unansehnlichen, grausam gerenderten Schriftarten auch bemerkt. Gl&uuml;cklicherweise fand sich schnell eine L&ouml;sung: L&ouml;scht man alle mit "10-" beginnenden Symlinks im Ordner "/etc/fonts/conf.d" und rekonfiguriert das Paket "fontconfig", ist das Problem nach einem Neustart des Firefox beseitigt.</p> <pre>sudo rm /etc/fonts/conf.d/10-*<br />sudo dpkg-reconfigure fontconfig<br /></pre> <p>Ein ellenlanger Thread zu diesem Thema, in dem auch diese L&ouml;sung zur Sprache kommt, findet sich hier: <a href="http://ubuntuforums.org/showthread.php?p=7616965#post7616965" target="_blank">http://ubuntuforums.org/showthread.php?p=7616965#post7616965</a></p> <h2>Update</h2> <p>Mein Versuch, eine von der Mozilla-Website heruntergeladene Version des Firefox 3.5 zu verwenden, endete in einer mir bis dato noch nicht bekannten Fehlermeldung. Eine andere Anwendung greife gerade auf eine zu Firefox geh&ouml;rige Datei zu. Deswegen funktioniere das Lesezeichen- und Chronik-System nicht. Nach kurzer Internet-Suche fand ich auf der Mozilla-Support-Seite die L&ouml;sung: Greift kein anderes Programm auf die Dateien zu (Virenscanner, ...) - weil man beispielsweise kein solches hat - kann es helfen, die Dateien "places.sqlite" und "places.sqlite-journal" im Profil-Ordner zu l&ouml;schen.</p> Mon, 31 Aug 2009 14:48:53 +0200http://www.joachim-neu.de/post/98/firefox-35/lighttpd mod_evhost http://www.joachim-neu.de/post/100/lighttpd-mod_evhost/<p>Der HTTP-Server "lighttpd" ist nicht nur aufgrund seiner schon im Namen angedeuteten Sparsamkeit (wenig Rechenlast und geringer Arbeitsspeicherbedarf) &uuml;beraus empfehlenswert. Seine Konfiguration ist ebenso einfach wie genial und flexibel. Allein des "etwas anderen" Ansatzes wegen ist er durchaus einen Nachmittag wert.</p> <p>So kann man beispielsweise mit dem Modul "mod_evhost" einfach eine Umgebung f&uuml;r virtuelles Hosting zu Verf&uuml;gung stellen. Die Hauptverzeichnisse von Domains und Subdomains werden damit einfach mithilfe eines Patterns eingestellt - eine Konfiguration f&uuml;r jede einzelne Domain oder Subdomain entf&auml;llt:</p> <pre>docroot = "/var/www/"<br />evhost.path-pattern = docroot + "/%0/%3/"</pre> <p>Greift man nun z.B. auf die auf den Server gerichtete Domain "www.example.com" zu, wird der Inhalt in "/var/www/example.com/www/" gesucht. Greift man auf "example.com" zu, landet man in "/var/www/example.com//". M&ouml;chte man von dort automatisch auf "www.example.com" weiterleiten, kann man eine Datei "index.php" hinterlegen, die dies mit Header-Angaben bewerkstelligt.</p> <p>Tats&auml;chlich birgt das ganze jedoch auch ein gewisses Risiko. Den Inhalt von "www.example.com" kann man bei dieser Konfiguration auch &uuml;ber "example.com/www" abrufen. Ist auf "www.example.com" beispielsweise eine Django-Installation hinterlegt, k&ouml;nnte man &uuml;ber "example.com/www" Zugriff auf die dahinterstehenden Dateien bekommen. Sind jetzt die Python-Dateien lesbar, ist der Angreifer schnell im Besitz des Datenbankpassworts oder der verwendeten SQLite Datenbank.</p> <p>Um das zu verhindern sollte man den Zugriff auf Unterverzeichnisse der Hauptdomain streng limitieren oder am besten ganz untersagen. M&ouml;chte man f&uuml;r die Hauptdomain nur den Index und die hinterlegte "index.php"-Datei freigeben, geht das allgemein f&uuml;r alle Domains mit folgendem Conditional:</p> <pre>$HTTP["host"] =~ "^([^.]+)\.([^.]+)$"<br />{<br /> $HTTP["url"] !~ "^/(index.php)?$"<br /> {<br /> url.access-deny = ("")<br /> }<br />}<br /></pre> <p>Denkbar w&auml;re auch eine L&ouml;sung die den Zugriff auf Unterordner des Hauptdomainverzeichnisses sperrt.</p> Wed, 02 Sep 2009 23:11:39 +0200http://www.joachim-neu.de/post/100/lighttpd-mod_evhost/yield http://www.joachim-neu.de/post/99/yield/<p>Das Konzept hinter dem Schl&uuml;sselwort "yield" ist ebenso reizvoll und elegant wie auf den ersten Blick kompliziert. Es ist nicht unverzichtbar, macht aber viele Dinge angenehmer zu schreiben und schneller auszuf&uuml;hren.</p> <p>Die folgende, zugegeben etwas unn&uuml;tze Funktion &uuml;berpr&uuml;ft f&uuml;r jedes Element der als erstes Argument &uuml;bergebenen Liste, ob es sich in einen Integer umwandeln l&auml;sst. Alle Elemente auf die dieses Kriterium zutrifft, werden in einer Liste zur&uuml;ckgegeben:</p> <pre>def bsp_func(liste):<br /> elemente = []<br /> for element in liste:<br /> try:<br /> elemente.append(int(element))<br /> except ValueError:<br /> pass<br /> return elemente<br /></pre> <p>&Uuml;ber den R&uuml;ckgabewert dieser Funktion w&uuml;rde man in vielen F&auml;llen in einem Programm wie folgt iterieren:</p> <pre>for e in bsp_func(['foo', 'bar', '32', '23', 'sieben', 'drei', 32, 23, 42]):<br /> print e<br /></pre> <p>Mit "yield" l&auml;sst sich die Beispielfunktion etwas ver&auml;ndern. Statt die Funktion komplett zu durchlaufen und &uuml;ber ihren R&uuml;ckgabewert, eine Liste, zu iterieren, wird mit "yield" ein Generator erzeugt, der nach und nach Elemente ausspuckt, und &uuml;ber diesen iteriert. Praktisch f&uuml;hlt sich das so an, als w&uuml;rde die Funktion immer schrittweise bis zum n&auml;chsten "yield" ausgef&uuml;hrt werden. Das Argument zu "yield" wird dann als das "n&auml;chste Element" des Generators zur&uuml;ckgegeben, solange, bis die Funktion ihr Ende erreicht, keine weiteren Elemente mehr generiert werden und die Iteration endet:</p> <pre>def bsp_func(liste):<br /> for element in liste:<br /> try:<br /> yield int(element)<br /> except ValueError:<br /> pass</pre> <p>Bei der eigendlichen for-Schleife in der Anwendung bedarf es keiner &Auml;nderung - hier verh&auml;lt sich ein von "yield" erzeugter Generator genauso wie ein Iterator oder eine Liste. Der Generator bringt jedoch den Vorteil, dass hier nicht alle Elemente berechnet werden m&uuml;ssen, bevor die for-Schleife anf&auml;ngt, die zur&uuml;ckgegebene Liste abzuarbeiten. Das spart neben ein paar Codezeilen in manchen F&auml;llen Rechenzeit (wenn nicht alle Elemente durchlaufen werden) und im Regelfall Arbeitsspeicher, weil nicht alle Elemente gleichzeitig im RAM gehalten werden m&uuml;ssen.</p> Tue, 01 Sep 2009 21:24:53 +0200http://www.joachim-neu.de/post/99/yield/APT-GPG-Signaturen http://www.joachim-neu.de/post/96/apt-gpg-signaturen/<p>Bei g&auml;ngigen Debian-basierten Distributionen ist es Gang und Gebe, APT-Pakete mit GPG-Signaturen auf &Uuml;bertragungsfehler oder Manipulationen zu &uuml;berpr&uuml;fen. Dazu besitzt jedes System einen &ouml;ffentlichen GPG-Schl&uuml;ssel f&uuml;r das APT-Verzeichnis, mit dem es die Signaturen &uuml;berpr&uuml;fen kann. Die &ouml;ffentlichen GPG-Schl&uuml;ssel werden auf den Installationsmedien mitgeliefert und sind im APT-Paket "debian-archive-keyring" enthalten. &Uuml;ber eine Aktualisierung dieses Pakets k&ouml;nnen regelm&auml;&szlig;ig neue Schl&uuml;ssel verteilt werden um die Angriffswahrscheinlichkeit weiter zu reduzieren. Alte GPG-Schl&uuml;ssel werden dann nichtmehr verwendet und ung&uuml;ltig.</p> <p>Aktualisiert man ein System l&auml;ngere Zeit nicht, kann es passieren, dass man ein Update dieser GPG-Schl&uuml;ssel verschl&auml;ft. Man kann dann die Integrit&auml;t der APT-Pakete nichtmehr verifizieren, weil sie mit einem neuen Schl&uuml;ssel signiert sind, der dem System nicht bekannt ist.</p> <p>Um die neuen GPG-Schl&uuml;ssel zu bekommen, muss man das Paket "debian-archive-keyring" manuell aktualisieren. Hierbei sollte man sicherstellen, dass das Update nicht von einem Angreifer verf&auml;lscht oder durch einen &Uuml;bertragungsfehler beeintr&auml;chtigt wurde, weil sonst die Authenzit&auml;t der APT-Pakete nichtmehr gew&auml;hrleistet werden kann und es einem Angreifer m&ouml;glich ist, manipulierte APT-Pakete unerkannt in das System einzuschleusen.</p> <p>Das Paket aktualisiert man wie folgt:</p> <pre>apt-get install&nbsp; debian-archive-keyring<br /></pre> <p>(Einige Internetquellen empfehlen, auch gleich das Paket "debian-keyring" mitzuinstallieren, bei mir hat es bisher aber stehts ohne funktioniert.)</p> <p>Leider ist es auf diesem Wege nicht m&ouml;glich, die fehlerfreie &Uuml;bertragung des Paketes (das ja selbst aufgrund fehlender Signatur nicht &uuml;berpr&uuml;ft werden kann) zu gew&auml;hrleisten. Alternativ kann man sich das Paket auch manuell von der Repository-Seite der Distribution herunterladen. Dort sollte sich ein Hash-Wert finden lassen, der nach dem Download &uuml;berpr&uuml;ft werden kann. So wird die Integrit&auml;t des Paketes &uuml;berpr&uuml;ft.</p> <p>Dass sich f&uuml;r dieses Problem keine 100%ig zufriedenstellende, garantiert sichere L&ouml;sung finden l&auml;sst, verdeutlicht gut, warum man ein Computersystem stehts mit Sicherheitsupdates versorgen sollte.</p> Sat, 27 Jun 2009 12:47:18 +0200http://www.joachim-neu.de/post/96/apt-gpg-signaturen/mutouch http://www.joachim-neu.de/post/59/mutouch/<p>Nach l&auml;ngerer &Uuml;berlegung, welches Motherboard zusammen mit welchem Massenspeicher und welchem Netzteil nun die optimale Kombination f&uuml;r mein neues Projekt abgeben w&uuml;rde, habe ich mich entschieden, erstmal einen Touchscreen zu kaufen und dann &uuml;ber den Rest nachzudenken.</p> <p>Da neue Touchscreens eine ziemlich teure Angelegenheit werden k&ouml;nnen, habe ich mich entschlossen, einen gebrauchten Touchscreen auf eBay zu kaufen. Nachdem ich als eBay-Neuling erstmal ein paar Auktionen verlohren habe, konnte ich doch ein sch&ouml;nes St&uuml;ck ersteigern.</p> <p>Mein Touchscreen hat 12", ein externes Netzteil, ist per VGA mit dem Rechner verbunden und sendet die Touchdaten via serieller RS232 Schnittstelle an den Rechner. Er ist von der Firma "MicroTouch" bzw. "3M", seit diese den Hersteller aufgekauft haben.</p> <p>Um das schmucke Ding unter Linux im Xorg-Server als Mausersatz verwenden zu k&ouml;nnen, verwendete ich in einer frischen Debian-Etch installation den Treiber "mutouch" aus dem Paket "xserver-xorg-input-mutouch". Nach der Installation</p> <pre>sudo apt-get install xserver-xorg-input-mutouch</pre> <p>editierte ich die Datei /etc/X11/xorg.conf und f&uuml;gte das folgende ein:</p> <pre>Section "InputDevice"<br /> Identifier "TouchScreen"<br /> Driver "mutouch"<br /> Option "Type" "finger"<br /> Option "Device" "/dev/ttyS0"<br /> Option "ScreenNo" "0"<br /> Option "MinX" "0"<br /> Option "MaxX" "16383"<br /> Option "MinY" "0"<br /> Option "MaxY" "16383"<br /> Option "SendCoreEvents" "yes"<br />EndSection</pre> <p>Die zu verwendende serielle Schnittstelle f&uuml;r den Parameter "Device" findet man heraus, indem man den folgenden Befehl mit immer gr&ouml;&szlig;er werdendem x (beginnend bei 0) ausf&uuml;hrt, ein wenig toucht und wenn kryptische Zeichen auf dem Bildschirm erscheinen, hat man die Ger&auml;tedatei gefunden:</p> <pre>cat /dev/ttySx</pre> <p>Au&szlig;erdem f&uuml;gte ich in der Sektion "ServerLayout" in der Xorg-Konfigurationsdatei /etc/X11/xorg.conf noch den folgenden Eintrag hinzu:</p> <pre>Section "ServerLayout"<br /> ...<br /> InputDevice "TouchScreen"<br /> ...<br />EndSection</pre> <p>Der Touchscreen funktionierte daraufhin auf Anhieb, war aber noch etwas ungenau. Zur Kalibrierung verwende ich das Programm "touchcal", das sich ziemlich einfach herunterladen, bauen und ausf&uuml;hren l&auml;sst:</p> <pre>cd /tmp<br />apt-get install build-essential libncurses5-dev<br />wget http://kent.dl.sourceforge.net/sourceforge/touchcal/touchcal-0.31.tar.gz<br />tar -zxf touchcal-0.31.tar.gz<br />cd touchcal-0.31<br />./configure<br />make</pre> <p>Anschlie&szlig;end muss man sich vergewissern, dass der X-Server beendet ist und kein anderes Programm mehr auf die Serielle Schnittstelle zugreift. Dann f&uuml;hrt man "touchcal" aus und folgt den Anweisungen auf dem Bildschirm:</p> <pre>/tmp/touchcal-0.31/touchcal</pre> <p>Die ausgegebenen Werte f&uuml;r MinX, MaxX, MinY und MaxY tr&auml;gt man dann bei den entsprechenden Konfigurationsparametern in der Datei /etc/X11/xorg.conf ein.</p> <p>Startet man nun den X-Server wieder, hat man einen relativ gut kalibrierten und verwendbaren Touchscreen.</p> <p>Mein Gl&uuml;ck aber w&auml;hrte nicht lange. Da Debian Etch aufgrund der vorsteinzeitlichen Programmversionen kaum vern&uuml;nftig einsetzbar ist, habe ich nach kurzer Zeit ein Upgrade auf die n&auml;chste stabile Version "Lenny" durchgef&uuml;hrt. Dabei wurde nicht nur die Datei /etc/X11/xorg.conf zerst&ouml;rt, sodass ich sie neu einrichten musste, auch war fortan die Y-Achse invertiert. Klickte ich also oben, landete der Mauszeiger unten.</p> <p>Weil Optionen wie "SwapY" in der Konfigurationsdatei keine Abhilfe schafften, entschloss ich mich, inden Quellcode des Treibers einzusteigen und die Y-Achse h&auml;ndisch umzudrehen. (Warum es zu diesem seltsamen Fehlverhalten kommt kann ich mir nur damit erkl&auml;ren, dass bei einer Xorg-&Auml;nderung der Ursprung des Koordinatensystems ver&auml;ndert wurde, aber das ist reine Spekulation.) Ich verbrachte also eine weitere Stunde mit dem Lesen des mutouch-Xorg-Treibers, konnte aber letztlich das Fehlverhalten mit einer kleinen &Auml;nderung beseitigen.</p> <p>Zuerst ben&ouml;tigt man eine Kopie des mutouch-Treibers, au&szlig;erdem muss man den alten, im Paket mitgelieferten Treiber entfernen und einige Entwicklerpakete installieren:</p> <pre>cd /root<br />mkdir mutouch<br />cd mutouch<br />apt-get source xserver-xorg-input-mutouch<br />apt-get install xserver-xorg-dev pkg-config<br />cd xserver-xorg-input-mutouch*<br />apt-get remove --purge xserver-xorg-input-mutouch</pre> <p>Anschlie&szlig;end wird der Quellcode testweise gebaut und das Kompilat installiert, um zu sehen, ob alle Pakete da sind und keine generellen Probleme auftreten:</p> <pre>./configure<br />make<br />make install</pre> <p>Anschlie&szlig;end bearbeitet man die Datei src/xf86MuTouch.c:</p> <pre>nano src/xf86MuTouch.c</pre> <p>Hier erg&auml;nzt man die Zeile 746, die urspr&uuml;nglich so aussieht:</p> <pre>cur_y = WORD_ASSEMBLY(start_ptr[3], start_ptr[4]);<br /></pre> <p>mit einer kleinen Anweisung zu dem Folgenden:</p> <pre>cur_y = (priv-&gt;max_y + priv-&gt;min_y) - WORD_ASSEMBLY(start_ptr[3], start_ptr[4]);</pre> <p>Dann verl&auml;sst man den Editor wieder, erstellt die Bin&auml;rdateien neu, installiert sie wieder und setzt noch einige symbolische Links, damit der Xorg-Server die Dateien auch wirklich findet:</p> <pre>make<br />make install<br />ln -s /usr/local/lib/xorg/modules/input/mutouch_drv.la /usr/lib/xorg/modules/input/mutouch_drv.la<br />ln -s /usr/local/lib/xorg/modules/input/mutouch_drv.so /usr/lib/xorg/modules/input/mutouch_drv.so<br />ldconfig</pre> <p>Was genau der letzte Befehl macht, wei&szlig; ich nicht, es scheint aber mit besser zu gehen als ohne (bzw. ohne garnicht zu gehen), deshalb habe ich ihn verwendet.</p> <p>Nun kann man den X-Server neu starten und, wenn alles gut gelaufen ist, den Touchscreen auch unter neueren Xorg-Versionen ohne invertierte Y-Achse betreiben.</p> <h3>Update</h3> <p>Angeblich ist es auch ohne Treiber&auml;nderungen m&ouml;glich, die Y-Achse zu invertieren, indem man die Werte von MinY und MaxY vertauscht. Vielen Dank an Christian K. f&uuml;r den Hinweis!</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/59/mutouch/signal http://www.joachim-neu.de/post/95/signal/<p>Signale sind integrer Bestandteil der Interprozesskommunikation unter unixoiden Betriebssystemen wie Linux. Hier verwendet man Signale beispielsweise, um schlafende Prozesse anzusto&szlig;en und sie so dar&uuml;ber zu informieren, dass ein Timer abgelaufen ist oder man sie gerne beenden w&uuml;rde. Um das zu realisieren kann das Programm Signal-Handler registrieren, Funktionen, die aufgerufen werden, sobald dieses oder jenes Signal eintrifft. Au&szlig;erdem wird die Systemfunktion "pause" verwendet, um die Programmausf&uuml;hrung solange anzuhalten, bis eines der gefragten Signale eintrifft.</p> <p>Auch f&uuml;r Python gibt es eine Bibliothek, mit der man Signal-Handler registrieren und die "pause"-Funktion verwenden kann. Das Paket hei&szlig;t "signal" und enth&auml;lt neben einigen Konstanten f&uuml;r die numerischen Werte der Signale unter Anderem die beiden Funktionen "signal" und "pause".</p> <p>Mit "signal" kann man einen Signal-Handler registrieren:</p> <pre>import signal<br /><br />def mein_signal_handler(*args):<br /> print 'signal erhalten!'<br /><br />signal.signal(signal.SIGUSR1,mein_signal_handler)<br /><br />import time<br />time.sleep(3600)<br /></pre> <p>Schickt man dem Programm nun eines der Signale, f&uuml;r die es einen Handler registriert hat (im Beispiel USR1), wird dieser aufgerufen. Die letzten beiden Zeilen sorgen daf&uuml;r, dass sich das Programm nicht nach dem registrieren des Signal-Handlers automatisch beendet. Das Warten bei "time.sleep" wird jedoch beim Empfangen eines Signales abgebrochen. Signale kann man unter Linux mit dem Kommandozeilenprogramm "kill" verschicken:</p> <pre>kill -SIGUSR1 [PID des Programmes]<br /></pre> <p>Hat man ein Programm, dass st&auml;ndig im Hintergrund l&auml;uft (Daemon) und dort schl&auml;ft, bis eine Aufgabe eintrudelt, was ihm von einem Signal mitgeteilt wird, ist eine Endlosschleife zusammen mit der Funktion "pause" sinnvoll. Mit ihr kann sich das Programm solange schlafen legen, bis es eines der gew&uuml;nschten Signale erh&auml;lt, sich dann dar&uuml;ber erkundigen, was ansteht, die Aufgabe ausf&uuml;hren, und sich anschlie&szlig;end wieder schlafen legen:</p> <pre>import signal<br /><br />def mein_signal_handler(*args):<br /> print 'Signal erhalten!'<br /><br />signal.signal(signal.SIGUSR1,mein_signal_handler)<br /><br />while 1:<br /> signal.pause()<br /> print 'Aufgewacht, an die Arbeit!'<br /> print '...'<br /> print 'Fertig!'</pre> <p>Diesem Programm kann man beliebig oft das Signal schicken, es wird jedes Mal wieder aufwachen, die anstehende Aufgabe abarbeiten und sich wieder schlafen legen.</p> <p>Vielen Dank an der Stelle an meinen Freund Thomas, der mir das Modul "signal" gezeigt hat.</p> Wed, 03 Jun 2009 16:41:01 +0200http://www.joachim-neu.de/post/95/signal/subprocess http://www.joachim-neu.de/post/94/ospopensubprocess/<p>Einen neuen Prozess in einem Python-Script zu starten und dessen Standardein- und -ausgabe als Datei-&auml;hnliche Objekte zu bekommen, um ihn mit Eingaben zu f&uuml;ttern oder seine Ausgaben mit der Zeit weiterzuverarbeiten, ging in Python zum Beispiel so:</p> <pre>import os<br />stdin, stdout = os.popen2('ls -lA')<br /></pre> <p>Wer das macht, bekommt nun eine Warnung vorgesetzt:</p> <pre>__main__:1: DeprecationWarning: os.popen2 is deprecated.&nbsp; Use the subprocess module.<br /></pre> <p>Es wird empfohlen, anstelle der bisherigen Vorgehensweise fortan das Modul "subprocess" und die darin definierte Klasse "Popen" zu verwenden. Hierbei erzeugt man zuerst eine Instanz dieser Klasse indem man dem Konstruktor alle notwendigen Informationen mitgibt, zum Beispiel den Namen des aufzurufenden Programms, wie er mit den Pipes zu verfahren hat und wie gro&szlig; die zu verwendenden Puffer gew&auml;hlt werden sollen. Ein &Auml;quivalent zum oben aufgef&uuml;hrten Beispiel k&ouml;nnte so aussehen:</p> <pre>import subprocess<br />process = subprocess.Popen('ls -lA', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True)<br />stdin, stdout = process.stdin, process.stdout<br /></pre> <p>Auf den ersten Blick f&auml;llt auf, dass der Code ein gutes St&uuml;ck l&auml;nger als der vorherige Code ist. Da "subprocess" aber als Ersatz zu einer Reihe von Funktionen gedacht ist, ist davon auszugehen, dass an dieser Stelle Generalisierungen und Vereinfachungen geplant sind, die das unn&ouml;tige Durcheinander an verschiedenen aber &auml;hnlichen Funktionen zugunten einer einzigen, flexiblen Implementation beseitigen sollen.</p> Tue, 02 Jun 2009 19:46:37 +0200http://www.joachim-neu.de/post/94/ospopensubprocess/pickle http://www.joachim-neu.de/post/92/pickle/<p>Wer pl&ouml;tzlich beispielsweise aufgrund einer &Auml;nderung in einem verwendeten Framework oder einer verwendeten Bibliothek gezwungen ist, eine alte Objekt-spezifische Pickle-Anpassung mit __setstate__ und __getstate__ auf eine solche mit __reduce__ umzustellen, kann sich &uuml;bergangsweise eines folgenden Codeschnipsels bedienen:</p> <pre>&nbsp;&nbsp;&nbsp; def __reduce__(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return (self.__class__,(),self.__getstate__())</pre> <p>Damit wird &uuml;ber den Umweg der Methode __reduce__ weiterhin die "alte" Vorgehensweise verwendet.</p> Sun, 17 May 2009 17:35:42 +0200http://www.joachim-neu.de/post/92/pickle/leere Sessions http://www.joachim-neu.de/post/91/leere-sessions/<p>Entgegen meinen Erwartungen wirft Django dem Programmierer keine Exception um die Ohren, wenn es beim Laden (Unpicklen) der Session-Daten auf irgendeinen Fehler st&ouml;&szlig;t. Stattdessen schluckt es etwaige auftretende Fehler und gibt nur eine leere Session zur&uuml;ck. Wer dann verzweifelt in seinem Code nach der Stelle sucht, die ihm vermeintlich alle Session-Informationen zerst&ouml;rt, ist auf dem Holzweg.</p> <p>Ursache f&uuml;r dieses Verhalten ist ein try-except-Statement in der Datei "django/contrib/sessions/backends/base.py":</p> <pre> try:<br /> return pickle.loads(pickled)<br /> # Unpickling can cause a variety of exceptions. If something happens,<br /> # just return an empty dictionary (an empty session).<br /> except:<br /> return {}</pre> <p>Fehler beim Auspacken der Session-Informationen k&ouml;nnen beispielsweise auftreten, wenn Objekt-spezifischer Pickle-Code in __setstate__/__getstate__/__reduce__ nicht fehlerfrei funktioniert.</p> Sun, 17 May 2009 17:29:45 +0200http://www.joachim-neu.de/post/91/leere-sessions/less http://www.joachim-neu.de/post/88/less/<p>L&auml;sst sich beispielsweise die Ausgabe von "man" unter Debian nicht bequem hoch und runter scrollen, fehlt mit gro&szlig;er Wahrscheinlichkeit das Paket und gleichnamige Konsolen-Programm "less", das die f&uuml;r die Ausgabe von vielen Textzeilen in &uuml;berlangen Bildschirminhalten n&ouml;tige M&ouml;glichkeit, hoch und runter zu scrollen, liefert. Das Paket l&auml;sst sich einfach und schnell &uuml;ber die Standardquellen nachinstallieren.</p> <pre>sudo apt-get install less</pre> Sat, 16 May 2009 18:12:42 +0200http://www.joachim-neu.de/post/88/less/Ubuntu 9.04 &quot;Jaunty&quot; http://www.joachim-neu.de/post/87/ubuntu-904-jaunty/<p>Vor einigen Wochen schon habe ich, p&uuml;nktlich zum Release, mein System auf Ubuntu 9.04 "Jaunty" geupdatet. Danach war ich einige Stunden damit besch&auml;ftigt, mein System wieder zu dem zu machen, was es davor war. Die Neuerungen in Jaunty waren dabei nicht immer hilfreich.</p> <h2>DontZap</h2> <p>Der Xorg-Server von Ubuntu 9.04 hat standardm&auml;&szlig;ig die Tastenkombination STRG + ALT + BACKSPACE deaktiviert. So ist es nichtmehr problemlos m&ouml;glich, einen wild gewordenen X-Server abzuschie&szlig;en, umst&auml;ndliche Umwege werden n&ouml;tig. Diese &Auml;nderung wurde eingef&uuml;hrt, um unerfahrene Benutzer davor zu sch&uuml;tzen, durch eine Tastenkombination versehentlich ihre noch nicht gespeicherten &Auml;nderungen an ge&ouml;ffneten Dateien zu verlieren. Inwieweit es sinnvoll ist, eine gut funktionierende Tastenkombination mit einer nicht bestreitbaren Darseinsberechtigung zu deaktivieren, um das Verhalten eines anderen Betriebssystems nachzuempfinden, ist auch in der Ubuntu Gemeinde weiterhin strittig. Diskussionen dieser Art haben bereits eine lange Tradition (http://www.felix-schwarz.name/files/opensource/articles/Linux_ist_nicht_Windows/). Die folgenden Befehle deaktivieren DontZap und aktivieren so die gewohnte Tastenkombination wieder:</p> <pre>sudo apt-get install dontzap<br />sudo dontzap --disable</pre> <h2>Compiz Key Bindings ...</h2> <p>... sind standardm&auml;&szlig;ig deaktiviert, k&ouml;nnen aber im CompizConfig Settings Manager (CCSM) mit dem Modul "Commands" wieder wie gewohnt aktiviert werden.</p> <h2>Amarok 2</h2> <p>Mit Amarok hatte ich unter Jaunty gleich mehrere Probleme. Zuerst ging die Audioausgabe nicht, was nach etwas Recherchieren mit dem Installieren eines Paketes gel&ouml;st werden konnte:</p> <pre>sudo apt-get install phonon-backend-xine</pre> <p>Deutlich komplizierter (und letztlich auch fatal) stellte sich dagegen das Problem "Amarok 2" heraus. W&auml;hrend Amarok zwar auf meinem Desktop etwas tr&auml;ge reagierte und bisweilen das gesamte System kurzzeitig einfrohr, zeigte sich Amarok 2 &uuml;berladen mit einer Menge unn&ouml;tigen Schnickschnacks, weniger Konfigurationsm&ouml;glichkeiten, sodass das grundlegende Umkonfigurieren nicht m&ouml;glich war, und essenziellen aber nicht vorhandenen (oder nicht auffindbaren) Features wie einer nach Album/Interpret/Genre sortierbaren Ansicht aller St&uuml;cke in einer Playlist. Amarok habe ich deshalb recht bald restlos entfernt und durch Rhythmbox ersetzt.</p> <h2>Pidgin</h2> <p>Zwar zeigt Pidgin eine vorbildliche Integration in das sehr nett anzuschauende neue Notification-System von Jaunty, allerdings ist mir die Standardeinstellung etwas zu unruhig. Hat man eine recht gro&szlig;e Kontaktliste vergehen kaum drei Minuten ohne einen Kontakt der online oder offline geht, immer begleitet von einer Benachrichtigung, die zwar sch&ouml;n anzuschauen, zu h&auml;ufig angezeigt aber st&ouml;rend und ablenkend ist. Wann eine Benachrichtigung erscheint kann man gl&uuml;cklicherweise einstellen. Dazu markiert man im Plugin-Dialog (STRG + U) das Plugin "libnotify Popups" und konfiguriert das Plugin nach den eigenen W&uuml;nschen.</p> Sat, 16 May 2009 00:40:57 +0200http://www.joachim-neu.de/post/87/ubuntu-904-jaunty/&quot;externe&quot; Scripte http://www.joachim-neu.de/post/86/externe-scripte/<p>Manchmal m&ouml;chte man ein kleines Script f&uuml;r irgendeine meist einmalige Datenverarbeitung auf bestehende oder neu zu schaffende Django-Datenbest&auml;nde anwenden. Dabei muss man sich nicht unbedingt mit der Integration des fertigen Scriptes in die Django-Installation (als View oder manage.py-Erweiterung) besch&auml;ftigen.</p> <p>Django l&auml;sst sich auch von au&szlig;en "anzapfen". N&ouml;tig ist dazu nur eine Konsole, die sich in dem obersten Projektverzeichnis befindet, und das Script selbst, das hier liegen muss.</p> <p>Um den Zugriff auf die Daten des Django-Projektes zu erm&ouml;glichen, muss die Django-Bibliothek Informationen &uuml;ber die Einstellungen eben jenes Projektes erhalten, also wissen, wo und wie sie die Datei "settings.py" finden kann. Diese Information wird &uuml;ber eine Umgebungsvariable &uuml;bergeben, was, wenn man sich in dem obersten Projektverzeichnis befindet, so funktioniert:</p> <pre>DJANGO_SETTINGS_MODULE='settings'<br />export DJANGO_SETTINGS_MODULE</pre> <p>Anschlie&szlig;end startet man das Script, in dem beispielsweise Django-Models importiert werden, wie gewohnt.</p> Sat, 16 May 2009 00:15:26 +0200http://www.joachim-neu.de/post/86/externe-scripte/jQuery http://www.joachim-neu.de/post/85/jquery/<p>Die JavaScript Bibliothek jQuery liefert insbesondere eine Menge sch&ouml;ne grafische Effekte die einfach und und unkompliziert eingebaut werden k&ouml;nnen, ohne sich den Overhead einer riesigen Bibliothek mit einer gro&szlig;en Menge unbenutzter Funktionen in's Haus zu holen.</p> <p>http://www.jquery.com/</p> <p>Zwei sch&ouml;ne Beispiele, wie einfach sich mit jQuery nette grafische Effekte und Spielereien machen lassen, sind die jQuery Plugins "Cycle" (http://malsup.com/jquery/cycle/) und "jCarousel" (http://sorgalla.com/projects/jcarousel/).</p> <p>"Cycle" ist besonders geeignet f&uuml;r ansehnliche Diashows w&auml;hrend "jCarousel" sich beispielsweise zur Bilderauswahl oder als Bilderstreckenvorschau einsetzen l&auml;sst. Beide Plugins lassen sich jedoch auch anderweitig vielseitig verwenden.</p> Sat, 16 May 2009 00:06:37 +0200http://www.joachim-neu.de/post/85/jquery/auto_now_add http://www.joachim-neu.de/post/84/auto_now_add/<p>Die Eigenschaft "auto_now_add", die bei Date(Time)-Feldern daf&uuml;r sorgt, dass dort beim Erzeugen des Objektes der aktuelle Zeitpunkt festgehalten wird, sorgt immer wieder f&uuml;r Probleme im Zusammenhang mit Django's Administrationsmen&uuml;. So ist es hier nicht m&ouml;glich, Felder mit dieser Eigenschaft in den Erstellungs- und Bearbeitungsformularen auftauchen zu lassen.</p> <p>Weil die derzeitige Umsetzung der "auto_now_add"-Funktion und &auml;hnlicher Eigenschaften immerwieder Ursache von Problemen und Unstimmigkeiten ist, suchen Django Entwickler offenbar schon l&auml;nger nach einer guten Alternative.</p> Fri, 15 May 2009 23:53:33 +0200http://www.joachim-neu.de/post/84/auto_now_add/ntfsprogs http://www.joachim-neu.de/post/83/ntfsprogs/<p>Zwar kann Ubuntu standardm&auml;&szlig;ig NTFS-Datentr&auml;ger einbinden, zum Formatieren (anlegen eines Dateisystems auf einer Partition) ben&ouml;tigt man jedoch das Programm "mkfs.ntfs", das im Paket "ntfsprogs" enthalten ist. Das Paket l&auml;sst sich mit diesem Befehl aus den Ubuntu-Repositories installieren:</p> <pre>sudo apt-get install ntfsprogs</pre> Fri, 15 May 2009 23:42:18 +0200http://www.joachim-neu.de/post/83/ntfsprogs/Me-TV http://www.joachim-neu.de/post/56/me-tv/<p>Eine ernsthafte Alternative zu bekannten Gr&ouml;&szlig;en wie Kaffeine im Bereich der freien Fernseh-Software stellt inzwischen auch das Projekt "Me-TV" dar. Es zeichnet sich insbesondere durch einen zuverl&auml;ssigen, voll funktionst&uuml;chtigen EPG (= Electronic Program Guide) aus. Dieser enth&auml;lt Informationen &uuml;ber die aktuelle Sendung und das Programm der nahen Zukunft und erspart somit den Blick in die Fernsehzeitung oder ziel- und planloses Hin-und-Her-Zappen.</p> <p>Installieren l&auml;sst sich Me-TV bequem per APT. Es ist seit Ubuntu Hardy in den Repositories enthalten.</p> <pre>sudo apt-get install me-tv</pre> <p>Sollte das Programm beim Hochfahren nicht alle in der Region verf&uuml;gbaren Sender finden, lohnt sich das Suchen nach einer geeigneten "channels.conf"-Datei im Internet. Eine der ersten Anlaufstellen f&uuml;r diese Suche sollte die folgende Seite sein:</p> <p>http://wiki.ubuntuusers.de/dvb-utils</p> <p>Hat man eine geeignete Datei gefunden, speichert man sie im Ordner ".me-tv" im Home-Verzeichnis des eigenen Benutzers als "channels.conf" ab und startet Me-TV neu.</p> <pre>cp heruntergeladene_channels.conf ~/.me-tv/channels.conf</pre> <h2>Update</h2> <p>In der Standardeinstellung hat Me-TV die unbequem aufdringliche Eigenschaft, immer im Vordergrund zu verweilen. Dieses Verhalten kann man ihm aber sehr schnell unter dem Men&uuml;punkt "Ansicht" beim Eintrag "Einstellungen" abgew&ouml;hnen, indem man den Haken bei "Immer im Vordergrund" entfernt.</p> <h2>Update 2</h2> <p>Unter Ubuntu 9.04 "Jaunty" ist Me-TV (genauer gesagt das von Me-TV verwendete Backend "xine") so konfiguriert, dass die Mute-Option die gesamte Audioausgabe des Systems stumm schaltet. Das ist unangenehm, wenn man w&auml;hrend Werbepausen einfach den Sound abschalten und z.B. Musik h&ouml;ren m&ouml;chte. In Launchpad existiert bereits ein Bug-Report (#331452) zu diesem Thema, der auch eine L&ouml;sung enth&auml;lt. Mit folgendem Befehl l&auml;sst sich die Mute-Funktion nur auf Me-TV begrenzen:</p> <pre>echo "gui.audio_mixer_method:Software" &gt;&gt; ~/.me-tv/xine.config<br /></pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/56/me-tv/Inkscape Oversampling http://www.joachim-neu.de/post/82/inkscape-oversampling/<p>Wenn die von Inkscape als PNG exportierten Bilder an den R&auml;ndern von eingef&uuml;gten Rastergrafiken oder weichgezeichneten Fl&auml;chen pixelig sind, k&ouml;nnte ein ung&uuml;nstig konfiguriertes Oversampling Ursache daf&uuml;r sein.</p> <p>Es lohnt sich dann, einen Blick in die Einstellungen (STRG + SHIFT + P) "Sonstiges" zu werfen und dort unter Umst&auml;nden den Wert f&uuml;r Oversampling nach oben zu korrigieren.</p> Fri, 15 May 2009 23:34:49 +0200http://www.joachim-neu.de/post/82/inkscape-oversampling/Deutscher Bundestag !? http://www.joachim-neu.de/post/81/bundestag/<p>Du hast geglaubt der Bundestag w&auml;re in diesem viereckigen gro&szlig;en Geb&auml;ude mit der durchsichtigen begehbaren Glaskuppel? Weit gefehlt!</p> <p>Bei meiner Berlin-Reise bin ich, nicht weit von eben beschriebenem Geb&auml;ude am Fluss gelegen, auf das tats&auml;chliche Parlamentsgeb&auml;ude gesto&szlig;en!</p> <p>Anmerkung: Es handelt sich hierbei nicht um Fotomontage!</p> <p><img src="../../../../../res/pictures/bundestag_web.jpg" alt="" /></p> Fri, 15 May 2009 23:28:29 +0200http://www.joachim-neu.de/post/81/bundestag/*-html-Hack http://www.joachim-neu.de/post/52/html-hack/<p>Manchmal hilft alles Tricksen nichts, man muss zwangsl&auml;ufig getrennte CSS-Regeln f&uuml;r Internet Explorer Version 6 und &auml;lter und aktuelle Browser definieren.</p> <p>Eine offenbar sehr verl&auml;ssliche Methode dazu ist der sogenannte "Star-HTML-Hack". Dabei setzt man vor die CSS-Regeln "* html ". Die Regeln werden dann also nur auf alle Elemente angewendet, die sich irgendwo unterhalb eines HTML-Elements befinden was sich wiederrum irgendwo unterhalb irgendeines Elements befindet. Das macht nat&uuml;rlich keinen Sinn, denn das HTML-Element hat im Regelfall kein &uuml;bergeordnetes Element, es ist das sogenannte "Root-Element" der Datei.</p> <pre>div p { [irgendwelche Definitionen] }</pre> <p>wird zu</p> <pre>* html div p { [irgendwelche IE&lt;=6-spezifischen Definitionen] }</pre> <p>Das st&ouml;rt allerdings alle alten Internet Explorer vor und mit Version 6 herzlich wenig. Darum ersetzt diese Methode zuverl&auml;ssig so manche Browserweiche.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/52/html-hack/Events http://www.joachim-neu.de/post/75/events/<p>Einem gro&szlig;en Irrtum l&auml;uft auf, wer glaubt, die Inkompatibilit&auml;ten unter den Browsern erstreckten sich nur auf (X)HTML und CSS. Auch JavaScript ist in einigen Bereichen betroffen. Einer davon ist die Behandlung von Ereignissen, die, meist durch Nutzereingaben, auftreten.</p> <p>FireFox beispielsweise &uuml;bergibt einem Event-Handler als Parameter ein Event-Objekt, das genauere Informationen &uuml;ber das aufgetretene Ereignis enth&auml;lt. Es liefert zum Beispiel Informationen, um welches Event es sich handelt und auf welchem HTML-Objekt es ausgel&ouml;st wurde.</p> <p>Der InternetExplorer verlangt von Event-Handlern, dass sie das Event aus "window.event" auslesen. Dort hinterlegt ist ebenfalls ein Event-Objekt, das &auml;hnliche Informationen wie das des FireFox bereitstellt.</p> <p>Die beiden Event-Objekte unterscheiden sich aber nicht zuletzt in einigen Attributsnamen. Findet der im FireFox ausgef&uuml;hrte Event-Handler das das Event betreffende HTML-Element unter "event.target", muss er im InternetExplorer unter "event.srcElement" suchen. Und Safari hat die Information in "event.parentNode" versteckt, allerdings nur, wenn "event.nodeType" 3 ist. Sonst findet man den Wert ebenfalls in "event.target".</p> <p>Ein Event-Handler, der auf den verbreitetesten Browsern funktionieren sollte, k&ouml;nnte beispielsweise so aussehen:</p> <pre>function MyHandler(event) {<br />&nbsp;&nbsp;&nbsp; if(!event)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event = window.event;<br />&nbsp;&nbsp;&nbsp; if (event.target)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = event.target;<br />&nbsp;&nbsp;&nbsp; else if (event.srcElement)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = event.srcElement;<br />&nbsp;&nbsp;&nbsp; if (target.nodeType == 3)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = target.parentNode;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; // hier steht der eigendliche Code<br />&nbsp;&nbsp;&nbsp; // des Event-Handlers, der mit<br />&nbsp;&nbsp;&nbsp; // "event" und "target" hantiert<br />}</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/75/events/fURLEncode http://www.joachim-neu.de/post/28/furlencode/<p>Fr&uuml;her, als das Internet noch exklusiv im amerikanischen und europ&auml;ischen Sprachraum mit den lateinischen Buchstaben eingesetzt wurde, war noch alles gut. Man hatte ASCII als Zeichenstandard definiert, jeder wusste damit umzugehen und niemand hatte Probleme. Doch dann kam eines Tages (wer h&auml;tte das gedacht?!) der Rest der Welt auch auf die Idee, Computer und das Internet verwenden zu wollen. Nachdem aber nicht der Rest der Welt Lust hatte, erstmal Englisch oder eine andere europ&auml;ische Sprache zu lernen, wurde die Forderung laut, doch auch Zeichen und Symbole aus anderen Sprachen verwendbar zu machen. Das war mit ASCII nicht machbar und so begann der Wald der Zeichenkodierungen zu sprie&szlig;en. Heute ist er so gro&szlig;, dass kaum mehr einer durchblickt, und trotzdem setzen die Internet-Protokolle zumeist noch auf ASCII auf.</p> <p>M&ouml;chte man nun also beispielsweise eine arabische Wikipedia-Seite aufrufen, stellt sich die Frage, wie man arabische Zeichen &uuml;ber das HTTP-Protokoll &uuml;bertr&auml;gt, das doch eigendlich nur f&uuml;r ASCII gebaut war.</p> <p>Daf&uuml;r haben sich ein paar schlaue K&ouml;pfe etwas mehr oder minder Schlaues ausgedacht. Man repr&auml;sentiert den zu &uuml;berliefernden String im entsprechenden Zeichensatz der Seite als Abfolge von Bin&auml;rdaten, schreibt alle Zeichen, die vom ASCII-Standard abweichen, hexadezimal, setzt jeweils ein Prozentzeichen davor und gut ist. Auf diesem Weg werden auch anderweitig kritische Zeichen mit Sonderbedeutungen in URLs (@, &amp;, Leerzeichen, ...) gut umschifft.</p> <p>Aus einem Leerzeichen mit dem ASCII Wert 32 wird somit %20, was letztendlich dann &uuml;bertragen wird.</p> <p>Muss man nun beispielsweise in Python eine Internet-Seite aufrufen und die URL enth&auml;lt an falscher Stelle derartige Sonderzeichen, so muss man diese escapen. Das geht mit der folgenden Funktion:</p> <pre>def fURLEncode(pString):<br />&nbsp;&nbsp;&nbsp; return ''.join([ '%' + pString.encode('hex')[tNumber:tNumber + 2] for tNumber in range(0,len(pString.encode('hex')),2) ])</pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/28/furlencode/fGetMIME http://www.joachim-neu.de/post/29/fgetmime/<p>Unter Windows erf&auml;hrt man den Typ einer Datei, indem man auf deren letzte Endung (den Teil des Namens hinter dem letzten Punkt) schaut. Ist diese Endung beispielsweise "BMP", handelt es sich um ein Bild, ist sie "WAV", enth&auml;lt die Datei vermutlich Audio-Daten. Dieser "Brauch" reicht weit zur&uuml;ck in die Vergangenheit und hat seine Wurzeln in der DOS-Zeit.</p> <p>Unter Linux kann man den Dateityp beispielsweise mit dem Befehl "file" ermitteln. Dieser untersucht verschiedene Eigenschaften, unter anderem Signaturen, Header und Endungen.</p> <p>Das Ergebnis kann man sich auch als MIME-Type darstellen lassen. Diese MIME-Types sind eine &Uuml;bereinkunft, wie man den Datentyp am besten und eindeutig speichert, und kommen eigendlich aus der Geburtszeit der eMail-Kommunikation. "image/png" bedeutet zum Beispiel, dass es sich um ein Bild des Types "PNG" handelt.</p> <p>Des Befehls "file" bedient sich der folgende Code-Schnipsel, der unter Linux den MIME-Type der &uuml;bergebenen Datei als String zur&uuml;ckgibt.</p> <pre>def fGetMIME(pFile):<br />&nbsp;&nbsp;&nbsp; import os<br />&nbsp;&nbsp;&nbsp; return os.popen2('file -bi "' + pFile + '"')[1].readlines()[0][:-1]</pre> <p>Anmerkung: Es kann passieren, dass der Funktionsaufruf in einer IOError-Exception endet. Diese kann man aber (einigen Internet-Foren zufolge) getrost abfangen und im Sand verlaufen lassen.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/29/fgetmime/httplib (POST) http://www.joachim-neu.de/post/33/httplib-post/<p>Mit der "httplib" lassen sich gut und einfach Internet-Zugriffe &uuml;ber das HTTP-Protokoll realisieren. Spezifiziert man jedoch bei einem POST-Request nicht explizit den MIME-Type der &uuml;bersendeten Daten, f&uuml;hrt das zu einem Fehler, mit dem man leicht einige Zeit verbringen und ihn dennoch nur schwerlich finden kann.</p> <p>Die notwendige Header-Information "Content-Type" kann man jedoch ganz einfach &uuml;ber den vierten Parameter der Abfrage-Methode "request" eines HTTPConnection-Objektes setzen, indem man dem dortigen Dictionary unter dem Key "Content-Type" den Wert "application/x-www-form-urlencoded" abspeichert.</p> <p>Das k&ouml;nnte dann beispielsweise so aussehen:</p> <pre>import httplib<br />Verbindung = httplib.HTTPConnection('myserver.de', 80)<br />Verbindung.connect()<br />Verbindung.request('POST', '/myfile', 'param1=value1&amp;param2=value2', {'Content-Type': 'application/x-www-form-urlencoded'})<br />Response = Verbindung.getresponse() </pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/33/httplib-post/commands http://www.joachim-neu.de/post/35/commands/<p>Vor einiger Zeit bin ich auf eine sehr elegante L&ouml;sung gesto&szlig;en, wie man die Ausgabe von Konsolen-Befehlen als String bekommt. Das Paket "commands" stellt dazu die Funktion "getoutput" zur Verf&uuml;gung.</p> <pre>import commands<br />print commands.getoutput()</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/35/commands/repr() / pprint http://www.joachim-neu.de/post/38/repr-pprint/<p>F&uuml;r ein Projekt habe ich dringend nach einer M&ouml;glichkeit gesucht, Python-Objekte so in Strings zu verwandeln, dass man das erh&auml;lt, was man in den Python-Interpreter eingeben muss, um das entsprechende Objekt zu erzeugen.</p> <p>Die meisten Primitiven (bool, int, float, ...) bringen ein entsprechendes Verhalten, wenn man sie mit str() in einen String umwandelt. Nicht so verh&auml;lt es sich mit Strings, weshalb ich f&uuml;r diese einen Ausnahmefall behandelt habe.</p> <p>Vor Kurzem bin ich dann &uuml;ber die Funktion "repr()" und das Modul "pprint" und dessen Methode "saferepr()" gestolpert. Diesen kann man das Objekt &uuml;bergeben, das man gerne als String-Repr&auml;sentation haben m&ouml;chte, und erh&auml;lt diese dann auch.</p> <pre>import pprint<br />pprint.saferepr(u'Dies ist ein Unicode String.')</pre> <p>Der letzte Befehl gibt folgendes zur&uuml;ck:</p> <pre>"u'Dies ist ein Unicode String.'"</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/38/repr-pprint/property http://www.joachim-neu.de/post/60/property/<p>In der Objekt-orientierten Programmierung (OOP) hat man es mit Objekten zutun, die Attribute und Methoden besitzen und von einer Klasse abstammen. Mit dieser Modellvorstellung lassen sich allt&auml;gliche Probleme sch&ouml;n und anschaulich l&ouml;sen, da auch hier meistens verschiedene Objekte mit verschiedenen Eigenschaften (Attributen) und F&auml;higkeiten (Methoden) vorkommen.</p> <p>Schwierig wird es bei dieser Vorstellung nur immer dann, wenn eine Eigenschaft als solche nicht als Attribut gespeichert werden kann (oder soll), meist, weil dadurch die selbe Information mehrfach an verschiedenen Stellen gespeichert w&uuml;rde. Soetwas vermeiden Programmierer sehr gerne, um Syncronisierungsproblemen vorzubeugen.</p> <p>Nimmt man beispielsweise ein Objekt der Klasse "Kasse", so besitzt dieses verschiedene Eigenschaften (z.B. die Zahl der ein und zwei Euro St&uuml;cke) und Methoden (z.B. etwas wird aus der Kasse genommen oder in die Kasse gelegt). Der Gesamtwert des Geldes in der Kasse w&auml;re eine weitere Eigenschaft, w&uuml;rde man hier aber einen numerischen Wert speichern, m&uuml;sste dieser bei jeder &Auml;nderung der Geldst&uuml;cke ebenfalls neu berechnet und ver&auml;ndert werden. Meist verwendet man deshalb eine Methode statt einer Eigenschaft, die diesen Wert berechnet. Letzteres ist aber nicht naheliegend und st&ouml;rt deshalb die Modellvorstellung.</p> <p>An dieser Stelle hilft einem das Python-Konstrukt "property". Mit diesem kann man eine Eigenschaft erzeugen, die sich auch als solche verwenden l&auml;sst, bei jedem Zugriff diesen aber transparent an eine Funktion weitergibt.</p> <p>Der Sachverhalt l&auml;sst sich am besten an einer konkreten Implementation beschreiben:</p> <pre>class Kasse:<br />&nbsp;&nbsp;&nbsp; ein_euro = 0<br />&nbsp;&nbsp;&nbsp; zwei_euro = 0<br />&nbsp;&nbsp;&nbsp; def _get_gesamtsumme(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self.ein_euro + self.zwei_euro * 2<br />&nbsp;&nbsp;&nbsp; gesamtsumme = property(_get_gesamtsumme)</pre> <p>Erzeugt man nun von dieser Klasse ein Objekt, so hat es unter anderem ein Attribut "gesamtsumme", das immer die korrekte Gesamtsumme ausgibt, ohne, dass diese explizit berechnet werden muss.</p> <pre>kasse = Kasse()<br />kasse.ein_euro = 10<br />kasse.zwei_euro = 10<br />print kasse.gesamtsumme</pre> <p>In meinem Beispiel habe ich nur eine Funktion an "property" &uuml;bergeben, sodass nur das Auslesen des Wertes einwandfrei funktioniert. M&ouml;chte ich die Eigenschaft mit einem neuen Wert &uuml;berschreiben (was in diesem Beispiel nicht sinnvoll ist), ben&ouml;tigt man eine weitere Funktion, ebenso, wenn man auch das L&ouml;schen des Attributes erlauben m&ouml;chte. Weitere Auskunft dazu bekommt man in jeder interaktiven Python-Shell mit dem Befehl "help(property)".</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/60/property/Unicode / MD5 http://www.joachim-neu.de/post/69/unicode-md5/<p>Unterschiedliche Encodings geh&ouml;ren zu den ekligsten und nervigsten Dingen unserer Tage und trotzdem muss man sich in regelm&auml;&szlig;igen Abst&auml;nden immer wieder mit ihnen auseinandersetzen. In Python (Version 2.X) wird man dabei zwar schon an vielen Stellen an die Hand genommen, eine absolut transparente L&ouml;sung gibt es aber erst ab Python 3.0. Wichtigste &Auml;nderung dort: Fortan verwendet Python nichtmehr ASCII als Standardencoding f&uuml;r Bytestrings, sondern UTF-8. Dadurch werden viele Problemchen und Stolperfallen hoffentlich bald endg&uuml;ltig der Vergangenheit angeh&ouml;ren.</p> <p>Aber bis dorthin muss man sich wahrscheinlich noch ein bisschen plagen, beispielsweise, wenn man das Modul "md5" in Python verwendet. Ihm sollte man tunlichst keine Unicode-Strings anbieten, weil diese f&uuml;r das Berechnen des Hashes in ASCII-encodierte Bytestrings umgewandelt werden. Das f&uuml;hrt in den allermeisten F&auml;llen zu Problemen, sp&auml;testens dann, wenn der Unicode-String Zeichen enth&auml;lt, die in ASCII nicht vorgesehen sind.</p> <p>Deshalb schreibt man statt</p> <pre>import md5<br />md5.md5(my_string).hexdigest()</pre> <p>lieber</p> <pre>import md5<br />md5.md5(my_string.encode('utf-8')).hexdigest()</pre> <p>Den Unterschied bemerkt man sp&auml;testens, wenn my_string Sonderzeichen enth&auml;lt.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/69/unicode-md5/python-dsv http://www.joachim-neu.de/post/76/python-dsv/<p>CSV Dateien (Comma Seperated Values) sind beliebt um plattform- und softwareunabh&auml;ngig Daten abzuspeichern und auszutauschen. Eine CSV Datei kann eine Tabelle mit Zeilen und Spalten abbilden. Zeilen sind durch Zeilenumbr&uuml;che voneinander getrennt, Spalten durch ein quasi beliebig w&auml;hlbares Trennzeichen (engl. "delimiter"). Hier kommt bei CSV das Komma zum Einsatz. Die einzelnen Zellen sind meist von Anf&uuml;hrungsstrichen umschlossen.</p> <p>Python ist mit dem Modul "DSV" (Delimiter Seperated Values) in der Lage, unter anderem CSV Dateien zu laden, kann aber beliebige Zeichen als Trennzeichen und zum Umschlie&szlig;en der einzelnen Zellen verwenden.</p> <p>Wei&szlig; man nicht, welches Format die vorliegende Datei hat, bringt DSV passende heuristische Algorithmen mit. Auch integriert ist ein Dialog, der die n&ouml;tigen Parameter vom Anwender abfragt.</p> <p>Das Modul DSV ist unter Ubuntu im APT-Paket "python-dsv" zu finden, das sich leicht wie folgt installieren l&auml;sst:</p> <pre>sudo apt-get install python-dsv</pre> <p>Die grundlegende Handhabung ist simpel. Das Auslesen einer CSV Datei erledigt der folgende Code:</p> <pre>from DSV import DSV<br />datei = open('dateiname.csv','r')<br />data = DSV.importDSV(datei.readlines(), delimiter = ',', textQualifier = '"')</pre> <p>Als Trennzeichen wird hier das Komma (,) verwendet, zum Umschlie&szlig;en von Zellen die doppelten Anf&uuml;hrungsstriche (").</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/76/python-dsv/unichr http://www.joachim-neu.de/post/79/unichr/<p>Das passende Zeichen zum ASCII-Code 65 ist das gro&szlig;e A. Das kann man mit Python relativ einfach herausfinden:</p> <pre>print chr(65)</pre> <p>Inzwischen leben wir aber in 21. Jahrhundert in einer globalisierten Welt mit vielen unterschiedlichen Sprachen und l&auml;ngst ist es nichtmehr jedem computerbenutzenden Erdenb&uuml;rger zuzumuten, extra Englisch oder doch zumindest die lateinischen Buchstaben zu lernen. Die zwingende Konsequenz war die "Erfindung" von Unicode, einem Zeichensatz, der erstmalig genug Platz f&uuml;r alle bislang bekannten Schriftzeichen, auch die deutschen Umlaute, bietet.</p> <p>Die Funktion chr() liefert jedoch nur Zeichen aus dem ASCII-Zeichenraum zur&uuml;ck. M&ouml;chte man auf die Unicode-Zeichen zur&uuml;ckgreifen, muss man sich der Funktion unichr() bedienen:</p> <pre>print unichr(0xC4)</pre> <p>Erstaunlicherweise gibt die Funktion ord() jedoch die Position innerhalb des Unicode-Satzes zur&uuml;ck, kann also auch mit nicht-ASCII-Zeichen umgehen.</p> <pre>print ord(u'&auml;')</pre> <p>Eine solche Anpassung w&auml;re auch f&uuml;r chr() w&uuml;nschenswert, zumal sich das bisherige Verhalten dadurch nicht ma&szlig;geblich &auml;ndern w&uuml;rde, alter Programmcode also nur in Ausnahmef&auml;llen angepasst werden m&uuml;sste.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/79/unichr/pyhyphen http://www.joachim-neu.de/post/80/pyhyphen/<p>Bei Silbentrennung steht dem Python-Programmierer die Bibliothek <a href="http://code.google.com/p/pyhyphen/" target="_blank">pyhyphen</a> zur Seite, die jedoch noch keinen Einzug in Debian und Ubuntu gehalten hat. Man muss sie also selbst herunterladen, bauen und installieren.</p> <p>Die Verwendung ist relativ einfach:</p> <pre>import hyphen<br />h = hyphen.hyphenator()<br />h.pairs(u'thunderstorm')</pre> <p>Der letzte Aufruf gibt das silbengetrennte Ergebnis zur&uuml;ck:</p> <pre>[[u'thun', u'derstorm'], [u'thunder', u'storm']]</pre> <p>Die Sprache kann man optional beim Erstellen des Hyphenators angeben:</p> <pre>h = hyphen.hyphenator('de_DE')</pre> <p>Spezifiziert man hier nichts, wird Englisch als Standard angenommen.</p> <p>Um zus&auml;tzliche Sprachen zu installieren, werden die n&ouml;tigen Funktionen direkt mitgeliefert. Sie laden das Sprachpaket aus dem Internet und installieren es automatisch. Dazu sind jedoch "root"-Rechte erforderlich.</p> <p>Hat man Python als "root" gestartet, kann man auf diese Weise Sprachen installieren:</p> <pre>from hyphen import dictools<br />dictools.install('de_DE')<br />dictools.install('it_IT')</pre> <p>Anschlie&szlig;end stehen diese dann bei der Initialisierung des Hyphenators zur Verf&uuml;gung:</p> <pre>import hyphen<br />h = hyphen.hyphenator('de_DE')<br />h.pairs(u'Autowerkstattmechaniker')<br />[[u'Au', u'towerkstattmechaniker'], [u'Auto', u'werkstattmechaniker'], [u'Autowerk', u'stattmechaniker'], [u'Autowerkstatt', u'mechaniker'], [u'Autowerkstattme', u'chaniker'], [u'Autowerkstattmecha', u'niker'], [u'Autowerkstattmechani', u'ker']]</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/80/pyhyphen/Splash-Screen http://www.joachim-neu.de/post/2/splash-screen/<p>Derzeit besch&auml;ftige ich mich ernsthaft damit, den Splash-Screen unter meiner Ubuntu Hardy Installation zum Laufen zu kriegen. Dabei gibt es mehrere Punkte, an denen der Splash-Screen zerst&ouml;rt wird und eine normale Kernel-Ausgabe erfolgt.</p> <p>Eines dieser Probleme, die den Splash-Screen zerst&ouml;ren, ist das Kernel-Modul "padlock". Das Problem sollte nur bei verwendeter Festplattenverschl&uuml;sselung auftreten. Hier versucht der Kernel, die Hardwareverschl&uuml;sselung mit dem "padlock" Modul zu aktivieren, was bei Fehlen dessen in einem Fehler ziemlich zu Beginn des Bootvorgangs resultiert, der den Splash unterbricht. Gel&ouml;st wird dieses Problem einfach, indem dem Kernel gesagt wird, er m&ouml;ge statt dem Modul "padlock" das Modul "sha256_generic" f&uuml;r das Modul "sha256" verwenden.</p> <pre>sudo -s<br />echo -e "\n# padlock splash-screen issue #\nalias sha256 sha256_generic\n" &gt;&gt; /etc/modprobe.d/aliases</pre> <p>Anschlie&szlig;end muss das InitRAMFS neu gebaut werden, damit die ge&auml;nderten Konfigurationsdateien auch dort ber&uuml;cksichtigt werden.</p> <pre>sudo update-initramfs -u -k all</pre> <h3>Update</h3> <p>Einen weiteren Stolperstein auf dem Weg zu einem funktionierenden Splash-Screen insbesondere in rundum Festplatten-verschl&uuml;sselten Umgebungen stellen fehlerhafte "resume" Einstellungen dar. Offenbar dazu gedacht, schlafengelegte Rechner mit einem alten Speicherabbild aus dem Swap-Bereich wieder zum Leben mit selben Zustand wie vor dem Herunterfahren zu erwecken, ben&ouml;tigen sie gleiche Swap-Partitionsangaben in Form von UUIDs in den Dateien "/etc/fstab" und "/etc/initramfs-tools/conf.d/resume", die beim Ausfindigmachen des RAM-Abbildes behilflich sein sollen.</p> <p>Ung&uuml;nstig gestaltet sich dieses Verhalten dann, wenn aufgrund von Swap-Verschl&uuml;sselung sich die UUID der Swap-Partitionen bei jedem Boot-Vorgang &auml;ndert. Dann ist es nicht m&ouml;glich, diese Werte mit der tats&auml;chlichen, von "sudo blkid" zur&uuml;ckgegebenen UUID der Swap-Partition syncron zu behalten, das System wankt, "usplash" verhaspelt sich in einem Speicherzugriffsfehler (Segfault), stirbt daraufhin und der Splash-Screen verschwindet.</p> <p>Die L&ouml;sung ist denkbar einfach und besteht aus dem L&ouml;schen bzw. Umbenennen der Datei "/etc/initramfs-tools/conf.d/resume".</p> <h3>Achtung: Das L&ouml;schen der Datei erfolgt auf eigene Gefahr! Mir ist kein negativer Nebeneffekt bekannt, ich kann einen solchen aber nicht ausschlie&szlig;en und keine Haftung f&uuml;r irgendeine Art von Folgesch&auml;den &uuml;bernehmen!</h3> <pre>sudo rm /etc/initramfs-tools/conf.d/resume</pre> <p>Anschlie&szlig;end sollte der Boot-Splash beim Hochfahren nichtmehr an dieser Stelle zusammenbrechen.</p> <h3>Update 2</h3> <p>Probleme bereitet die Verschl&uuml;sselung ebenso beim Einbinden der &uuml;brigen verschl&uuml;sselten Laufwerke (/home, ...). Auch hier wird der Splash-Screen gest&ouml;rt und man findet sich auf einem Termin wieder. Eine L&ouml;sung f&uuml;r dieses Problem scheint allerdings derzeit noch in weiter Ferne, da grundlegende Probleme bei der Verarbeitung von Passw&ouml;rtern im Splash-Screen-Programm "usplash" in Verbindung mit der Startprozedur bestehen, die dazu f&uuml;hren, dass das Passwort im Klartext in der Konsole erscheint. Wen das nicht sonderlich st&ouml;rt, der kann sein System mit einem Patch so manipulieren, dass der Splash-Screen auch an dieser Stelle wieder funktioniert. Der Patch funktioniert allerdings in den Situationen nicht, wo vorher eine Datentr&auml;ger&uuml;berpr&uuml;fung mit "fsck" durchgef&uuml;hrt wird. Weitere Informationen zu diesem Thema gibt es hier:</p> <p>https://bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/139363</p> <p>Das fehlerhafte Verhalten und die Ausgabe des Passworts im Klartext auf die Konsole konnte ich bei mir nicht nachvollziehen. Der Patch l&auml;sst sich ziemlich einfach anwenden:</p> <pre>wget http://launchpadlibrarian.net/15877400/cryptdisks.functions.patch<br />sudo -s<br />patch /lib/cryptsetup/cryptdisks.functions cryptdisks.functions.patch</pre> <p>Anschlie&szlig;end sollte beim n&auml;chsten Boot-Vorgang alles problemlos verlaufen und das Splash-Screen an dieser Stelle nichtmehr versagen.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/2/splash-screen/EVMS http://www.joachim-neu.de/post/3/evms/<p>Schon seit l&auml;ngerer Zeit bekam ich beim Booten eine lange Liste Fehlermeldungen des device-mappers. (Hier ein Auszug aus dem Syslog.)</p> <pre>Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: 4.7.0-ioctl (2006-06-24) initialised: dm-devel@redhat.com<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:0: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:0: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:0: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:4: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:4: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:4: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:4: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:4: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:4: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:4: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:4: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table<br />Jan 01 00:00:00 localhost kernel: device-mapper: table: 254:4: linear: dm-linear: Device lookup failed<br />Jan 01 00:00:00 localhost kernel: device-mapper: ioctl: error adding target to table</pre> <p>Nach dem Hochfahren waren dann alle beim Hochfahren noch nicht gemounteten Festplatten belegt und mussten erst mit Hilfe dieses Konsolen-Befehls "freigegeben" werden:</p> <pre>sudo dmsetup remove_all</pre> <p>Nach einigen Nachforschungen stellte sich heraus, dass das Paket "evms" (Enterprise Volume Management System) daf&uuml;r verantwortlich war. Dieses hat nach dem Booten alle freien Speichermedien belegt und dabei diese Fehlermeldungen erzeugt.</p> <p>Nach diesem kurzen Konsolenbefehl war der Spuk vorbei:</p> <pre>sudo apt-get remove --purge evms</pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/3/evms/nohup http://www.joachim-neu.de/post/5/nohup/<p>Wer kennt es nicht, da will man auf einem Server ein Programm &uuml;ber SSH starten, dass sich nicht d&auml;monisieren kann, aber auch nicht beim Beenden der SSH-Verbindung beendet werden soll, und kriegt es mit dem sch&ouml;nen "Parameter" "&amp;" am Ende des Konsolen-Befehls einfach nicht hin.</p> <p>In solchen F&auml;llen hilft der Befehl "nohup". Versehen mit "&amp;" startet dieser ein Programm, bel&auml;sst aber das SSH-Terminal benutzbar. Au&szlig;erdem wird das Programm beim Beenden der Verbindung nicht abgew&uuml;rgt.</p> <p>Eingesetzt wird "nohup" wie "sudo":</p> <pre>nohup [zu startendes Programm]</pre> <p>Weitere Informationen enth&auml;lt man in der zugeh&ouml;rigen "man"-Page mit:</p> <pre>man nohup</pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/5/nohup//dev/loopX http://www.joachim-neu.de/post/6/dev-loopx/<p>Nicht selten ist es unter Linux notwendig oder n&uuml;tzlich, Device-Files zu haben, die ihre Informationen aus einem Image laden bzw. in dieses reinspeichern. Damit lassen sich beispielsweise transparente Container-Verschl&uuml;sselungen oder Laufwerke simulieren.</p> <p>Dazu verwendet man Loop-Devices, die vom Kernelmodul "loop" zur Verf&uuml;gung gestellt werden. Standardm&auml;&szlig;ig werden bei der Installation 8 solcher Devices angelegt, die darauf warten, mit einem Image verkn&uuml;pft zu werden.</p> <p>Das n&auml;chste ungenutzte Device-File findet sich mit diesem Befehl:</p> <pre>sudo losetup -f</pre> <p>Mit diesem Befehl verkn&uuml;pft man ein Loop-Device und ein Image:</p> <pre>sudo losetup [Ger&auml;te-Datei] [Image-Datei]</pre> <p>Das Ger&auml;t l&auml;sst sich mit diesem Befehl wieder freigeben:</p> <pre>sudo losetup -d [Ger&auml;te-Datei]</pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/6/dev-loopx/15a4:9020 http://www.joachim-neu.de/post/7/15a4-9020/<p>Schon seit l&auml;ngerer Zeit wollte ich mir einen TV-USB-Stecker f&uuml;r meinen PC besorgen, um endlich auf dem Desktop fernsehen zu k&ouml;nnen. Nachdem das analoge Fernsehen wohl in den n&auml;chsten Jahren abgeschaltet werden wird, entschied ich mich, einen DVB-T-Stecker zu kaufen. Nachdem ich &uuml;ber l&auml;ngere Zeit versucht hatte, einen USB-Stecker zu erhaschen, der von LinuxTV (www.linuxtv.org) unterst&uuml;tzt wird, gelang mir dies nun endlich.</p> <p>Ich steckte also voller Erwartungen mein neues Ger&auml;t (DeLock USB 2.0, USB-ID 15a4:9020) in den PC. Selbstverst&auml;ndlich wurde er nicht automatisch installiert und eingerichtet (was ich auch nicht erwartet hatte), also suchte ich im Internet nach Anleitungen zur Installation. Nach ein bisschen Suchen und ausprobieren gelang es mir mit den folgenden Befehlen, den Treiber zu compilieren und zu installieren.</p> <pre>mkdir linuxtv-af9005<br />cd linuxtv-af9005<br />sudo apt-get install mercurial linux-headers-$(uname -r) build-essential gcc make<br />wget http://ventoso.org/luca/af9005/af9005.fw<br />sudo mkdir /lib/firmware/$(uname -r)<br />sudo cp af9005.fw /lib/firmware/$(uname -r)/af9005.fw<br />hg clone http://linuxtv.org/hg/~manu/af9005<br />cd af9005<br />make<br />sudo make install</pre> <p>(Wenn sich beim "make"en ein Fehler in einer Datei dvb_net.c in Zeile 186 ergibt, hilft es meistens, die entsprechende Zeile einfach auszukommentieren!)</p> <p>Nachdem ich den USB-Dongle ab- und wieder angesteckt hatte, wurde das Ger&auml;t korrekt erkannt und ich konnte im Syslog diese Zeile lesen:</p> <pre>dvb-usb: Afatech DVB-T USB1.1 stick successfully initialized and connected.</pre> <p>Ich installierte also schnell ein DVB-T taugliches TV-Programm (Kaffeine), startete es und f&uuml;hrte den Sendersuchlauf (Tastenkombination C) durch. Zu meiner Ern&uuml;chterung musste ich feststellen, dass keine Sender gefunden wurden. Die Konsole, in der ich Kaffeine gestartet hatte, f&uuml;llte sich stattdessen mit Textbl&ouml;cken dieser Bauweise:</p> <pre>Using DVB device 0:0 "AF9005 USB DVB-T"<br />tuning DVB-T to 401833000 Hz<br />inv:2 bw:0 fecH:9 fecL:9 mod:6 tm:2 gi:4 hier:4<br />. LOCKED.<br />Transponders: 1/189<br />Invalid section length or timeout: pid=17<br />Invalid section length or timeout: pid=0<br />Frontend closed</pre> <p>Im IRC-Channel #linuxtv auf irc.freenode.net:6667 konnte man mir zwar sagen, dass es wohl Probleme mit dem verbauten Hardwaretuner MT2060 bzw. dessen Treiber gab, jedoch nicht, wie ich mein Problem l&ouml;sen kann.</p> <p>Aus diesem Grund hat sich lange Zeit nichts getan und ich hatte meinen DVB-T-Stecker schon f&uuml;r's Erste bei Seite gelegt, als mich gestern eine eMail von einem Leser dieses Beitrags ereilte. Er bedankte sich f&uuml;r die Hilfe, die ihm dieser Eintrag bereitet hatte und hatte eine L&ouml;sung parat, wie auch ich mein DVB-T zum Laufen kriegen kann.</p> <p>Diese bestand daraus, eine geeignete Kanal-Informationsdatei f&uuml;r Kaffeine zu suchen (er hatte freundlicherweise seine bereits beigelegt), in der die Kan&auml;le des eigenen Standorts gelistet sind, und mit dieser dann fern zu sehen.</p> <p>Die Kanalinformationen speichert man einfach in der Datei ~/.kde/share/apps/kaffeine/channels.dvb und schon sollte der Weg zum Fernsehgenuss nach einem Kaffeine-Neustart frei sein.</p> <p>Mit ein wenig Googlen sollte sich f&uuml;r jede Region ein passender Datensatz finden.</p> <p>Weiterf&uuml;hrende Informationen dazu gibt es auch hier:</p> <p>http://wiki.ubuntuusers.de/dvb-utils</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/7/15a4-9020/DMCrypt http://www.joachim-neu.de/post/9/dmcrypt/<p>Den Umstieg meines Desktop-Rechners von Debian Etch auf Ubuntu Gutsy Gibbon nahm ich zum Anlass, mein Betriebssystem mit Ausnahme einer /boot-Partition komplett zu verschl&uuml;sseln.</p> <p>Ein entsprechendes System l&auml;sst sich per Ubuntu-Alternative-CD sehr einfach installieren. Bei der Partitionierung lassen sich manuell Partitionen f&uuml;r Verschl&uuml;sselung anlegen, in die man das System installieren kann.</p> <p>Ein Problem ergab sich bei mir jedoch beim Hochfahren, da das System das zu verwendende Crypto-Laufwerk nicht fand. Zuerst dachte ich, dem Betriebssystemkern w&uuml;rden Module fehlen, die die Verschl&uuml;sselung erst erm&ouml;glichen. Nach genauerem Nachforschen fiel mir aber auf, dass die Module zwar da waren, aber nicht geladen wurden. Somit waren nat&uuml;rlich die zu verwendenden Crypto-Laufwerke in /dev/mapper nicht vorhanden.</p> <p>Ein Freund wusste gl&uuml;cklicherweise Rat. Er wusste, dass man den Kernel beim Booten nur mit den entsprechenden Optionen ausstatten muss, damit dieser sich selbst das verschl&uuml;sselte Root-Filesystem zu einem benutzbaren Pseudo-Device mappt.</p> <p>Das geschah ganz einfach, indem ich in der Datei /boot/grub/menu.lst an meinen zu bootenden Kernel hinten diesen Kernel-Parameter anh&auml;ngte:</p> <pre>cryptopts=source=[Ger&auml;te-Datei der verschl&uuml;sselten Root-Partition],target=[Name der gemappten Root-Partition]</pre> <p>In meinem Fall sah das dann so aus:</p> <pre>cryptopts=source=/dev/sda3,target=sda3_crypt</pre> <p>Der Kernel erstellt dann beim Booten selbstst&auml;ndig ein Device in /dev/mapper, das man mit dem Kernel-Parameter "root" als Root-Filesystem-Partition angeben kann.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/9/dmcrypt/05d8:4003 http://www.joachim-neu.de/post/10/05d8-4003/<p>Auch ich besitze einen Scanner den ich nat&uuml;rlich unter Linux zum Laufen bringen wollte. Zum Gl&uuml;ck fand ich schnell eine passende kurze Anleitung im Internet, wie ich meinen Scanner "Artec E+ 48U" mit der USB-ID 05d8:4003 installieren kann. Diese Anleitung m&ouml;chte ich hier nocheinmal niederschreiben.</p> <p>Zuerst installiert man die notwendigen Pakete:</p> <pre>sudo apt-get install xsane sane libsane</pre> <p>Anschlie&szlig;end legt man die zum Ger&auml;t geh&ouml;rige Treiber-CD in das CD-ROM-Laufwerk und f&uuml;hrt diesen kleinen Codeschnipsel Schritt f&uuml;r Schritt in einer Konsole aus.</p> <pre>sudo mkdir /etc/sane.d/drivers<br />sudo cp /media/cdrom/WinXP/Artec48.usb /etc/sane.d/drivers</pre> <p>Er legt einen neuen Ordner in /etc/sane.d an und kopiert die Treiberdaten von der CD dort hinein.</p> <p>Nun &auml;ndert man nurnoch in der zugeh&ouml;rigen Konfigurationsdatei</p> <pre>/etc/sane.d/artec_eplus48u.conf</pre> <p>die Pfadangabe in Zeile 18 so, dass sie auf den soeben kopierten Treiber zeigt:</p> <pre>option artecFirmwareFile /etc/sane.d/drivers/Artec48.usb</pre> <p>Nun kann man mit dem Programm "xsane" scannen.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/10/05d8-4003/Grub http://www.joachim-neu.de/post/11/grub/<p>Wer kennt das nicht, da richtet man m&uuml;hseelig die einzelnen sorgf&auml;ltig ausgefeilten Boot-Parameter der Kernel in der Datei /boot/grub/menu.lst bei den zugeh&ouml;rigen Eintr&auml;gen ein, weil man beim Hochfahren seine verschl&uuml;sselten Festplatten mounten und einen VESA-Frame-Buffer-Modus verwenden will, dann kommt das n&auml;chste automatische Kernel-Update, die Datei /boot/grub/menu.lst wird neu erzeugt und alles h&auml;ndische Finetuning ist wieder weg.</p> <p>Zum Gl&uuml;ck l&auml;sst sich auch hier Abhilfe schaffen.</p> <p>Nach dem Installieren eines neuen Kernels wird der Befehl "update-grub" ausgef&uuml;hrt, der die Datei /boot/grub/menu.lst neu generiert. Dieser Befehl interpretiert auch ein paar auskommentierte Zeilen im "BEGIN AUTOMAGIC KERNELS LIST"-Bereich, beispielsweise eine Zeile die mit "# kopt" beginnt. Wie man aus dem dar&uuml;berstehenden Kommentar entnehmen kann, lassen sich hier Kernel-Parameter angeben, die automatisch beim Generieren der /boot/grub/menu.lst mit eingebaut werden. Somit ist es m&ouml;glich, die Standard-Kernel-Parameter (auch das Standard-Root-FS-Device!) zu modifizieren und so dauerhaft neue Kernel-Parameter auch f&uuml;r zuk&uuml;nftige Kernel zu setzen.</p> <p>Nach dem Bearbeiten der Datei /boot/grub/menu.lst sollte diese mit dem folgenden Befehl aktualisiert werden:</p> <pre>sudo update-grub</pre> <p>Tipp: In den anderen auskommentierten Zeilen der /boot/grub/menu.lst finden sich auch so manche interessante Features!</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/11/grub/Medibuntu http://www.joachim-neu.de/post/16/medibuntu/<p>Ich geh&ouml;re zu den Leuten, die freie Software sehr sch&auml;tzen, die Thematik aber (meiner Meinung nach) nicht zu ideologisch sehen. Deswegen findet sich auf meiner Festplatte nicht nur "Freie Software" sondern auch das ein oder andere St&uuml;ck sehr n&uuml;tzlicher, "geschlossener" Software.</p> <p>Diese "geschlossene Software" tut sich bei den meisten Distributionen schwer, in die Standard-Repositories zu kommen, erst recht, wenn es gute freie Alternativen gibt.</p> <p>F&uuml;r Ubuntu hat das Projekt "Medibuntu" ein alternatives Zusatzrepo geschaffen, in dem diese Software zu finden ist. Um Softwarepakete aus diesem zu installieren, ben&ouml;tigt der Computer eine Liste der darin verf&uuml;gbaren Pakete. Diese Informationen lassen sich mit den folgenden Befehlen ermitteln und speichern:</p> <pre>su<br />echo -e "\n\ndeb http://packages.medibuntu.org/ gutsy free non-free" &gt;&gt; /etc/apt/sources.list<br />wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- | apt-key add -<br />apt-get update</pre> <p>Nun k&ouml;nnen alle im Repository zug&auml;nglichen Pakete &uuml;ber den gewohnten Weg installiert, deinstalliert und geupdatet werden.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/16/medibuntu/HyperPen http://www.joachim-neu.de/post/17/hyperpen/<p>Vor langer Zeit habe ich mir mal ein Graphics Tablet (Aiptek HyperPen 6000) zugelegt. Ich verwende es zwar nicht h&auml;ufig, in manchen Momenten kann es aber trotzdem eine Hilfe sein. Deswegen habe ich den Entschluss gefasst, es mir auch unter Linux zu installieren, was erstaunlich einfach war.</p> <p>Zuerst installierte ich den zugeh&ouml;rigen Treiber f&uuml;r meinen X-Server, indem ich das Folgende in eine Konsole eingab.</p> <pre>sudo apt-get install xserver-xorg-input-hyperpen</pre> <p>Dann bearbeitete ich die Datei /etc/X11/xorg.conf. In die Sektion "Module" f&uuml;gte ich eine neue Zeile ein:</p> <pre>Load "hyperpen"</pre> <p>Au&szlig;erdem erstellte ich f&uuml;r mein Graphics Tablet eine eigene Sektion in der Datei:</p> <pre>Section "InputDevice"<br /> Identifier "tablet"<br /> Driver "HyperPen"<br /> Option "Device" "/dev/ttyS0"<br /> Option "Mode" "absolute"<br /> Option "Cursor" "Stylus"<br /> Option "XSize" "600"<br /> Option "YSize" "450"<br /> Option "AlwaysCore"<br /> Option "BaudRate" "19200"<br />EndSection</pre> <p>Zuletzt f&uuml;gte ich der Sektion "ServerLayout" eine neue Zeile hinzu:</p> <pre>Inputdevice "tablet"</pre> <p>Nach einem Neustart des X-Servers (z.B. &uuml;ber STRG + ALT + BACKSPACE oder Reboot) war mein Graphics Tablet voll einsatzf&auml;hig.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/17/hyperpen/Pidgin http://www.joachim-neu.de/post/18/pidgin/<p>Gestern habe ich ein Problem mit dem Pidgin-Sound unter Xubuntu Gutsy Gibbon gel&ouml;st. An dem betroffenen Rechner wurden keine Sounds beim Empfangen und Versenden von Nachrichten abgespielt, obwohl die entsprechende Option aktiviert war.</p> <p>Nach einigem erfolglosem Herumprobieren mit den Ausgabemethoden unter "Werkzeuge" &gt; "Einstellungen" &gt; "Sounds" begab ich mich im Internet auf die Suche nach einer L&ouml;sung. Diese war schnell gefunden und bestand aus einem kurzen Workaround.</p> <p>Zuerst installiert man das Programm "bplay" ganz einfach per Konsole:</p> <pre>sudo apt-get install bplay</pre> <p>Anschlie&szlig;end w&auml;hlt man bei den Sound-Einstellungen die Ausgabemethode "Kommando" und w&auml;hlt als Klang-Abspielbefehl "bplay %s".</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/18/pidgin/148f:2573 http://www.joachim-neu.de/post/19/148f-2573/<p>Der WLAN-USB-Stick mit der USB-ID 148f:2573 war nach kurzem Googlen schnell installiert.</p> <p>Leider wird offenbar unter Ubuntu Gutsy Gibbon f&uuml;r die Hardware das falsche Kernelmodul geladen. Das f&uuml;hrt zu Problemen bei der Konfiguration der Hardware.</p> <p>Indem man zwei Kernel-Module "blacklistet", also verhindert, dass sie automatisch geladen werden, gibt man dem mitgelieferten Treiber die Chance, die Kontrolle &uuml;ber das Ger&auml;t zu &uuml;bernehmen und so Wireless-LAN-Funktionalit&auml;t zur Verf&uuml;gung zu stellen.</p> <p>Das Blacklisten erfolgt mit den folgenden Befehlen:</p> <pre>su<br />echo -e "\n\nblacklist rt2x00usb\nblacklist rt2500usb" &gt;&gt; /etc/modprobe.d/blacklist</pre> <p>Nach einem Reboot ist das zugeh&ouml;rige wlanX-Interface dann wie gewohnt konfigurierbar.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/19/148f-2573/Last.FM http://www.joachim-neu.de/post/22/last-fm/<p>Gl&uuml;cklicherweise muss man auch unter Ubuntu nicht auf den Genuss von Last.FM, der "Social Music Revolution", verzichten.</p> <p>Die Installation des Last.FM-Players unter Ubuntu ist kinderleicht. Zuerst f&uuml;gt man die APT-Software-Quellen hinzu, l&auml;d sich den zugeh&ouml;rigen Archiv-GPG-Schl&uuml;ssel herunter und installiert die Player-Software.</p> <pre>su<br />echo -e "\n\ndeb http://apt.last.fm/ debian stable" &gt;&gt; /etc/apt/sources.list<br />wget -q http://apt.last.fm/last.fm.repo.gpg -O- | apt-key add -<br />apt-get update<br />apt-get install lastfm</pre> <p>Anschlie&szlig;end startet man den Player &uuml;ber das Men&uuml;. Wer noch keinen Account hat, hat w&auml;hrend der Einrichtung die M&ouml;glichkeit, sich einen solchen zu erstellen. Zu meinem Erstaunen wird die eingegebene eMail-Adresse nichteinmal verifiziert, sodass man durchaus die M&ouml;glichkeit hat, seine Privatsph&auml;re und sein Postfach hinreichend zu sch&uuml;tzen.</p> <p>Nach dem Einrichten gibt man im Hauptfenster den Namen des K&uuml;nstlers ein, zu dessen Musikfeld man Musik h&ouml;ren m&ouml;chte, und schon geht's los!</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/22/last-fm/AWN http://www.joachim-neu.de/post/23/awn/<p>Sicherheit, Quelloffenheit, Stabilit&auml;t. Das sind nur wenige der zahlreichen Vorteile des freien Betriebssystems Linux. Um aber den Heimanwender zum Verwenden von Linux zu bewegen, muss es sich insbesondere durch sch&ouml;ne grafische Effekte hervortun. Dass Linux lange nichtmehr nur aus einer Konsole und viel verr&uuml;cktem Technikoutput besteht, zeigt neben dem Projekt "Compiz Fusion" auch das Projekt "AWN" (Avant Window Navigator) eindrucksvoll.</p> <p>Es bietet eine leicht erweiter- und installierbare Men&uuml;leiste wie sich in Form des Docks auch unter Mac OS findet. So kann man auch unter Linux in den Genuss sch&ouml;ner Grafikeffekte kommen und ist den Windows-Verfechtern wieder einen Schritt voraus.</p> <p>Installieren l&auml;sst sich AWN unter Ubuntu Gutsy Gibbon ganz bequem &uuml;ber die Konsole mit den folgenden Befehlen:</p> <pre>su<br />echo -e "\n\ndeb http://download.tuxfamily.org/syzygy42 gutsy avant-window-navigator\ndeb-src http://download.tuxfamily.org/syzygy42 gutsy avant-window-navigator" &gt;&gt; /etc/apt/sources.list<br />wget -q http://download.tuxfamily.org/syzygy42/reacocard.asc -O- | apt-key add -<br />apt-get update<br />apt-get install avant-window-navigator-bzr awn-core-applets-bzr</pre> <p>Danach findet sich im Anwendungsmen&uuml; beim Zubeh&ouml;r das Programm "Avant Window Navigator", dass sich mit einem Klick starten l&auml;sst.</p> <p>Tipp: Wenn man au&szlig;erhalb eines Applets im Panel die rechte Maustaste dr&uuml;ckt, gelangt man zu den Einstellungen!</p> <h3>Update</h3> <p>Offenbar haben sich einige APT-Quellen ge&auml;ndert und/oder sind nicht f&uuml;r Ubuntu Hardy verf&uuml;gbar. Darum empfehlen sich alternativ die folgenden APT-Quellen:</p> <pre>deb http://ppa.launchpad.net/reacocard-awn/ubuntu hardy main<br />deb-src http://ppa.launchpad.net/reacocard-awn/ubuntu hardy main</pre> <p>Au&szlig;erdem sollte man das Paket "awn-manager-bzr" noch installieren!</p> <h3>Update 2</h3> <p>Auch mit Ubuntu Intrepid haben sich ein paar Dinge ge&auml;ndert. Wer sich nicht auf die h&auml;ufig ver&auml;nderte "bzr"-Version verlassen m&ouml;chte, kann AWN auch &uuml;ber die normalen Pakete installieren. Man entfernt dazu zuerst alle "bzr"-Pakete und installiert "avant-window-navigator":</p> <pre>sudo apt-get install avant-window-navigator</pre> <p>Wer einige mehr Applets verwenden m&ouml;chte, kann zus&auml;tzlich auch noch die Pakete "awn-applets-c-extras" und "awn-applets-python-extras" installieren.</p> <h3>Update 3</h3> <p>Ubuntu 8.10 "Intrepid" bringt auch einen neuen Shutdown-Mechanismus mit, mit dem das AWN Quit Applet nicht standardm&auml;&szlig;ig umgehen kann. Man kann jedoch &uuml;ber die Eigenschaften (Rechtsklick auf das Icon im Panel) den Befehl spezifizieren, der beim Klicken aufgerufen wird. Stellt man hier den folgenden ein, kann man dieses Applet auch mit dem neuen Shutdown-Mechanismus zum Herunterfahren verwenden:</p> <pre>gnome-session-save --shutdown-dialog</pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/23/awn/CCSM http://www.joachim-neu.de/post/24/ccsm/<p>Um Compiz Fusion (auch bekannt unter dem Namen "Beryl") bequem und umfangreich konfigurieren zu k&ouml;nnen, eignet sich unter Ubuntu das Programm "CompizConfig Settings Manager" (abgek&uuml;rzt "CCSM"). Es verbirgt sich hinter dem Paket "compizconfig-settings-manager", das sich mit dem folgenden Befehl ganz schnell mit einer Konsole installieren l&auml;sst:</p> <pre>sudo apt-get install compizconfig-settings-manager</pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/24/ccsm/Screenlets http://www.joachim-neu.de/post/25/screenlets/<p>Auch unter Linux muss man nicht auf die sch&ouml;nen und teilweise auch n&uuml;tzlichen Widgets und Gadgets (in Form von Uhren, Kalendern etc.) aus der Windows- und MacOS-Welt verzichten.</p> <p>Mit "Screenlets" hat die OpenSource-Gemeinde ein interessantes Projekt hervorgebracht, das sich durchaus mit den F&auml;higkeiten von Widgets und Gadgets aus den Parallelwelten der Fenster und &Auml;pfel messen kann.</p> <p>Leider werden die Screenlets nicht in HTML mit JavaScript verfasst, daf&uuml;r er&ouml;ffnet die verwendete Scriptsprache Python noch weitgehendere M&ouml;glichkeiten und erm&ouml;glichen ebenso einen einfachen Einstieg.</p> <p>Die in den Repositories befindlichen Pakete sind zwar nicht die sch&ouml;nsten, erf&uuml;llen jedoch ihren Zweck hinreichend. Installieren l&auml;sst sich Screenlets &uuml;ber die folgenden Befehle:</p> <pre>su<br />wget http://hendrik.kaju.pri.ee/ubuntu/hendrikkaju.gpg -O- | apt-key add -<br />echo -e "\n\ndeb http://hendrik.kaju.pri.ee/ubuntu/ gutsy screenlets" &gt;&gt; /etc/apt/sources.list<br />apt-get update<br />apt-get install screenlets</pre> <p>Weitere Informationen zu den Screenlets und eine gro&szlig;e Menge einfacher Widgets finden sich unter http://www.Screenlets.org.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/25/screenlets/mencoder http://www.joachim-neu.de/post/27/mencoder/<p>Ich m&ouml;chte an dieser Stelle nicht die Frage nach dem Sinn und Unsinn von gestreamten Audio- und Video-Daten &uuml;ber das Internet beginnen, in vielen F&auml;llen st&ouml;rt es aber, wenn man sich gerne ein Video oder eine Audio-Datei mehrfach ansehen, beliebig darin umher springen und Teile rausschneiden m&ouml;chte. In diesem Fall sind Streams sehr ung&uuml;nstig und man h&auml;tte lieber die komplette Datei auf seiner eigenen Festplatte.</p> <p>Das geht ganz einfach mit dem Kommandozeilen-Programm "mencoder". Der folgende Befehl nimmt den durch die URL &uuml;bergebenen Stream auf und speichert ihn als Video-Datei im MP(E)G-Format als Zieldatei auf der Festplatte.</p> <pre>mencoder [URL] -o [Ziel-Dateiname] -ovc lavc -oac lavc</pre> <h3>Update</h3> <p>M&ouml;chte man die Daten nicht neu kodieren, verwendet man bei den Parametern statt "lavc" lieber "copy", dann werden die Daten unver&auml;ndert geladen und abgepackt. Treten hierbei bei der aufgezeichneten Datei zu Beginn und teilweise auch im weiteren Verlauf Fehler in der Audio-Spur auf, kann man auch "pcm" als Audio-Codec verwenden. Dadurch wird aber die Dateigr&ouml;&szlig;e massiv erh&ouml;ht, weil die Audiodaten unkomprimiert abgespeichert werden.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/27/mencoder/VideoWalker http://www.joachim-neu.de/post/26/videowalker/<p>Der Intenso VideoWalker MP3-Player (der wohl als einer der wenigen MP3-Player auf der Verpackung Linux-Support vermerkt) h&auml;lt sein Versprechen.</p> <p>Nach dem Anstecken an den USB-Anschluss meldet er sich mit der Ger&auml;te-ID 071b:3203 als Wechseldatentr&auml;ger an. Als solchen kann man ihn auch ansprechen und Fotos, Videos, Musik und Texte als einfache Dateien auf ihm abspeichern.</p> <p>Zwar habe ich das mitgelieferte Video-Konvertierungsprogramm nicht getestet, sodass ich hier nichts dar&uuml;ber sagen kann, ob und wie gut es funktioniert, aber der folgende Kommandozeilenaufruf gen&uuml;gt, um Videos in ein f&uuml;r den VideoWalker g&uuml;nstiges Videoformat zu bringen:</p> <pre>mencoder [zu codierende Datei] -o [Dateiname des Resultats] -ffourcc XVID -ofps 18 -vf-add scale=220:176, -vf-add expand=220:176:-1:-1:1,rotate=2,flip -srate 44100 -ovc xvid -xvidencopts bitrate=800:max_bframes=0:quant_type=h263:me_quality=0 -oac lavc -lavcopts acodec=mp2:abitrate=64</pre> <p>Das verwendete Programm "mencoder" befindet sich bei Ubuntu in den Standard-Repositories und kann mit dem folgenden Kommandozeilenbefehl installiert werden:</p> <pre>sudo apt-get install mencoder</pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/26/videowalker/xargs http://www.joachim-neu.de/post/30/xargs/<p>F&uuml;r wenig und mittel komplexe Dateisystemoperationen erfreut sich die Linux-Shell immernoch gr&ouml;&szlig;ter Beliebtheit.</p> <p>Ein besonderst praktischer Befehl ist "xargs". Dieser lie&szlig;t Zeichenketten von STDIN und verwendet diese abh&auml;ngig von seinen Optionen als Parameter einer angegebenen Funktion. Insbesondere in Verbindung mit dem Befehl "find" lassen sich so for-Schleifen und/oder Rekursion ersparen.</p> <p>Der folgende Code l&ouml;scht in allen Unterverzeichnissen des aktuellen Verzeichnisses alle Dateien, die auf ".pyc" enden.</p> <pre>find | egrep .pyc$ | xargs rm</pre> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/30/xargs/Firefox 2 / 3 http://www.joachim-neu.de/post/32/firefox-2-3/<p>Leider bringt Ubuntu 8.04 "Hardy" den f&uuml;nften Beta-Release der neuen dritten Version des bekannten Internet-Browsers FireFox als Standardbrowser f&uuml;r Internet-Seiten mit.</p> <p>Diese mag vielleicht die gesteckten Ziele in Sachen Performance und Leistung erreichen, hat aber f&uuml;r den t&auml;glichen produktiven Einsatz einige gravierende Nachteile. So gleicht der Download-Manager bisher eher einer gro&szlig;en Baustelle als Teil eines fertigen, benutzbaren Produkts. Das gr&ouml;&szlig;te Manko stellt jedoch die fehlende Unterst&uuml;tzung f&uuml;r Plugins dar. Von meinen urspr&uuml;nglich 20 Plugins wurden gerade einmal f&uuml;nf unterst&uuml;tzt. Ohne hilfreiche Plugins wie Tab Mix Plus oder FireBug wird das Surfen zu einer Tortur und man w&uuml;nscht sich nichts sehnlicher als seinen alten FireFox 2 zur&uuml;ck.</p> <p>Das ist nicht so einfach, wie es sein sollte, aber durchaus m&ouml;glich. Mit einem kleinen Kommando-Zeilen-Befehl bringt man den altbekannten FireFox zur&uuml;ck auf die heimische Festplatte:</p> <pre>sudo apt-get install firefox-2</pre> <p>Dieser ist jedoch leider nicht in der Lage, das bisherige Profil zu verwenden. Man startet ihn also mit dem Profil-Manager zu Beginn und erstellt ein neues Profil:</p> <pre>firefox-2 -ProfileManager</pre> <p>Startet man den FireFox 2 nun mit dem neu angelegten Profil, hat man wieder alle M&ouml;glichkeiten wie mit einem taufrischen FireFox 2. Mit wenigen Handgriffen installiert man die n&ouml;tigsten Pakete, die man zum &Uuml;berleben bis zum fertigen FireFox 3 Release braucht, setzt die Startseite unter "Edit" =&gt; "Preferences" neu und importiert die alten Lesezeichen ("Bookmarks" =&gt; "Organize Bookmarks ...").</p> <p>Nun muss man nurnoch unter "System" =&gt; "Einstellungen" =&gt; "Bevorzugte Anwendungen" "firefox-2 %s" als "Benutzerdefiniert"es Programm f&uuml;r Internet-Adressen einstellen und schon ist das Leben leichter.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/32/firefox-2-3/Flash-Audio http://www.joachim-neu.de/post/34/flash-audio/<p>Nach dem Update auf Ubuntu-Hardy hat bei mir die Audio-Ausgabe bei Flash-Applets nichtmehr funktioniert. Nach einigen Recherchen fand ich heraus, dass hierf&uuml;r offenbar ein neues/ver&auml;ndertes Audio-System verantwortlich ist.</p> <p>Um den Fehler zu beheben hat es gen&uuml;gt, das Paket "libflashsupport" zu installieren, was mit dem folgenden kurzen Konsolenbefehl geht:</p> <pre>sudo apt-get install libflashsupport</pre> <h3>Update</h3> <p>Ubuntu 8.10 "Intrepid Ibex" geht auch hier neue Wege. Versucht man, "libflashsupport" zu installieren, bekommt man eine Fehlermeldung und den Hinweis, es mit "flashplugin-nonfree-extrasound" zu versuchen. Dieses Paket l&ouml;st dann auch das Problem.</p> <pre>sudo apt-get install flashplugin-nonfree-extrasound</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/34/flash-audio/OCR http://www.joachim-neu.de/post/36/ocr/<p>Schrifterkennung (OCR = Optical Character Recognition) ist noch immer eine nicht triviale und nicht immer funktionierende Methode, um in Bildern gespeicherten Text zu erkennen und wieder als solchen f&uuml;r Computer zug&auml;nglich zu machen.</p> <p>Unter Ubuntu-Linux kann man sich dazu des Paketes "gocr" bedienen. M&ouml;chte man diesem PNG-Bilder f&uuml;ttern, ist auch das Script "pngtopnm" aus dem Paket "netpbm" notwendig, also installiert man letzteres auch noch.</p> <pre>sudo apt-get install gocr netpbm</pre> <p>Ruft man nun das Programm mit dem Dateinamen des zu lesenden Bildes als ersten Parameter auf, so erh&auml;lt man auf der Standard-Ausgabe den ausgelesenen Text:</p> <pre>gocr /pfad/zu/meinem/bild.png</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/36/ocr/SysRq http://www.joachim-neu.de/post/37/sysrq/<p>Es passiert immer wieder und meist genau dann, wenn man es &uuml;berhaupt nicht brauchen kann: Irgendein Programm verursacht durch eine kleine Fehlfunktion eine katastrophale Kette von anderen Fehlern die schlie&szlig;lich darin enden, dass das System zwar noch l&auml;uft, die Musik noch spielt und die Maus sich noch bewegt, Pings noch beantwortet werden, aber keine Tasten und Mausdr&uuml;cke mehr angenommen werden. Somit ist auch ein Wechsel auf die Konsolen unm&ouml;glich und wer gerade keinen zweiten Rechner und ein Netzwerk zur Verf&uuml;gung hat, um &uuml;ber SSH den X-Server neu zu starten, dem bleibt nichts anderes als der Druck auf den Reset-Knopf.</p> <p>Als Abhilfe haben die Linux-Kernel-Entwickler ein Feature in den Kernel eingebaut, der in solchen F&auml;llen zumindest das saubere Ausbinden von Datentr&auml;gern erm&ouml;glichen soll. Hierzu bedient man sich einer Reihe von Tastenkombinationen mit der Taste "SysRq" (auch "Print Screen", "Druck" oder "S-Abf"). Um die Tastenkombinationen einzuschalten, muss man eine 1 in der Datei "/proc/sys/kernel/sysrq" ablegen:</p> <pre>sudo -s<br />echo "1" &gt; /proc/sys/kernel/sysrq</pre> <p>Bei Ubuntu Hardy sind diese Tastenkombinationen standardm&auml;&szlig;ig aktiviert.</p> <p>Im Notfall kann man sich nun unter Anderem den folgenden Tastenkombinationen bedienen:</p> <p><strong>Alt + SysRq + R</strong> entzieht dem X-Server Tastatur und Maus, sodass man wieder auf die Konsolen wechseln kann.</p> <p><strong>Alt + SysRq + S</strong> schreibt alle Daten aus dem Festplatten-Cache auf die Festplatte.</p> <p><strong>Alt + SysRq + U</strong> h&auml;ngt alle gemounteten Datentr&auml;ger aus.</p> <p><strong>Alt + SysRq + E</strong> sendet allen Prozessen au&szlig;er "init" die Aufforderung, sich zu beenden (SIGTERM).</p> <p><strong>Alt + SysRq + I</strong> t&ouml;tet alle Prozesse ausgenommen "init" (SIGKILL).</p> <p>Diese Liste ist nicht vollst&auml;ndig, deckt aber die meiner Meinung nach wichtigsten Kombinationen ab.</p> <p>&nbsp;</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/37/sysrq/S.M.A.R.T. http://www.joachim-neu.de/post/46/s-m-a-r-t/<p>Die S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology) F&auml;higkeit moderner Festplatten soll dem Benutzer eine Analysem&ouml;glichkeit in die Hand geben um bevorstehende Festplattenausf&auml;lle und dadurch entstehenden Datenverlust fr&uuml;hzeitig zu erkennen und notwendige Ma&szlig;nahmen zur Datensicherung ergreifen zu k&ouml;nnen.</p> <p>Nat&uuml;rlich ist diese Technologie auch unter Linux einsetzbar. Hierf&uuml;r gibt es das Paket "smartmontools" zu dem neben dem Analyseprogramm "smartctl" auch der Daemon "smartd" geh&ouml;rt. Letzterer &uuml;berwacht die Festplatten w&auml;hrend dem PC-Betrieb und kann bei Fehlern rechtzeitig Alarm schlagen. Seine Konfiguration soll im Folgenden kurz erl&auml;utert werden.</p> <p>Aufgrund der Brisanz der Aufgabe, die S.M.A.R.T. erf&uuml;llen soll, weise ich an dieser Stelle nochmal explizit darauf hin, dass ich keinerlei Garantien f&uuml;r die Richtigkeit der hier gezeigten Informationen &uuml;bernehme. Ich empfehle dringend, auch andere Anleitungen und Erkl&auml;rungen im Internet zu lesen und sich nicht nur auf diese eine zu verlassen.</p> <p>Um mit der Arbeit zu beginnen muss man zuerst den Super-User-Status erlangen:</p> <pre>sudo -s</pre> <p>Zuerst installiert man das entsprechende Paket, unter Ubuntu Hardy mit folgendem Befehl:</p> <pre>apt-get install smartmontools</pre> <p>Dann aktiviert man den smartd Daemon in der entsprechenden Konfigurationsdatei:</p> <pre>echo -e "\nstart_smartd=yes" &gt;&gt; /etc/default/smartmontools</pre> <p>Dann bestimme man die zu &uuml;berwachenden Festplatten. Ich verwende hier als Name "DEVICESCAN" um alle Ger&auml;te abzudecken, denkbar sind aber auch Pfadangaben zu Ger&auml;te-Dateien wie /dev/hda oder /dev/sda.</p> <pre>echo -e "DEVICESCAN -o on -S on -I 194 -I 231 -I 9 -a -m Unused -M exec /etc/smartd-callback.sh" &gt;&gt; /etc/smartd.conf</pre> <p>Diese Einstellung aktiviert Festplatten-Selbsttests (-o on) und das Speichern statistischer Daten (-s on). Au&szlig;erdem werden &Auml;nderungen der S.M.A.R.T. Parameter 194, 231 und 9 ignoriert, die unter Anderem die aktuelle Temperatur und die Anzahl der Betriebsstunden speichern. Zus&auml;tzlich werden die f&uuml;r IDE-Festplatten typischen Tests durchgef&uuml;hrt (-a). F&uuml;r SATA-Festplatten sollte man hier noch den Parameter "-d sat" anh&auml;ngen. Die Parameter "-m" und "-M" sorgen daf&uuml;r, dass bei fehlerhaftem Verhalten das Script "/etc/smartd-callback.sh" ausgef&uuml;hrt wird.</p> <p>Beachten sollte man, dass es bei manchen Ger&auml;ten notwendig ist, spezielle Parameter f&uuml;r die verwendete Hardware zu spezifizieren. Beispielsweise erfordern Festplatten der Firma Samsung offenbar noch den Parameter "-F samsung". Weitere Informationen diesbez&uuml;glich sind der Anleitung von smartd zu entnehmen:</p> <pre>man smartd</pre> <p>Die eben angesprochene Datei "/etc/smartd-callback.sh" existiert noch nicht und muss erst angelegt und mit sinnvollem Inhalt bef&uuml;llt werden:</p> <pre>echo -e "LOGFILE=\"/var/log/smartd.log\"\necho -e \"\$(date)\\\n\$SMARTD_MESSAGE\\\n\" &gt;&gt; \"\$LOGFILE\"" &gt;&gt; /etc/smartd-callback.sh<br />chmod +x /etc/smartd-callback.sh</pre> <p>Auf diese Weise wird in der Datei ein St&uuml;ck Code hinterlegt, das etwaige Fehler in der Datei "/var/log/smartd.log" hinterlegt. Anschlie&szlig;end wird die Datei ausf&uuml;hrbar gemacht.</p> <p>Am Ende der Arbeiten sollte man den S.M.A.R.T. Daemon neu starten:</p> <pre>/etc/init.d/smartmontools stop<br />/etc/init.d/smartmontools start</pre> <p>Au&szlig;erdem kann es nicht schaden, zu &uuml;berpr&uuml;fen, ob er wirklich l&auml;uft:</p> <pre>pidof smartd</pre> <p>Auch das &Uuml;berpr&uuml;fen des Syslog ist zu empfehlen um Fehler in der Konfiguration sofort zu erkennen:</p> <pre>tail /var/log/syslog</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/46/s-m-a-r-t/tee http://www.joachim-neu.de/post/47/tee/<p>Ein die Nerven und Zeit des Linux-Shell-Benutzers sicher sehr schonender Befehl ist "tee".</p> <p>Hat man beispielsweise einen Befehl, der sehr viel Ausgabe erzeugt, die man gleichzeitig untersuchen aber auch ungefiltert speichern m&ouml;chte, ist "tee" das gesuchte Zwischenst&uuml;ck zwischen dem eigendlichen Befehl und beispielsweise einer "grep" oder "awk" Anweisung.</p> <p>In der Theorie funktioniert "tee" so: Es lie&szlig;t die Zeichen auf der Standardeingabe ein und leitet sie auf die Standardausgabe und in die angegebenen Dateien weiter.</p> <p>Ein denkbarer Anwendungsfall f&uuml;r "tee" w&auml;re das herunterladen, speichern und gleichzeitige Filtern einer Internetseite:</p> <pre>wget -O - http://www.joachim-neu.de/ | tee /tmp/website | grep "irgendein begriff"</pre> <p>Dieser Befehl l&auml;d die angegebene Internet-Seite herunter und leitet sie an "tee" weiter. Dieses speichert sie in der Datei "/tmp/website" und leitet sie zus&auml;tzlich an die "grep" Anweisung weiter, die den heruntergeladenen Inhalt filtert.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/47/tee/Sensoren http://www.joachim-neu.de/post/48/sensoren/<p>Zu den vielen Komponenten moderner Computer geh&ouml;ren auch viele kleine Sensoren an verschiedenen Stellen, die Auskunft &uuml;ber Temperaturen von Bauteilen, anliegende Spannungen und Rotationsgeschwindigkeiten von L&uuml;ftern geben. Verkn&uuml;pft man diese Informationen geschickt miteinander, kann man beispielsweise die Rotationsgeschwindigkeit von L&uuml;ftern in Abh&auml;ngigkeit von der Temperatur der Umgebung variieren. Der K&uuml;hler muss dann nicht die volle Leistung erbringen und ist leiser. Achtet man darauf, dass die Temperatur nicht zu hoch steigt, kann das auch die Lebensdauer der Hardware positiv beeinflussen und man bemerkt etwaige Temperaturprobleme fr&uuml;hzeitig.</p> <p>Unter Ubuntu ist f&uuml;r die Sensorverwaltung das Paket "lm-sensors" zust&auml;ndig. Dieses installiert man schnell:</p> <pre>sudo apt-get install lm-sensors</pre> <p>Um das Paket einsetzen zu k&ouml;nnen muss es erstmal alle im Computer verbauten Sensoren ausfindig machen. Dazu liefert es einen Befehl mit, der alle an den Computer angeschlossenen Bus-Systeme auf Sensoren hin untersucht:</p> <pre>sudo sensors-detect</pre> <p>Es empfielt sich, f&uuml;r fast alle gestellten Fragen die Standardantwort zu &uuml;bernehmen, indem man einfach ENTER dr&uuml;ckt. Lediglich die letzte Frage ("Do you want to add these lines automatically?") sollte man entgegen des Vorschlags mit "yes" beantworten, sodass die ermittelten Kernel-Module automatisch beim Hochfahren geladen werden.</p> <p>Wer genug Erfahrung hat kann an dieser Stelle die entsprechenden Kernel-Module mit dem Programm "modprobe" nachtr&auml;glich in den Kernel laden, Unerfahrenen empfehle ich einen einfachen Reboot des Rechners.</p> <p>Mit dem Befehl "sensors" kann man nun die Sensorwerte &uuml;berwachen.</p> <p>Wer die Daten zus&auml;tzlich noch unter GNOME im Panel angezeigt haben m&ouml;chte, kann das Paket "sensors-applet" bem&uuml;hen:</p> <pre>sudo apt-get install sensors-applet</pre> <p>In die Leiste hinzugef&uuml;gt zeigt es in der Standardkonfiguration die Werte aller gefundenen Sensoren. Die Liste der angezeigten Sensorwerte l&auml;sst sich aber mit anpassen, indem man rechts auf das Applet klickt und dort im Men&uuml; "Einstellungen" bei der Registerkarte "Sensoren" die ungew&uuml;nschten Sensoren deaktiviert.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/48/sensoren/preload http://www.joachim-neu.de/post/55/preload/<p>Wer sich einen Computer mit viel Arbeitsspeicher ausger&uuml;stet hat, wird schnell feststellen, dass auch dieser tr&auml;gen Anwendungen (wie OpenOffice) nicht merklich unter die Arme greifen kann.</p> <p>F&uuml;r diese F&auml;lle gibt es das Programm "preload". Es ist im gleichnamigen Paket Debian-basierter Distributionen wie Ubuntu verf&uuml;gbar. Die Installation gestaltet sich dank APT denkbar einfach:</p> <pre>sudo apt-get install preload</pre> <p>Die als Daemon im Hintergrund laufende Applikation beobachtet die Programmaufrufe des Benutzers und erstellt f&uuml;r diese Modelle zur Vorhersage, wann welches Programm am ehesten gestartet wird. Au&szlig;erdem werden die am meisten verwendeten Bibliotheken ermittelt. Auf Basis dieser Informationen l&auml;d das Programm diese Dateien in den ungenutzten Arbeitsspeicher (daher der Name "preload") und beschleunigt so die Ausf&uuml;hrung teils merklich, weil ben&ouml;tigte Komponenten bereits bereit stehen.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/55/preload/GraphViz http://www.joachim-neu.de/post/57/graphviz/<p>Eine Dom&auml;ne, in der Konsolen-Anwendungen grafischen Anwendungen weit voraus sind, ist meiner Meinung nach der Bereich der Graphen-Erstellung.</p> <p>Hier gibt es zwar einige grafische Bearbeitungstools (Dia, aber auch Inkscape), die aber f&uuml;r gr&ouml;&szlig;ere Graphen nur eingeschr&auml;nkt benutzbar sind. Sp&auml;testens wenn die genaue sp&auml;tere Anordnung der einzelnen Punkte zu Beginn noch nicht bekannt ist, wird das ewige Verschieben der Knoten und ihrer Verbinder auf die Dauer eine Tortour.</p> <p>In diese Bresche springt das Paket "GraphViz" aus dem gleichnamigen Debian-Paket ("graphviz"). Diese Sammlung von kleinen Programmen enth&auml;lt einige Tools, mit der sich in DOT-Language beschrieben Graphen zu "Papier" (PNG, SVG, PostScript) bringen lassen. Graphen sind dabei denkbar einfach beschrieben:</p> <pre>digraph name {<br /> a -&gt; b -&gt; c<br /> b -&gt; d<br />}</pre> <p>Das ist bereits eine vollst&auml;ndige Graphen-Definition, die man in einer Datei (im Beispiel "dateiname.dot") speichern kann. Zu einer PNG verwandelt sich das ganze nach dem Installieren von GraphViz per Konsole ziemlich einfach:</p> <pre>sudo apt-get install graphviz<br />dot -Tpng -O dateiname.dot</pre> <p>Da ich an dieser Stelle nicht die komplette Syntax der DOT-Sprache beschreiben kann, verweise ich einfach auf die Homepage des Projektes und rate jedem, sich ein wenig in die Materie einzulesen.</p> <p>http://www.graphviz.org/</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/57/graphviz/2304:020e http://www.joachim-neu.de/post/61/2304-020e/<p>Auch der DVB-USB-Stecker "PCTV 200e" von der Firma "Pinnacle" hat nun Linux-Treiber. Er meldet sich mit der USB-ID 2304:020e an. Ansteuern l&auml;sst er sich mit einem momentan noch nicht im Kernel integrierten Treiber des LinuxTV-Projektes. Zudem wird der Treiber momentan offenbar nichtmehr aktiv weiterentwickelt, er funktioniert aber auch noch unter Ubuntu Hardy.</p> <p>Der Programmierer hat eine speziell f&uuml;r diesen Treiber angepasste Version von LinuxTV f&uuml;r Ubuntu Hardy online gestellt. Diese ist unter dem folgenden Link herunterzuladen:</p> <p>http://rapidshare.com/files/111810479/v4l-dvb-hardy-2daeefda69fe.zip</p> <p>Bevor man beginnt, das Kernelmodul zu kompilieren, sollte man sichergehen, dass man &uuml;ber die n&ouml;tigen Softwarepakete (build-essential, ...) und die Kernel-Header des aktuellen Kernels verf&uuml;gt. Zudem ist der Quellcode so angepasst, dass er nur mit Kernel 2.6.24-16-generic funktioniert, weil er die Header-Dateien in /lib/modules/2.6.24-16-generic sucht. Es funktioniert jedoch auch, wenn man einfach die Header-Dateien des aktuellen Kernels unter dem Namen "2.6.24-16-generic" im Verzeichnis "/lib/modules" verlinkt:</p> <pre>cd /lib/modules<br />sudo ln -s $(uname -r) 2.6.24-16-generic</pre> <p>Nun entpackt man die ZIP-Datei und betritt das Verzeichnis. Dort startet man den Kompilierungsvorgang und installiert anschlie&szlig;end die erzeugten Module:</p> <pre>make all<br />sudo make install</pre> <p>Ist der Vorgang erfolgreich verlaufen, kann man nun das TV-Ger&auml;t wieder ab und anstecken und anschlie&szlig;end mit Kaffeine auf Kanalsuchlauf gehen.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/61/2304-020e/GNOME Splash http://www.joachim-neu.de/post/63/gnome-splash/<p>Um den GNOME-Splash-Screen zu ver&auml;ndern, habe ich in der Ubuntu "Intrepid" Standard-Installation kein vorinstalliertes Programm gefunden.</p> <p>Jedoch existiert ein Programm, mit dem man den GNOME-Splash-Screen bequem von der grafischen Oberfl&auml;che aus einstellen kann.</p> <p>Das offenbar auf Ruby basierende Tool ist in den Haupt-Repositories unter dem langen Namen "gnome-splashscreen-manager" vorhanden und nach der Installation &uuml;ber die Systemeinstellungen aufrufbar.</p> <p>Installiert wird es z.B. mit diesem Kommandozeilenbefehl:</p> <pre>sudo apt-get install gnome-splashscreen-manager</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/63/gnome-splash/Hamster http://www.joachim-neu.de/post/64/hamster/<p>GNOME 2.24 bringt ein neues Applet f&uuml;r das GNOME-Panel mit. Es hei&szlig;t "Hamster" und erm&ouml;glicht unkomplizierte Zeiterfassung. T&auml;tigkeiten kann man in Kategorien einordnen und mit wenigen Mausklicken die Zeiterfassung f&uuml;r einzelne T&auml;tigkeiten starten und wieder stoppen. Die Arbeitszeit stellt Hamster wahlweise f&uuml;r Tage, Wochen oder Monate in &uuml;bersichtlichen Statistiken zusammen und generiert auf Wunsch zugeh&ouml;rige Berichte.</p> <p>Das Applet ist auch unter Ubuntu 8.10 "Intrepid Ibex" verf&uuml;gbar, jedoch nicht standardm&auml;&szlig;ig installiert. Es ist im Paket "hamster-applet" enthalten und kann mit dem folgenden Befehl installiert werden:</p> <pre>sudo apt-get install hamster-applet</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/64/hamster/classbrowser http://www.joachim-neu.de/post/65/classbrowser/<p>F&uuml;r Entwickler steht unter g&auml;ngigen GNOME-basierten Linux-Distributionen der Texteditor GEdit zum Bearbeiten von (Programm-)texten zur Verf&uuml;gung. Neben Syntaxhighlighting in allen erdenklichen Sprachen verf&uuml;gt er &uuml;ber automatische Einr&uuml;ckungen (sehr wichtig f&uuml;r Python Entwickler) und viele andere Features, die h&auml;ufig durch schon mitgelieferte Plugins bereitgestellt werden. GEdit ist ein leichter, nicht alzu &uuml;berladener Standardeditor der f&uuml;r die meisten der allt&auml;glichen T&auml;tigkeiten zuverl&auml;ssige Dienste tut.</p> <p>Braucht man der &Uuml;bersicht wegen in einem gr&ouml;&szlig;eren Projekt doch mal, ganz IDE-like, einen &Uuml;berblick &uuml;ber alle in einem Dokument definierten Klassen und Funktionen, kann man zum Beispiel zu dem Plugin "classbrowser" greifen. Es ist unter folgender URL zum Download angeboten:</p> <p>http://www.stambouliote.de/projects/gedit_plugins.html</p> <p>Die Installation l&auml;sst sich problemlos mit den folgenden Befehlen bewerkstelligen:</p> <pre>cd /tmp wget http://www.stambouliote.de/download/gedit_classbrowser-0.2.1.tar.gz tar -zxf gedit_classbrowser-0.2.1.tar.gz cd gedit_classbrowser-0.2.1 mv classbrowser*~/.gnome2/gedit/plugins</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/65/classbrowser/Formulare http://www.joachim-neu.de/post/41/formulare/<p>F&uuml;r Formulare aller Art verwende ich derzeit eine Kombination aus dem FormWizard und den "newforms"-Formularen und Formularfeldern. Diese Kombination eignet sich auch f&uuml;r Formulare mit nur einer Eingabemaske.</p> <p>Die Verwendung des FormWizard ist relativ gut dokumentiert, sodass man zumindest f&uuml;r Standardf&auml;lle die notwendigen Informationen aus der Django-Dokumentation entnehmen kann.</p> <p>Knifflig wird es dann, wenn man in diese Prozedur zwischen Wizard, den Formularen und den Feldern und Widgets eingreifen m&ouml;chte. Das ist dann der Fall, wenn Formular-Felder dynamisch zur Laufzeit definiert werden sollen. Hierf&uuml;r muss man die __call__-Methode des Wizards &uuml;berschreiben. Innerhalb dieser kann man &uuml;ber "self.form_list" auf die &uuml;bergebenen Formulare zugreifen und deren Felder mittels ihrem Attribute "base_fields", einem Dictionary, &uuml;berschreiben.</p> <p>M&ouml;chte man beispielsweise in der Praxis im 3. Formular das Feld "name" als CharField neu definieren, so kann man in der __call__-Methode des entsprechenden Wizards das Feld wie folgt &uuml;berschreiben:</p> <pre>self.form_list[2].base_fields['name'] = forms.CharField(label='Name')</pre> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/41/formulare/PickledObject http://www.joachim-neu.de/post/42/pickledobject/<p>In einer Datenbank einen Wert zu speichern, der sich erst w&auml;hrend der Laufzeit entscheidet, war schon seit jeher ein relativ schweres Unterfangen, da Datenbanksysteme keine dynamische Typisierung der Spalten unterst&uuml;tzen. Darum behilft man sich meist, indem man die zu speichernden Daten serialisiert und in einem Textfeld speichert.</p> <p>Dieser Weg funktioniert auch in Django. Zur Serialisierung verwendet man das Modul "cPickle" bzw. "pickle". M&ouml;chte man die (Un-)Serialisierung transparent gestalten, empfielt sich, einen neuen Feld-Typ zu schaffen. M&ouml;chte man zudem die M&ouml;glichkeit haben, die Daten des Feldes mit dem im "newforms"-Branch mitgelieferten neuen Administrationsmen&uuml; zu editieren, ben&ouml;tigt man noch weitere Form- und Widget-Klassen.</p> <p>Diese habe ich entwickelt und ein PickledObjectField geschaffen, dass man in eigenen Datenbankmodellen verwenden kann. Die (Un-)Serialisierung erfolgt transparent und im Administrationsbereich hat man Zugriff auf die abgelegten Daten und kann diese ver&auml;ndern.</p> <p><strong>ACHTUNG: Ich &uuml;bernehme keine Haftung f&uuml;r durch in diese Datei verursachte Sch&auml;den, Fehler oder Sicherheitsl&uuml;cken! Die Benutzung erfolgt ausschlie&szlig;lich auf eigene Gefahr!</strong></p> <p>Um die Klassen zu verwenden muss man einfach <a href="http://www.joachim-neu.de/res/downloads/PickledObjectField.gz">diese Datei</a> herunterladen und an der gegebenen Stelle importieren. Dann hat man Zugriff auf PickledObjectField und kann dieses verwenden.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/42/pickledobject/SQLite http://www.joachim-neu.de/post/78/sqlite/<p>Django ist in der Lage, Daten in verschiedenen Datenbanksystemen (PostgreSQL, SQLite, MySQL, ...) zu speichern und den Zugriff für den Programmierer transparent und systemunabhängig zu gestalten. Lediglich die für das Datenbanksystem zuständigen Python-Bibliotheken müssen installiert sein.</p><p>Django verwendet SQLite Version 3, Version 2 hingegen funktioniert nicht. Die Benennung der Pakete unter Debian und Ubuntu ist an dieser Stelle jedoch missverständlich. Version 2 trägt den Namen "python-sqlite", während Version 3 unter dem Namen "python-pysqlite2" zu finden ist. Wer also "python-sqlite" installiert, ist auf dem Holzweg, benötigt wird "python-pysqlite2".</p><p>Außerdem verwendet Django noch die im Paket "python-flup" enthaltenen Schnittstellen zur Kommunikation mit dem Webserver.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/78/sqlite/PyRTF http://www.joachim-neu.de/post/77/pyrtf/<p>Häufig wünscht man sich, aus einer Menge von Daten Informationen extrahieren und neu zusammenstellen zu können. Möchte man Text-Daten ansehnlich formatieren und in einer Datei abspeichern, bleiben aber nurnoch wenig Wege das zu tun. Zwar könnte man die Informationen in einer HTML-Seite darstellen und durchaus brauchbar formatieren, allerdings eignet sich das denkbar schlecht, möchte man die Daten später drucken. Plain-Text kommt selten in Frage, ebenso der Umweg über (La)TeX. Ein PDF wäre wünschenswert, die entsprechenden PDF-Libraries unterstützen aber nur das gezielte Setzen einzelner Textblöcke, sodass man sich quasi eine eigene Rendering-Engine schreiben müsste, will man längere und mehrfach untergliederte Texte strukturiert und ansehnlich formatiert zu Papier bringen.</p><p>In diese Bresche springt RTF. Ursprünglich in Redmond entwickelt existieren viele freie Implementationen und gängige Textverarbeitungsprogramme wie OpenOffice und Abiword unter Linux können damit ebenso umgehen wie Word und das bei Windows gratis mitgelieferte WordPad. RTF erscheint somit als brauchbares plattformunabhängiges Format, mit dem sich Text ansehnlich formatieren und strukturieren lässt, ohne viel Aufwand zu betreiben, da die eigentliche Umsetzung in ein Layout erst beim Öffnen des fertigen Dokuments vom entsprechenden Programm vorgenommen wird.</p><p>PyRTF ermöglicht es, mit Python RTF Dateien zu erstellen. Das Projekt wurde ursprünglich auf SourceForce (http://pyrtf.sourceforge.net/) entwickelt, scheint aber seit Mai 2005 nichtmehr betreut zu werden. Die Klassen-, Attribut- und Methodennamen weisen eine seltsame Groß-/Kleinschreibung auf und entsprechen so längst nichtmehr den Empfehlungen. PyGTK-NG hat versucht, sich dieses und anderer Probleme anzunehmen, ist inzwischen aber offenbar auch bereits eingestellt worden. Zu beiden Projekten existiert keinerlei Dokumentation, sodass der geneigte Programmierer mit den mitgelieferten "Examples" Vorlieb nehmen und daraus seine Erkenntnisse herleiten muss.</p><p>Dennoch ist PyRTF eine empfehlenswerte Bibliothek, möchte man RTF zum Textaustausch verwenden, was in manchen Fällen so ziemlich der einzige Weg ist. Mit "Ted" (http://www.nllgg.nl/Ted) soll es angeblich auch möglich sein, RTF Dateien mittels Kommandozeilenprogramm in PDF Dateien umzuwandeln.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/77/pyrtf/FlashBlock http://www.joachim-neu.de/post/73/flashblock/<p>Nicht nur eine langsame Internet-Anbindung, es gibt viele gute Gründe, warum man die blinkenden, effekthascherischen Flash-Applets hin und wieder nicht haben möchte. Für diesen Fall gibt es das FireFox-Plugin "FlashBlock". Aktiviert hindert es standardmäßig alle Flash-Applets am Laden und spart somit Bandbreite, Rechenpower und Nerven.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/73/flashblock/K3B http://www.joachim-neu.de/post/72/k3b/<p>Neben dem bei GNOME mitgelieferten Brasero eignet sich auch K3B aus der KDE-Ecke gut zum Brennen von CDs und DVDs. Beide Programme verfügen über die zu erwartenden Grundfunktionalitäten, können sowohl CDs alsauch DVDs brennen, erstellen Audio- und Daten-Scheiben wahlweise von Dateien oder Images. Zickt eines der beiden Programme, lohnt es sich vielleicht, für die gewählte Tätigkeit das andere Programm zu verwenden und zu hoffen, dass es nicht auch an der gleichen Stelle einen Aussetzer hat.</p><p>Wer mit K3B unter Ubuntu aber Audio-CDs von MP3-Dateien brennen möchte, sollte aber aufpassen. K3B ist hier nicht "ab Werk" in der Lage, MP3-Dateien zu dekodieren. Abhilfe schafft das Paket "libk3b3-extracodecs" aus den Standardrepositories.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/72/k3b/taskset / chrt http://www.joachim-neu.de/post/71/taskset-chrt/<p>Wer Lust hat, auf den Linux Scheduler ein bisschen Einfluss zu nehmen und beispielsweise Prozesse nur einzelnen Kernen zuzuweisen oder sie mit Real-Time-Rechten auszustatten (und damit sein Desktop vorübergehend einzufrieren), der möge einmal einen Blick auf die Kommandozeilenprogramme "taskset" (nicht zu verwechseln mit "tasksel") und "chrt" werfen.</p><p>Sie scheinen unter Ubuntu bereits zur Standardausstattung zu gehören, sollten aber auch bei anderen Distributionen in den Standardrepositories leicht zu finden sein.</p><p>Eine detailierte Beschreibung der Optionen spare ich mir an dieser Stelle und verweise auf die entsprechenden "man"-Pages. Ein Wort zur Argumentenübergabe: Sie ist anfangs möglicherweise etwas verwirrend weil unterschiedlich von der anderer Konsolen-Tools, man ist deshalb gut bedient, sich strikt an die Notation aus der "man"-Page zu halten. Alle Parameter sind Optionen und verlangen ihre Werte nicht unmittelbar hinter sich, sondern erst später, wenn alle Optionen definiert sind.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/71/taskset-chrt/Siedler II (NG) http://www.joachim-neu.de/post/68/siedler-ii-ng/<p>Eigendlich bin ich seit vielen Jahren schon kein großer Fan mehr von Computerspielen, aber hin und wieder finde ich eine (meist weniger spaßig gelungene) Fortsetzung eines alten Lieblingscomputerspiels für günstig beim Stöbern in irgendeiner Ramschkiste in irgendeinem Laden in der Stadt. Hin und wieder passiert es dann, dass ich mir das Spiel kaufe, zuhause installiere und ein wenig in Nostalgie schwelge und an die "guten alten Zeiten" zurückdenke, damals, als Spiele noch Spaß machten, weil sie witzig, neuartig, interessant und unterschiedlich waren.</p><p>Eines dieser Remakes, das den Weg auf meine Festplatte gefunden hat, ist "Die Siedler II - Die nächste Generation", wie der Name schon sagt die moderne Fassung von "Die Siedler II" anno 1996. Eigendlich hatte ich vor, es ohne Wine-Versuche auf einer Windows-Kiste laufen zu lassen, dann reizte es mich aber doch und ich probierte, es mit Wine zu emulieren.</p><p>Anfänglich sah es eher düster aus, das Spiel ließ sich zwar problemlos installieren, beendete aber den Ladevorgang mit Fehlermeldungen und einem finalen Absturz, aber nach ein bisschen Googlen und Durchstöbern diverser Webseiten konnte ich aber doch den folgenden bei mir erfolgreichen Weg ausmachen:</p><p>Bei mir haben neben DirectX 9.0c auch noch einige DLLs (streamci, d3dx9_36, d3dx9_29, mscoree) gefehlt, die schnell im Internet zusammengesucht und im Wine-Windows-System32-Ordner (~/.wine/drive_c/windows/system32) abgelegt waren. Dann lief auch die DirectX 9.0c Installation einwandfrei und nach dem Einrichten der DLLs (eine detailierte Anleitung zu allen Schritten gibt es hier: http://www.wine-reviews.net/microsoft/directx-90c-march-2008-redistributable-on-linux-with-wine.html) hatte ich auch beim Spielstart keine Probleme mehr.</p><p>Zum Spiel selbst bleibt zu sagen: Es ist sehr an die alte Version angelehnt, die Grafik (auch wenn ich sie, vermutlich aufgrund der Emulation, nicht mit hoher Qualität genießen kann) ist ein gelungenes 3D-Remake der alten niedlichen Siedler-II-Grafik, auch das Wirtschaftssystem ist bekannt. Einziges Manko: Im Einzelspieler-Modus sieht man von der ersten Mission an alle Gebäude, die jemals zur Verfügung stehen werden; das zerstört die Überraschung.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/68/siedler-ii-ng/Flowplayer http://www.joachim-neu.de/post/67/flowplayer/<p>Web 2.0 ist "in" und eng mit diesem Trend, manchmal besser Hype, sind Videos im Web verbunden. Ob User-generated-Content wie bei YouTube oder ein Mitschnitt des letzten Konzerts auf der Website einer Band, es gibt viele mehr oder weniger gute Gründe, bewegte Bilder im Web zu zeigen.</p><p>Dafür braucht es aber ein geeignetes Stück Software, das in der Lage ist, vorzugsweise FLV-Dateien (Flash Video) aus einer Internet-Quelle abzuspielen.</p><p>Wer nicht von YouTube oder einem anderen Online-Anbieter abhängig sein und/oder nicht bei diesem seine Videos hochladen möchte, für den empfielt sich eines der unzähligen kostenlosen Flash-Player, die dieser Tage im Web zu finden sind. Kommt aber zusätzlich noch die Anforderung hinzu, dass dieser Player sich gut in die Seite integrieren und vorzugsweise über ein JavaScript-API ansprechbar sein soll, bleiben nichtmehr viele kostenlose und teilweise auch freie Player übrig.</p><p>Einer der wenigen, die diesen Anforderungen gerecht werden, ist "Flowplayer" (http://www.flowplayer.org/). Es gibt ihn sowohl unter OpenSource- alsauch unter proprietärer Lizenz und er verfügt über ein sehr mächtiges JavaScript-API und Plugin-System. Ein Blick lohnt sich also allemal!</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/67/flowplayer/Dev-Server http://www.joachim-neu.de/post/66/dev-server/<p>Wer Webanwendungen entwickelt, möchte diese in den meisten Fällen auch einfach und unkompliziert testen und wenn nötig Fehler beseitigen. Um den üblichen Hochladen-Aktualisieren-Zyklus dabei zu vermeiden, ständigem Server-Neustarten vorzubeugen und den Computer nicht mit einer komplexen Webserver-Installation zu belasten, ist in Django ein sogenannter Development-Server integriert. Mit diesem kann man das erstellte Projekt schnell und unkompliziert ohne Server-Reloads und Dateien-Kopieren testen.</p><p>Das größte Manko dieses Servers zeigt sich jedoch spätestens bei der Arbeit mit AJAX und Crons: Er kann nur eine Abfrage gleichzeitig verarbeiten, andere Abfragen müssen warten, bis sie an der Reihe sind. Da man im Django-Projekt derzeit aus verschiedenen Gründen nicht gewillt zu sein scheint, eine Multi-Threading-Fähigkeit in den Dev-Server zu integrieren, wird für viele Versionen ein Patch angeboten, mit dem interessierte Entwickler den Multi-Thread-Support selbst nachrüsten können.</p><p>Weitere Informationen diesbezüglich gibt es hier:</p><p>http://code.djangoproject.com/ticket/3357</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/66/dev-server/var (JS) http://www.joachim-neu.de/post/62/var-js/<p>"var foobar = 23;" oder "foobar = 23;", beides sind in JavaScript gültige Ausdrücke und werden von keinem Interpreter beanstandet. Beide weisen einer Variable "foobar" den Wert "23" zu und funktionieren ohne Probleme und Nebeneffekte. Zumindest scheinbar, denn konzeptionell besteht ein großer Unterschied.</p><p>Der erste Ausdruck, "var foobar = 23;", erzeugt eine lokale Variable, der der Wert 23 zugewiesen wird. Diese wird nach Beenden der Funktion wieder gelöscht, wird die Funktion erneut aufgerufen, wird die Variable neu erstellt und neu initialisiert, man kann nicht feststellen, ob es schon jemals diese Variabel gab.</p><p>Anders dagegen der zweite Ausdruck, "foobar = 23;". Dieser weißt dem Attribut "foobar" des Objektes, von dem die aktuelle Funktion eine Methode ist, den Wert 23 zu. Führt man dieses Statement innerhalb einer normalen Funktion aus, wird die globale Variable "foobar" mit dem Wert 23 gefüllt, führt man es innerhalb einer Methode eines Objektes auf, wird das Attribut "foobar" dieses Objektes auf 23 gesetzt.</p><p>Im Normalfall merkt man kaum einen Unterschied zwischen den beiden Ausdrücken, wohl aber dann, wenn man den Zähler einer for-Schleife mit letzterer Methode initialisiert und innerhalb der for-Schleife eine Rekursion stattfindet. Dann beginnt der Zähler wie wild und pseudozufällig hin und her zu springen und schwer reproduzierbare Fehler entstehen. Aus diesem Grund sollte man die Zähler von for-Schleifen immer mit "var" initialisieren.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/62/var-js/Firefox 3 SSL http://www.joachim-neu.de/post/58/firefox-3-ssl/<p>In der letzten Ausgabe der Computerzeitschrift c't gab es einen Artikel über die SSL-Fähigkeiten des Firefox 3. Hier sind die Standardeinstellungen relativ anfällig für Angriffe mit nicht verschlüsselten Verbindungen.</p><p>Leitet ein Angreifer einen Surfer beispielsweise statt auf httpS://www.meinebank.de/login.php auf http://www.meinebank.de.login.vu/ um, merkt der Ottonormalsurfer von diesem Angriff kaum etwas. Einzig die Hintergrundfarbe des Favicons ändert sich auf blau, was aber deutlich zu wenig auffällig ist, um in der Hektik des Alltags wahrgenommen zu werden.</p><p>Um das Problem zu beseitigen kann in der Konfiguration (Seite "about:config") den Schlüssel "browser.identity.ssl_domain_display" auf 1 setzen. Dann werden auch sichere HTTPS-Verbindungen angezeigt, indem die Domain blau hinterlegt zu Beginn der Adresszeile steht. Ähnlich hervorgehoben werden auch sogenannte EV-SSL-Zertifikate, die bisher aufgrund nicht rechtfertigbarer höherer Kosten meist nur bei Bankseiten verwendet werden.</p><p>Bleibt die Frage, warum diese Vorkehrung zum Schutz des Surfers nicht standardmäßig aktiviert ist, sondern erst aktiviert werden muss.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/58/firefox-3-ssl/Schriftarten http://www.joachim-neu.de/post/54/schriftarten/<p>Schriftarten zu erstellen ist besonders unter Linux mit Programmen wie "FontForge" eine nervenaufreibende Angelegenheit. Aber auch unter Windows lässt sich dieses Problem kaum ohne geeignete, kostenpflichtige, professionelle Software bewerkstelligen.</p><p>In diese Bresche springt der Online-Service "FontStruct" (fontstruct.fontshop.com). Mit einem einfach zu bedienenden Flash-Interface lassen sich hier schöne Fonts aus verschiedenen Klötzchen zusammenstecken und herunterladen. Und das auch noch kostenlos!</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/54/schriftarten/Screenshots http://www.joachim-neu.de/post/53/screenshots/<p>Screenshots der aktuell im FireFox angezeigten Seite per "Print Screen" und händischem Ausschneiden und Zusammenfügen in einem Malprogramm zu machen, ist eine fummelige, langweilige Aufgabe.</p><p>Aus diesem Grund gibt es die FireFox Erweiterung "Screen grab!" (www.screengrab.org). Nurnoch den gewünschten Dateinamen und Pfad auswählen und schon wird die aktuelle Seite als PNG-Bild-Datei für die Ewigkeit archiviert.</p><p>Möchte man die Archivierung nicht in Form von Bild-Dateien durchführen (bei denen zwangsweise die Textinformation verlohren geht), eignet sich die FireFox Erweiterung "zotero" (www.zotero.org). Mit ihr kann man Internet-Seiten inklusive aller benötigten Media-Daten dauerhaft auf der Festplatte ablegen. Außerdem kann man gespeicherte Seiten mit Anmerkungen und Hervorhebungen ausstatten.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/53/screenshots/child selector http://www.joachim-neu.de/post/51/child-selector/<p>Hat man ein HTML-Dokument mit einer Hierarchie mit vielen Ebenen, hilft einem der "child selector" ">" in CSS, den Überblick zu bewahren, welches Element man mit der aktuellen CSS-Regel manipuliert. Damit spart man sich einige Klassen und verkürzt die Namen anderer.</p><p>Dieses wunderschöne Feature hat nur einen großen Haken: Der InternetExplorer in Version 6 unterstützt es nicht. Wer es also in großen Teilen seines CSS verwendet, sieht im IE 6 von diesen Anweisungen garnix.</p><p>Das jagt einem nicht nur einen gehörigen Schrecken ein, sondern man findet den Fehler auch nur sehr schwer, sodass man leicht einige Stunden auf der Fehlersuche investiert. Ich hoffe dieser Eintrag bewahrt jemanden vor diesem Schicksal.</p><p>Ersetzen kann man den "child selector" übrigends ganz einfach, indem man ihn weglässt. Das ist dann ein "descendant selector", der alle Elemente modifiziert, die sich auf irgendeiner Ebene unterhalb befinden, nicht auf der direkt nächsten. Häufig macht diese Verwendung einige weitere Definitionen notwendig, um vorher gesetzte Definitionen zu überschreiben.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/51/child-selector/IEs4Linux http://www.joachim-neu.de/post/50/ies4linux/<p>Wer es sich leisten kann, alle Benutzer des Microsoft-Browsers InternetExplorer von der Benutzung seiner Seite ganz oder teilweise auszuschließen oder ihnen zumindest die schönen grafischen Effekte und ein ansprechendes optisches Layout zu verweigern, kann sich glücklich schätzen. Alle anderen müssen zähneknirschend solange an ihrer Seite basteln, bis sie auch der InternetExplorer halbwegs passabel anzeigt.</p><p>Wer unter Linux entwickelt hat dann nicht nur das Problem, dass er den InternetExplorer wohl nicht in den Paket-Quellen finden wird. Häufig braucht er auch ein ganz anderes Betriebssystem. Entweder er wechselt ständig zwischen Windows und Linux, lässt eines der beiden in einer virtuellen Maschine laufen oder besorgt sich einen zweiten Rechner nur um IE-Kompatibilität zu prüfen.</p><p>Um in diesem Fall Abhilfe zu schaffen gibt es das Projekt IEs4Linux. Mit diesem Tool kann man gängige Versionen des InternetExplorers unter Linux installieren und per Wine laufen lassen. Unterstützt werden derzeit die Versionen 5.0, 5.5, 6.0 und 7.0 (derzeit noch in der Beta-Phase). Ein Installer führt bequem durch die Installation und läd die notwendigen Pakete herunter.</p><p>Das Programm sowie eine Anleitung gibt es hier:</p><p>http://www.tatanka.com.br/ies4linux/page/Main_Page</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/50/ies4linux/NiftyCorners http://www.joachim-neu.de/post/49/niftycorners/<p>Runde Ecken, mit Boardmitteln von CSS und HTML ein Graus für alle Webdesigner. Abhilfe für das Problem würde eine neue CSS-Anweisung schaffen. Die aber gibt es erst ab CSS Version 3, einer neuen Version des CSS-Standards die noch nichteinmal verabschiedet ist. Und auch dann wäre zweifelhaft, wie zügig, vollständig und korrekt alle Browser diese Fähigkeit implementiert bekämen. Ganz zu schweigen von den alten Browsern, die dieses Feature nicht haben und auch nie haben werden.</p><p>Eine mögliche Lösung für das Problem sind Hintergrundbilder. Die aber sind nicht flexibel, sodass Höhen- und Farbänderungen des abzurundenden Objekts häufig unbequem viel Arbeit nach sich ziehen.</p><p>Abhilfe für diesen Umstand schafft "NiftyCorners". Bei dieser Technologie werden HTML-Elemente in die Ecken des abzurundenden Containers gelegt. Dieser scheint dann abgerundet.</p><p>Damit die ganze unflexible Handarbeit nicht am Programmierer hängen bleibt, gibt es das Projekt "NiftyCube". Dies ist eine JavaScript-Datei, die das Abrunden ausgewählter Elemente übernimmt. Hier kann man auch viele Parameter spezifizieren und so das Abrunden ganz gezielt und genau steuern.</p><p>Erstaunlicherweise funktioniert diese Technologie bei allen aktuellen Browser-Versionen ohne Probleme. Der Webdesigner muss sich daher um Kompatibilität keinen Kopf machen!</p><p>Weiterführende Informationen und die benötigten Dateien gibt es hier:</p><p>http://www.html.it/articoli/nifty/index.html</p><p>http://www.html.it/articoli/niftycube/index.html</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/49/niftycorners/watch http://www.joachim-neu.de/post/45/watch/<p>Möchte man einen Befehl in regelmäßigen Abständen ausführen und dessen Ausgabe anzeigen, eignet sich der Shell-Befehl "watch" sehr gut. Diesem übergibt man mit dem optionalen Parameter -n die Zahl der Sekunden zwischen den Aufrufen und anschließend den Befehl selbst.</p><p>Dies ist sehr praktisch, wenn man beispielsweise den Füllstand der Festplatten (watch df -h) oder die Größe eines Verzeichnisses (watch du) per Konsole überwachen möchte.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/45/watch/powernowd http://www.joachim-neu.de/post/44/powernowd/<p>In diesem Beitrag geht es um meine gestrigen Erfahrungen mit AMD's Cool'n'Quiet Technologie (im Weiteren mit CQ abgekürzt) und dem HardWare Monitor meines Motherboards.</p><p>CQ erlaubt dem Computer, die Taktfrequenz der CPU an die momentane Last anzupassen. Läuft der Computer im Leerlauf, schaltet das Betriebssystem beispielsweise eine auf 2,2 GHz getaktete Recheneinheit auf 1,0 GHz herunter. Das senkt die Leistungsaufnahme und somit auch die Leistungsabgabe in Form von Wärme. Unter Linux erledigt diesen Dienst das Programm "powernowd", das meist als Daemon im Hintergrund zusammen mit einem Kernel, der über die notwendigen Kernel-Module verfügt, die Taktfrequenz anpasst. Unter GNU/Linux Ubuntu Hardy ist dieses Feature bereits standardmäßig aktiviert. Oft ist nurnoch eine Aktivierung im BIOS des Motherboards notwendig.</p><p>Den Vorteil der geringeren Abwärme kann man nutzen, wenn man die Geschwindigkeit der Gehäuse- und CPU-Kühler an die aktuelle Temperatur anpasst. Dies geschieht bei mir zur Laufzeit mit dem offenbar vom Motherboard implementierten HardWare Monitor. Er steuert die Kühler abhängig von der aktuellen Temperatur, was den Geräuschpegel bei mir merklich gesenkt hat.</p><p>Bereits nach kurzer Zeit fällt auf, dass die CPU die meiste Zeit bei herunterskalierter Frequenz im Leerlauf unterwegs ist. Nur selten wird die mögliche Taktfrequenz wirklich ausgenutzt.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/44/powernowd/mixer-plugin http://www.joachim-neu.de/post/43/mixer-plugin/<p>Das "xfce4-mixer-plugin" unter Xubuntu's Desktop-Umgebung XFCE4 zeigt offenbar unter manchen Rechnern ein sehr seltsames Verhalten was das Hinzufügen zum Panel angeht.</p><p>Bei betroffenen Rechnern ist das Hinzufügen des Plugins nicht möglich, wenn man in dem zugehörigen Fenster das Plugin markiert und auf "Hinzufügen" klickt.</p><p>Abhilfe schafft es, das Plugin einfach aus der Liste mit Drag'n'Drop in die entsprechende Leiste an die passende Stelle zu ziehen und dort loszulassen.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/43/mixer-plugin/__unicode__ http://www.joachim-neu.de/post/40/unicode/<p>Zu Beginn meines Ausflugs in die Welt von Django habe ich mit dem Django-Paket der aktuellen Ubuntu Hardy Distribution gearbeitet. Dieses liefert Django in der Version 0.96, gegenüber der die aktuelle SVN-Version einige Vorteile hat. Unter Anderem verwendet die aktuelle SVN-Version __unicode__() statt __str__() für String-Repräsentation von Objekten.</p><p>Bei meinem Umstieg habe ich also meine ganzen alten __str__() Funktionen in __unicode__() umbenannt und unverändert weiterverwendet. Das ging auch gut, bis eines Tages die String-Repräsentation eines Objekts ein Sonderzeichen enthielt. An dieser Stelle warf Django mit Fehlern um sich.</p><p>Glücklicherweise hatte zur selben Zeit ein anderer Einsteiger im IRC-Chat #django auf irc.freenode.net das gleiche Problem und so erfuhr ich, dass __unicode__() (wie eigendlich der Name schon sagt) Unicode-Objekte und keine String-Objekte zurückgeben muss.</p><p>Das macht bei herkömmlichen Strings keinen Unterschied, wohl aber bei Strings, die Sonderzeichen enthalten.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/40/unicode/M2M-Field http://www.joachim-neu.de/post/39/m2m-field/<p>ManyToManyField-Model-Felder (M2M) sind in Django die Möglichkeit, Tabellen zu modellieren, wo mehrere Einträge auf mehrere andere Einträge von Tabellen zeigen. Möchte man beispielsweise in einer Tabelle Pizzen und in einer anderen Tabelle Pizzen-Belag speichern, so erstellt man in der Pizzen-Tabelle ein ManyToManyField für den Belag. Eine Pizza kann also mehr als einen Belag haben, ein Belag kann aber auch auf mehr als einer Pizza vorkommen. Diese Beziehungen werden in Django über eine transparent zwischengeschaltete Hilfstabelle hergestellt.</p><p>Ein seltsames Verhalten zeigt die aktuelle SVN-Version von Django bei ManyToManyField-Feldern auf die eigene Tabelle. Hier führte es bei mir zu mehr als seltsamen Fehlern. Unter Anderem ließen sich keine Werte mehr zuweisen bzw. die zugewiesenen nichtmehr korrekt auslesen, obwohl diese in der Datenbank korrekt abgespeichert wurden.</p><p>Als Lösung stellte sich heraus, dass es offenbar für ManyToManyField-Felder auf die selbe Tabelle notwendig ist, "symmetrical=False" als ein Parameter zu übergeben. Anschließend funktionierte es bei mir problemlos.</p> Fri, 15 May 2009 21:41:33 +0200http://www.joachim-neu.de/post/39/m2m-field/Enigmail http://www.joachim-neu.de/post/31/enigmail/<p>Enigmail ist eine wunderbare Erweiterung des bekannten eMail-Programms Thunderbird. Mit ihr lässt sich bequem PGP/GPG betreiben ohne sich ständig mit Internals rumzuschlagen.</p><p>Nach meinem Update auf das neue Ubuntu Hardy hat Enigmail bei mir jedoch gestreikt. Statt dem automatischen Signieren und Verschlüsseln ausgehender eMails warf es mit Fehlermeldungen um sich, der GPG-Agent sei nicht erreichbar.</p><p>Das Problem löste ich, indem ich das Paket "gnupg-agent" installierte und die beiden Einträge "gpg-agent-info" und "use-agent" der in der Datei ~/.gnupg/gpg.conf auskommentierte.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/31/enigmail/0ace:1215 http://www.joachim-neu.de/post/20/0ace-1215/<p>Dieser WLAN-USB-Stick erforderte bei mir zur Installation unter Ubuntu Gutsy Gibbon keine besonderen Treiber oder Maßnahmen.</p><p>Sonderbarerweise wird er vom Kernel als ein ethX-Interface erkannt.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/20/0ace-1215/Compiz-Fusion http://www.joachim-neu.de/post/15/compiz-fusion/<p>Sollte jemand nach dem Umstieg auf eine neuere Version von Compiz-Fusion (bei mir 0.6.1) auch Probleme mit dem Rotieren des Würfels haben (bei mir rotierte der Würfel auch, wenn ich die mittlere Maustaste innerhalb eines Fensters drückte, was die Copy&Paste-Funktion unbrauchbar machte), empfehle ich ihm, einfach die Erweiterung "Viewport" (im Deutschen "Arbeitsflächenumschalter") zu aktivieren. Bei mir ging es danach.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/15/compiz-fusion/trackerd http://www.joachim-neu.de/post/12/trackerd/<p>Wer (wie ich) kein gesteigertes Interesse an der automatischen Indizierung seiner Dateien hat, kann sich die dafür aufgebrachte Rechenzeit auch einfach sparen.</p><p>Zwar kann man unter Ubuntu mit den "Indizierungseinstellungen" (bei den System-Einstellungen) die Indizierung deaktivieren, das zuständige Programm "trackerd" wird aber dennoch beim Hochfahren geladen.</p><p>Dieses Programm (bzw. dessen Start) kann man jedoch über den Menüpunkt "Sitzungen" bei den System-Einstellungen im Teilbereich "Startprogramme" durch entfernen des Häkchens vor dem Programm "Tracker - Tracker Such- und Indizierungsdienst" ausschalten.</p> Fri, 15 May 2009 21:41:32 +0200http://www.joachim-neu.de/post/12/trackerd/