<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>andreas.goelzer.de &#187; Computers</title>
	<atom:link href="http://andreas.goelzer.de/category/computers/feed" rel="self" type="application/rss+xml" />
	<link>http://andreas.goelzer.de</link>
	<description>Electronics and small programs and other stuff</description>
	<lastBuildDate>Tue, 29 Nov 2011 21:08:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>burn a recorded mpeg-ts file to dvd in linux</title>
		<link>http://andreas.goelzer.de/burn-a-recorded-mpeg-ts-file-to-dvd-in-linux</link>
		<comments>http://andreas.goelzer.de/burn-a-recorded-mpeg-ts-file-to-dvd-in-linux#comments</comments>
		<pubDate>Tue, 29 Nov 2011 21:06:06 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[convert]]></category>
		<category><![CDATA[dreambox]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=279</guid>
		<description><![CDATA[Our old dreambox 7000 records movies in the mpeg-ts format (file extension:.ts). I wrote a Makefile to burn recorded files to dvd. To produce a dvd out of a mpeg-ts file we need: Project-X: Cut and demux videos mplex from &#8230; <a href="http://andreas.goelzer.de/burn-a-recorded-mpeg-ts-file-to-dvd-in-linux">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Our old dreambox 7000 records movies in the mpeg-ts format (file extension:.ts).  I wrote a Makefile to burn recorded files to dvd.<br />
<span id="more-279"></span></p>
<p>To produce a dvd out of a mpeg-ts file we need:</p>
<ul>
<li><a href="http://project-x.sourceforge.net/">Project-X</a>: Cut and demux videos</li>
<li>mplex from the <a href="http://mjpeg.sourceforge.net/">MJPEG Tools</a>: Remux videos</li>
<li><a href="http://dvdauthor.sourceforge.net/">dvdauthor</a>: create a video-dvd file structure</li>
<li>growisofs from the <a href="http://fy.chalmers.se/~appro/linux/DVD+RW/">DVD+RW package</a>: Create an iso image or burn directly to disk</li>
</ul>
<p>In Ubuntu you can install them by typing:</p>
<pre>sudo apt-get install project-x dvdauthor mjpegtools growisofs</pre>
<p>Dvdauthor demands to know the video format, so type</p>
<pre>echo "PAL" > ~/.config/video_format</pre>
<p>(replace PAL with NTSC if living in the USA or another NTSC-country)</p>
<p>Now you should have everything you need.  Copy the makefile to the same folder you downloaded the ts-file(assuming, for simplicity, it&#8217;s named sample.ts) to. Now, to just burn it to dvd, one title, no menu, conserving all audio tracks, do</p>
<pre>make sample.burn</pre>
<p>The advantage of using a Makefile is that you can do each step manually.  You can for example cut and demux the files with project-x by hand, or just produce the .mpg files, then use <a href="http://www.dvdstyler.org/">dvdstyler</a> to create a complex menu and burn the dvd.</p>
<pre lang="python" line="1">all:$(patsubst %.ts,%.dvd,$(wildcard *.ts))

MPLEX=mplex
MPLEXFLAGS=-f 8
DVDAUTHOR=dvdauthor
PROJECTX=projectx

DREAMBOX_BASEURL=root:dreambox@192.168.178.22/hdd/movie
.PRECIOUS: %.m2v %.ts %.mpg %.dvd

%.ts:
	wget ftp://$(DREAMBOX_BASEURL)/$@

%_proc.m2v: %.ts
	$(PROJECTX) -out . -name $*_proc $&lt;

%.mpg: %_proc.m2v
	-rm $*_proc*.txt
	$(MPLEX) $(MPLEXFLAGS) -o $@ $*_proc*
	-rm $*_proc*

%.xml: %.mpg
	echo &quot;&lt;dvdauthor&gt;&lt;vmgm /&gt;&lt;titleset&gt;&lt;titles&gt;&lt;pgc&gt;&lt;vob file=\&quot;$&lt;\&quot; /&gt;&lt;/pgc&gt;&lt;/titles&gt;&lt;/titleset&gt;&lt;/dvdauthor&gt;&quot; &gt; $*.xml

%.dvd: %.xml
	$(DVDAUTHOR) -x $*.xml -o $@ 

%.burn: %.dvd
	growisofs -Z /dev/dvd -dvd-video -V $* $&lt;/</pre><hr /><a href='http://andreas.goelzer.de/download/Makefile-movies'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-generic.png" width="16" height="16" alt="filetype" class="icon16" /> Makefile-movies</a> (623 B, 2011-11-29)<br/><hr />
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/burn-a-recorded-mpeg-ts-file-to-dvd-in-linux/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>readesm 2011 with Qt user interface</title>
		<link>http://andreas.goelzer.de/readesm-2011-with-qt-user-interface</link>
		<comments>http://andreas.goelzer.de/readesm-2011-with-qt-user-interface#comments</comments>
		<pubDate>Sun, 20 Nov 2011 22:41:34 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Vehicles]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[tachograph]]></category>
		<category><![CDATA[trucks]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=222</guid>
		<description><![CDATA[The new versions of readesm use a qt graphical frontend.  Combined with the other changes, readesm should now be more useful and usable. <a href="http://andreas.goelzer.de/readesm-2011-with-qt-user-interface">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The <a href="readesm-reading-digital-tachograph-files">old version of readesm</a> was using a command-line interface to convert the tachograph data into html.  If one wanted it shown in the browser, there was a script to convert the file, write it to a temporary directory, and then open that file in the browser.  However, this approach turned out to be not portable at all.</p>
<p>There were other problems: readesm was using custom Makefiles, which apparently made compiling the source difficult.  I was amazed to discover <a href="http://wiki.ubuntuusers.de/Fahrlinux">this wiki entry for fahrlinx</a>, which contained information on how to install the windows version of readesm using <a href="http://www.winehq.org">wine</a>.  As the windows version at that time was cross-compiled in linux and lacked some features, readesm was clearly too difficult to compile.</p>
<p>In readesm versions since march 2011, both problems are solved.  Readesm now uses <a href="http://www.cmake.org/">cmake</a> for the build process, and <a href="http://qt.nokia.com/">Qt</a> to display the generated html pages in a webkit browser.</p>
<h3>Idea</h3>
<p>The idea behind readesm is to show you exactly what is in the tachograph file.</p>
<h3>Using readesm</h3>
<p>Usually you will either associate readesm with a file extension, and have your file manager open readesm for you.  Or you can open a file from readesm&#8217;s menu.<br />
Alternatively you can use the command line:</p>
<pre>readesm tachofile.ddd</pre>
<p>will open the file in the gui, and</p>
<pre>readesm tachofile.ddd tachofile.html</pre>
<p>will convert the file into html format and save it as <i>tachofile.html</i>.</p>
<h3>Screenshots</h3>
<p><a href='photos/screenshots/readesm/2011.11/vu1.png'><img class='photofiles_thumb' src='thumbs/screenshots/readesm/2011.11/vu1.png.thumb_small.png' alt='link to photos/screenshots/readesm/2011.11/vu1.png' height='100' width='100' title=''/></a> <a href='photos/screenshots/readesm/2011.11/vu2.png'><img class='photofiles_thumb' src='thumbs/screenshots/readesm/2011.11/vu2.png.thumb_small.png' alt='link to photos/screenshots/readesm/2011.11/vu2.png' height='100' width='100' title=''/></a> <a href='photos/screenshots/readesm/2011.11/card1.png'><img class='photofiles_thumb' src='thumbs/screenshots/readesm/2011.11/card1.png.thumb_small.png' alt='link to photos/screenshots/readesm/2011.11/card1.png' height='100' width='100' title=''/></a> </p>
<h3>Free software toolchain for tachographs</h3>
<p>With readesm, <a href="http://developer.berlios.de/projects/fahrlinx/">fahrlinx</a> and <a href="http://andreas.goelzer.de/serial-download-from-a-digital-tachograph-in-python">loadvu</a>, a linux laptop can now connect to vehicle units, read out driver cards and visualize the contents of the files.</p>
<p>To install all three programs in ubuntu:</p>
<pre>sudo apt-add-repository ppa:k-2005
sudo apt-get update
sudo apt-get install readesm fahrlinx loadvu</pre>
<p>It&#8217;s a bit more difficult in Windows, but should be possible nevertheless.</p>
<h3>Download readesm</h3>
<p>Download the latest files from the <a href="https://sourceforge.net/projects/readesm/files/readesm/">project page</a> at sourceforge.  </p>
<ul>
<li>Use the windows-installer (readesm-XX-win32.exe) to install. The latest version should also associate tachograph files with itself.</li>
<li>If you cannot or do not want to install readesm, use readesm-XX-win32.zip</li>
<li>Ubuntu users should either use <a href="https://launchpad.net/~k-2005/+archive/ppa">my ppa</a> or compile from source.</li>
<li>Users of 64 bit windows might be able to run the 32 bit windows version.  Unfortunately, I do not have access to a single 64 bit windows pc.</li>
<li>For other operating systems, download one of the source packages and compile it yourself.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/readesm-2011-with-qt-user-interface/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Serial download from a digital tachograph in python</title>
		<link>http://andreas.goelzer.de/serial-download-from-a-digital-tachograph-in-python</link>
		<comments>http://andreas.goelzer.de/serial-download-from-a-digital-tachograph-in-python#comments</comments>
		<pubDate>Mon, 14 Nov 2011 23:11:08 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Vehicles]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tachograph]]></category>
		<category><![CDATA[trucks]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=243</guid>
		<description><![CDATA[  <a href="http://andreas.goelzer.de/serial-download-from-a-digital-tachograph-in-python">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Digital tachographs are a compulsory equipment for heavy trucks in the european union.  The companies owning these trucks have to download the data at least once every 3 months.</p>
<p>Without dedicated hardware, this was so far not easily possible in linux, but my python script should make it possible to download the data with a serial cable with the right connector.<br />
<span id="more-243"></span></p>
<h3>Ubuntu package</h3>
<p>Ubuntu packages are available in my <a href="https://launchpad.net/~k-2005/+archive/ppa">ppa</a>. You can add my ppa with</p>
<pre>sudo apt-add-repository ppa:k-2005</pre>
<p>and then install loadVu with</p>
<pre>sudo apt-get install loadvu</pre>
<h3>Usage</h3>
<p>Start the program with</p>
<pre>./loadvu</pre>
<p>The data will be saved to a file named after the vehicle and date.<br />
If your serial connection is not /dev/ttyUSB0, you should specify it with the &#8211;serial parameter.  A possible call would be</p>
<pre>./loadvu --serial /dev/ttyUSB1</pre>
<h3>Extra transfer response parameters</h3>
<p>While the commision regulation 1360/2002 defines TREPs 1 to 6 </p>
<table>
<tr>
<th>TRTP/TREP</th>
<th>Description</th>
</tr>
<tr>
<td>1</td>
<td>Overview</td>
</tr>
<tr>
<td>2</td>
<td>Daily Activity on a specified date</td>
</tr>
<tr>
<td>3</td>
<td>Events and faults</td>
</tr>
<tr>
<td>4</td>
<td>Detailed speed</td>
</tr>
<tr>
<td>5</td>
<td>Technical data</td>
</tr>
<tr>
<td>6</td>
<td>Card download</td>
</tr>
</table>
<p>At least the digital tachographs from Siemens VDO return data on other requests, too.  For example Daimler&#8217;s TCO-DKG program requests 17,19 and 20 and saves those to an .add file.  The vu also returns data requesting trtp 18.  To mimic the behaviour of tco-dkg, type</p>
<pre>./loadvu --treps 2,3,4,5 -o mycar.esm
./loadvu --treps 17,19,20 -o mycar.add</pre>
<h3>Download of card data</h3>
<p>It is possible to download the data stored in a driver card inserted into the vehicle unit.  However, in the current version the script will add vehicle data to the file, so few programs will be able to read it.  The current svn of readesm can, but the last release cannot.</p>
<pre>./loadvu --treps 6 -o card.esm</pre>
<p>Future versions might handle this with more elegance.</p>
<h3>Download Speed</h3>
<p>With a digital tachograph from 2007, loadvu tells:</p>
<pre>$ ./loadvu
Sending 'Request Start Communication Request'
Got the expected response
Sending 'Request Diagnostic Session'
Got the expected response
Sending 'Request Request Byte rate 115200'
Got the expected response
[...]
Sending 'Request Stop Communication'
Got the expected response
data saved to UL-XX YYY 2010-11-09 to 2011-11-18 21.54 (CET).esm
Got 222772 Byte in 1789.75275612 seconds. (124.470823827 Byte/s)</pre>
<p>It&#8217;s slow.  Really slow.  Considering how many trucks there are, also expensively slow.  And it&#8217;s not just this script, it&#8217;s that slow with any program.  Why? Hard to tell.  The transfer is slowest when transferring daily activities, where many cryptographic signatures are transferred.  However, there is no technical reason why these would have to be generated at every download, as the data really should not change once written.</p>
<p>Enjoy the script.<br />
<hr /><a href='http://andreas.goelzer.de/download/loadvu-2011.11.tar.gz'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-compressed.png" width="16" height="16" alt="filetype" class="icon16" /> loadvu-2011.11.tar.gz</a> (4.96 kiB, 2011-11-18)<br/><hr /></p>
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/serial-download-from-a-digital-tachograph-in-python/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Play or open newest file from the linux command line</title>
		<link>http://andreas.goelzer.de/play-or-open-newest-file-from-the-linux-command-line</link>
		<comments>http://andreas.goelzer.de/play-or-open-newest-file-from-the-linux-command-line#comments</comments>
		<pubDate>Sun, 23 Oct 2011 14:01:21 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=214</guid>
		<description><![CDATA[In some cases it is convenient to have a shortcut to open the newest file in a directory. Maybe the last show your dvr recorded, or the last file you bought from amazon. For these cases I found this little &#8230; <a href="http://andreas.goelzer.de/play-or-open-newest-file-from-the-linux-command-line">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In some cases it is convenient to have a shortcut to open the newest file in a directory.  Maybe the last show your dvr recorded, or the last file you bought from amazon.</p>
<p>For these cases I found this little bash snippet useful:</p>
<pre>ls -tr | tail -n 1 | xargs -I FILE kde-open "FILE"</pre>
<p><span id="more-214"></span></p>
<p>Instead of <i>kde-open</i>, which opens any file with the associated program, you can use any program, gnome-users might want <i>gnome-open</i>, people with other window managers can use <i>xdg-open</i> from xdg-utils.  Or you can just insert <i>mplayer</i>, if you are only interested in music and videos. </p>
<p>I prefer it installed somewhere in the path, and then one can add a command-line parameter, the number of files to be played:<br />
<pre lang="python" line="1">#!/bin/sh
ls -tr | tail -n ${1:-1} | xargs -I FF kde-open &quot;FF&quot;
</pre><hr /><a href='http://andreas.goelzer.de/download/playlast'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-generic.png" width="16" height="16" alt="filetype" class="icon16" /> playlast</a> (63 B, 2011-10-23)<br/><hr /></p>
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/play-or-open-newest-file-from-the-linux-command-line/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ytplay &#8211; wrapper for youtube-dl.py</title>
		<link>http://andreas.goelzer.de/ytplay-wrapper-for-youtube-dl-py</link>
		<comments>http://andreas.goelzer.de/ytplay-wrapper-for-youtube-dl-py#comments</comments>
		<pubDate>Wed, 17 Feb 2010 22:55:59 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=148</guid>
		<description><![CDATA[Due to my slightly outdated computer flash is a huge problem. So, for viewing youtube videos, youtube-dl.py is a great solution. However, I wanted something more comfortable. ytplay wraps around youtube-dl.py, it searches for a video, orders youtube-dl to get &#8230; <a href="http://andreas.goelzer.de/ytplay-wrapper-for-youtube-dl-py">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Due to my slightly outdated computer flash is a huge problem. So, for viewing youtube videos, <a href="http://bitbucket.org/rg3/youtube-dl/wiki/Home">youtube-dl.py</a> is a great solution. However, I wanted something more comfortable.</p>
<p>ytplay wraps around youtube-dl.py, it searches for a video, orders youtube-dl to get it, and starts playing it in vlc.</p>
<p>Usage is simple:<br />
> ytplay foobar<br />
will search youtube for videos about foobar and play the first one found.</p>
<p>The code is still quite dirty, especially the subprocess part. However, it should work, have fun!<br />
<span id="more-148"></span><br />
<pre lang="python" line="1">#!/usr/bin/python
# -*- coding: utf-8 -*-
#		parser.add_option('-P', '--play', action='store_true',
#				dest='play', help='play in vlc', default=False)

from optparse import OptionParser
from subprocess import Popen, PIPE
from urllib2 import urlopen 
from urllib import quote_plus
from re import search, match
from os import system

parser = OptionParser(version='2010.02.13')

parser.add_option('-p', '--player',
dest='player', metavar='PROGRAM', help='media player to use', default='vlc')

(opts, args) = parser.parse_args()

if match(&quot;http://&quot;,args[0]):
	videopageurl = args[0]
else:
	searchargs = '+'.join(args)
	searchurl = &quot;http://www.youtube.com/results?search_type=&amp;aq=f&amp;oq=&amp;search_query=&quot; + quote_plus(searchargs)
	searchresult = urlopen(searchurl).read()
	p=search(r'(watch\?[^&quot;]*)',searchresult)
	if p==None:
		print &quot;No Videos found&quot;
		exit()
	videopageurl=&quot;http://www.youtube.com/&quot; + p.group(1)
	

print &quot;Starting youtube-dl for &quot; + videopageurl
ytdl = Popen(&quot;youtube-dl.py -t -b &quot; + videopageurl,shell=True,stdout=PIPE)

while not ytdl.stdout.closed:
	line = ytdl.stdout.readline()
	print line,
	if line == '': exit()
	p = search(r'\[download\] Destination: (\S*)',line)
	if p != None:
		print &quot;Starting player: &quot; + opts.player + &quot; &quot; + p.group(1)
		system(opts.player + &quot; &quot; + p.group(1) + &quot; &amp;&quot;)

</pre><hr /><a href='http://andreas.goelzer.de/download/ytplay'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-generic.png" width="16" height="16" alt="filetype" class="icon16" /> ytplay</a> (1.28 kiB, 2010-02-14)<br/><hr /></p>
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/ytplay-wrapper-for-youtube-dl-py/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GPS plasmoid</title>
		<link>http://andreas.goelzer.de/gps-plasmoid</link>
		<comments>http://andreas.goelzer.de/gps-plasmoid#comments</comments>
		<pubDate>Thu, 09 Apr 2009 16:16:20 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[gps]]></category>
		<category><![CDATA[plasmoid]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=133</guid>
		<description><![CDATA[Having recently acquired a bluetooth GPS receiver for as little as 20 €, and just having switched to KDE 4, i tried to combine those two, and write a little plasmoid to show the current position on the desktop. And &#8230; <a href="http://andreas.goelzer.de/gps-plasmoid">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Having recently acquired a bluetooth <a href="http://en.wikipedia.org/wiki/Gps">GPS</a> receiver for as little as 20 €, and just having switched to <a href="http://www.kde.org/announcements/4.2/desktop.php">KDE 4</a>, i tried to combine those two, and write a little plasmoid to show the current position on the desktop.</p>
<p>And that is basically everything to say, enjoy the little applet.<br />
<span id="more-133"></span></p>
<h3>Installation</h3>
<p>Make sure <a href="http://gpsd.berlios.de/">gpsd</a> is installed and set up properly. Also make sure the python bindings are installed.<br />
In Ubuntu you would need to:</p>
<pre>sudo apt-get install gpsd python-gps
sudo dpkg-reconfigure gpsd
sudo apt-get install python-plasma python-dev</pre>
<p>After those are installed,  you can proceed to install the plasmoid with plasmapkg -i.</p>
<h3>Problems and TODOs</h3>
<p>This is all rather dirty and bloated. The correct way to do it would probably be to write a data engine for plasma, which would provide the positional data. Maybe someone will do it, especially if <a href="http://edu.kde.org/marble/">Marble</a> will one day <strike>be able to support overlays</strike> integrate <a href="http://geoclue.freedesktop.org/">GeoClue</a> or something similar.</p>
<p>Right now the data travels from the GPS device to the PC in the form of <a href="http://www.gpsinformation.org/dale/nmea.htm">NMEA sentences</a>, gets then converted into gpsd&#8217;s own format, python-gps connects to gpsd over TCP port 2947, interprets the gpsd output, hands it over to the applet, which reformats the data yet again. For something so useless that just wastes too many CPU cycles. <a href="http://andreas.goelzer.de/gps-mouse-in-python">Interpreting GPS data</a> entirely in python is not hard, but still a bit harder than with gpsd, especially if one wants to cover a lot of GPS devices. Don&#8217;t get me wrong, gpsd does its job quite well, it is just a bit overkill for this task.</p>
<p>Another improvement would be readable coordinates. Something like &#8220;10 km northwest of Zürich&#8221; or even &#8220;200 meters south of Sternen Oerlikon, Zürich&#8221; would really be much more useful.</p>
<p>Update February 2010: Version 0.16 now uses KDE&#8217;s geolocation data engine. This drops the (direct) dependency on gpsd, and allows for ip-based location &#8211; unfortunately i now can no longer get my gps to work with it, hoping for kubuntu lucid.<br />
<p><a href='photos/screenshots/gps-plasmoid/gps-plasmoid012-zoom.png'><img class='photofiles_thumb' src='thumbs/screenshots/gps-plasmoid/gps-plasmoid012-zoom.png.thumb_small.png' alt='link to photos/screenshots/gps-plasmoid/gps-plasmoid012-zoom.png' height='100' width='100' title=''/></a> <a href='photos/screenshots/gps-plasmoid/gps-plasmoid012.png'><img class='photofiles_thumb' src='thumbs/screenshots/gps-plasmoid/gps-plasmoid012.png.thumb_small.png' alt='link to photos/screenshots/gps-plasmoid/gps-plasmoid012.png' height='100' width='100' title=''/></a> <a href='photos/screenshots/gps-plasmoid/gps-plasmoid012-zoom.jpg'><img class='photofiles_thumb' src='thumbs/screenshots/gps-plasmoid/gps-plasmoid012-zoom.jpg.thumb_small.png' alt='link to photos/screenshots/gps-plasmoid/gps-plasmoid012-zoom.jpg' height='100' width='100' title=''/></a> </p><br />
<hr /><a href='http://andreas.goelzer.de/download/gps-plasmoid_0.16.plasmoid'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-generic.png" width="16" height="16" alt="filetype" class="icon16" /> gps-plasmoid_0.16.plasmoid</a> (5.85 kiB, 2010-02-13)<br/><a href='http://andreas.goelzer.de/download/gps-plasmoid_0.15.plasmoid'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-generic.png" width="16" height="16" alt="filetype" class="icon16" /> gps-plasmoid_0.15.plasmoid</a> (2.59 kiB, 2009-04-11)<br/><hr /></p>
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/gps-plasmoid/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>readESM &#8211; Reading Digital Tachograph files</title>
		<link>http://andreas.goelzer.de/readesm-reading-digital-tachograph-files</link>
		<comments>http://andreas.goelzer.de/readesm-reading-digital-tachograph-files#comments</comments>
		<pubDate>Tue, 10 Feb 2009 02:33:51 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Vehicles]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[tachograph]]></category>
		<category><![CDATA[trucks]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=111</guid>
		<description><![CDATA[Update, November 2011: See the post about readesm 2011 and the sourceforge project page for newer descriptions of readesm. Update, March 2011: There is a new release of readesm, The description provided here no longer applies, the new readesm uses &#8230; <a href="http://andreas.goelzer.de/readesm-reading-digital-tachograph-files">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><b>Update, November 2011:</b> <i>See the post about <a href="readesm-2011-with-qt-user-interface">readesm 2011</a> and the <a href="http://sourceforge.net/projects/readesm/files/readesm/">sourceforge project page</a> for newer descriptions of readesm.</i></p>
<p><b>Update, March 2011:</b> <i>There is a new release of readesm,  The description provided here no longer applies, the new readesm uses Qt and cmake.  You can get the new release at the sourceforge <a href="http://sourceforge.net/projects/readesm/files/readesm/">project page</a> and read the documentation <a href="http://readesm.sourceforge.net/help.html">here</a>.</i></p>
<p>For several years now, new trucks sold in the European union are equipped with digital tachographs, that record the driving times and replace the older chart-based mechanical tachographs.</p>
<p>For companies in road transport that means, although in theory they get nice data about their drivers and vehicles, in practice they have to pay a lot of money for the digital tachograph and the associated equipment, which is then used against them &#8211; the old fraud schemes no longer work, the machine cruelly gives every police officer the driving times of the last 28 days (and could give much more).</p>
<p>The usability of the devices I&#8217;m familiar with is also abysmal. It just takes forever to read out the data (9600 baud per default, 115000 baud maximal, but i guess the company&#8217;s software does just the former), and the drivers have to keep track of their times manually &#8211; just not up to par with 2009 technology.</p>
<p>The company also had just a very bad software for analyzing the data recorded by the card and the digital tachograph, so I was asked to write a simple visualization program.</p>
<h3>Compiling</h3>
<p>You can get the program files from this page, or from the <a href="http://sourceforge.net/projects/readesm/">development page</a> at Sourceforge.<br />
Since so far there is no binary distribution for the program, you will have to compile it yourself.<br />
To do that, you need a c++ compiler, parts of the <a href="http://www.boost.org/">boost library</a> (specifically program_options and shared_ptr) and the <a href="http://gmplib.org/">Gnu MP library</a>, wich is used to check the various <a href="http://en.wikipedia.org/wiki/RSA">RSA</a> signatures. Once all those are installed, typing make/make install should work fine. On <a href="http://www.ubuntu.com/">Ubuntu</a> systems, you will need to do something like:</p>
<pre>svn co https://readesm.svn.sourceforge.net/svnroot/readesm readesm
sudo apt-get install libboost-program-options-dev libgmpxx4ldbl  libgmp3-dev
make
sudo make install
</pre>
<p>You can of course also use checkinstall instead of make install, or type make package, which invokes checkinstall.</p>
<h3>Running the program</h3>
<p>In most circumstances, you will run the program from the commandline like this:</p>
<pre>readesm --infile foo.esm --outfile bar.html --format=html</pre>
<p>Alternatively, if no output file is specified, stdout is used. For <a href="http://www.kde.org/">KDE</a> users, i wrote a little wrapper script named readesm-wrap-kde.sh. It will get installed my typing make install</p>
<h3>Security</h3>
<p>It is a really pleasant surprise to see a nice security model in the digital tachographs, considering the rules for the security implementations were made by politicians. Both cards and vehicle units work with 1024-bit RSA keys, and each vehicle unit has its own key, with an certificate signed by the member state, which in turn is signed by an European master key. Data is hashed with SHA-1, subsequently padded and signed by the vehicle unit, and that signature appended to the readouts. The law even states that the companies have to store the data in this signed form, so there is little chance to tamper with the data, once recorded.</p>
<p>Since the most likely attacker &#8211; the evil manager who wants to exploit the drivers &#8211; has physical access to the card and vehicle unit, which contain the private keys, even 1024-bit RSA provides no absolute security. The manager could try a timing attack, or take a really close look at the storage, both times avoiding having to solve the RSA problem.</p>
<p>The connection from tachograph to sensor is also secured, using Triple-DES. The week point here is the sensor &#8211; a successful attack against the sensors some DAF trucks are equipped with is to disturb it using strong permanent magnets, thereby preventing it from recognizing the changing magnetic fields.</p>
<p>All possible attacks against the security system however face the problem of being unveiled by police checkpoints or a cross-correlation of the faked data with data from other sources, for example the toll systems recording every few highway kilometers in Germany.</p>
<p><p><a href='photos/screenshots/readesm/alpha_html_control.png'><img class='photofiles_thumb' src='thumbs/screenshots/readesm/alpha_html_control.png.thumb_small.png' alt='link to photos/screenshots/readesm/alpha_html_control.png' height='100' width='100' title=''/></a> <a href='photos/screenshots/readesm/alpha_html_output.png'><img class='photofiles_thumb' src='thumbs/screenshots/readesm/alpha_html_output.png.thumb_small.png' alt='link to photos/screenshots/readesm/alpha_html_output.png' height='100' width='100' title=''/></a> <a href='photos/screenshots/readesm/card_error.png'><img class='photofiles_thumb' src='thumbs/screenshots/readesm/card_error.png.thumb_small.png' alt='link to photos/screenshots/readesm/card_error.png' height='100' width='100' title=''/></a> <a href='photos/screenshots/readesm/readesm_0.3.2_german_locale.png'><img class='photofiles_thumb' src='thumbs/screenshots/readesm/readesm_0.3.2_german_locale.png.thumb_small.png' alt='link to photos/screenshots/readesm/readesm_0.3.2_german_locale.png' height='100' width='100' title=''/></a> <a href='photos/screenshots/readesm/readesm_0.3.2_windows_xml_2.PNG'><img class='photofiles_thumb' src='thumbs/screenshots/readesm/readesm_0.3.2_windows_xml_2.PNG.thumb_small.png' alt='link to photos/screenshots/readesm/readesm_0.3.2_windows_xml_2.PNG' height='100' width='100' title=''/></a> error, cannot open image photos/screenshots/readesm/2011.11. </p><br />
This is the historical release, described in this post, in case you do not like Qt.  Otherwise, check the <a href="http://sourceforge.net/projects/readesm/files/readesm/">newer versions</a>.<br />
<hr /><a href='http://andreas.goelzer.de/download/readesm.tar.bz2'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-compressed.png" width="16" height="16" alt="filetype" class="icon16" /> readesm.tar.bz2</a> (60.86 kiB, 2009-05-19)<br/><hr /></p>
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/readesm-reading-digital-tachograph-files/feed</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>GPS Mouse in Python</title>
		<link>http://andreas.goelzer.de/gps-mouse-in-python</link>
		<comments>http://andreas.goelzer.de/gps-mouse-in-python#comments</comments>
		<pubDate>Sat, 08 Nov 2008 00:15:49 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[gps]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=74</guid>
		<description><![CDATA[Some months ago I aquired a cheap gps mouse (Royaltek RGM-2000, really cheap, 2 € + shipping) at ebay. My plans to use it in combination with an microcontroller and a display haven&#8217;t worked out, it is a lot of &#8230; <a href="http://andreas.goelzer.de/gps-mouse-in-python">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Some months ago I aquired a cheap gps mouse (Royaltek RGM-2000, really cheap, 2 € + shipping) at ebay. My plans to use it in combination with an microcontroller and a display haven&#8217;t worked out, it is a lot of work and the garmin units do that job fine.<br />
However, playing around with it in python lead to better results. Getting the data to <a href="http://earth.google.com/">google earth</a> works nicely, and at least <a href="http://qlandkarte.sourceforge.net/">qlandkarte</a> can read the generated gpx tracks.<br />
<span id="more-74"></span></p>
<h4>Usage</h4>
<ul>
<li>Start the Program, add a parameter for the port your nmea device is attached to (/dev/ttyUSB0 is the default</li>
<li>Start google earth or something, load the generated kml file (/tmp/posdate by default)</li>
<li>Exit the program by pressing ctrl-c, track data will be written to /tmp/track-some time.gpx</li>
</ul>
<p>Guess I should code something with <a href="http://xkcd.com/407/">extra geek value</a> now.<br />
It might be comfortable to have google earth automatically reload the file, so instead open sth. like</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;kml</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://earth.google.com/kml/2.1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;NetworkLink<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>GPS<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;flyToView<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/flyToView<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;href<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/tmp/posdata.kml<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/href<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;refreshMode<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>onInterval<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/refreshMode<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;refreshInterval<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>10<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/refreshInterval<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/NetworkLink<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/kml<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<pre lang="python" line="1">#!/usr/bin/python
&quot;&quot;&quot;
Script to read nmea data from a GPS mouse
Copyright (C) 2008  Andreas Goelzer
 
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
 
This program reads data from a nmea device (uses the GGA sentence),
and creates a google kml file with the current position and the path
leading there. Additionally, a gpx file is generated containing the
track data with time information.
&quot;&quot;&quot;

from serial import Serial;
from time import strftime, gmtime;
from optparse import OptionParser;


hist = &quot;&quot;;
gpx = &quot;&quot;;

kmlmask=&quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;kml xmlns=&quot;http://earth.google.com/kml/2.0&quot;&gt;
&lt;Document&gt;
	&lt;Placemark&gt;
		&lt;name&gt;Your Position&lt;/name&gt;
		&lt;Point&gt;
			&lt;coordinates&gt;%s&lt;/coordinates&gt;
		&lt;/Point&gt;
	&lt;/Placemark&gt;
	&lt;Placemark&gt;
		&lt;name&gt;Previous positions&lt;/name&gt;
		&lt;description&gt;Path that lead you here&lt;/description&gt;
		&lt;LineString&gt;
			&lt;coordinates&gt;%s&lt;/coordinates&gt;
		&lt;/LineString&gt;
	&lt;/Placemark&gt;
&lt;/Document&gt;
&lt;/kml&gt;&quot;&quot;&quot;
#			&lt;altitudeMode&gt;absolute&lt;/altitudeMode&gt;

gpxmask = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot; ?&gt;&lt;gpx xmlns=&quot;http://www.topografix.com/GPX/1/1&quot; xmlns:gpxx=&quot;http://www.garmin.com/xmlschemas/GpxExtensions/v3&quot; xmlns:gpxtpx=&quot;http://www.garmin.com/xmlschemas/TrackPointExtension/v1&quot; creator=&quot;Colorado 300&quot; version=&quot;1.1&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensions/v3/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtension/v1/TrackPointExtensionv1.xsd&quot;&gt;
&lt;trk&gt;&lt;name&gt;%s&lt;/name&gt;&lt;trkseg&gt;%s&lt;/trkseg&gt;&lt;/trk&gt;&lt;/gpx&gt;&quot;&quot;&quot;

def gpstime():
	return strftime(&quot;%Y-%m-%dT%H:%M:%SZ&quot;,gmtime());

def readlatlon(value,inverse):
	lat = float(value);
	lat2 = int(lat) / 100;
	lat = lat2 + (lat - 100 * lat2)/ 60; 
	if inverse:
		lat = -lat;
	return lat;

def calcchecksum(checkstr):
	cs = ord(checkstr[0]);
	for i in range(1,len(checkstr)):
		cs ^= ord(checkstr[i])
	return cs;


class sentencevalidator:
	&quot;Check checksum and other stuff and split to fields&quot;
	def __init__(self,line):
		if(line[0] == '$' and line[-5] == '*' and calcchecksum(line[1:-5]) ==  int(line[-4:-2],16)):
			self.valid = True;
			self.sentence = line[3:6];
			self.data = line[7:-5].split(',');
		else :
			self.valid = False;

parser = OptionParser(version=&quot;%prog 0.1&quot;);
parser.add_option(&quot;-s&quot;, &quot;--serial&quot;, dest=&quot;serial&quot;,
                  help=&quot;serial terminal of the gps unit&quot;, default='/dev/ttyUSB0', metavar=&quot;FILE&quot;);
parser.add_option(&quot;-g&quot;, &quot;--gpxfile&quot;, dest=&quot;gpxfile&quot;,
                  help=&quot;GPX output file&quot;, default=&quot;/tmp/track&quot; + gpstime() + &quot;.gpx&quot;, metavar=&quot;FILE&quot;);
parser.add_option(&quot;-k&quot;, &quot;--kmlfile&quot;, dest=&quot;kmlfile&quot;,
                  help=&quot;KML output file&quot;, default=&quot;/tmp/posdata.kml&quot;, metavar=&quot;FILE&quot;);
parser.add_option(&quot;-v&quot;, &quot;--verbose&quot;,
                  action=&quot;store_true&quot;, dest=&quot;verbose&quot;, default=False,
                  help=&quot;print debug messages&quot;);
 
(options, args) = parser.parse_args();

gps = Serial(options.serial, 4800, timeout=1);


#on sirf chips, activate all sentences
for i in range(1,5):
	cmd = &quot;PSRF103,0%d,00,05,01&quot; % i;
	realcmd=&quot;$%s*%x\r\n&quot; % (cmd,calcchecksum(cmd));
	print realcmd;
	gps.write(realcmd)

try:
	while 1:
		line = gps.readline()
		if(options.verbose): print line,
		s = sentencevalidator(line);
		if(s.valid and s.sentence == &quot;GGA&quot; and int(s.data[5]) != 0):
			lat = readlatlon(s.data[1],s.data[2]=='S');
			lon = readlatlon(s.data[3],s.data[4]=='W');
			alt = float(s.data[8]);
				
			gpx += &quot;\n&quot; + '&lt;trkpt lat=&quot;%f&quot; lon=&quot;%f&quot;&gt;&lt;ele&gt;%f&lt;/ele&gt;&lt;time&gt;%s&lt;/time&gt;&lt;/trkpt&gt;' % (lon,lat,alt,gpstime())
			
			position =  &quot;%f, %f, %f&quot; % (lon,lat,alt);
			print position
			hist += &quot;\n&quot; + position;
			f=open(&quot;/tmp/posdata.kml&quot;,'w');
			f.write(kmlmask % (position,hist));
			f.close();

except:
	0

f=open(options.gpxfile,'w');
f.write(gpxmask % (gpstime(),gpx));
f.close();

gps.close()</pre><hr /><a href='http://andreas.goelzer.de/download/readgps.py'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-source-alt.png" width="16" height="16" alt="filetype" class="icon16" /> readgps.py</a> (4.46 kiB, 2008-11-08)<br/><hr />
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/gps-mouse-in-python/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>kernel config based on lsmod output</title>
		<link>http://andreas.goelzer.de/kernel-config-based-on-lsmod-output</link>
		<comments>http://andreas.goelzer.de/kernel-config-based-on-lsmod-output#comments</comments>
		<pubDate>Mon, 06 Oct 2008 11:35:20 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=23</guid>
		<description><![CDATA[Update (October 7th, 2011): Kernels from 2.6.32 onwards should have the option to &#8220;make localmodconfig&#8221; and &#8220;make localyesconfig&#8221;. This post describes a dirty hack to get a result similar to &#8220;make localyesconfig&#8221;. If possible, use the official way instead of &#8230; <a href="http://andreas.goelzer.de/kernel-config-based-on-lsmod-output">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><b>Update (October 7th, 2011):</b> <i>Kernels from 2.6.32 onwards should have the option to &#8220;make localmodconfig&#8221; and &#8220;make localyesconfig&#8221;. This post describes a dirty hack to get a result similar to &#8220;make localyesconfig&#8221;. If possible, use the official way instead of my python script.</i></p>
<p>After reading about the amazing <a href="http://lwn.net/Articles/299483/">5-seconds bootup</a> I decided to once again compile a kernel myself. Compiling a kernel is almost trivial these days, but customizing the configuration can still be quite confusing. For example, the names of the modules in lsmod aren&#8217;t the ones you select as config options. To map them, I found some scripts in the <a href="http://wiki.linuxquestions.org/wiki/Configuring_linux_kernel">LQWiki</a>, but they weren&#8217;t that easily to use, and also programming in bash is just painful.</p>
<p>So i wrote a python variant, that takes an input config(for example your distributions config) and changes the reply to &#8220;y&#8221; for all config options if the respective module is loaded(ie. if ext3 is loaded, CONFIG_EXT3_FS=y will be set).</p>
<p>In almost all cases you still want to tweak the resulting config file with make menuconfig. Also keep in mind that some things don&#8217;t work that easily if compiled in, for example if firmware has to be loaded from a file, the disk should be accessible.<br />
<pre lang="python" line="1">#!/usr/bin/python
# -*- coding: utf-8 -*-
&quot;&quot;&quot;
Script to modify kernel config based on lsmod output
Copyright (C) 2008  Andreas Goelzer
 
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
 
 
Based on a previous config and the output of lsmod, this script determines
which modules could be compiled in and generates a new config.
See http://andreas.goelzer.de/kernel-config-based-on-lsmod-output for updates
&quot;&quot;&quot;

import re;
from optparse import OptionParser;
from os import popen;
from sys import stderr, stdout, stdin;

parser = OptionParser(version=&quot;%prog 0.31&quot;);
parser.add_option(&quot;-i&quot;, &quot;--infile&quot;, dest=&quot;cfgfile&quot;,
                  help=&quot;input config file&quot;, default=&quot;.config&quot;, metavar=&quot;FILE&quot;);
parser.add_option(&quot;-o&quot;, &quot;--outfile&quot;, dest=&quot;outfile&quot;,
                  help=&quot;output config file&quot;, default=&quot;-&quot;, metavar=&quot;FILE&quot;);
parser.add_option(&quot;-l&quot;, &quot;--logfile&quot;, dest=&quot;logfile&quot;,
                  help=&quot;file to log errors to&quot;, default=&quot;-&quot;, metavar=&quot;FILE&quot;);
parser.add_option(&quot;-s&quot;, &quot;--sourcedir&quot;, dest=&quot;sourcedir&quot;,
                  help=&quot;kernel source tree&quot;, default=&quot;.&quot;, metavar=&quot;DIR&quot;);
#parser.add_option(&quot;-v&quot;, &quot;--verbose&quot;,
                  #action=&quot;store_true&quot;, dest=&quot;verbose&quot;, default=False,
                  #help=&quot;print debug messages&quot;);

(options, args) = parser.parse_args();
if(options.outfile == '-'): of = stdout;
else: of = open(options.outfile, 'w');
if(options.logfile != '-'): stderr = open(options.logfile, 'w');


loadedmods=popen('lsmod | tail -n+2').readlines();
getmodname=re.compile(r&quot;^(?P&lt;modname&gt;\w*)&quot;);

#prob. need to replace kernel with sth. like (kernel|ubuntu) for an ubuntu kernel source
parsepath=re.compile(r&quot;/kernel(?P&lt;path&gt;/.*/)(?P&lt;file&gt;.*).ko&quot;)

wantin=[];
for module in loadedmods:
	modname = re.search(getmodname,module).group('modname');
	moduleprops=re.search(parsepath,popen('modinfo -n ' + modname).read());
	if(moduleprops):
		#search the makefile for the module name
		try:
			f=open(options.sourcedir + moduleprops.group('path') + 'Makefile' , 'r');
		except IOError:
			stderr.write('Could not find Makefile for ' + modname + '\n');
			continue
		cont=f.read();
		f.close();
		m=re.search(r&quot;obj-\$\((?P&lt;cfgname&gt;[A-Z0-9_]*)\)\W*\+=\W*&quot;+moduleprops.group('file')+r&quot;\.o&quot;,cont);
		if(m):wantin.append(m.group('cfgname'));
		else:stderr.write('Could not determine config name for ' + modname + '\n');
	else:
		stderr.write('Could not parse modinfo for ' + modname + '\n');



if(options.cfgfile != '-'): 
	f=open(options.cfgfile, 'r');
	lines=f.readlines();
	f.close();
else:
	lines=stdin.readlines();

confparse = re.compile(r&quot;\W*(?P&lt;iscomment&gt;#?)\W*(?P&lt;cfgname&gt;CONFIG_[A-Z0-9_]*)\W*=?\W*(?P&lt;answer&gt;[nmy]?)&quot;);

for line in lines:
	matches = re.search(confparse,line);
	if(matches and matches.group('cfgname') in wantin): 
		of.write(matches.group('cfgname')+'=y\n');
	else: 
		#if(matches and matches.group('answer') == 'm'):of.write(matches.group('cfgname')+'=n\n');
		of.write(line);</pre><hr /><a href='http://andreas.goelzer.de/download/customconfig.py'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-source-alt.png" width="16" height="16" alt="filetype" class="icon16" /> customconfig.py</a> (3.41 kiB, 2009-05-19)<br/><hr /></p>
<p>To use the script, call it for example like <code>./customconfig.py -i /boot/config-2.6.24-21-generic -o .config</code> if it is located in a linux kernel directory. Then modify the resulting config to suit your needs with <code>make menuconfig</code>, and then you can proceed to compile your kernel.</p>
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/kernel-config-based-on-lsmod-output/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Feeding a screensaver from the digikam database</title>
		<link>http://andreas.goelzer.de/feeding-a-screensaver-from-the-digikam-database</link>
		<comments>http://andreas.goelzer.de/feeding-a-screensaver-from-the-digikam-database#comments</comments>
		<pubDate>Mon, 02 Jun 2008 20:17:09 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Photography]]></category>
		<category><![CDATA[digikam]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[screensaver]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=12</guid>
		<description><![CDATA[After several months of living without any screensaver, I decided it just would be nice to once again have something nice to watch and show while idling. I really like the photo slideshow that ships with windows vista, but as &#8230; <a href="http://andreas.goelzer.de/feeding-a-screensaver-from-the-digikam-database">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>After several months of living without any screensaver, I decided it just would be nice to once again have something nice to watch and show while idling. I really like the photo slideshow that ships with windows vista, but as my laptop runs linux only that was not possible. The next best thing i found was glslideshow from the <a href="http://www.jwz.org/xscreensaver/">xscreensaver compilation</a>. Like most slideshow programs, glslideshow will look into a given directory, and show files out of it in random order. However, there are downsides to that simple approach: My photo folder contains some private pictures, and also some pictures that are just ugly. So i decided to connect it to my <a href="http://www.digicam.org">digikam</a> database, which was surprisingly simple.</p>
<p>By default, xscreensaver takes the directory out of its configfile ~/.xscreensaver, and passes it to a helper script xscreensaver-getimage-file, which then prints the complete path to a random file in that directory. So all one needs to do to add another source for pictures is to replace that file, there is already <a href="http://jrwren.wrenfam.com/blog/2005/02/20/flickr-xscreensaver-fun/">xscreensaver-getimage-flickr<br />
</a>, which pulls photos off flickr. So I wrote a similar script in python to print a random file from my digikam database. Maybe there are more?</p>
<h4>Installation</h4>
<p>The script is written in python, so that has to be installed (which is usually the case), it also requires sqlite and python bindings for it (apt-get install python-pysqlite2 in debian and ubuntu). If those are installed, backup the original xscreensaver-getimage-file, and copy the script there. Check that it is executable.<br />
the overall process would look like(assuming xscreensaver-glslideshow already works)</p>
<pre>
sudo apt-get install python-pysqlite2
cd ~
wget http://andreas.goelzer.de/download/xscreensaver-getimage-digikam.py
chmod +x xscreensaver-getimage-digikam.py
cd /usr/bin
sudo mv xscreensaver-getimage-file xscreensaver-getimage-file-original
sudo mv ~/xscreensaver-getimage-digikam.py /usr/bin/
ln -s xscreensaver-getimage-digikam.py xscreensaver-getimage-file
</pre>
<p>If you had previously pointed xscreensaver to your digikam photo folder, that should work now. If not, edit ~/.xscreensaver and add a line pointing to that directory, in my case:</p>
<pre>
imageDirectory: /home/goelzera/Documents/Bilder
</pre>
</p>
<h4>Modification</h4>
<p>Right now this is all a bit hacky. at the beginning of the file, there is a line</p>
<pre>bad_tags = "('private','me','Nophoto','Notmeanttobenice')"</pre>
<p>If called, the script will take a random picture out of the database, then check if it has one of those tags. If it is tagged with one of those, it will be dismissed, similarly, if it has an extension indicating xscreensaver won&#8217;t be able to display it. So, set those line to the tags you do not want in your slideshow. For everything else you need to change the sql queries or the source code.</p>
<h4>Running</h4>
<p>Set your screensaver to glslideshow and wait for it to start</p>
<pre lang="python" line="1">#!/usr/bin/python
# -*- coding: utf-8 -*-
&quot;&quot;&quot;
Script to choose random pictures from the digikam database
Copyright (C) 2008  Andreas Goelzer

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.


This program takes one random picture out of a sqlite-database
made by digikam.
This is useful for screensavers, xscreensaver-glslideshow in particular.
&quot;&quot;&quot;

#import sys;
#ef=open('/home/goelzera/Documents/Programme/python/xscreensaver-errlog','a')
#sys.stderr = ef

good_extensions = ('jpg', 'jpeg', 'pjpeg', 'pjpg', 'png', 'gif', 'tif', 'tiff', 'xbm', 'xpm')
bad_tags = &quot;('private','me','Nophoto','Notmeanttobenice')&quot;
#good_tags = &quot;('public')&quot;
good_tags = &quot;&quot;
attempts = 200


import sqlite3;
from sys import argv, exit;
from os.path import splitext;

digikamversion = &quot;4&quot;;

if(len(argv) &gt; 1):
	dirname = argv[len(argv) - 1]
else:
	dirname = &quot;/home/goelzera/Documents/Pictures&quot;
	
con = sqlite3.connect(dirname + &quot;/digikam&quot; + digikamversion + &quot;.db&quot;)
if(digikamversion == &quot;4&quot;):
	url = &quot;relativePath&quot;
	dirid = &quot;album&quot;
else:
	url = &quot;url&quot;
	dirid = &quot;dirid&quot;
	
#from time import time
#f=open('/home/goelzera/Documents/Programme/python/xscreensaver-log','a')
#f.write(str(time()) + '\t' + str(argv) + '\t')

#get tagids for bad tags
def getTagIdsFromNames(names):
	tag_ids = ' ';
	for row in con.execute(&quot;SELECT id FROM Tags WHERE name IN &quot;+ names):
		tag_ids += str(row[0]) + ','
	tag_ids = '(' + tag_ids[:-1] + ')'
	return tag_ids

if(bad_tags != &quot;&quot;): bad_tag_ids = getTagIdsFromNames(bad_tags)
if(good_tags != &quot;&quot;): good_tag_ids = getTagIdsFromNames(good_tags)

file = 'none';
#search for images, take a random one out of the db and see if it fulfills the criteria
for attempt in range(attempts):
	#get a random picture, i guess this is the wrong way, performs horrible
	#truely random, but painfully slow
	#row = con.execute(&quot;SELECT id, name, $dirid FROM Images ORDER BY RANDOM() LIMIT 0,1&quot;).fetchone()
	#fast, but not as random
	row = con.execute(&quot;SELECT id, name, &quot;+ dirid+&quot; FROM Images WHERE id &gt;= (abs(RANDOM()) % (SELECT max(id) FROM Images)) LIMIT 0,1&quot;).fetchone()
	#f.write(str(row[0]) + ',')
	
	#check for bad tag
	if(bad_tags != &quot;&quot;):
		if(con.execute(&quot;SELECT 1 FROM ImageTags WHERE imageid = &quot; + str(row[0]) + &quot; AND tagid IN &quot;+ bad_tag_ids).fetchone()): continue

	#check for good tag
	if(good_tags != &quot;&quot;):
		if(not con.execute(&quot;SELECT 1 FROM ImageTags WHERE imageid = &quot; + str(row[0]) + &quot; AND tagid IN &quot;+ good_tag_ids).fetchone()): continue


	#check for invalid extension
	ext = splitext(row[1])
	ext = ext[1][1:].lower()
	if(not ext in good_extensions): continue
	
	#not rejected, get directory
	drow = con.execute(&quot;SELECT &quot;+url+&quot; FROM Albums WHERE id = &quot; + str(row[2])).fetchone()
	file = dirname + drow[0] + '/' + row[1]
	break

print file.encode('utf-8')

#f.write(file.encode('latin-1') + '\n')





</pre><hr /><a href='http://andreas.goelzer.de/download/xscreensaver-getimage-digikam.py'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-source-alt.png" width="16" height="16" alt="filetype" class="icon16" /> xscreensaver-getimage-digikam.py</a> (3.29 kiB, 2009-08-06)<br/><hr />
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/feeding-a-screensaver-from-the-digikam-database/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 1/19 queries in 0.056 seconds using disk: basic
Object Caching 666/695 objects using disk: basic

Served from: andreas.goelzer.de @ 2012-02-05 05:54:42 -->
