<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5225187212028091396</id><updated>2011-12-30T13:19:29.695+01:00</updated><category term='Mathematik'/><category term='Fedora'/><category term='Gamepad'/><category term='C'/><category term='Softwareentwicklung'/><category term='Urlaub'/><category term='Misc'/><category term='projects'/><category term='WebKit'/><category term='dvr-recover'/><category term='GLib'/><category term='Jaunty'/><category term='Sachsen'/><category term='ExIP'/><category term='VagaMule'/><category term='Festplattenrekorder'/><category term='Compiz'/><category term='Shutter'/><category term='Debugging'/><category term='Acer Aspire One'/><category term='Last.fm'/><category term='o2'/><category term='Squeeze'/><category term='XSLT'/><category term='CSS'/><category term='acerfand'/><category term='Projekt'/><category term='Pipes'/><category term='Barcode'/><category term='gWallpapers'/><category term='Perl'/><category term='Gnome'/><category term='Jabber'/><category term='UTMS'/><category term='NAT'/><category term='Liferea'/><category term='FritzBox'/><category term='Chat'/><category term='iPhone'/><category term='Upgrade'/><category term='Caller ID'/><category term='Wifi'/><category term='GPS'/><category term='EAN'/><category term='Jailbreak'/><category term='cross compiler'/><category term='Datenrettung'/><category term='Xfce'/><category term='mobile broadband'/><category term='Python'/><category term='mail'/><category term='Tunneling'/><category term='GTR'/><category term='Drobox'/><category term='pv'/><category term='Netzwerk'/><category term='Fotos'/><category term='Kernel-Mode-Settings'/><category term='Socat'/><category term='freie Software'/><category term='Programming'/><category term='iPhone OS 4.0'/><category term='Feedreader'/><category term='WLAN'/><category term='m3u-copy.py'/><category term='iPod Touch'/><category term='Reverse Connections'/><category term='Joystick'/><category term='KDE'/><category term='Script'/><category term='dirlisting.py'/><category term='DesktopNova'/><category term='Google Wave'/><category term='Debian'/><category term='DreamPlug'/><category term='Software Development'/><category term='Pidgin'/><category term='rc.local'/><category term='U-Boot'/><category term='XMPP'/><category term='Jaunty Jackalope'/><category term='Abitur'/><category term='Handschriftanalyse'/><category term='blog'/><category term='hugin'/><category term='studentconsult-downloader'/><category term='Locale'/><category term='free software'/><category term='Taschenrechner'/><category term='Screenshottool'/><category term='Linux'/><category term='twitter'/><category term='Anrufmonitor'/><category term='Microblogging'/><category term='identi.ca'/><category term='Netbook'/><category term='gcc'/><category term='Ubuntu'/><category term='Windows-Bashing'/><category term='xmldirlisting'/><category term='Panormabilder'/><title type='text'>Stefan’s Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>73</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-58337225676154410</id><published>2011-12-30T13:01:00.002+01:00</published><updated>2011-12-30T13:19:29.708+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DreamPlug'/><category scheme='http://www.blogger.com/atom/ns#' term='U-Boot'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Freeing my DreamPlug (Second Part)</title><content type='html'>&lt;p&gt;I don’t know what caused the problem &lt;a href="http://haliner.blogspot.com/2011/11/blog-post.html"&gt;I was recently faced with&lt;/a&gt;, but the latest U-Boot source code works fine with my DreamPlug.&lt;/p&gt;

&lt;p&gt;You don’t need any patches, just compile the plain source code for the dreamplug target (either directly on the DreamPlug or on another box and a cross compiler).&lt;/p&gt;

&lt;p&gt;Everything seems to work quite well.&lt;/p&gt;

&lt;p&gt;I’m also using the latest Linux kernel sources. You only need to &lt;a href="http://article.gmane.org/gmane.linux.ports.arm.kernel/143116/match=dreamplug+patch"&gt;apply one patch&lt;/a&gt; which you can find on the Linux mailing lists.&lt;/p&gt;

&lt;p&gt;Since I set this configuration up the DreamPlug is really stable and reliable and I can recommend it to all DreamBox users.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-58337225676154410?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/58337225676154410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/12/freeing-my-dreamplug-second-part.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/58337225676154410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/58337225676154410'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/12/freeing-my-dreamplug-second-part.html' title='Freeing my DreamPlug (Second Part)'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-6653635423742720607</id><published>2011-11-05T20:33:00.003+01:00</published><updated>2011-11-05T23:37:36.416+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DreamPlug'/><category scheme='http://www.blogger.com/atom/ns#' term='U-Boot'/><category scheme='http://www.blogger.com/atom/ns#' term='free software'/><title type='text'>Freeing my DreamPlug (replacing U-Boot bootloader)</title><content type='html'>&lt;p&gt;Well, see yourself:&lt;/p&gt;

&lt;pre class="terminal"&gt;Marvell&gt;&gt; reset
resetting ...


U-Boot 2011.09 (Nov 05 2011 - 11:44:46)
Marvell-DreamPlug

SoC:   Kirkwood 88F6281_A1
DRAM:  512 MiB
WARNING: Caches not enabled
SF: Detected MX25L1605D with page size 64 KiB, total 2 MiB
In:    serial
Out:   serial
Err:   serial
Net:   egiga0, egiga1
88E1116 Initialized on egiga0
88E1116 Initialized on egiga1
Hit any key to stop autoboot:  0 
Marvell&gt;&gt; help ext2load
ext2load - load binary file from a Ext2 filesystem

Usage:
ext2load &lt;interface&gt; &lt;dev[:part]&gt; [addr] [filename] [bytes]
    - load binary file 'filename' from 'dev' on 'interface'
      to address 'addr' from ext2 filesystem
Marvell&gt;&gt;&lt;/pre&gt;

&lt;p&gt;Thanks to everyone who made this possible. Free software rocks!&lt;/p&gt;

&lt;p style="color:red;"&gt;Update: I’m experiencing some problems. USB subsystem doesn’t work, so I’m unable to boot anything which is directly attached to the plug. Currently I’m trying to make a new U-Boot image. Progress reports and a complete guide for (safely?) flashing the DreamPlug as soon as possible.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-6653635423742720607?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/6653635423742720607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/11/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6653635423742720607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6653635423742720607'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/11/blog-post.html' title='Freeing my DreamPlug (replacing U-Boot bootloader)'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-5657082726461784968</id><published>2011-10-19T18:10:00.003+02:00</published><updated>2011-10-19T18:11:58.737+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Lidl Error 404: Money not found</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-lCCdc1MpoV0/Tp72lFDhyDI/AAAAAAAABUo/bnjkulq4K5o/s1600/IMG_1813.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-lCCdc1MpoV0/Tp72lFDhyDI/AAAAAAAABUo/bnjkulq4K5o/s320/IMG_1813.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5665236498151229490" /&gt;&lt;/a&gt;

&lt;p&gt;Who came up with this stupid “Wha, wha, wha. Money doesn’t make you happy”? Fool! It does! :D&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-5657082726461784968?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/5657082726461784968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/10/lidl-error-404-money-not-found.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5657082726461784968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5657082726461784968'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/10/lidl-error-404-money-not-found.html' title='Lidl Error 404: Money not found'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-lCCdc1MpoV0/Tp72lFDhyDI/AAAAAAAABUo/bnjkulq4K5o/s72-c/IMG_1813.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4615392787595761860</id><published>2011-08-16T23:23:00.002+02:00</published><updated>2011-08-16T23:29:33.858+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='cross compiler'/><title type='text'>Building gcc cross compiler without libc</title><content type='html'>&lt;p&gt;This evening the process of cross compiling the latest source of gcc failed, because the build systems automatically decided to build fancy stuff which required a working C library (maybe only headers, I don’t care). I couldn’t provide a C library and I wasn’t willing to, because I just don’t need one for my setup.&lt;/p&gt;

&lt;p&gt;The workaround is quite easy: Instead of making the default  “all” target, I only built “all-gcc” and “all-target-libgcc”. To install the built targets, make “install-gcc” and “install-target-libgcc”. Easy, isn’t it? :)&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;pre class="terminal"&gt;$ ./configure --target="$TARGET" --prefix=/tmp/cross --disable-shared --disable-nls --enable-languages=c
[...]
$ make all-gcc all-target-libgcc
[...]
$ make install-gcc install-target-libgcc&lt;/pre&gt;

&lt;p&gt;binutils: 2.21; gcc: 4.6.1&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4615392787595761860?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4615392787595761860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/08/building-gcc-cross-compiler-without.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4615392787595761860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4615392787595761860'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/08/building-gcc-cross-compiler-without.html' title='Building gcc cross compiler without libc'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-773741573268662399</id><published>2011-08-10T23:03:00.004+02:00</published><updated>2011-08-10T23:05:31.481+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Locale'/><category scheme='http://www.blogger.com/atom/ns#' term='GLib'/><title type='text'>Don’t forget to set the locale.</title><content type='html'>&lt;p&gt;After I had spent hours hunting a mysterios bug, I finally found out that my Unicode conversation was correct. I just forgot to set the locale and so the GLib logging functions mangled my debug strings unusable.&lt;/p&gt;

&lt;p&gt;What I’ve learnt today: If you use GLib you shouldn’t forget to set the locale. :)&lt;/p&gt;

&lt;pre class="terminal"&gt;#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;glib.h&amp;gt;
#include &amp;lt;locale.h&amp;gt;

int main(int argc, char **argv)
{
    setlocale(LC_ALL, "");
    g_debug("Unicode ftw! äöü!");
    return EXIT_SUCCESS;
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-773741573268662399?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/773741573268662399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/08/dont-forget-to-set-locale.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/773741573268662399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/773741573268662399'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/08/dont-forget-to-set-locale.html' title='Don’t forget to set the locale.'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-349482017085847634</id><published>2011-07-26T10:39:00.005+02:00</published><updated>2011-07-26T10:58:16.777+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DreamPlug'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>DreamPlug: Linux Kernel and U-Boot News</title><content type='html'>&lt;p&gt;I got some new information about the DreamPlug:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is a working patch for the vanilla Linux kernel. Unfortunately upstream is not accepting the patch, because it isn’t using the flattened device tree. The bigger problem seeems to be that there is no support for FDT for the marvell plattform right now. In the meantime you can either apply the patch manually or use the config option for the GuruPlug reference board. Linux 3.0 is running fine on my DreamPlug.&lt;br&gt;Source: &lt;a href="http://thread.gmane.org/gmane.linux.ports.arm.kernel/120507"&gt;[PATCH 0/2 RFC] arm/kirkwood: add dreamplug support.&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;The source code of the factory u-boot is available. Now it can be integrated into the main u-boot source. Both u-boot and openocd do not support the SPI flash interface currently.&lt;br&gt;Sources: &lt;a href="http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/101484"&gt;RFC: Dreamplug support&lt;/a&gt;, &lt;a href="http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/104030"&gt;[PATCH RFC] drivers/rtc: add Marvell Integrated RTC.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-349482017085847634?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/349482017085847634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/07/dreamplug-linux-kernel-and-u-boot-news.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/349482017085847634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/349482017085847634'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/07/dreamplug-linux-kernel-and-u-boot-news.html' title='DreamPlug: Linux Kernel and U-Boot News'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-6914151005633004441</id><published>2011-07-15T22:12:00.003+02:00</published><updated>2011-07-16T09:50:47.734+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DreamPlug'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>DreamPlug: A Dream Becomes True</title><content type='html'>&lt;p&gt;One year ago I heared of something called “plug computers”. These small devices have become popular in the Linux world, because they are in fact quite powerful. You can use them for all networking tasks you can image. It can be configured as a router, mail server, web server, file server, backup system and the like. I was really interested and so I considered buying a SheevaPlug or GuruPlug. But when I actually decided to buy one, I didn’t get one because they were out of stock.&lt;/p&gt;

&lt;p&gt;Time passed and I forgot these gadgets for a while. Later something with the name “&lt;a href="http://www.globalscaletechnologies.com/t-dreamplugdetails.aspx"&gt;DreamPlug&lt;/a&gt;” crossed my way on the Internet. I couldn’t resist. I wanted to get one. &lt;i&gt;Immediately!&lt;/i&gt; I’m living in Germany and so purchasing from &lt;a href="http://www.globalscaletechnologies.com/"&gt;Globalscale&lt;/a&gt; directly is no big fun. The FedEx shipping costs nearly the same amount of money as the plug computer itself. And as far as I know this doesn’t include taxes for import or export. That’s why I purchased my DreamPlug from the British shop &lt;a href="http://www.newit.co.uk/"&gt;NewIT&lt;/a&gt; for about 170£ (incl. shipping) via credit card. I can highly recommend the shop, everything went smooth, the quality is perfect, contact was nice and friendly.&lt;/p&gt;

&lt;p&gt;The first thing I did was to install a clean version of Debian, because I wanted to have full control and an unmodified Debian system. After recognizing that Debian Stable lacks a few things I needed, I upgraded and the plug is now running Debian Testing. Currently my DreamPlug acts as wireless router for sharing the UMTS Internet connection. Some server processes are running too &amp;mdash; the list is growing. I’m a bit sad, because there are some proprietary parts necessary to make complete use of all the offered features of the plug. A list of problems if you are not willing to using the preinstalled system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s not possible to replace the u-boot bootloader, because the SPI flash is not supported.&lt;/li&gt;
&lt;li&gt;The shipped bootloader has many features disabled. It can only read fat16 filesystems, no support for ext2 or other good filesystems.&lt;/li&gt;
&lt;li&gt;Debian’s Linux kernel won’t boot, because it’s searching for a NAND flash or some MMC stuff and this seems to lock up the box. I compiled my own Linux kernel (v3.0-rc7 + patches from different mailing lists) with only the minimal drivers and settings enabled and it works like a charm.&lt;/li&gt;
&lt;li&gt;The free Linux drivers for wireless lan and bluetooth are not able to upload the firmware correctly and that’s why client mode does not work for me.&lt;/li&gt;
&lt;li&gt;Wireless master mode (acting as access point) only works with proprietary modules and a different firmware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To fix the last two problems, I’m simply using a Ralink usb wireless stick. Hopefully all these problems get addressed in the future.&lt;/p&gt;

&lt;p&gt;Apart from these quite show-stopping issues, which are affecting nearly all brand-new devices, the DreamPlug is really really impressive.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-syuKNx4D_y8/TiCSgKddtOI/AAAAAAAABUQ/G3MxulFocD8/s1600/IMG_0103.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://4.bp.blogspot.com/-syuKNx4D_y8/TiCSgKddtOI/AAAAAAAABUQ/G3MxulFocD8/s200/IMG_0103.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5629660615474525410" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-aXIy2QbpnOg/TiCSgcgsWAI/AAAAAAAABUY/5fg26I4HNJ4/s1600/IMG_0399.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://4.bp.blogspot.com/-aXIy2QbpnOg/TiCSgcgsWAI/AAAAAAAABUY/5fg26I4HNJ4/s200/IMG_0399.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5629660620319905794" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-6914151005633004441?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/6914151005633004441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/07/dreamplug-dream-becomes-true.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6914151005633004441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6914151005633004441'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/07/dreamplug-dream-becomes-true.html' title='DreamPlug: A Dream Becomes True'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-syuKNx4D_y8/TiCSgKddtOI/AAAAAAAABUQ/G3MxulFocD8/s72-c/IMG_0103.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-3780470274862513078</id><published>2011-05-12T20:36:00.000+02:00</published><updated>2011-05-13T22:38:52.451+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod Touch'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><title type='text'>iPhone Development</title><content type='html'>&lt;p&gt;Since I’ve got an Apple iPod Touch 2nd generation a long time ago, I was very interested in development of iOS “Apps”. Using Apple’s SDK was absolutely no option, because I don’t have a Mac (And I rather would say this way is quite boring *g*).&lt;/p&gt;

&lt;p&gt;One solution would be setting up a cross compiler for the iOS. Unfortunately my time was too limited. Until now :)&lt;/p&gt;

&lt;p&gt;Currently I’m getting my hands dirty and I’m building my own cross compilation environment. It seems that I am not allowed to make my toolchain available to the public (I’d have to distribute Apple’s libraries). Hopefully everything is going well, so that I might provide a step-by-step guide, for all that are interested in an up-to-date and Gnu/Linux based cross compilation toolchain for the iOS.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-3780470274862513078?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/3780470274862513078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/05/iphone-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3780470274862513078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3780470274862513078'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/05/iphone-development.html' title='iPhone Development'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2790124144955160653</id><published>2011-05-08T16:35:00.002+02:00</published><updated>2011-05-08T16:57:11.475+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UTMS'/><category scheme='http://www.blogger.com/atom/ns#' term='o2'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile broadband'/><title type='text'>Disadvantages of Mobile Internet Connections</title><content type='html'>&lt;p&gt;Nowadays Internet access is quite cheap. Even if you want to get a mobile broadband connection, you don’t have to pay too much money. Currently I’m able to test the service of o2’s UMTS network. It play very well with my Arch Gnu/Linux powered netbook (It does actually work even better than on a Windows 7 machine. Ok, no big surprise. *g*). I discovered only some minor drawbacks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I don’t get the promised 7.2 Mbit/s. But as long as the connection is faster than dial-up, I can live with that fact.&lt;/li&gt;
&lt;li&gt;Speed is capped after 5 GiB of data traffic. This might not be sufficient for full Internet experience. So updating all the Linux system and downloading isos or other stuff must be done with an alternate connection. But even if I hit the limit, I’ll be able to access with GRPS connection speed.&lt;/li&gt;
&lt;li&gt;I can’t offer TCP/IP services. No webserver, no FTP-server, no &lt;i&gt;nothing&lt;/i&gt;. The PPP-daemon connects to the private o2-subnetwork and connections to the outer Internet can only be established over the ISP’s NAT-router. This prevents direct access from the Internet to my machine behind the UMTS modem.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apart from that, it’s fun. :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2790124144955160653?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2790124144955160653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/05/disadvantages-of-mobile-internet_08.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2790124144955160653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2790124144955160653'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/05/disadvantages-of-mobile-internet_08.html' title='Disadvantages of Mobile Internet Connections'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-5908166364622155047</id><published>2011-04-10T17:32:00.006+02:00</published><updated>2011-04-10T18:11:24.954+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Taschenrechner'/><category scheme='http://www.blogger.com/atom/ns#' term='Abitur'/><category scheme='http://www.blogger.com/atom/ns#' term='Sachsen'/><category scheme='http://www.blogger.com/atom/ns#' term='GTR'/><title type='text'>Berechnung der Abiturnote (Sachsen)</title><content type='html'>&lt;p&gt;Die erste Hürde zu einem erfolgreichen Absolvieren des sächsischen Abiturs stellt die Berechnung der Abiturnote dar. Zumindest haben die verantwortlichen Stellen sogar mal richtig ihre Kreativität bewiesen und haben für die geübten Mathematiker unter uns gleich noch ein paar unlogische Verschleierungen eingebaut, damit auch wirklich niemand hinter das Geheimnis der Berechnung steigen kann...&lt;/p&gt;

&lt;p&gt;Damit ich nicht ständig diese unhandliche Tabelle mit mir herumschleppen muss, habe ich aus Langeweile ein Taschenrechnerprogramm geschrieben, was die Berechnung übernimmt. Ich habe mir nicht die Mühe gemacht und herausgefunden, wie die Punktverteilung auf die Endnote abgebildet wird (und vor allem warum ausgerechnet so *g*), sondern durch genaueres Hinsehen hat sich ergeben, dass die Abstände der Punktebereiche für 0,1er Notenabstände jeweils 18 Punkte betragen. Die Berechnung hier ist demzufolge nicht der offizielle Weg, aber solange die Ergebnisse stimmen, ist es mir auch egal.&lt;/p&gt;

&lt;pre class="terminal"&gt;
"Punkte"?→A↲
823→B↲
1.0→C↲
While (A&amp;lt;B)
B-18→B
C+0.1→C
WhileEnd↲
"Abiturnote:":C
&lt;/pre&gt;

&lt;p&gt;Ich habe mir alle Halbjahres-Ergebnisse noch im Listenmenü gespeichert. Liste 1-4 wären mit den Halbjahren 1 bis 4 zu füllen (jeweils 13 Noten, die ersten beiden wären die Leistungskurse und werden doppelt gewertet). Die Abiturprüfungen kommen dann in Liste 5. Das nachfolgende Programm berechnet dann die Ergebnisse für Block I und II, sowie die Gesamtpunktzahl (die man dem obigen Programm übergeben kann).&lt;/p&gt;

&lt;pre class="terminal"&gt;
0→A↲
0→B↲
For 1→I To 4↲
I=1⇒List 1↲
I=2⇒List 2↲
I=3⇒List 3↲
I=4⇒List 4↲
Sum List Ans+List Ans[1]+List Ans[2]→C↲
Dim List Ans+2→D↲
A+C→A↲
B+D→B↲
ClrText↲
" "↲
" "↲
Locate 1,1,"Halbjahr  :"↲
Locate 10,1,I↲
C÷D◢
Next↲
A÷B×40→C↲
Sum List 5×4→D↲
ClrText↲
" "↲
" "↲
" "↲
" "↲
" "↲
Locate 1,1,"Block I:"↲
Locate 10,1,C↲
Locate 1,2,"Block II:"↲
Locate 10,2,D↲
Locate 1,3,"---------------------"↲
Locate 1,5,"Gesamt:"↲
Locate 10,5,C+D◢
C+D
&lt;/pre&gt;

&lt;p&gt;Da es nirgendwo anders hinpasst, war ich so frei und habe es hier veröffentlicht. Vielleicht freut sich ja jemand drüber ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-5908166364622155047?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/5908166364622155047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/04/berechnung-der-abiturnote-sachsen.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5908166364622155047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5908166364622155047'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/04/berechnung-der-abiturnote-sachsen.html' title='Berechnung der Abiturnote (Sachsen)'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-8086186475578968756</id><published>2011-03-30T07:48:00.002+02:00</published><updated>2011-03-30T07:57:22.433+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><title type='text'>I’m receiving your mail...</title><content type='html'>&lt;p&gt;Only a short note for the impatient: I’m receiving all your emails and I &lt;i&gt;really&lt;/i&gt; like hearing from you, but I can’t answer these bunches of mail in realtime. You know, single core processors are not very good scalable ;) Keep on writing me, I’ll answer you one after another.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-8086186475578968756?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/8086186475578968756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/03/im-receiving-your-mail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8086186475578968756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8086186475578968756'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/03/im-receiving-your-mail.html' title='I’m receiving your mail...'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-8590906880915941635</id><published>2011-03-20T18:11:00.005+01:00</published><updated>2011-03-20T18:27:57.815+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='DesktopNova'/><title type='text'>DesktopNova 0.8.1</title><content type='html'>&lt;p&gt;Today I finished fixing the biggest issues, which have effected DesktopNova in the past. What a crappy source code... I’m very glad, that the code in the trunk series does actually look a little bit cleaner, but sadly it’s not ready yet. (And probably won’t be in the next months too...).&lt;/p&gt;

&lt;p&gt;The new release 0.8.1 of DesktopNova is only here to fix some bugs, which prevented the whole project from beeing built. A Debian Developer already filled a bug in the Debian Bugtracker and so I decided to fix it upstream. The intltool integration was also completely unusable, so I rewrote it.&lt;/p&gt;

&lt;p&gt;ChangeLog entry for 0.8.1:&lt;/p&gt;
&lt;pre class="terminal"&gt;
2011-03-20  Stefan Haller

 * Version 0.8.1
 * fixed build failure: Link against ld
 * reorganized intltool integration
&lt;/pre&gt;

&lt;p&gt;Please note, that I currently disabled the translation framework in Launchpad for this project. I’ll enable it after the code is more clean and mature and after I’ve made major changes to the code base (trunk series).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://launchpad.net/desktopnova"&gt;Project’s homepage&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-8590906880915941635?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/8590906880915941635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/03/desktopnova-081.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8590906880915941635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8590906880915941635'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/03/desktopnova-081.html' title='DesktopNova 0.8.1'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-135977545954385977</id><published>2011-03-14T16:20:00.003+01:00</published><updated>2011-09-28T11:03:18.081+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='dvr-recover'/><category scheme='http://www.blogger.com/atom/ns#' term='free software'/><title type='text'>dvr-recover 0.8</title><content type='html'>&lt;p&gt;Today a new release of dvr-recover is ready. In dvr-recover 0.8 there are no big changes, but about a month ago Alan Kan suggested a bug fix. His fix is included in this release. Thanks for the patch. You may obtain more information about it from the Changelog or the source code.&lt;/p&gt;

&lt;pre class="terminal"&gt;
2011-03-14  Stefan Haller  &lt;haliner@googlemail.com&gt;

  Version 0.8:
  * dvr-recover.py: Don't drop the last block of n-1 chunk and first block of n
    chunk while splitting.
    Patch submitted by Alan Kan. Thanks.
  * dvr-recover.py, README: Added Panasonic DVM-E80H to list of working devices.
  * README: Some minor changes.
&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://sites.google.com/site/haliner/dvr-recover"&gt;Homepage of dvr-recover&lt;/a&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-135977545954385977?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/135977545954385977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/03/dvr-recover-08.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/135977545954385977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/135977545954385977'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/03/dvr-recover-08.html' title='dvr-recover 0.8'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-7081066016378561109</id><published>2011-03-03T15:45:00.002+01:00</published><updated>2011-03-03T15:51:19.899+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='xmldirlisting'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='dirlisting.py'/><title type='text'>xmldirlisting 0.4</title><content type='html'>&lt;p&gt;
  If you do not check my Dropbox public folder regularly, you probably won’t
  have noticed the changes to xmldirlisting (formerly known as dirlisting.py).
  So I’m quite sure you haven’t :)
&lt;/p&gt;

&lt;p&gt;
  The new release xmldirlisting 0.4 is ready. I renamed the project, rewrote it
  from scratch and currently it’s &amp;hellip; really simple. Basically you can do
  the same things like before the transition&amp;mdash;it’s just a bit trickier.
  There are even no command line arguments right now and the documentation is
  short, but  if you have a good understanding of XML and XSLT you will be
  familiar with the concept.
&lt;/p&gt;

&lt;p&gt;
  The project will generate an XML representation of the entire directory
  including all subdirectories. The XML file can be processed by other programs.
  I use the project in combination with some XSLT-stylesheets to create a
  highly customizable HTML page for example. Have a look at the
  &lt;a href="http://dl.dropbox.com/u/1996083/Projects/index.html"&gt;
    project folder of the public part of my Dropbox
  &lt;/a&gt;,
  to see an example result. The file is automatically generated in realtime
  just before it’s send to the Dropbox servers. You can obtain the sources of my
  XSLT-stylesheet, which is used for the transformation, in the release tarball.
&lt;/p&gt;

&lt;p&gt;
  If you want to use xmldirlisting, but some feature is missing, you should file
  a bug report in the bug tracker on the project’s homepage.
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;a href="https://launchpad.net/xmldirlisting/"&gt;Project Homepage&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-7081066016378561109?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/7081066016378561109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/03/xmldirlisting-04.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7081066016378561109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7081066016378561109'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/03/xmldirlisting-04.html' title='xmldirlisting 0.4'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-7609573538295245309</id><published>2011-01-26T20:15:00.004+01:00</published><updated>2011-01-26T20:23:21.821+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='dvr-recover'/><title type='text'>dvr-recover 0.7 released</title><content type='html'>&lt;p&gt;I’ve released a new relase of dvr-recover (dvr-recover 0.7). Only one minimal change, but most likely this one helps many users.&lt;/p&gt;

&lt;pre class="terminal"&gt;
2011-01-26  Stefan Haller  &lt;haliner@googlemail.com&gt;

  Version 0.7:
  * dvr-recover.py: Introduced fallback for determining file size.
    This solves issues with special files like device files.
    Thanks to Kevin Cardinal, who reported the bug and tested the developed fix.
&lt;/pre&gt;

&lt;p&gt;To get better results, please decrease the &lt;i&gt;minchunksize&lt;/i&gt;. Many people reported to have improved recovery ratio by doing this.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sites.google.com/site/haliner/dvr-recover"&gt;Project’s homepage&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-7609573538295245309?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/7609573538295245309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/01/dvr-recover-07-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7609573538295245309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7609573538295245309'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/01/dvr-recover-07-released.html' title='dvr-recover 0.7 released'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2538399870508757359</id><published>2011-01-26T20:08:00.000+01:00</published><updated>2011-01-26T20:15:08.728+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>Yet Another Challenge</title><content type='html'>&lt;p&gt;
In the past I really felt how tedious mixing languages can be. When I began to
write computer programs nearly everything was labeled in my mother tongue. The
more public the programs were, the more English they became. Today I’m going to
write everything related to a project in English, because maintaining different
language sets takes a lot of time. The last thing which remained German was this
blog. From now on I’ll keep blogging in English. Everyone who is interested in
my projects and my work should follow this blog to stay tuned. I’ll announce all
new projects, releases and software related things. If there are frequently
asked questions (indeed, there are), I’ll answer them for everyone.
&lt;/p&gt;

&lt;p&gt;
(The other reason is, that Google’s pagerank for this blog is quite good for
special queries, so I hope to reach more people.)
&lt;/p&gt;

&lt;p&gt;
For the impatient: Currently I’m busy. A lot of exams and other stuff to do.
I try to maintain my projects as best as I can, but don’t expect too much.
&lt;/p&gt;

&lt;p&gt;
Continue making free software dominating our world ;)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2538399870508757359?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2538399870508757359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2011/01/yet-another-challenge.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2538399870508757359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2538399870508757359'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2011/01/yet-another-challenge.html' title='Yet Another Challenge'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-5440112705659155941</id><published>2010-11-28T12:21:00.005+01:00</published><updated>2010-11-28T12:59:47.564+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FritzBox'/><category scheme='http://www.blogger.com/atom/ns#' term='XSLT'/><title type='text'>Fritz!Box-Telefonbuch: Tabelle mit Kurzwahlen erstellen</title><content type='html'>&lt;p&gt;Ein nettes Feature der Fritz!Box ist unter anderem die Kurzwahl-Verwaltung. An zentraler Stelle lassen sich alle wichtigen Kontakte speichern und auch mit einer Kurzwahl versehen, so dass man sich die Telefonnummern weder merken muss, noch an jedem Telefon die Nummern separat speichern musss.&lt;/p&gt;

&lt;p&gt;Praktisch dazu ist natürlich noch eine übersichtliche Tabelle. Diese kann man entweder per Hand erstellen, was natürlich mehr als langweilig ist. Einfacher ist es, wenn man das Telefonbuch von der Fritz!Box exportiert und die Tabelle automatisch erstellen lässt. Das geht sogar ganz ohne Scripte, sondern mit einer simplen &lt;a href="http://de.wikipedia.org/wiki/XSLT"&gt;XSL-Transformation&lt;/a&gt;. Die XML-Datei wird mit der XSLT-Datei in eine andere XML-Sprache transformiert. In diesem Falle wird XML zu XHTML umgewandelt (reines HTML wäre auch möglich).&lt;/p&gt;

&lt;p&gt;Das Telefonbuch findet man nach dem einloggen auf &lt;a href="http://fritz.box"&gt;fritz.box&lt;/a&gt; im linken Menü. Anschließend klickt man auf &lt;i&gt;Sichern&lt;/i&gt; und lädt sich das Telefonbuch herunter.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dl.dropbox.com/u/1996083/Projects/Fritz!Box/Phonebook-XSLT/Telefonbuch.xsl"&gt;Mein fertiges XSLT-Sheet&lt;/a&gt; muss ebenfalls noch heruntergeladen werden. (Im &lt;a href="http://dl.dropbox.com/u/1996083/Projects/index.html"&gt;Downloadverzeichnis&lt;/a&gt; gibt es dazu noch Beispiele, die man sich anschauen kann. Diese befinden sich im Ordner &lt;i&gt;Fritz!Box/Phonebook-XSLT/Examples&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;Es gibt 2 Möglichkeiten, um das XSLT-Sheet zu aktivieren:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
Man öffnet das die XML-Datei vom Telefonbuch und fügt nach der &lt;pre class="terminal"&gt;&amp;lt;?xml  version="1.0" encoding="utf-8"?&amp;gt;&lt;/pre&gt; Definition folgende Zeile ein:

&lt;pre class="terminal"&gt;&amp;lt;?xml-stylesheet type="text/xsl" href="Telefonbuch.xsl"?&amp;gt;&lt;/pre&gt;

Ein vernünftiger Browser (Firefox) öffnet die Seite daraufhin ordnungsgemäß.
&lt;/li&gt;

&lt;li&gt;
Man verwendet &lt;i&gt;xmlstarlet&lt;/i&gt; oder ein ähnliches Tool und generiert die XHTML-Seite:

&lt;pre class="terminal"&gt;xmlstarlet tr Telefonbuch.xsl Telefonbuch.xml &gt;Telefonbuch.html&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Egal welchen Weg man nimmt, man bekommt im Endeffekt eine Seite mit einer Tabelle, welche es nur noch auszudrucken gilt. :)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dl.dropbox.com/u/1996083/Projects/Fritz!Box/Phonebook-XSLT/Examples/Phonebook.html"&gt;Die Beispielseite&lt;/a&gt; zeigt, wie es aussehen könnte.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-5440112705659155941?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/5440112705659155941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/11/fritzbox-telefonbuch-tabelle-mit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5440112705659155941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5440112705659155941'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/11/fritzbox-telefonbuch-tabelle-mit.html' title='Fritz!Box-Telefonbuch: Tabelle mit Kurzwahlen erstellen'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4403319440929854396</id><published>2010-11-15T21:51:00.005+01:00</published><updated>2010-11-15T22:31:52.113+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='studentconsult-downloader'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>studentconsult-downloader.pl</title><content type='html'>&lt;p&gt;Im Bekanntenkreis gab es wieder das Interesse an einem kleinen Script, was natürlich wieder lästige Arbeit automatisieren soll. Ich fand die Aufgabe auch nicht gerade uninteressant und so habe ich mich einfach mal dran gesetzt. Diesmal jedoch kein Python-Code, nein, Perl. (In letzter Zeit habe ich auch dessen Vorzüge kennen gelernt.)&lt;/p&gt;

&lt;p&gt;Das Perl-Script ist in der Lage von der Seite &lt;i&gt;studentconsult.de&lt;/i&gt; Bücher herunterzuladen. So weit mir bekannt ist, kann man sich auf dieser Seite wohl für das Studium interessante Bücher kaufen und diese online lesen. Prima. Ist eben etwas blöd, wenn man die Dinger auch offline lesen will. Das ist nicht möglich, außer man speichert sich die Seiten per Hand. Nun, keine zufriedenstellende Lösung.&lt;/p&gt;

&lt;p&gt;Ich sage es vorher: Das Script ist nichts weiter als ein schneller Hack. Es funktioniert, zumindest so, wie ich es getestet habe. Es gibt viele Verbesserungsmöglichkeiten und auch den Quelltext könnte man noch etwas schöner machen. Es läuft wie immer: Das Projekte ist freie Software, jeder kann sich bedienen. Wenn sich jemand meldet, wäre ich auch bereit weitere Änderungen vorzunehmen.&lt;/p&gt;

&lt;p&gt;Als erstes installiert man sich &lt;i&gt;Perl&lt;/i&gt; und &lt;i&gt;curl&lt;/i&gt;. Perl dürfte zur Standardinstallation zählen, curl eher nicht. &lt;/p&gt;&lt;pre class="terminal"&gt;sudo apt-get install perl curl.&lt;/pre&gt;

&lt;p&gt;Jetzt fix das Script holen und ausführbar machen.&lt;/p&gt;&lt;pre class="terminal"&gt;curl -O 'http://dl.dropbox.com/u/1996083/Projects/studentconsult-downloader/studentconsult-downloader.pl'
chmod +x studentconsult-downloader.pl&lt;/pre&gt;

&lt;p&gt;Das Script benötigt noch ein paar Informationen. Man öffnet zunächst den Browser, loggt sich ein und öffnet das Buch, welches man herunterladen möchte. In der Adresszeile findet man einen jetzt einen Parameter, welcher wie eine ISBN-Nummer aussieht (und vermutlich auch eine ist). Diese Nummer wird benötigt (und zwar mit den Bindestrichen!). Außerdem braucht man die Cookies. Im Firefox geht das mit über &lt;i&gt;Bearbeiten &gt; Einstellungen &gt; Privatsphäre &gt; Cookie anzeigen&lt;/i&gt; (ist bei diversen Firefox-Versionen anders). Dort sucht man nach &lt;i&gt;studentconsult.de&lt;/i&gt; und sucht sich die Cookies &lt;i&gt;CFID&lt;/i&gt;, sowie &lt;i&gt;CFTOKEN&lt;/i&gt; (Siehe Bild).&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/TOGj9cs63YI/AAAAAAAABTw/F4uSGD-rJH4/s1600/cookies.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 134px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/TOGj9cs63YI/AAAAAAAABTw/F4uSGD-rJH4/s200/cookies.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5539889292714368386" /&gt;&lt;/a&gt;

&lt;p&gt;Jetzt editiert man das Script und findet im ersten Abschnitt 3 Zeilen, welche mit &lt;i&gt;our&lt;/i&gt; beginnen:&lt;/p&gt;
&lt;pre class="terminal"&gt;&lt;span style="color: #66d9ef"&gt;our&lt;/span&gt; &lt;span style="color: #f8f8f2"&gt;$cookie_cfid&lt;/span&gt;    &lt;span style="color: #f92672"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color: #f8f8f2"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef"&gt;our&lt;/span&gt; &lt;span style="color: #f8f8f2"&gt;$cookie_cftoken&lt;/span&gt; &lt;span style="color: #f92672"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color: #f8f8f2"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef"&gt;our&lt;/span&gt; &lt;span style="color: #f8f8f2"&gt;$isbn&lt;/span&gt;           &lt;span style="color: #f92672"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color: #f8f8f2"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;In diese Variablendefinitionen trägt man die oben genannten Werte in die einfachen Anführungszeichen ein. Das war’s. Das Script einfach mit folgendem Befehl starten:&lt;/p&gt;
&lt;pre class="terminal"&gt;./studentconsult-downloader.pl&lt;/pre&gt;

&lt;p&gt;Das Unterfangen dauert nun eine ganze Weile. Wenn man wieder eine Eingabe-Prompt zu Gesicht bekommt und das Script keine Meldungen ausgegeben hat, dann ist es fertig. Die selbst generierte Übersichtsseite findet man unter &lt;i&gt;/tmp/studentconsult/index.html&lt;/i&gt;.&lt;/p&gt;

&lt;p style="color: red;"&gt;Bevor man das Script ein weiteres Mal ausführt (z.B. mit einer anderen Buch-ISBN), dann muss man vorher den Ordner &lt;i&gt;/tmp/studentconsult/&lt;/i&gt; löschen!&lt;/p&gt;

&lt;p&gt;Vielleicht nützt das Script noch jemanden. In einem solchen Falle würde ich mich über eine kleine Rückmeldung freuen. Wer Anregungen hat, darf sich wie immer gern melden. Man kann noch viele Dinge machen, z. B. könnten die Seiten mit CSS gestylt werden. Außerdem sind die Frames nicht besonders schick und Bilder werden noch gar nicht verarbeitet. (Man kann sich aber auch einfach mal den Seitenquelltext vom Online-Portal anschauen… Der &lt;i&gt;originale&lt;/i&gt; Code ist auch weniger als gar nicht standardkonform ;) Ich bin erstaunt, dass ein Browser überhaupt so schlau ist, daraus eine darstellbare Seite gebacken zu bekommen…)&lt;/p&gt;

&lt;p&gt;Viel Spaß damit.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/TOGmuYpWsLI/AAAAAAAABT4/DpfTiWxczVc/s1600/output.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/TOGmuYpWsLI/AAAAAAAABT4/DpfTiWxczVc/s320/output.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5539892332462518450" /&gt;&lt;/a&gt;

&lt;ul&gt;
 &lt;li&gt;Projekt-Homepage&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://dl.dropbox.com/u/1996083/Projects/index.html"&gt;Download-Verzeichnis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4403319440929854396?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4403319440929854396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/11/studentconsult-downloaderpl.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4403319440929854396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4403319440929854396'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/11/studentconsult-downloaderpl.html' title='studentconsult-downloader.pl'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-C3w1uboIpk/TOGj9cs63YI/AAAAAAAABTw/F4uSGD-rJH4/s72-c/cookies.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-7553908217876118914</id><published>2010-07-26T21:05:00.002+02:00</published><updated>2010-07-26T21:08:19.409+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wifi'/><category scheme='http://www.blogger.com/atom/ns#' term='WLAN'/><title type='text'>Wifi Spielereien - Teil 3</title><content type='html'>&lt;p&gt;Ohne Worte...&lt;/p&gt;


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/TE3csd04_CI/AAAAAAAABTU/jda6iBUj5-A/s1600/IMG_5173.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/TE3csd04_CI/AAAAAAAABTU/jda6iBUj5-A/s200/IMG_5173.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5498293376568065058" /&gt;&lt;/a&gt;


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/TE3c-uJRzkI/AAAAAAAABTc/wdi5kML4pg8/s1600/IMG_5174.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/TE3c-uJRzkI/AAAAAAAABTc/wdi5kML4pg8/s200/IMG_5174.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5498293690186190402" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-7553908217876118914?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/7553908217876118914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/07/wifi-spielereien-teil-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7553908217876118914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7553908217876118914'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/07/wifi-spielereien-teil-3.html' title='Wifi Spielereien - Teil 3'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/TE3csd04_CI/AAAAAAAABTU/jda6iBUj5-A/s72-c/IMG_5173.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-1714800819042557261</id><published>2010-07-24T22:11:00.014+02:00</published><updated>2010-07-24T22:57:15.055+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Script'/><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='m3u-copy.py'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>m3u-copy.py</title><content type='html'>&lt;p&gt;Mein Onkel benötigte eine Lösung um beschädigte Musikdateien mit den Sicherungskopien zu ersetzen. Es waren bereits alle defekten Titel in einer M3U-Playliste gespeichert. Das Problem an der Sache ist jedoch, dass die Pfade der Sicherungskopien nicht exakt vorhersehbar waren. Sie verstecken sich teilweise in verschiedenen Unterordnern. Jedoch enden alle Pfade nach dem Schema &lt;i&gt;/Interpret/Album/Titel.ext&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;Deswegen habe ich ein Script entwickelt, welches genau dies tut. Folgende Parameter werden übergeben:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i&gt;--input-file&lt;/i&gt;: Der Pfad der M3U-Playliste muss übergeben werden.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;--import-dir&lt;/i&gt;: Der Pfad des Hauptordners der Sicherheitskopien muss übergeben werden.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;--export-dir&lt;/i&gt;: Das Verzeichnis, in welche die Dateien kopiert werden sollen, muss ebenfalls übergeben werden.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;--convert-sep&lt;/i&gt;: (Optional.) Konvertiert das übergebene Zeichen in den Pfad-Separator des Systems.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;--encoding&lt;/i&gt;: (Optional.) Ein- und Ausgabekodierung der M3U-Dateien. Meistens werden M3U-Dateien &lt;i&gt;latin-1&lt;/i&gt; oder &lt;i&gt;utf-8&lt;/i&gt; kodiert.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Angenommen der Pfad einer Datei im Import-Verzeichnis heißt &lt;i&gt;/home/stefan/Sicherung/Musik/Interpret/Album/Titel.ext&lt;/i&gt;, dann wird es zu &lt;i&gt;Interpret/Album/Titel.ext&lt;/i&gt; transformiert. Nun findet das Programm in einer M3U-Datei den Pfad &lt;i&gt;C:\Musik\Interpret\Album\Titel.ext&lt;/i&gt;. Wenn als Parameter &lt;i&gt;--convert-sep '\'&lt;/i&gt; übergeben wurde, dann wird der Pfad ebenfalls zu &lt;i&gt;Interpret/Album/Titel.ext&lt;/i&gt; transformiert. Die Datei &lt;i&gt;/home/stefan/Sicherung/Musik/Interpret/Album/Titel.ext&lt;/i&gt; wird nun nach &lt;i&gt;&amp;lt;export-dir&amp;gt;/Interpret/Album/Titel.ext&lt;/i&gt; kopiert.&lt;/p&gt;

&lt;p&gt;Intern wird eine Sqlite3-Datenbank verwendet, welche im Speicher angelegt wird.&lt;/p&gt;

&lt;p&gt;Es ist nicht viel dran, aber eh das Script auf meiner Festplatte vermodert, kann es auch irgendwer anders haben.&lt;/p&gt;

&lt;pre class="terminal" style="background: #222; font-size: 75%; max-height: 300px"&gt;&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;#&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# Copyright (C) 2010  Stefan Haller &amp;lt;haliner@googlemail.com&amp;gt;&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;#&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# This program is free software: you can redistribute it and/or modify&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# it under the terms of the GNU General Public License as published by&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# the Free Software Foundation, either version 3 of the License, or&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# (at your option) any later version.&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;#&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# This program is distributed in the hope that it will be useful,&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# GNU General Public License for more details.&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;#&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# You should have received a copy of the GNU General Public License&lt;/span&gt;
&lt;span style="color: #008800; font-style: italic; background-color: #0f140f"&gt;# along with this program.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;/span&gt;



&lt;span style="color: #fb660a; font-weight: bold"&gt;import&lt;/span&gt; &lt;span style="color: #ffffff"&gt;optparse&lt;/span&gt;
&lt;span style="color: #fb660a; font-weight: bold"&gt;import&lt;/span&gt; &lt;span style="color: #ffffff"&gt;os&lt;/span&gt;
&lt;span style="color: #fb660a; font-weight: bold"&gt;import&lt;/span&gt; &lt;span style="color: #ffffff"&gt;os.path&lt;/span&gt;
&lt;span style="color: #fb660a; font-weight: bold"&gt;import&lt;/span&gt; &lt;span style="color: #ffffff"&gt;re&lt;/span&gt;
&lt;span style="color: #fb660a; font-weight: bold"&gt;import&lt;/span&gt; &lt;span style="color: #ffffff"&gt;shutil&lt;/span&gt;
&lt;span style="color: #fb660a; font-weight: bold"&gt;import&lt;/span&gt; &lt;span style="color: #ffffff"&gt;sqlite3&lt;/span&gt;


&lt;span style="color: #fb660a; font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #ffffff"&gt;M3UObject(object):&lt;/span&gt;
    &lt;span style="color: #ffffff"&gt;__slots__&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;extinf&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;

    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;__init__&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;path,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;extinf):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.path&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;path&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.extinf&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;extinf&lt;/span&gt;

    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;__str__&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.extinf&lt;/span&gt; &lt;span style="color: #ffffff"&gt;is&lt;/span&gt; &lt;span style="color: #ffffff"&gt;not&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None:&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;quot;%s\n%s&amp;quot;&lt;/span&gt; &lt;span style="color: #ffffff"&gt;%&lt;/span&gt; &lt;span style="color: #ffffff"&gt;(self.extinf,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.path)&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;else&lt;/span&gt;&lt;span style="color: #ffffff"&gt;:&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.path&lt;/span&gt;

    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;__repr__&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;quot;M3Object(%r, %r)&amp;quot;&lt;/span&gt; &lt;span style="color: #ffffff"&gt;%&lt;/span&gt; &lt;span style="color: #ffffff"&gt;(self.path,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.extinf)&lt;/span&gt;



&lt;span style="color: #fb660a; font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #ffffff"&gt;M3UProcessor(object):&lt;/span&gt;
    &lt;span style="color: #ffffff"&gt;__slots__&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;filename&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;encoding&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;

    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;__init__&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;filename,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;encoding):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.filename&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;filename&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.encoding&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;encoding&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;process&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;extm3u&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;False&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;extinf&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;f&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;open(self.filename,&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;encoding=self.encoding)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;first_line&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;True&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;for&lt;/span&gt; &lt;span style="color: #ffffff"&gt;line&lt;/span&gt; &lt;span style="color: #ffffff"&gt;in&lt;/span&gt; &lt;span style="color: #ffffff"&gt;f:&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;line&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;line.strip()&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;first_line:&lt;/span&gt;
                &lt;span style="color: #ffffff"&gt;first_line&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;False&lt;/span&gt;
                &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;line&lt;/span&gt; &lt;span style="color: #ffffff"&gt;==&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;#EXTM3U&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;:&lt;/span&gt;
                    &lt;span style="color: #ffffff"&gt;extm3u&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;True&lt;/span&gt;
                    &lt;span style="color: #fb660a; font-weight: bold"&gt;continue&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;extm3u&lt;/span&gt; &lt;span style="color: #ffffff"&gt;and&lt;/span&gt; &lt;span style="color: #ffffff"&gt;line.startswith(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;#EXTINF&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;):&lt;/span&gt;
                &lt;span style="color: #ffffff"&gt;extinf&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;line&lt;/span&gt;
                &lt;span style="color: #fb660a; font-weight: bold"&gt;continue&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;line.startswith(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;#&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;):&lt;/span&gt;
                &lt;span style="color: #fb660a; font-weight: bold"&gt;continue&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;yield&lt;/span&gt; &lt;span style="color: #ffffff"&gt;M3UObject(line,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;extinf)&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;extinf&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;f.close()&lt;/span&gt;



&lt;span style="color: #fb660a; font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #ffffff"&gt;Main(object):&lt;/span&gt;
    &lt;span style="color: #ffffff"&gt;__slots__&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;options&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;args&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;db&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;regex&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;

    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;__init__&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.options&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.args&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.regex&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;setup_db&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;sqlite3.connect(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;:memory:&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;CREATE TABLE import (&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;id INTEGER PRIMARY KEY,&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;path TEXT,&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;transformed TEXT&amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;CREATE TABLE input (&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;id INTEGER PRIMARY KEY,&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;path TEXT,&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;extinf TEXT,&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;transformed TEXT&amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;CREATE TABLE copies (&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;id INTEGER PRIMARY KEY,&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;input INTEGER,&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;import INTEGER&amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;CREATE TABLE output (&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;id INTEGER PRIMARY KEY,&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;input INTEGER&amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;close_db&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.close()&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;transform_path&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;path,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;convert_sep&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;False):&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;convert_sep&lt;/span&gt; &lt;span style="color: #ffffff"&gt;and&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.options.convert_sep&lt;/span&gt; &lt;span style="color: #ffffff"&gt;is&lt;/span&gt; &lt;span style="color: #ffffff"&gt;not&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None:&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;path&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;path.replace(self.options.convert_sep,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;os.sep)&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.regex&lt;/span&gt; &lt;span style="color: #ffffff"&gt;is&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None:&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;self.regex&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;re.compile(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;r&amp;#39;(&amp;#39;&lt;/span&gt; &lt;span style="color: #ffffff"&gt;+&lt;/span&gt;
                         &lt;span style="color: #ffffff"&gt;os.sep&lt;/span&gt; &lt;span style="color: #ffffff"&gt;+&lt;/span&gt;
                         &lt;span style="color: #0086d2"&gt;r&amp;#39;[^&amp;#39;&lt;/span&gt; &lt;span style="color: #ffffff"&gt;+&lt;/span&gt;
                         &lt;span style="color: #ffffff"&gt;os.sep&lt;/span&gt; &lt;span style="color: #ffffff"&gt;+&lt;/span&gt;
                         &lt;span style="color: #0086d2"&gt;r&amp;#39;]*){3}$&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;match&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.regex.search(path)&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;match&lt;/span&gt; &lt;span style="color: #ffffff"&gt;is&lt;/span&gt; &lt;span style="color: #ffffff"&gt;not&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None:&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #ffffff"&gt;match.group(&lt;/span&gt;&lt;span style="color: #0086f7; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)[&lt;/span&gt;&lt;span style="color: #0086f7; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #ffffff"&gt;:]&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;else&lt;/span&gt;&lt;span style="color: #ffffff"&gt;:&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;parse_arguments&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;parser&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;optparse.OptionParser()&lt;/span&gt;

        &lt;span style="color: #ffffff"&gt;parser.add_option(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;--input-file&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;parser.add_option(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;--import-dir&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;parser.add_option(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;--export-dir&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;parser.add_option(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;--convert-sep&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;parser.add_option(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;--encoding&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;

        &lt;span style="color: #ffffff"&gt;(self.options,&lt;/span&gt;
         &lt;span style="color: #ffffff"&gt;self.args)&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;parser.parse_args()&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;check_arguments&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;result&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;True&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;for&lt;/span&gt; &lt;span style="color: #ffffff"&gt;i&lt;/span&gt; &lt;span style="color: #ffffff"&gt;in&lt;/span&gt; &lt;span style="color: #ffffff"&gt;(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;input_file&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt;
                  &lt;span style="color: #0086d2"&gt;&amp;#39;import_dir&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt;
                  &lt;span style="color: #0086d2"&gt;&amp;#39;export_dir&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;):&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;getattr(self.options,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;i)&lt;/span&gt; &lt;span style="color: #ffffff"&gt;is&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None:&lt;/span&gt;
                &lt;span style="color: #fb660a; font-weight: bold"&gt;print&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;quot;Please specify --%s!&amp;quot;&lt;/span&gt; &lt;span style="color: #ffffff"&gt;%&lt;/span&gt; &lt;span style="color: #ffffff"&gt;i.replace(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;))&lt;/span&gt;
                &lt;span style="color: #ffffff"&gt;result&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;False&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #ffffff"&gt;result&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;scan_import_dir&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;quot;DELETE FROM import&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;for&lt;/span&gt; &lt;span style="color: #ffffff"&gt;root,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;dirs,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;files&lt;/span&gt; &lt;span style="color: #ffffff"&gt;in&lt;/span&gt; &lt;span style="color: #ffffff"&gt;os.walk(self.options.import_dir):&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;for&lt;/span&gt; &lt;span style="color: #ffffff"&gt;f&lt;/span&gt; &lt;span style="color: #ffffff"&gt;in&lt;/span&gt; &lt;span style="color: #ffffff"&gt;files:&lt;/span&gt;
                &lt;span style="color: #ffffff"&gt;path&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;os.path.join(root,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;f)&lt;/span&gt;
                &lt;span style="color: #ffffff"&gt;transformed&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.transform_path(path)&lt;/span&gt;
                &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;transformed&lt;/span&gt; &lt;span style="color: #ffffff"&gt;is&lt;/span&gt; &lt;span style="color: #ffffff"&gt;not&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None:&lt;/span&gt;
                    &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
                        &lt;span style="color: #0086d2"&gt;&amp;quot;INSERT INTO import &amp;quot;&lt;/span&gt;
                        &lt;span style="color: #0086d2"&gt;&amp;quot;(path, transformed) &amp;quot;&lt;/span&gt;
                        &lt;span style="color: #0086d2"&gt;&amp;quot;VALUES (?, ?)&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt;
                        &lt;span style="color: #ffffff"&gt;(path,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;transformed))&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;process_input&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;quot;DELETE FROM input&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;processor&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;M3UProcessor(self.options.input_file,&lt;/span&gt;
                                 &lt;span style="color: #ffffff"&gt;self.options.encoding)&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;for&lt;/span&gt; &lt;span style="color: #ffffff"&gt;m3u&lt;/span&gt; &lt;span style="color: #ffffff"&gt;in&lt;/span&gt; &lt;span style="color: #ffffff"&gt;processor.process():&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;transformed&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.transform_path(m3u.path,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;True)&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;transformed&lt;/span&gt; &lt;span style="color: #ffffff"&gt;is&lt;/span&gt; &lt;span style="color: #ffffff"&gt;not&lt;/span&gt; &lt;span style="color: #ffffff"&gt;None:&lt;/span&gt;
                &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
                    &lt;span style="color: #0086d2"&gt;&amp;quot;INSERT INTO input &amp;quot;&lt;/span&gt;
                    &lt;span style="color: #0086d2"&gt;&amp;quot;(path, extinf, transformed) &amp;quot;&lt;/span&gt;
                    &lt;span style="color: #0086d2"&gt;&amp;quot;VALUES (?, ?, ?)&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt;
                    &lt;span style="color: #ffffff"&gt;(m3u.path,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;m3u.extinf,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;transformed))&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;find_copies&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;quot;DELETE FROM copies&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;INSERT INTO copies &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;(input, import) &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;SELECT input.id, import.id &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;FROM input &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;INNER JOIN import ON import.transformed = input.transformed&amp;quot;&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;quot;DELETE FROM output&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;INSERT INTO output &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;(input) &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;SELECT input.id &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;FROM input &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;WHERE input.id NOT IN (&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;SELECT copies.input &amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;FROM copies&amp;quot;&lt;/span&gt;
                &lt;span style="color: #0086d2"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;copy&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;for&lt;/span&gt; &lt;span style="color: #ffffff"&gt;result&lt;/span&gt; &lt;span style="color: #ffffff"&gt;in&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;SELECT import.path, input.transformed &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;FROM copies &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;INNER JOIN input ON input.id = copies.input &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;INNER JOIN import ON import.id = copies.import&amp;quot;&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;):&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;src&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;result[&lt;/span&gt;&lt;span style="color: #0086f7; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #ffffff"&gt;]&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;dest&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;os.path.join(self.options.export_dir,&lt;/span&gt;
                                &lt;span style="color: #ffffff"&gt;result[&lt;/span&gt;&lt;span style="color: #0086f7; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #ffffff"&gt;])&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;try&lt;/span&gt;&lt;span style="color: #ffffff"&gt;:&lt;/span&gt;
                &lt;span style="color: #ffffff"&gt;os.makedirs(os.path.dirname(dest))&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;except&lt;/span&gt; &lt;span style="color: #ffffff"&gt;OSError:&lt;/span&gt;
                &lt;span style="color: #fb660a; font-weight: bold"&gt;pass&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;shutil.copy(src,&lt;/span&gt; &lt;span style="color: #ffffff"&gt;dest)&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;write_output&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;f&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;open(self.options.input_file&lt;/span&gt; &lt;span style="color: #ffffff"&gt;+&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;.new&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt;
                 &lt;span style="color: #ffffff"&gt;encoding=self.options.encoding)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;f.write(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;#EXTM3U\n&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;for&lt;/span&gt; &lt;span style="color: #ffffff"&gt;result&lt;/span&gt; &lt;span style="color: #ffffff"&gt;in&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.db.execute(&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;SELECT input.path, input.extinf &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;FROM output &amp;quot;&lt;/span&gt;
            &lt;span style="color: #0086d2"&gt;&amp;quot;INNER JOIN input ON input.id = output.input&amp;quot;&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;):&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;m3u&lt;/span&gt; &lt;span style="color: #ffffff"&gt;=&lt;/span&gt; &lt;span style="color: #ffffff"&gt;M3UObject(result[&lt;/span&gt;&lt;span style="color: #0086f7; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #ffffff"&gt;],&lt;/span&gt; &lt;span style="color: #ffffff"&gt;result[&lt;/span&gt;&lt;span style="color: #0086f7; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #ffffff"&gt;])&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;f.write(str(m3u))&lt;/span&gt;
            &lt;span style="color: #ffffff"&gt;f.write(&lt;/span&gt;&lt;span style="color: #0086d2"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;f.close()&lt;/span&gt;


    &lt;span style="color: #fb660a; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #ff0086; font-weight: bold"&gt;run&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.setup_db()&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.parse_arguments()&lt;/span&gt;
        &lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;not&lt;/span&gt; &lt;span style="color: #ffffff"&gt;self.check_arguments():&lt;/span&gt;
            &lt;span style="color: #fb660a; font-weight: bold"&gt;return&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.scan_import_dir()&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.process_input()&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.find_copies()&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.copy()&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.write_output()&lt;/span&gt;
        &lt;span style="color: #ffffff"&gt;self.close_db()&lt;/span&gt;


&lt;span style="color: #fb660a; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #ffffff"&gt;__name__&lt;/span&gt; &lt;span style="color: #ffffff"&gt;==&lt;/span&gt; &lt;span style="color: #0086d2"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;:&lt;/span&gt;
    &lt;span style="color: #ffffff"&gt;Main().run()&lt;/span&gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-1714800819042557261?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/1714800819042557261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/07/m3u-copypy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/1714800819042557261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/1714800819042557261'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/07/m3u-copypy.html' title='m3u-copy.py'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4085978475911700879</id><published>2010-07-24T21:54:00.008+02:00</published><updated>2010-07-24T22:06:44.587+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wifi'/><category scheme='http://www.blogger.com/atom/ns#' term='WLAN'/><title type='text'>Wifi Spielereien - Teil 2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/TEtFdNLbTsI/AAAAAAAABS8/PPp-djtFDBM/s1600/IMG_5170.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/TEtFdNLbTsI/AAAAAAAABS8/PPp-djtFDBM/s200/IMG_5170.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5497564138191933122" /&gt;&lt;/a&gt;


&lt;p&gt;Alles was es zu einer Richtfunkantenne für’s WLAN braucht. Hoffe ich zumindest... ;)&lt;/p&gt;

&lt;p&gt;So sieht das Ganze dann zusammengebaut aus. Die Holzklötzchen müssen natürlich noch entfernt werden, dienen hier noch der Stabilisierung beim Kleben.&lt;/p&gt;

&lt;p style="clear: both;"&gt;&lt;/p&gt;


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-C3w1uboIpk/TEtF1ETw0OI/AAAAAAAABTE/KmomK2xbHUM/s1600/IMG_5171.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_-C3w1uboIpk/TEtF1ETw0OI/AAAAAAAABTE/KmomK2xbHUM/s200/IMG_5171.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5497564548127838434" /&gt;&lt;/a&gt;


&lt;p style="text-align: center;"&gt;BitSwitcher erkennt auch einige Netze:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/TEtGCpb0Q_I/AAAAAAAABTM/D_Qwqnep0VM/s1600/BitSwitcher.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 117px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/TEtGCpb0Q_I/AAAAAAAABTM/D_Qwqnep0VM/s200/BitSwitcher.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5497564781432030194" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4085978475911700879?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4085978475911700879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/07/wifi-spielereien-teil-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4085978475911700879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4085978475911700879'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/07/wifi-spielereien-teil-2.html' title='Wifi Spielereien - Teil 2'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/TEtFdNLbTsI/AAAAAAAABS8/PPp-djtFDBM/s72-c/IMG_5170.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-3309619054425366098</id><published>2010-07-19T20:05:00.008+02:00</published><updated>2010-07-19T20:51:52.027+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wifi'/><category scheme='http://www.blogger.com/atom/ns#' term='WLAN'/><title type='text'>Wifi Spielereien - Teil 1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-C3w1uboIpk/TESUjAIr4LI/AAAAAAAABSs/dNEbD-BNRcg/s1600/IMG_5169.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_-C3w1uboIpk/TESUjAIr4LI/AAAAAAAABSs/dNEbD-BNRcg/s200/IMG_5169.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5495680774351610034" /&gt;&lt;/a&gt;


&lt;p&gt;Dank &lt;a href="http://de.wikipedia.org/wiki/Kismet_%28Sniffer%29"&gt;Kismet&lt;/a&gt; und &lt;a href="http://de.wikipedia.org/wiki/BackTrack"&gt;BackTrack 4&lt;/a&gt; und dem guten alten Acer Aspire One lässt sich auch unterwegs fix ein offenes Wifi-Netz finden. Besonderes schön finde ich die Entwicklung hin zum &lt;a href="http://start.freifunk.net/"&gt;Freifunk&lt;/a&gt;, auch wenn die deutsche Gesetzgebung solche tollen Initiativen unnötigerweise stark einschränken. Aber so ein offenes WLAN überall ist doch eine feine Sache. Was aber, wenn dann doch die Antennenreichweite nicht ganz ausreicht?&lt;/p&gt;

&lt;p&gt;Mir erging es ähnlich. Ich hatte zwar Netz und zum e-Mails abrufen reichte es auch vollkommen aus, aber die Sache hatte einen Haken: Anscheinend funkte der Router zu schwach. Die im AA1 eingebaute Atheros-Karte tat gute Dienste und versendete die Pakete mit erstaunlicher Geschwindigkeit, aber das Funksignal der Gegenstelle war so schwach, dass die Pakete nur langsam beim Netbook eintrudelten (wenn überhaupt).&lt;/p&gt;

&lt;p&gt;Deswegen kam ich auf die Idee, mir meine eigene Wifi-Richtfunk-Antenne zu basteln. Bereits vorher hatte ich hier und da etwas gelesen, aber so richtig auseinandergesetzt habe ich mich noch nicht damit. Aber jetzt möchte ich doch mal gerne wissen, ob ich es schaffe ;)&lt;/p&gt;

&lt;p&gt;Das Problem ist allerdings, dass ich natürlich auch einen Chipsatz für die Antenne brauche. Die meisten nehmen einfach ihre Wifi-USB-Sticks und löten dort die Antenne an. Ich habe aber keinen solchen Stick, warum auch? Die Atheros-Karte im AA1 leistet hervorragende Dienste. Und an dieser werde ich mit Sicherheit nicht dran rumfrickeln :p Ein Neukauf kommt auch nicht in Frage, wo bleibt denn da der Spaß?&lt;/p&gt;

&lt;p&gt;Nun, ich habe mir also einfach einen alten Router geschnappt. Einen Targa WR 500 VoIP. Wenn man es genau betrachtet, ist es eine richtige „Schrottkiste“ (im Vergleich zu Fritz!Box :p) und baugleich mit dem Speedport W500V der T-Com. Kurzerhand wurde die Lage sondiert und das Ding in seine Einzelteile zerlegt. Wie man auf dem unteren Bild erkennen kann, ist es auf sehr einfache Weise möglich die Antenne des Gerätes auszutauschen.&lt;/p&gt;

&lt;p&gt;Mit der normalen Firmware kommt man aber dann doch nicht weiter. Deswegen einfach flott die modifizierte &lt;a href="http://bitswitcher.sourceforge.net/"&gt;BitSwitcher&lt;/a&gt;-Firmware auf das Gerät gespielt (tut ja nicht weh, ist sowieso überall Linux drin *g*). Diese Firmware ist wirklich genial und holt das letzte aus der alten Kiste heraus. So ist es möglich die WLAN-Hardware in den Client-Modus zu versetzen und sich mit einem WLAN-Netz zu verbinden (ansonsten stellt das Gerät einen eigenen Access Point bereit). Genau das was ich brauche.&lt;/p&gt;

&lt;p&gt;Jetzt ist es ganz einfach Pakete aus dem WLAN-Netz in das LAN-Netz zu routen. Sogar ein Bridged-Modus steht bereit. So nutze ich den Router einfach per LAN als meinen WLAN-Empfänger.&lt;/p&gt;

&lt;p&gt;Tja, was jetzt noch fehlt ist die Antenne. Mit der jetzt verbauten Antenne geht es zwar auch, aber das nützt mir ja noch nicht. Außerdem brauche ich für einen Feldversuch natürlich noch ein Feld auf offenem Gelände. Dürfte nicht so schwer zu finden sein, aber eins mit 240V-Anschluss schon ;). Aber zur Not muss eben der Konverter am Zigarettenanzünder her halten :)&lt;/p&gt;

&lt;p&gt;Weiter geht es also mit dem Bau der Antenne. Im Internet findet man wirklich interessante Ansatzpunkte. Ich denke, ich werde mich für eine Bi-Quad-Antenne entscheiden.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.tresselt.de/wlan.htm"&gt;http://www.tresselt.de/wlan.htm&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.dl2jas.com/antennen/biquad/biquad.html"&gt;http://www.dl2jas.com/antennen/biquad/biquad.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.google.com/search?q=Eigenbau+WLAN+Biquad"&gt;http://www.google.com/search?q=Eigenbau+WLAN+Biquad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-C3w1uboIpk/TESVDSyW9sI/AAAAAAAABS0/LUrxpFkMxxs/s1600/IMG_5165.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_-C3w1uboIpk/TESVDSyW9sI/AAAAAAAABS0/LUrxpFkMxxs/s200/IMG_5165.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5495681329114052290" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-3309619054425366098?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/3309619054425366098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/07/wifi-spielereien-teil-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3309619054425366098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3309619054425366098'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/07/wifi-spielereien-teil-1.html' title='Wifi Spielereien - Teil 1'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-C3w1uboIpk/TESUjAIr4LI/AAAAAAAABSs/dNEbD-BNRcg/s72-c/IMG_5169.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2248700291297067028</id><published>2010-07-19T19:44:00.003+02:00</published><updated>2010-07-19T19:57:01.931+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod Touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone OS 4.0'/><title type='text'>iPhone OS 4.0</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/TESRzK1aFEI/AAAAAAAABSk/-jtmQk1cIdc/s1600/IMG_5163.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/TESRzK1aFEI/AAAAAAAABSk/-jtmQk1cIdc/s200/IMG_5163.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5495677753566565442" /&gt;&lt;/a&gt;

&lt;p&gt;Bereits seit einiger Zeit ist ja Apples iPhone OS 4.0 für sowohl das iPhone als auch dem iPod Touch erhältlich. Diese Version ist im Gegensatz zu den anderen sogar kostenfrei verfügbar. Na wenn das mal nichts ist, da hat sich Apple ja richtig Mühe gegeben ;)&lt;/p&gt;

&lt;p&gt;Ich bin zwar kein großer Apple-Freund, aber hier kann ich echt nicht meckern. Es gibt ein paar wenige sichtbare Verbesserungen &amp;ndash; die meisten Features sind nur mit neueren Modellen verfügbar, so dass ich sie nicht testen kann. Aber auch so bringt das Update etwas: Ich habe das Gefühl, dass die Bedienung besser geworden ist, obwohl ich nicht genau sagen kann, was mich dazu verleitet. Aber das ist ja auch egal, Hauptsache es funzt :)&lt;/p&gt;

&lt;p&gt;Für alle, die das Firmware-Update auf das neue iPhone OS 4.0 in einer virtuellen Maschine ausführen wollen: iTunes startet das Gerät im Recover-Modus neu. Danach gibt sich das Gerät mit einer abweichenden ID aus, so dass man das „neue“ USB-Gerät wieder an das Gastsystem weiterleiten muss. Wenn man den richtigen Zeitpunkt erwischt, ist man auch nicht auf ein richtiges Windows- oder Mac-System angewiesen.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2248700291297067028?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2248700291297067028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/07/iphone-os-40.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2248700291297067028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2248700291297067028'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/07/iphone-os-40.html' title='iPhone OS 4.0'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/TESRzK1aFEI/AAAAAAAABSk/-jtmQk1cIdc/s72-c/IMG_5163.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2288024791055602925</id><published>2010-07-19T19:21:00.004+02:00</published><updated>2010-07-19T19:27:12.485+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='dvr-recover'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>dvr-recover 0.6.1</title><content type='html'>&lt;p&gt;Da ich die letzten Versionen auch hier angekündigt habe, mache ich das mit dieser Version auch einfach mal, auch wenn sich sowieso kaum was geändert hat :)&lt;/p&gt;

&lt;pre class="terminal"&gt;&lt;b&gt;2010-07-18  Stefan Haller&lt;/b&gt;

  &lt;b&gt;Version 0.6.1:&lt;/b&gt;
  * &lt;i&gt;dvr-recover.py&lt;/i&gt;: Fixed misplaced parenthesis introduced in release 0.6.
    Thanks to Martin Gašparík for pointing out this issue!
&lt;/pre&gt;

&lt;p&gt;Jaja, mit einer ordentlichen Test-Suite wäre das sicherlich nicht passiert. Aber diese kommt erst noch… oder auch nicht ;)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sites.google.com/site/haliner/dvr-recover"&gt;→ Projektseite&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2288024791055602925?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2288024791055602925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/07/dvr-recover-061.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2288024791055602925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2288024791055602925'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/07/dvr-recover-061.html' title='dvr-recover 0.6.1'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-5101805459436971774</id><published>2010-07-11T12:44:00.006+02:00</published><updated>2010-07-19T17:24:16.964+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Datenrettung'/><category scheme='http://www.blogger.com/atom/ns#' term='Script'/><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='Festplattenrekorder'/><category scheme='http://www.blogger.com/atom/ns#' term='dvr-recover'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>dvr-recover 0.6</title><content type='html'>&lt;p&gt;Schon wieder gibt es eine neue Version von &lt;a href="http://sites.google.com/site/haliner/dvr-recover"&gt;dvr-recover&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="terminal"&gt;&lt;b&gt;2010-07-11  Stefan Haller&lt;/b&gt;

  &lt;b&gt;Version 0.6:&lt;/b&gt;
  * &lt;i&gt;dvr-recover.py&lt;/i&gt;: Binary operations simplified.
  * &lt;i&gt;dvr-recover.py&lt;/i&gt;: Fixed bug throwing exception "__main__.SqlManagerError:
    Multiple chunks are referencing the same chunk for concatenating!".
  * &lt;i&gt;Readme&lt;/i&gt;: "Tuning" section added.&lt;/pre&gt;

&lt;p&gt;Einige Nutzer bemerkten, dass sich in der letzten Version ein kleiner Fehler eingeschlichen hat. Dieser Fehler hatte jedoch große Auswirkungen, denn dadurch konnte man nur noch in sehr eingeschränktem Maßstab die Dateien wiederherstellen.&lt;/p&gt;

&lt;p&gt;Weiterhin ist bekannt geworden, dass IsoBuster anscheinend in der Lage ist, dass Festplattenabbild teilweise auszulesen. Dies ist jedoch auch nur begrenzt möglich. Solange noch Bedarf an meinem Script besteht, werde ich versuchen das Projekt zu betreuen und alle gewünschten Features umzustetzen. Selbst wenn IsoBuster in Lage wäre alle Daten erfolgreich auszulesen: IsoBuster ist Shareware und kostet 29.95 USD. Eine freie Möglichkeit wie meine hat ja auch ihre Vorteile ;)&lt;/p&gt;

&lt;p&gt;Ich persönlich denke, dass Panasonic eine Art UDF als Dateisystem verwendet. Immerhin ist IsoBuster in der Lage das Abbild zu öffnen. Die Blockgröße von 2048 Byte würde meine These unterstützen. Außerdem wäre es nur logisch, denn so müsste der Recorder die Daten beim Schreiben auf eine DVD nicht erst konvertieren, da sie gleich im passenden Format vorliegen würden. Einige andere Leute sind ebenfalls dieser Meinung. Jedoch fehlt dann noch eine Zuordnung zu den Aufnahmeinformationen. Vermutlich ist der Aufbau der Festplatte wie folgt (Angaben natürlich ohne Gewähr, nur eine Mutmaßung meinerseits):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firmware&lt;/li&gt;
&lt;li&gt;Table of Contents (Informationen über die Aufnahmen, Datum, Sender, ...)&lt;/li&gt;
&lt;li&gt;UDF-artiges Dateisystem Layout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es gibt Bestrebungen das Dateisystem genauer zu untersuchen. Das interessiert mich auch. In der Zwischenzeit kann man mit meinem Script auch ganz gut die Aufnahmen retten. Wenn man natürlich das Dateisystem genau kennen würde, könnte man die Aufnahmen mit einer Quote von 100% zurückspielen ... :D&lt;/p&gt;

&lt;p&gt;Mein Script geht dabei überhaupt nicht den Ansatz über das Dateisystem. Deswegen ist es eben auch nicht vollkommen zuverlässig und einige Aufnahmen werden nicht gefunden. Jedoch denke ich, dass die Standardeinstellung für den Parameter „min_chunk_size“ viel zu hoch angesetzt ist. Ich kann ihn leider nicht mehr richtig feinjustieren, da ich kein Abbild der Festplatte mehr besitze. Wenn aber jemand zeigen kann, dass ein kleiner Standardwert besser wäre, dann würde ich die Standardeinstellungen in den kommenden Releases herabsetzen.&lt;/p&gt;

&lt;p&gt;An der Stelle sei noch auf die Stelle im Internet verwiesen, an der man wohl die meisten Informationen zu der Thematik erhält: &lt;a href="http://www.avsforum.com/avs-vb/showthread.php?t=1010518"&gt;Ein Thread im AVS-Forum&lt;/a&gt;. Dort hat auch die Entwicklung meines Scriptes begonnen und wird auch maßgeblich vorangetrieben.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-5101805459436971774?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/5101805459436971774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/07/dvr-recover-06.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5101805459436971774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5101805459436971774'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/07/dvr-recover-06.html' title='dvr-recover 0.6'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-7935705310048685728</id><published>2010-06-19T21:06:00.001+02:00</published><updated>2010-06-20T12:00:32.595+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Datenrettung'/><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='Festplattenrekorder'/><category scheme='http://www.blogger.com/atom/ns#' term='dvr-recover'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>dvr-recover 0.5</title><content type='html'>&lt;p&gt;Das &lt;a href="http://sites.google.com/site/haliner/dvr-recover"&gt;dvr-recover Script&lt;/a&gt; gibt es jetzt in der Version 0.5. Viele Teile vom Code wurden komplett geändert. Ebenfalls kam viele neue Dokumentation dazu, so dass der Einstieg und Umgang mit dem Script einfacher sein sollte.&lt;/p&gt;

&lt;p&gt;Auszug aus der ChangeLog:&lt;/p&gt;
&lt;pre class="terminal"&gt;&lt;b&gt;2010-06-17  Stefan Haller&lt;/b&gt;

  &lt;b&gt;Version 0.5:&lt;/b&gt;
  * &lt;i&gt;dvr-recover.py&lt;/i&gt;: Minor Bugfixes.
  * &lt;i&gt;dvr-recover.py&lt;/i&gt;: Direct access to Windows device files forbidden.
  * &lt;i&gt;dvr-recover.py&lt;/i&gt;: Use Sqlite3 database instead of chunk list file.
  * &lt;i&gt;dvr-recover.py&lt;/i&gt;: All settings are stored in database now. Use the parameter
    "setup" to manipulate the preferences.&lt;/pre&gt;

&lt;p&gt;Insgesamt betrachtet sind die Änderungen am Projekt in diesem neuen Release wirklich groß:&lt;/p&gt;
&lt;pre class="terminal"&gt;&lt;i&gt;$ git diff --stat ^v0.4 v0.5&lt;/i&gt;
 .gitignore     |    2 +-
 Authors        |    1 +
 ChangeLog      |   46 ++-
 Install        |    4 +
 Readme         |  247 ++++++++++++
 dvr-recover.py | 1224 +++++++++++++++++++++++++++++++++++---------------------
 6 files changed, 1056 insertions(+), 468 deletions(-)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-7935705310048685728?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/7935705310048685728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/06/dvr-recover-05.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7935705310048685728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7935705310048685728'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/06/dvr-recover-05.html' title='dvr-recover 0.5'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-8444334864401031005</id><published>2010-06-17T20:30:00.000+02:00</published><updated>2010-06-17T20:33:19.336+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Kernel-Mode-Settings'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='Squeeze'/><title type='text'>Debian Squeeze: Linux 2.6.32-5-686, KMS und mein Monitor</title><content type='html'>&lt;p&gt;Nach einem Kernelupdate von Debian Squeeze auf die neue Version &lt;i&gt;2.6.32-5-686&lt;/i&gt; war die Auflösung der Anzeige nicht mehr korrekt. Der Monitor lief nur mit einer niedrigeren Auflösung, als eigentlich unterstützt wird. Das Problem besteht schon ewig, jedoch konnte man dies mit einem Eintrag in der &lt;i&gt;xorg.conf&lt;/i&gt; bisher problemlos beheben.&lt;/p&gt;

&lt;p&gt;Nach diesem Kernelupdate wird jedoch „Kernel-Mode-Settings“ aktiviert. Das bewirkt, dass der Kernel selbst die Auflösung setzt, der X-Server kann dies danach nicht mehr tun. Ich benötige KMS eigentlich nicht und habe es deswegen deaktiviert. Danach kann ich auch den neuen Kernel ohne weitere Probleme nutzen.&lt;/p&gt;

&lt;p&gt;Dazu editiert man einfach die Datei &lt;i&gt;/etc/defaults/grub&lt;/i&gt; und fügt zu &lt;i&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/i&gt; den Eintrag &lt;i&gt;nomodeset&lt;/i&gt; hinzu:&lt;/p&gt;
&lt;pre class="terminal"&gt;GRUB_CMDLINE_LINUX_DEFAULT="quiet nomodeset"&lt;/pre&gt;

&lt;p&gt;Danach nur noch mit Root-Rechten die Grub-Konfiguration aktualisieren und fertig ist der Laden :)&lt;/p&gt;
&lt;pre class="terminal"&gt;# update-grub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-8444334864401031005?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/8444334864401031005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/06/debian-squeeze-linux-2632-5-686-kms-und.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8444334864401031005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8444334864401031005'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/06/debian-squeeze-linux-2632-5-686-kms-und.html' title='Debian Squeeze: Linux 2.6.32-5-686, KMS und mein Monitor'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2221843245070164241</id><published>2010-05-30T16:13:00.003+02:00</published><updated>2010-05-30T16:18:38.004+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DesktopNova'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>Käferalarm</title><content type='html'>&lt;p&gt;Kaum ist mein erstes Debian Paket &lt;a href="http://haliner.blogspot.com/2010/05/desktopnova-08-jetzt-offiziell-in-der.html"&gt;den ersten Tag in Debian Unstable&lt;/a&gt;, schon trudelt &lt;a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=583756"&gt;der erste Bugreport&lt;/a&gt; ein.&lt;/p&gt;
&lt;p&gt;Das Abhängigkeiten-System von den Debian-Paketen finde ich persönlich gerade als Anfänger gar nicht so einfach. Da hilft auch die Debian-Policy nicht viel, man benötigt vermutlich einfach nur mehr Erfahrung.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2221843245070164241?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2221843245070164241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/05/kaferalarm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2221843245070164241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2221843245070164241'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/05/kaferalarm.html' title='Käferalarm'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2949893389141707491</id><published>2010-05-29T19:53:00.005+02:00</published><updated>2010-05-29T19:57:11.465+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='DesktopNova'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>DesktopNova 0.8 jetzt offiziell in der Debian-Paketsammlung</title><content type='html'>&lt;p&gt;Gerade eben erreichte mich dir erfreuliche Mail, dass meine &lt;i&gt;DesktopNova&lt;/i&gt;-Pakete &lt;a href="http://packages.qa.debian.org/d/desktopnova.html"&gt;im offiziellen Debian-Paketarchiv&lt;/a&gt; akzeptiert wurden. Das bedeutet, dass diese ebenfalls den Weg in die nächste Ubuntu-Version finden sollten. :)&lt;/p&gt;
&lt;p&gt;Der Vorgang der Paketerstellung hat mich sowieso interessiert und im Rahmen des &lt;i&gt;DesktopNova&lt;/i&gt;-Projekts baute ich bereits Pakete für Ubuntu und später auch für Debian. Diese kamen jedoch nicht “offiziell” von der Distribution, sondern mussten manuell heruntergeladen werden. Ubuntu-Nutzer konnten auch &lt;a href="https://launchpad.net/~haliner/+archive/ppa"&gt;mein PPA&lt;/a&gt; einbinden, was jedoch auch noch einen kleinen Zwischenschritt darstellte.&lt;/p&gt;
&lt;p&gt;Dann fand ich im Debian-Bugtracker einen Bug, der dazu anregte, mein Projekt für Debian zu paketieren. Diese Aufgabe habe ich gleich selbst übernommen. Es war zwar gar nicht so einfach sich in den gesamten Prozess hineinzufinden, doch habe ich es letztendlich geschafft und habe einen kompetenten Mentor gefunden, der mich auf Fehler aufmerksam machte und mir Hinweise gab. Vielen Dank in diesem Zusammenhang an &lt;i&gt;Laszlo Boszormenyi&lt;/i&gt;, der meine Pakete gesponsort hat. ;)&lt;/p&gt;
&lt;p&gt;Ich muss sagen, dass ich eine Menge gelernt habe und ich durch die Ratschläge eindeutig bessere Pakete bauen kann als zuvor. Dies kommt natürlich auch den Paketen im Ubuntu-PPA zugute.&lt;/p&gt;
&lt;p&gt;Falls ich Zukunft irgendwelche gute freie Software finde, welche noch nicht im Debian-Repository vorhanden ist, werde ich definitiv versuchen weitere Pakete zu erstellen.&lt;/p&gt;
&lt;p&gt;Debian ist jetzt nicht mehr die einzige Distribution, wo &lt;i&gt;DesktopNova&lt;/i&gt; enthalten ist. Im AUR (Arch User Repository) von Arch Linux ist es dank &lt;i&gt;alessandro_ufms&lt;/i&gt; ebenfalls seit einiger Zeit &lt;a href="http://aur.archlinux.org/packages.php?ID=36467"&gt;enthalten&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2949893389141707491?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2949893389141707491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/05/desktopnova-08-jetzt-offiziell-in-der.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2949893389141707491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2949893389141707491'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/05/desktopnova-08-jetzt-offiziell-in-der.html' title='DesktopNova 0.8 jetzt offiziell in der Debian-Paketsammlung'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2599130151392887448</id><published>2010-05-23T16:52:00.000+02:00</published><updated>2010-05-23T16:53:21.902+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebKit'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>WebKit mit „unnormalen“ &lt;pre&gt;-Blöcken</title><content type='html'>&lt;p&gt;Alle Code- und Terminal-Blöcke hier im Blog und auf der &lt;a href="http://sites.google.com/site/haliner/"&gt;Homepage&lt;/a&gt; werden präformatiert mithilfe von &amp;lt;pre&amp;gt;-Blöcken dargestellt. Allerdings können diese das Layout auch recht einfach zerstören, falls die die horizontale Breite des Textes zu groß ist. Der Text wird meist einfach angezeigt und überlagert dann die anderen Inhalte oder läuft sogar ganz aus der Seite heraus. Das ist natürlich nicht gewünscht. Aber ein Umbruch ist meistens auch nicht die optimale Lösung, da gerade bei Quelltext der automatische Zeilenumbruch die Bedeutung maßgeblich beeinflusst (beim Kopieren des Inhalts des &amp;lt;pre&amp;gt;-Blocks werden diese zwar nicht mitkopiert, aber auf der Seite sieht es dennoch komisch aus.)&lt;/p&gt;

&lt;p&gt;Vor einiger Zeit habe ich deswegen etwas am CSS-Code gedreht, so dass automatisch Scrollleisten angeboten werden und auch die Höhe des Blocks in der Größe beschränkt wird:&lt;/p&gt;

&lt;pre class="terminal"&gt;&lt;span style="color: #0000FF; font-weight: bold"&gt;.post&lt;/span&gt; &lt;span style="color: #008000; font-weight: bold"&gt;pre&lt;/span&gt; {
  &lt;span style="color: #666666"&gt;//&lt;/span&gt; &amp;quot;normale&amp;quot; Formatierung
  &lt;span style="color: #008000; font-weight: bold"&gt;color&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;#444&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;background-color&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;#f5f5f5&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;border&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;1px&lt;/span&gt; &lt;span style="color: #008000; font-weight: bold"&gt;solid&lt;/span&gt; &lt;span style="color: #666666"&gt;#666&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;margin&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;1em&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;padding&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;0.5em&lt;/span&gt;;

  &lt;span style="color: #666666"&gt;//&lt;/span&gt; Scrollleisten &lt;span style="color: #666666"&gt;&amp;amp;&lt;/span&gt; Groessenbeschraenkung
  &lt;span style="color: #008000; font-weight: bold"&gt;overflow&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #008000; font-weight: bold"&gt;auto&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;max-height&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;500px&lt;/span&gt;;
}&lt;/pre&gt;

Das funktioniert schon relativ gut, jedoch weigerten sich alle WebKit-Browser horizontale Scrollleisten anzuzeigen. Stattdessen wurde der Text innerhalb der &amp;lt;pre&amp;gt;-Blöcke einfach umgebrochen, obwohl ich ja genau dies nicht wollte. Die Lösung für das Problem ist jedoch mit der CSS 3-Eigenschaft namens „word-wrap“ ganz einfach:

&lt;pre class="terminal"&gt;&lt;span style="color: #0000FF; font-weight: bold"&gt;.post&lt;/span&gt; &lt;span style="color: #008000; font-weight: bold"&gt;pre&lt;/span&gt; {
  &lt;span style="color: #666666"&gt;//&lt;/span&gt; &amp;quot;normale&amp;quot; Formatierung
  &lt;span style="color: #008000; font-weight: bold"&gt;color&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;#444&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;background-color&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;#f5f5f5&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;border&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;1px&lt;/span&gt; &lt;span style="color: #008000; font-weight: bold"&gt;solid&lt;/span&gt; &lt;span style="color: #666666"&gt;#666&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;margin&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;1em&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;padding&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;0.5em&lt;/span&gt;;

  &lt;span style="color: #666666"&gt;//&lt;/span&gt; Scrollleisten &lt;span style="color: #666666"&gt;&amp;amp;&lt;/span&gt; Groessenbeschraenkung
  &lt;span style="color: #008000; font-weight: bold"&gt;overflow&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #008000; font-weight: bold"&gt;auto&lt;/span&gt;;
  &lt;span style="color: #008000; font-weight: bold"&gt;max-height&lt;/span&gt;&lt;span style="color: #666666"&gt;:&lt;/span&gt; &lt;span style="color: #666666"&gt;500px&lt;/span&gt;;
  &lt;span style="color: #BA2121"&gt;word-wrap: &lt;span style="font-weight: bold"&gt;normal&lt;/span&gt;;&lt;/span&gt;
}&lt;/pre&gt;

&lt;p&gt;Auch wenn der Wert „normal“ eigentlich suggeriert, dass diese Einstellung auch Standard ist, so scheint dies bei WebKit zumindest nicht zu stimmen. Standardmäßig scheint WebKit mit „word-wrap: word-break“ bei präformatiertem Text zu arbeiten.&lt;/p&gt;

&lt;p&gt;Der Nachteil dieser gesamten Methode ist jedoch, dass der Text einfach abgeschnitten wird (wie bei „overflow: hidden“), falls keine Scrollleisten angeboten werden können. Dies ist z.B. bei Systemen mit Touchscreen wie dem iPhone der Fall. Allerdings ist wird man mit diesen Geräten wohl auch kaum den Quelltext vollständig durchschauen wollen und so ist es erstmal besser als nichts ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2599130151392887448?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2599130151392887448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/05/webkit-mit-unnormalen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2599130151392887448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2599130151392887448'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/05/webkit-mit-unnormalen.html' title='WebKit mit „unnormalen“ &amp;lt;pre&amp;gt;-Blöcken'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-6538424340354857154</id><published>2010-05-16T17:51:00.004+02:00</published><updated>2010-05-16T19:43:24.182+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Script'/><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='Drobox'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><category scheme='http://www.blogger.com/atom/ns#' term='dirlisting.py'/><title type='text'>dirlisting.py 0.2 – und jetzt ordentlich...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/S_AP5avZSHI/AAAAAAAABCA/lDlBsxR6wr8/s1600/dirlisting.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 126px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/S_AP5avZSHI/AAAAAAAABCA/lDlBsxR6wr8/s200/dirlisting.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5471891026360223858" /&gt;&lt;/a&gt;


&lt;p style="text-align: left;"&gt;Das &lt;a href="http://sites.google.com/site/haliner/dirlisting-py"&gt;dirlisting.py-Script&lt;/a&gt; benötige ich so gut wie täglich. Jedoch kam ich mit der alten Version sehr rasch an seine Grenzen. Mit der Zeit wurde es auch immer schwieriger Verbesserungen einzubauen, da der Quellcode einfach viel zu unsauber war.&lt;/p&gt;

&lt;p&gt;Deswegen habe ich das Script nochmal rasch neu geschrieben und viele neue Features eingebaut und alte Schwächen behoben. Weitere Features werden folgen und zwar genau dann, wenn ich sie selbst benötige ;). Im Rahmen der Umgestaltung der Homepage (die Projektseiten werden automatisch mithilfe der Projektdateien generiert) hat das Script auch eine &lt;a href="http://sites.google.com/site/haliner/dirlisting-py"&gt;eigene Unterseite&lt;/a&gt; bekommen.&lt;/p&gt;

&lt;p&gt;Hier eine Liste aller Features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alle Python-Versionen der 2.x-Serie ab 2.5 werden offiziell unterstützt. (Es kann allerdings auch mit älteren Versionen funktionieren.)&lt;/li&gt;
&lt;li&gt;Vollständiger Unicode-Support.&lt;/li&gt;
&lt;li&gt;Der ausgegebene Code ist sauber und valide und besitzt auch Einrückungen, so dass eine Nachbearbeitung durch Mensch oder Script einfach ist.&lt;/li&gt;
&lt;li&gt;Der Inhalt der Seite wurde von CSS und Javascript separiert. Es ist möglich CSS und Javascript direkt in die HTML-Seite einzubinden oder als externe Quelle anzugeben. (Das Script kann auf Wunsch natürlich auch nur den CSS und Javascript-Code ausgeben, so dass dieser in separaten Dateien ausgelagert werden kann.)&lt;/li&gt;
&lt;li&gt;Der Javascript-Anteil wurde wesentlich verbessert. Die generierte Seite lässt sich jedoch ebenso ohne aktives Javascript nutzen.&lt;/li&gt;
&lt;li&gt;Der Titel ist veränderbar.&lt;/li&gt;
&lt;li&gt;Man kann eine Datei angeben, in welche das Script die Ausgabe schreibt. Weiterhin wird versucht die Ausgabedatei von der Dateiauflistung auszuschließen.&lt;/li&gt;
&lt;li&gt;Unterstützung für unixartige Betriebssysteme sowie Windows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eine Beispielseite für die Ausgabe des Scriptes ist die &lt;a href="http://dl.dropbox.com/u/1996083/Projects/index.html"&gt;Downloadseite all meiner aktuellen Projekte&lt;/a&gt;. Die Ausgabe des Scripts wurde in diesem Falle jedoch durch ein kleines Sed-Script gepiped. Der Unterschied zu der normalen Ausgabe des Scripts ist jedoch minimal (hauptsächlich wurde das „git“-Verzeichnis komplett ersetzt).&lt;/p&gt;

&lt;p&gt;Mit der Zeit werden sicherlich noch weitere Verbesserungen einfließen, je nachdem, was ich gerade benötige.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-6538424340354857154?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/6538424340354857154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/05/dirlistingpy-02-und-jetzt-ordentlich.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6538424340354857154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6538424340354857154'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/05/dirlistingpy-02-und-jetzt-ordentlich.html' title='dirlisting.py 0.2 &amp;ndash; und jetzt ordentlich...'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/S_AP5avZSHI/AAAAAAAABCA/lDlBsxR6wr8/s72-c/dirlisting.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-7971961508041381219</id><published>2010-05-13T22:52:00.003+02:00</published><updated>2010-05-13T23:11:30.641+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Datenrettung'/><category scheme='http://www.blogger.com/atom/ns#' term='Script'/><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Festplattenrekorder'/><category scheme='http://www.blogger.com/atom/ns#' term='dvr-recover'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>dvr-recover 0.4 – Wie geht es weiter?</title><content type='html'>&lt;p&gt;In den letzten Tagen häuften sich die neuen Versionen rund um das „dvr-recover“-Projekt.  Mittlerweile ist bereits die Version 0.4 aktuell. Die Änderungen halten sich jedoch in Grenzen, die &lt;a href="http://dl.dropbox.com/u/1996083/Projects/index.html"&gt;Patches&lt;/a&gt; fallen relativ klein aus. Jedoch sind einige Verbesserungen hinzu gekommen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version 0.3:
&lt;ul&gt;
&lt;li&gt;Fehler beim Öffnen der Einstellungsdatei werden jetzt abgefangen.&lt;/li&gt;
&lt;li&gt;Die Einstellungsdatei wird jetzt nicht mehr geladen, wenn der Parameter „sample_settings“ spezifiziert wurde. (Die Datei soll mit dem Parameter erst erstellt werden, ein vorheriges Öffnen ist sinnlos.)&lt;/li&gt;
&lt;li&gt;Um Missverständnisse zu umgehen, wurden einige Termini ersetzt und vereinheitlicht.&lt;/li&gt;
&lt;li&gt;Die Hilfe-Meldung gibt nun noch Informationen zu den eckigen Klammer an. Diese dürfen in der Einstellungsdatei nicht übernommen werden, ansonsten werden Fehler ausgegeben.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Version 0.4:
&lt;ul&gt;
&lt;li&gt;Der Parameter „test_settings“ gibt nun nicht die Liste der Eingabedateien als Ganzes aus. Die von Python ausgegebenen eckigen Klammern und „unescapten“ Strings waren verwirrend. Stattdessen wird jede Eingabedatei in einer extra Zeile mit „hdd-file:“ davor ausgeben. Dies entspricht auch der Syntax der Einstellungsdatei.&lt;/li&gt;
&lt;li&gt;Bevor der langwierige Vorgang des Scans begonnen wird, wird jetzt versucht die Chunklisten-Datei zu erstellen. Dies verhindert eine Fehlermeldung nach dem Abschluss des Prozesses, falls die Datei nicht geschrieben werden kann. Es ist äußerst ungünstig, wenn das Script nach vier Stunden Arbeit an einem so simplen Fehler scheitert und alle Ergebnisse verloren sind.&lt;/li&gt;
&lt;/ul&gt;
&lt;/lu&gt;
&lt;/ul&gt;

&lt;p&gt;Wie immer sind alle Informationen zum Script auf meiner &lt;a href="http://sites.google.com/site/haliner/dvr-recover"&gt;Homepage&lt;/a&gt; zu finden.&lt;/p&gt;

&lt;p&gt;Doch wie geht es weiter? Ich denke, ich werde das Projekt noch einige Zeit aktiv weiterentwickeln. Nächstes Ziel ist der Umstieg auf eine Sqlite3-Datenbank. Dadurch ist es möglich, dass die Daten &lt;i&gt;on-demand&lt;/i&gt; abgefragt werden können und die Liste nicht im Speicher gehalten werden muss. Zudem ist es möglich, dass Buch über den Fortschritt der Sammel-Aktion geführt wird. Es wäre dann möglich, dass man den Vorgang unterbrechen kann und ohne Verluste später weiterführt. Durch die Sqlite3-Datenbank und dem Transaktionsmodell ist es auch &lt;i&gt;atomic&lt;/i&gt;, eine Inkonsistenz der Daten wird verhindert. Außerdem habe ich beim Überblicken des Codes noch ein paar Logikfehler entdeckt. Diese scheinen jedoch nicht gravierend, da bereits einige Nutzer etwa 60% ihrer Daten retten konnten. Eine bessere Rate ist in meinen Augen undenkbar. Später soll die Bedienführung noch vereinfacht werden. Alle Einstellungen kommen in die Datenbank, die Einstellungsdatei wird abgeschafft. Vor der ersten Benutzung fragt das Script dann interaktiv nach den benötigten Einstellungen. Tja, dann werde ich schauen, wie sich das Interesse am Projekt weiterentwickelt und irgendwann wird das Projekt in Frieden ruhen.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-7971961508041381219?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/7971961508041381219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/05/dvr-recover-04-wie-geht-es-weiter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7971961508041381219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7971961508041381219'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/05/dvr-recover-04-wie-geht-es-weiter.html' title='dvr-recover 0.4 – Wie geht es weiter?'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-283404529608562187</id><published>2010-05-09T16:00:00.004+02:00</published><updated>2010-05-09T18:10:36.396+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Datenrettung'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='Festplattenrekorder'/><category scheme='http://www.blogger.com/atom/ns#' term='dvr-recover'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>dvr-recover 0.2</title><content type='html'>&lt;p&gt;Das &lt;a href="http://haliner.blogspot.com/2010/04/aufnahmen-von-der-festplatte-eines.html"&gt;Script zum Retten der Aufnahmen von Festplatten digitaler Videorekorder&lt;/a&gt; funktionierte an sich schon recht gut. Jedoch musste das Festplattenabbild dazu zwingend in einer einzigen Datei vorliegen. Das Script konnte mit mehreren Dateien, welche die Festplatte in einzelne Teile zerstückelt darstellen, nichts anfangen. Doch mit der Version 0.2 von dvr-recover gehört dieses Problem der Vergangenheit an. Das Script handhabt mehrere Dateien jetzt wie eine einzige große Datei. Dadurch ist es möglich das Festplattenabbild in Stücke von beispielsweise 4 GiB zu teilen.&lt;/p&gt;

&lt;p&gt;Außerdem wurde berichtet, dass das Script ebenfalls mit einem &lt;i&gt;Panasonic DMR-EH57&lt;/i&gt; funktioniert.&lt;/p&gt;

&lt;p&gt;Mehr Infos zu dvr-recover gibt’s auf der &lt;a href="http://sites.google.com/site/haliner/dvr-recover"&gt;Projektseite&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-283404529608562187?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/283404529608562187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/05/dvr-recover-02.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/283404529608562187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/283404529608562187'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/05/dvr-recover-02.html' title='dvr-recover 0.2'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-5757887921637465571</id><published>2010-04-27T19:32:00.009+02:00</published><updated>2010-05-23T13:03:20.753+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Datenrettung'/><category scheme='http://www.blogger.com/atom/ns#' term='Festplattenrekorder'/><category scheme='http://www.blogger.com/atom/ns#' term='dvr-recover'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>Aufnahmen von der Festplatte eines digitalen Festplattenrekorders retten</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/S9ccoyiOPxI/AAAAAAAABBo/khrC670zTVw/s1600/IMG_4551.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/S9ccoyiOPxI/AAAAAAAABBo/khrC670zTVw/s200/IMG_4551.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5464868159923044114" /&gt;&lt;/a&gt;

&lt;p&gt;Zu Ostern gab es dieses Jahr zu den üblichen „Überraschungen“ noch ein ganz unerwartete. Mein Onkel brachte einen defekten Festplattenrekorder mit. Nach einer eher kurzen Diagnose stand fest, dass das Gerät leider nicht so einfach repariert werden konnte. Das DVD-Laufwerk ist kaputt, es ist also unmöglich die Daten von dem Gerät runter zu bekommen. Das scheint eine „Modeerscheinung“ bei dem Gerät (Panasonic DMR-EH56) zu sein, denn viele Nutzer klagen über einen raschen Tod des Laufwerks. In unserem speziellen Fall ging der Motor vom Laufwerk nicht mehr zuverlässig, so dass die DVD noch nicht einmal richtig angedreht wurde. Dummerweise lässt sich das Gerät nicht austauschen, da es kein gewöhnliches DVD-Laufwerk mit PATA-Anschluss ist, sondern eine Art Spezialanfertigung. Das Laufwerk selbst besitzt keinerlei Controller-Logik, das liegt alles auswärts auf der Platine des restlichen Rekorders. An dieser Stelle lässt sich also nicht viel deichseln.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/S9cc6sH0UNI/AAAAAAAABBw/RFE6iW9RZSc/s1600/IMG_4399.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/S9cc6sH0UNI/AAAAAAAABBw/RFE6iW9RZSc/s200/IMG_4399.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5464868467439325394" /&gt;&lt;/a&gt;

&lt;p&gt;Theoretisch ist das Gerät noch einsatzfähig, nur bekommt man eben die Aufnahmen einfach nicht mehr von dem Gerät runter. Das ist schon etwas ungünstig. Allerdings ist in dem Rekorder ja noch eine handelsübliche PATA-Festplatte eingebaut, auf der alle Aufnahmen fein säuberlich gespeichert sind (man nimmt es doch stark an *g*). Also wurde die Platte einfach mal an einen USB-HDD-Controller angestöpselt und siehe da, die Platte wurde erkannt. Allerdings wurde der Inhalt nicht erkannt, was nicht verwunderlich ist, da die Platte keine Partitionstabelle hatte. Auch scheint Panasonic kein bekanntes Dateisystem zu verwenden. Alte Vorgängermodelle nutzten noch Dateisystem aus der ext-Reihe. Dennoch gelang es mir, viele (oder alle, ich weiß es nicht, da es nicht mein Rekorder war) Aufnahmen komplett von der Festplatte zu kopieren. Wie das genau vonstatten ging, folgt: (Achtung, es wird auch der technische Hintergrund behandelt. Wer das nicht wissen will, sondern nur erfahren möchte, wie er evtl. die Aufnahmen mit dem von mir entwickelten Script retten kann, der sollte weiter unten weiterlesen :D)&lt;/p&gt;

&lt;p&gt;Zuerst untersuchte ich die Festplatte in einem Hexeditor. Laut einem gefundenen String war die Platte mit einem Dateisystem des Namens „MEIHDFS“ bestückt. Google liefert zu dieser Suchphrase sage und schreibe drei Ergebnisse! Dies ist also auch eine Sackgasse, denn um das Dateisystem selbst zu analysieren und durch Reverse Engineering zu „entschlüsseln“ fehlt mir a) das Know-How, b) die Zeit von mehreren Jahrzehnten und vorallem c) doch etwas die Freakigkeit ;).&lt;/p&gt;

&lt;p&gt;Lustigerweise ist das Dateisystem relativ weit hinten auf der Festplatte. Zuvor findet man nicht viel. Der größte Teil sind lauter Nullen, welche wohl keinen größeren Zweck erfüllen dürften. Zwischendurch dann nochmal etwas anderes. Vermutlich handelt es sich dabei um die Firmware für das Gerät. In Internetforen findet man immer wieder, dass die Geräte mit einer nagelneuen baugleichen Festplatte nicht funktionieren, wohl weil eben genau diese Firmware dort fehlt. Aber gut, im Prinzip ist es mir auch egal.&lt;/p&gt;

&lt;p&gt;Der nächste Schritt für mich war, dass ich mit dem Hexeditor nach dem Suchmuster „00 00 01 BA“ (hex) gesucht habe. Jeder Header eines MPEG-Program-Streams beginnt nämlich mit genau diesen „Sync-Bytes“. Glücklicherweise wurde ich fündig. Scheinbar speichert der Rekorder die Aufnahmen als direkt als MPEG-Stream in einem proprietären Dateisystem Marke Eigenbau. Auffällig war, dass alle „Sync-Bytes“ einen Abstand von exakt 2048 Bytes hatten. Demnach arbeitet das Dateisystem also mit einer Blockgröße von 2048 Bytes (Ich kann nicht garantieren, dass dies immer so ist, bei dem Gerät ist es allerdings definitiv der Fall). So, ein Ansatz ist also vorhanden. Jetzt geht es ans Eingemachte :)&lt;/p&gt;

&lt;p&gt;Jetzt könnte man also die MPEG-Pakete auslesen, aber woher weiß man, wann ein Film anfängt und einer endet? Immerhin werden die Daten auf der Festplatte fragmentiert, also nicht fortlaufend geschrieben. Die Rekorder schreibt genau an der Stelle der Festplatte, wo er gerade Platz hat. Ein Film muss also nicht zwangsweise hintereinander, fortlaufend und in korrekter Reihenfolge gespeichert sein.&lt;/p&gt;

&lt;p&gt;Genau für diese Aufgabe habe ich ein Python-Script geschrieben, welches die einzelnen Teile der Aufnahmen erkennt, sortiert, Teile gleicher Aufnahmen automatisch erkennt und zur Ausgabe in Dateien dumpt.&lt;/p&gt;

&lt;p&gt;Das Script liest die Festplatte (oder ein Kopie dieser) in Blöcken (Blockgröße die vorhin erwähnten 2048 Byte, ist aber konfigurierbar) ein und schaut, ob der Block ein MPEG-Chunk ist. Die benötigten Spezifikationen findet man gut beschrieben in der &lt;a href="http://en.wikipedia.org/wiki/MPEG_program_stream"&gt;englischen Wikipedia&lt;/a&gt;. Zuerst wird das korrekte Vorkommen der „Sync-Bytes“ geprüft und anschließend das der „Marker-Bits“. Wenn diese „Tests“ bestanden wurden sind, handelt es sich also um ein MPEG-Chunk. Aus diesem wird sofort noch die aus 33 Bit bestehende „System Clock Reference“ ausgelesen. Sofern jetzt zwei aufeinanderfolgende MPEG-Chunks eine zu große Abweichung im „System Clock“-Wert haben, gehören Sie vermutlich nicht zusammen, an dieser Stelle beginnt ein neuer Teil einer Aufnahme. Doch was ist ein großer Wert? Da die „System Clock“ 90.000 mal pro Sekunde „tickt“, habe ich eine Differenz von 90.000 Ticks als Grenze verwendet. In meinen Tests funktionierte das wunderbar.&lt;/p&gt;

&lt;p&gt;Jetzt kann man also alle Teilstücke auf der Festplatte ausfindig machen. Aber die komplette Aufnahme müsste man immer noch mit der Hand zusammensetzen. Auch keine optimale Lösung. Das Script ist aber noch genau dazu in der Lage! Dazu vergleicht es den „System Clock Reference“ am Ende eines Teils mit dem am Anfang eines anderen. Wenn diese nah beieinander liegen (Differenz &lt; 90.000 Ticks) gehören beide zur gleichen Aufnahme und müssen nur „zusammengeklebt“ werden. (Ein Glück, dass das MPEG-Format relativ einfach aufgebaut ist *g*)&lt;/p&gt;

&lt;p&gt;Jetzt ist alles beisammen und die Aufnahmen müssen nur noch ausgelesen und benannt werden. Der gesamte Vorgang dauert mit Script mehrere Stunden, dass Script arbeitet die meiste Zeit aber vollkommen autonom.&lt;/p&gt;

&lt;p&gt;Problematisch ist nur die Werbung. Falls diese vorher herausgeschnitten wurde und der Rekorder die Werbungsfragmente bereits überschrieben hat, wird die Aufnahme nicht mehr als Ganzes erkannt. Da ist Handarbeit gefragt. Auch findet man vor und nach vielen Aufnahmen noch Werbung. Beide Probleme lassen sich allerdings relativ einfach mit Videobearbeitungsprogrammen wie Avidemux beheben.&lt;/p&gt;

&lt;p&gt;Doch wie verwendet man jetzt das Script?&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-C3w1uboIpk/S9cdoPSE4kI/AAAAAAAABB4/I8-BZvbjM4A/s1600/Bildschirmfoto2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 169px;" src="http://2.bp.blogspot.com/_-C3w1uboIpk/S9cdoPSE4kI/AAAAAAAABB4/I8-BZvbjM4A/s200/Bildschirmfoto2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5464869249971708482" /&gt;&lt;/a&gt;

&lt;p&gt;Zuerst: Wenn ihr meint, dass das Festplattenabbild wichtig ist: Backup anlegen. Ich übernehme keinerlei Garantie.&lt;/p&gt;

&lt;p&gt;Downloade und extrahiere das Script (oder Kopie vom Git-Repo holen) und Shell öffnen:&lt;/p&gt;

&lt;pre class="terminal"&gt;$ cd /path/to/script
$ python dvr-recover.py usage&lt;/pre&gt;

&lt;p&gt;Das sollte die Usage-Information anzeigen.&lt;/p&gt;

&lt;p&gt;Konfigurationsdatei anlegen:&lt;/p&gt;
&lt;pre class="terminal"&gt;$ python dvr-recover.py sample_settings&lt;/pre&gt;
&lt;p&gt;Konfigurationsdatei bearbeiten (Siehe Usage. Die wichtigsten Einstellungen sind: „hdd-filename“, „chunk-filename“ und „export-dir“)&lt;/p&gt;

&lt;p&gt;Chunk-Liste anlegen: (Dauert eine Weile! Ich habe hier nur einen sehr kleinen Teil der gesamten HDD genommen.) Wenn der Prozess abgebrochen wird, sind alle gesammelten Daten verloren! Das Script speichert die Informationen erst ganz am Ende!&lt;/p&gt;

&lt;pre class="terminal"&gt;$ python dvr-recover.py create
[ 46.8%] 471420/1006929 blocks (15713.9 bl/s; 30.7 MiB/s): 6 chunks
[ 93.5%] 941768/1006929 blocks (15678.2 bl/s; 30.6 MiB/s): 6 chunks

Finished.
Read 1006929 of 1006929 blocks.
Found 7 chunks.
Took 64.08 seconds.
Average speed was 15714.0 blocks/s (30.7 MiB/s).&lt;/pre&gt;

&lt;p&gt;Chunk-Infos anzeigen:&lt;/p&gt;
&lt;pre class="terminal"&gt;$ python dvr-recover.py show&lt;/pre&gt;

&lt;p&gt;Sortiere Chunks:&lt;/p&gt;
&lt;pre class="terminal"&gt;$ python dvr-recover.py sort&lt;/pre&gt;

&lt;p&gt;Chunk-Infos erneut anzeigen:&lt;/p&gt;
&lt;pre class="terminal"&gt;$ python dvr-recover.py show
--+--------------+--------------+--------------+--------------+-------------
  |  Block Start |   Block Size |  Clock Start |    Clock End | Concatenate
--+--------------+--------------+--------------+--------------+-------------
0 |       391379 |       615548 |    250031969 |    402836926 |    False
1 |       223188 |       168189 |    401478251 |    484558534 |    False
2 |       107989 |       115197 |    546892241 |    592303341 |    False
3 |        80992 |        26995 |   1085209725 |   1100156779 |    False
4 |        53995 |        26995 |   1100157071 |   1115282776 |     True
5 |        26998 |        26995 |   1115283069 |   1129877061 |     True
6 |            0 |        26996 |   1129877208 |   1144930337 |     True&lt;/pre&gt;

&lt;p&gt;Vierten Chunk extrahieren (nach &amp;lt;export-dir&amp;gt;/chunk_####.mpg):&lt;/p&gt;
&lt;pre class="terminal"&gt;$ python dvr-recover.py export 3
Current chunk: #3
Chunk start: 80992
Chunk size:  26995
 0.95s (28436.33 blocks/s; 55.54 MiB/s).

Concatenate chunk: #4
[...]

Concatenate chunk: #6
Chunk start: 0
Chunk size:  26996
 3.22s (8388.86 blocks/s; 16.38 MiB/s).&lt;/pre&gt;

&lt;p&gt;Alle Chunks extrahieren:&lt;/p&gt;
&lt;pre class="terminal"&gt;$ python dvr-recover.py export
Current chunk: #0
Chunk start: 391379
Chunk size:  615548
 42.22s (14579.92 blocks/s; 28.48 MiB/s).
[...]&lt;/pre&gt;

&lt;p&gt;Das war nur eine kurze Einführung. Ich hoffe sie war einigermaßen verständlich.&lt;/p&gt;

&lt;p&gt;Bei Fragen einfach melden. Wäre gut, wenn mir mitgeteilt wird, ob das Script funktioniert oder nicht (und mit welchen Festplattenrekorder-Modellen es klappt).&lt;/p&gt;

&lt;p&gt;Mehr zum Script:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sites.google.com/site/haliner/dvr-recover"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/1996083/Projects/index.html"&gt;Download&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have fun!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-5757887921637465571?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/5757887921637465571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/04/aufnahmen-von-der-festplatte-eines.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5757887921637465571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/5757887921637465571'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/04/aufnahmen-von-der-festplatte-eines.html' title='Aufnahmen von der Festplatte eines digitalen Festplattenrekorders retten'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-C3w1uboIpk/S9ccoyiOPxI/AAAAAAAABBo/khrC670zTVw/s72-c/IMG_4551.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-9155552063235898178</id><published>2010-04-24T20:10:00.006+02:00</published><updated>2010-04-25T20:07:45.847+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Gnome'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Goodbye Ubuntu, Goodbye Gnome</title><content type='html'>&lt;p&gt;Auf der Desktop-Maschine ist erst einmal Schluss mit Ubuntu und Gnome. Jetzt läuft Debian Squeeze mit KDE (mein erster Gehversuch mit KDE außerhalb virtueller Maschinen). Ubuntu 10.04 Lucid Lynx kommt eh bald raus und da kommt mir eine Rolling Release-Distribution gerade recht. Eigentlich wollte ich Arch nehmen, aber da gibt es noch ein paar Probleme. Außerdem passt es mir nicht, dass die Pakete nicht signiert werden und ich Man-in-the-Middle-Attacken und kompromittierte Spiegelserver nicht ausschließen kann. Debians Paketverwaltung gefällt mir weiterhin sehr gut, da bleibe ich gerne dabei. Und KDE gefällt mir mittlerweile auch immer besser.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/S9SDSLNJ_QI/AAAAAAAABBg/y2OgliAc2NY/s1600/Bildschirmfoto1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/S9SDSLNJ_QI/AAAAAAAABBg/y2OgliAc2NY/s320/Bildschirmfoto1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5464136596176108802" /&gt;&lt;/a&gt;
&lt;p style="text-align: center"&gt;&lt;i&gt;Always on the bleeding edge side of life&lt;/i&gt; ;) Naja, fast... :D&lt;/p&gt;

&lt;p&gt;Auf dem Netbook rennt auch schon Ubuntu 10.04 Lucid Lynx und wird dort wahrscheinlich auch bleiben. Beim dem ist es mir wichtig, dass er einfach nur funktioniert. Und da macht Ubuntu seinen Job wirklich gut, auch wenn mich ein paar Eigenheiten stören.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-9155552063235898178?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/9155552063235898178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/04/goodbye-ubuntu-goodbye-gnome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/9155552063235898178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/9155552063235898178'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/04/goodbye-ubuntu-goodbye-gnome.html' title='Goodbye Ubuntu, Goodbye Gnome'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-C3w1uboIpk/S9SDSLNJ_QI/AAAAAAAABBg/y2OgliAc2NY/s72-c/Bildschirmfoto1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2568047164792900243</id><published>2010-04-23T19:38:00.004+02:00</published><updated>2010-04-23T19:48:39.034+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tunneling'/><category scheme='http://www.blogger.com/atom/ns#' term='NAT'/><category scheme='http://www.blogger.com/atom/ns#' term='Socat'/><category scheme='http://www.blogger.com/atom/ns#' term='Reverse Connections'/><category scheme='http://www.blogger.com/atom/ns#' term='Netzwerk'/><title type='text'>NAT-Hindernis umgehen: Reverse Connections mit Socat</title><content type='html'>&lt;p&gt;Peer-to-Peer (P2P) Verbindungen von einem privaten Rechner zu einem anderen privaten Rechner über das Internet sind dank der heute in so gut wie allen Routern genutzten NAT-Funktionalität gar nicht so einfach zu bewerkstelligen. Auf der Seite, die Server „spielen“ soll, muss noch der Router so konfiguriert werden, dass der Port weitergeleitet wird („&lt;a href="http://de.wikipedia.org/wiki/Port-Forwarding"&gt;Port-Forwarding&lt;/a&gt;“). Die folgende Abbildung verdeutlicht das Problem. Wenn der Port nicht korrekt weitergeleitet wird, kann sich der Client nicht mit dem Server verbinden. Der untere Pfeil hingegen zeigt den Verbindungsaufbau mit konfiguriertem Port-Forwarding.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/S9HRvP64owI/AAAAAAAABBI/oLycFrL2dxo/s1600/NAT.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 113px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/S9HRvP64owI/AAAAAAAABBI/oLycFrL2dxo/s400/NAT.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5463378432634692354" /&gt;&lt;/a&gt;

&lt;p&gt;Allerdings gibt es mitunter das Problem, dass man auf dem betreffenden System entweder kein Port weiterleiten lassen kann oder dass der Gegenüber mit der Konfiguration überfordert ist. Gerade bei einer Remote-Desktop-Verbindung, bei der man bei einem Computer-Problem helfen soll, ist dass oft der Fall. Die meisten solcher Systeme kommen zwar schon von Haus aus mit dem Aufbau einer Reverse Connection zurecht (beispielsweise VNC), allerdings kann man immer noch auf Anwendungen stoßen, wo so eine Funktionalität fehlt. Da wäre es gut, wenn man die gesamte Verbindung rückwärts aufbauen kann, so dass nicht der andere sondern man selbst den Port weiterleiten muss.&lt;/p&gt;

&lt;p&gt;Dabei lässt sich mit einfachen Kommandozeilen-Tools jede Verbindung rückwärts aufbauen. Am besten dazu geeignet ist &lt;a href="http://www.dest-unreach.org/socat/"&gt;socat&lt;/a&gt;: Socat ist ein hervorragendes Programm, welches unterschiedliche Datenströme miteinander verbinden kann. Genau dies kann man sich recht einfach zunutze machen:&lt;/p&gt;


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/S9HRvXJEtwI/AAAAAAAABBQ/FUQSsupZIwI/s1600/NAT2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 94px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/S9HRvXJEtwI/AAAAAAAABBQ/FUQSsupZIwI/s400/NAT2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5463378434573252354" /&gt;&lt;/a&gt;

&lt;p&gt;Der Socat-Client auf der eigentlichen Server-Seite verbindet sich sowohl mit dem eigentlichen Server als auch mit einem Socat-Server auf der Client-Seite. Der Client verbindet sich anschließend mit dem Socat-Server. Da beide Socat-Instanzen die Datenströme jeweils weiterleiten (Eingabe → Ausgabe und andersherum), können Client und Server nun wie gewohnt miteinander kommunizieren:&lt;/p&gt;


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/S9HRvi0GQtI/AAAAAAAABBY/PsI5y9fTIeU/s1600/NAT3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 106px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/S9HRvi0GQtI/AAAAAAAABBY/PsI5y9fTIeU/s400/NAT3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5463378437706498770" /&gt;&lt;/a&gt;

&lt;p&gt;Doch wie sieht eine praktische Umsetzung aus? Zuerst einmal muss man auf der Client-Seite den Port beim Router weiterleiten lassen. Im nachfolgenden Beispiel wird mit Port &lt;i&gt;55555&lt;/i&gt; gearbeitet. Nun startet man auf der Client-Seite den Socat-Server:&lt;/p&gt;
&lt;pre class="terminal"&gt;socat TCP-LISTEN:55555 TCP-LISTEN:8080&lt;/pre&gt;
&lt;p&gt;Der Socat-Server lauscht jetzt auf den Ports &lt;i&gt;55555&lt;/i&gt; und &lt;i&gt;8080&lt;/i&gt; (der Client verbindet sich später auf diesem Port) und verbindet diese.&lt;/p&gt;

&lt;p&gt;Auf der Server-Seite wird der Socat-Client gestartet:&lt;/p&gt;
&lt;pre class="terminal"&gt;socat TCP:hostname:55555 TCP:localhost:8080&lt;/pre&gt;
&lt;p&gt;Es wird also eine Verbindung zum Socat-Server aufgebaut (der &lt;i&gt;Hostname&lt;/i&gt; muss entsprechend abgeändert werden und muss natürlich bekannt sein, allerdings lässt sich die IP einfach mit einer Seite wie &lt;a href="http://www.wieistmeineip.de"&gt;www.wieistmeineip.de&lt;/a&gt; herausfinden.) und diese wird mit dem lokalen Server verbunden (im Beispiel lauscht der Server demzufolge auf Port &lt;i&gt;8080&lt;/i&gt;, also dem alternativen HTTP-Port).&lt;/p&gt;

&lt;p&gt;Als letztes muss sich nur noch der Client mit dem Socat-Server verbinden. Dazu muss man die Verbindungsdaten nur auf &lt;i&gt;„localhost“&lt;/i&gt; und den entsprechenden Port (im Beispiel &lt;i&gt;8080&lt;/i&gt;) ändern.&lt;/p&gt;

&lt;p&gt;Natürlich ist leicht erkennbar, dass der Aufwand nicht zu unterschätzen ist. Allerdings kann es sich in manchen Situationen durchaus bezahlt machen. Und der technisch nicht so versierte Nutzer auf der anderen Seite muss sich nicht mehr um eine Port-Weiterleitung und seine IP-Adresse kümmern. Der Befehl kann ebenfalls ganz einfach per Instant Messenger übergeben werden, so dass der Befehl lediglich in ein Terminal kopiert werden muss. Natürlich ist das Vorgehen aber auch für weitere Einsatzgebiet äußerst nützlich.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2568047164792900243?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2568047164792900243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/04/nat-hindernis-umgehen-reverse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2568047164792900243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2568047164792900243'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/04/nat-hindernis-umgehen-reverse.html' title='NAT-Hindernis umgehen: Reverse Connections mit Socat'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-C3w1uboIpk/S9HRvP64owI/AAAAAAAABBI/oLycFrL2dxo/s72-c/NAT.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4972564962337689618</id><published>2010-04-17T10:37:00.016+02:00</published><updated>2010-05-23T12:49:30.868+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Caller ID'/><category scheme='http://www.blogger.com/atom/ns#' term='FritzBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Anrufmonitor'/><title type='text'>AVM - Die Berliner haben’s raus</title><content type='html'>&lt;p&gt;Dass die Fritz!Box aus dem Hause der Berliner AVM GmbH zu den beliebtesten DSL-Routern in Deutschland gehört, ist mit Sicherheit kein Wunder. (Ist ja auch klar, innen Linux, außen schick :D) Der Funktionsumfang ist wirklich erstklassig, bei Bedarf lässt sich sogar ein &lt;a href="http://www.wehavemorefun.de/fritzbox/index.php/Starten_von_telnetd"&gt;Telnet-Zugang freischalten&lt;/a&gt;, damit man direkt auf das Innenleben der roten Kiste zugreifen kann.&lt;/p&gt;

&lt;p&gt;Allerdings war ich dennoch erstaunt, als ich heute nach einem Anrufermonitor für Linux suchte. Es gibt zwar einige Programme und Scripte im Internet, doch nichts, was mir wirklich richtig zusagte. Erst dachte ich, dass diese Informationen evtl. auch über &lt;a href="http://de.wikipedia.org/wiki/UPnP"&gt;UPnP&lt;/a&gt; bereitgestellt werden, aber es geht viel einfacher:&lt;/p&gt;

&lt;p&gt;Einfach auf einem angeschlossenen Telefon die Kombination &lt;i&gt;#96*5*&lt;/i&gt; wählen und auf den Signalton warten. Danach öffnet die Fritz!Box den &lt;i&gt;TCP-Port 1012&lt;/i&gt; und gibt auf diesem Informationen über alle ankommenden Anrufe aus. Das ist einfach, aber genial! Die Tastenkombination &lt;i&gt;#96*4*&lt;/i&gt; deaktiviert die Funktion wieder (aber wer will das schon? :p)&lt;/p&gt;

&lt;p&gt;Andere Tastenkombinationen wie &lt;i&gt;#96*1*&lt;/i&gt; oder &lt;i&gt;#96*0*&lt;/i&gt; um das WLan an- oder auszuschalten waren mir bereits bekannt, aber dieses nette Feature blieb seit Jahren unentdeckt.&lt;/p&gt;

&lt;p&gt;Linux-Nutzer können sich übrigens ganz einfach die Informationen anzeigen lassen, wahlweise mit &lt;i&gt;netcat&lt;/i&gt; oder dem von mir favorisierten &lt;i&gt;socat&lt;/i&gt;. Die Lösung ist natürlich nicht äußerst schön und elegant, aber für einen schnellen Test reicht es allemal:&lt;/p&gt;
&lt;pre class="terminal"&gt;nc fritz.box 1012
socat -u TCP:fritz.box:1012 STDOUT&lt;/pre&gt;
&lt;pre class="terminal"&gt;stefan@stefan-desktop:~$ socat -u TCP:fritz.box:1012 STDOUT
17.04.10 10:04:33;RING;0;015xxxxxxxxx;03xxxxxxxxx;Sxxx;
17.04.10 10:04:36;DISCONNECT;0;0;&lt;/pre&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/S8l8T7ldrpI/AAAAAAAABBA/za6xvCtnw6Y/s1600/incoming_call.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 103px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/S8l8T7ldrpI/AAAAAAAABBA/za6xvCtnw6Y/s200/incoming_call.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5461032705017622162" /&gt;&lt;/a&gt;
&lt;p style="text-align: left;"&gt;Ich habe mir mal den Spaß gemacht und mir ein kleines Shell-Script geschrieben, welches die ankommenden Daten der Fritz!Box ausliest und über das Benachrichtigungssystem anzeigt:&lt;/p&gt;
&lt;pre style="clear: both;" class="terminal"&gt;&lt;span style="color: #408080; font-style: italic"&gt;#!/bin/sh&lt;/span&gt;

get_element&lt;span style="color: #666666"&gt;()&lt;/span&gt;
&lt;span style="color: #666666"&gt;{&lt;/span&gt;
  &lt;span style="color: #008000"&gt;echo&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;$line&amp;quot;&lt;/span&gt; | awk -F &lt;span style="color: #BA2121"&gt;&amp;#39;;&amp;#39;&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;#39;{print $&amp;#39;&amp;quot;$1&amp;quot;&amp;#39;}&amp;#39;&lt;/span&gt;
&lt;span style="color: #666666"&gt;}&lt;/span&gt;

listen&lt;span style="color: #666666"&gt;()&lt;/span&gt;
&lt;span style="color: #666666"&gt;{&lt;/span&gt;
  socat -u TCP:fritz.box:1012 STDOUT | &lt;span style="color: #008000; font-weight: bold"&gt;while &lt;/span&gt;&lt;span style="color: #008000"&gt;read &lt;/span&gt;line; &lt;span style="color: #008000; font-weight: bold"&gt;do&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;    &lt;/span&gt;&lt;span style="color: #19177C"&gt;datetime&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 1&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;
    &lt;span style="color: #19177C"&gt;cmd&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 2&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;
    &lt;span style="color: #19177C"&gt;connid&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 3&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;

    &lt;span style="color: #19177C"&gt;title&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;
    &lt;span style="color: #19177C"&gt;message&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;

    &lt;span style="color: #008000; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #666666"&gt;[&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;$cmd&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;=&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;CALL&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;]&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;then&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;      &lt;/span&gt;&lt;span style="color: #19177C"&gt;interface&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 4&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;
      &lt;span style="color: #008000"&gt;caller&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 5&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;target&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 6&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;

      &lt;span style="color: #19177C"&gt;title&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;Outgoing Call&amp;quot;&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;message&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;Target: $target&amp;lt;br&amp;gt;Caller: $caller&amp;lt;br&amp;gt;Interface: $interface&amp;quot;&lt;/span&gt;
    &lt;span style="color: #008000; font-weight: bold"&gt;elif&lt;/span&gt; &lt;span style="color: #666666"&gt;[&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;$cmd&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;=&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;RING&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;]&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;then&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;      &lt;/span&gt;&lt;span style="color: #008000"&gt;caller&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 4&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;target&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 5&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;interface&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 6&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;

      &lt;span style="color: #008000; font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #666666"&gt;[&lt;/span&gt; -z &lt;span style="color: #BA2121"&gt;&amp;quot;$caller&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;]&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;then&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;caller&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;hidden&amp;quot;&lt;/span&gt;
      &lt;span style="color: #008000; font-weight: bold"&gt;fi&lt;/span&gt;

&lt;span style="color: #008000; font-weight: bold"&gt;      &lt;/span&gt;&lt;span style="color: #19177C"&gt;title&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;Incoming Call&amp;quot;&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;message&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;Caller: $caller&amp;lt;br&amp;gt;Target: $target&amp;lt;br&amp;gt;Interface: $interface&amp;quot;&lt;/span&gt;
    &lt;span style="color: #008000; font-weight: bold"&gt;elif&lt;/span&gt; &lt;span style="color: #666666"&gt;[&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;$cmd&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;=&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;CONNECT&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;]&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;then&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;      &lt;/span&gt;&lt;span style="color: #19177C"&gt;interface&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 4&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;number&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 5&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;

      &lt;span style="color: #19177C"&gt;title&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;Connection Established&amp;quot;&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;message&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;Number: $caller&amp;lt;br&amp;gt;Interface: $interface&amp;quot;&lt;/span&gt;
    &lt;span style="color: #008000; font-weight: bold"&gt;elif&lt;/span&gt; &lt;span style="color: #666666"&gt;[&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;$cmd&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;=&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;DISCONNECT&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;]&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;then&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;      &lt;/span&gt;&lt;span style="color: #19177C"&gt;length&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$(&lt;/span&gt;get_element 4&lt;span style="color: #008000; font-weight: bold"&gt;)&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;length_min&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$((&lt;/span&gt;length/60&lt;span style="color: #008000; font-weight: bold"&gt;))&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;length_s&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold"&gt;$((&lt;/span&gt;length%60&lt;span style="color: #008000; font-weight: bold"&gt;))&lt;/span&gt;

      &lt;span style="color: #19177C"&gt;title&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;Connection Closed&amp;quot;&lt;/span&gt;
      &lt;span style="color: #19177C"&gt;message&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;Length: $length_min min $length_s s&amp;quot;&lt;/span&gt;
    &lt;span style="color: #008000; font-weight: bold"&gt;fi&lt;/span&gt;

&lt;span style="color: #008000; font-weight: bold"&gt;    if&lt;/span&gt; &lt;span style="color: #666666"&gt;[&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;(&amp;quot;&lt;/span&gt; -n &lt;span style="color: #BA2121"&gt;&amp;quot;$title&amp;quot;&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;)&amp;quot;&lt;/span&gt; -a &lt;span style="color: #BA2121"&gt;&amp;quot;(&amp;quot;&lt;/span&gt; -n &lt;span style="color: #BA2121"&gt;&amp;quot;$message&amp;quot;&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;)&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;]&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;then&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;      &lt;/span&gt;&lt;span style="color: #19177C"&gt;message&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;Date: $datetime&amp;lt;br&amp;gt;Connection-ID: $connid&amp;lt;br&amp;gt;$message&amp;quot;&lt;/span&gt;
      notify-send -i &lt;span style="color: #BA2121"&gt;&amp;quot;gtk-dialog-info&amp;quot;&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;$title&amp;quot;&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;$message&amp;quot;&lt;/span&gt;
    &lt;span style="color: #008000; font-weight: bold"&gt;fi&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;  done&lt;/span&gt;
&lt;span style="color: #666666"&gt;}&lt;/span&gt;

&lt;span style="color: #008000; font-weight: bold"&gt;while &lt;/span&gt;&lt;span style="color: #008000"&gt;true&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;do&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;  &lt;/span&gt;listen
  sleep 60
&lt;span style="color: #008000; font-weight: bold"&gt;done&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;i&gt;Syntax-Highlighter: &lt;a href="http://pygments.org/"&gt;Pygments&lt;/a&gt;. Hier im Blog wird das Script zur Anzeige eventuell umgebrochen! Einfach in eine Datei kopieren und es sollte alles funktionieren.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Übrigens sollten sich andere Hersteller ruhig mal eine Scheibe abschneiden. Krasses Negativbeispiel ist da natürlich Apple, die alle ihre eigentlich hervorragenden (und hoffnungslos überteuerten :D) Geräte so dermaßen einschränken, dass sie ihr volles Potential nicht einmal ansatzweise ausschöpfen können. Einstellungsmöglichkeiten und Einfachheit schließen sich nicht aus und den Nutzer für den letzten Vollidioten zu halten ist meiner Meinung nach kein gutes Konzept...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4972564962337689618?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4972564962337689618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/04/avm-die-berliner-habens-raus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4972564962337689618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4972564962337689618'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/04/avm-die-berliner-habens-raus.html' title='AVM - Die Berliner haben’s raus'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-C3w1uboIpk/S8l8T7ldrpI/AAAAAAAABBA/za6xvCtnw6Y/s72-c/incoming_call.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2383597159049439819</id><published>2010-03-17T19:33:00.003+01:00</published><updated>2010-03-17T19:47:05.905+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='DesktopNova'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><category scheme='http://www.blogger.com/atom/ns#' term='gWallpapers'/><title type='text'>DesktopNova 0.7.3</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/S6EYieYuZUI/AAAAAAAABAU/-LA0ooGrBvw/s1600-h/desktopnova.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 128px; height: 128px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/S6EYieYuZUI/AAAAAAAABAU/-LA0ooGrBvw/s320/desktopnova.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5449664004646397250" /&gt;&lt;/a&gt;

&lt;p&gt;Die Umbenennung meines Projektes ist nun vollzogen: Aus dem ehemaligen „gWallpapers“ wird „DesktopNova“. Erst wenige Tage sind die neusten Releases alt, aber dennoch gibt es überraschenderweise relativ viel Feedback, was mich natürlich ungemein freut. Eine Suche bei &lt;a href="http://www.google.de/search?q=DesktopNova"&gt;Google&lt;/a&gt; findet bereits haufenweise Treffer. Die meisten stammen aus Blogs, aber sogar ein &lt;a href="http://www.youtube.com/watch?v=p_jr0lojHt8"&gt;YouTube-Video&lt;/a&gt; ist dabei. Dabei habe ich es selbst noch nicht geschafft den Namen überall abzuändern.&lt;/p&gt;

&lt;p&gt;Dummerweise habe ich bei der Freigabe auch noch einige dicke Patzer gemacht, so dass ich innerhalb von zwei Tagen gleich drei Versionen freigegeben habe. Dafür funktioniert jetzt aber auch wieder fast alles. Nur die alten Einstellungen werden leider nicht genutzt, da das Programm jetzt an einer anderen Stelle nach der Konfigurationsdatei sucht. Die alte Datei lässt sich allerdings relativ einfach an den neuen Ort verfrachten:&lt;/p&gt;

&lt;pre class="terminal"&gt;$ rm -r ~./config/desktopnova/
$ mv ~/.config/gwallpapers ~/.config/desktopnova
$ mv ~/.config/desktopnova/gwallpapers.xml ~/.config/desktopnova/desktopnova.xml
$ sed -i -e 's/gwallpapers/desktopnova/g' ~/.config/desktopnova/desktopnova.xml&lt;/pre&gt;

&lt;p&gt;Auch wurden wieder einige &lt;a href="https://bugs.launchpad.net/gwallpapers"&gt;neue Bugs&lt;/a&gt; gemeldet und &lt;a href="https://answers.launchpad.net/gwallpapers"&gt;Fragen gestellt&lt;/a&gt;. Im &lt;a href="https://code.launchpad.net/~haliner/gwallpapers/trunk"&gt;Entwicklungs-Branch&lt;/a&gt; befinden sich auch schon wieder einige Änderungen, so dass eine neue Version auch nicht all zu lange auf sich warten lassen sollte. Allerdings funktionieren &lt;a href="https://translations.launchpad.net/gwallpapers"&gt;die Übersetzung via Launchpad&lt;/a&gt; momentan nicht, da sich auch die Template-Namen geändert haben. Da ist erstmal Geduld gefragt. Ich hoffe, dass hält die fleißigen Übersetzer aber auch in Zukunft nicht davon ab, bei dem Projekt mit zu helfen. Ein herzliches Dankeschön an dieser Stelle allen Übersetzern ;)&lt;/p&gt;

&lt;p&gt;Ein Debian-Paket für die neue Version habe ich auch schon erstellt. Wenn alles klappt wird es dann vielleicht offiziell bei Debian aufgenommen. Dadurch würde es dann auch in den nachfolgenden Ubuntu-Version verfügbar sein, so dass die Installation wesentlich vereinfacht wird. Wenn das klappt, dann schaue ich vielleicht auch noch nach anderen Distributionen wie Fedora oder Arch Linux.&lt;/p&gt;

&lt;p&gt;Mich freut es ungemein, dass das Projekt vermutlich mehr Anklang findet, als ich selbst erwartet hätte. Bei Ubuntus Popularity-Contest hatte &lt;a href="http://popcon2.net/package/gwallpapers.html"&gt;das Paket „gwallpapers“&lt;/a&gt; in etwa 140 Installationskandidaten. Ich denke, dass ist schon allerhand, immerhin ist das Paket nicht offiziell in den Paketquellen vertreten und die Teilnahme an der Datenübermittlung ist standardmäßig deaktiviert. Deswegen wird die Zahl der tatsächlichen Installationen auf Ubuntu-Systemen um einiges höher sein, andere Distributionen erst einmal außen vor gelassen.&lt;/p&gt;

&lt;p&gt;Ich finde die Verbreitung sowieso erstaunlich, da ich eigentlich nie große Werbungsarbeit betrieben habe. Ich habe das Projekt auf meiner Homepage und zwei deutschen(!) Ubuntuforen angekündigt, insofern ist es doch erstaunlich, dass es so oft in fremdsprachigen Blogs und Foren auftaucht. Aber je mehr Leute an dem Projekt Gefallen finden, umso besser ist das natürlich :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2383597159049439819?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2383597159049439819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/03/desktopnova.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2383597159049439819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2383597159049439819'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/03/desktopnova.html' title='DesktopNova 0.7.3'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-C3w1uboIpk/S6EYieYuZUI/AAAAAAAABAU/-LA0ooGrBvw/s72-c/desktopnova.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2880563480774454617</id><published>2010-03-07T20:39:00.013+01:00</published><updated>2010-05-23T12:48:55.882+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Script'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>Benachrichtigung über laufende Rechner im Netzwerk</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-C3w1uboIpk/S5VHjtAIBaI/AAAAAAAABAM/T5hSw5CXrG4/s1600-h/computermonitor.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 68px;" src="http://2.bp.blogspot.com/_-C3w1uboIpk/S5VHjtAIBaI/AAAAAAAABAM/T5hSw5CXrG4/s200/computermonitor.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5446338003075597730" /&gt;&lt;/a&gt;

&lt;p&gt;Tierisch nervig empfand ich es immer, wenn ich abends endlich schlafen gehen wollte und dann merkte, dass da noch die ganzen Rechner an sind. Dann fiel es mir immer gleich wieder ein: Jaaa, der hatte ja noch was zu erledigen, eigentlich wollte ich ihn schon vor Stunden ausmachen. Doch damit ist jetzt Schluss! Ich habe mir kurzerhand ein kleines Shellscript (Kein Python! :P) geschrieben, welches mir einfach alle Rechner anpingt und mir bei Antwort eine Benachrichtigung zukommen lässt. Hier ist es:&lt;/p&gt;

&lt;pre class="terminal"&gt;&lt;span style="color: #408080; font-style: italic"&gt;#! /bin/sh&lt;/span&gt;
&lt;span style="color: #008000"&gt;set&lt;/span&gt; -e

&lt;span style="color: #19177C"&gt;hosts&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;

sleep 30

&lt;span style="color: #19177C"&gt;me&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;`&lt;/span&gt;hostname&lt;span style="color: #BA2121"&gt;`&lt;/span&gt;

&lt;span style="color: #008000; font-weight: bold"&gt;while &lt;/span&gt;&lt;span style="color: #008000"&gt;true&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;do&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;  &lt;/span&gt;&lt;span style="color: #19177C"&gt;online_hosts&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;
  &lt;span style="color: #008000; font-weight: bold"&gt;for &lt;/span&gt;host in &lt;span style="color: #19177C"&gt;$hosts&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;do&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;    if&lt;/span&gt; &lt;span style="color: #666666"&gt;[&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;$host&amp;quot;&lt;/span&gt; !&lt;span style="color: #666666"&gt;=&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;$me&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;]&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;then&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;      if &lt;/span&gt;ping -c 1 &lt;span style="color: #19177C"&gt;$host&lt;/span&gt; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; &lt;span style="color: #008000; font-weight: bold"&gt;then&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;        &lt;/span&gt;&lt;span style="color: #19177C"&gt;online_hosts&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;$online_hosts&amp;lt;br&amp;gt;$host&amp;quot;&lt;/span&gt;
      &lt;span style="color: #008000; font-weight: bold"&gt;fi&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;    fi&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;  done&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;  if&lt;/span&gt; &lt;span style="color: #666666"&gt;[&lt;/span&gt; -n &lt;span style="color: #BA2121"&gt;&amp;quot;$online_hosts&amp;quot;&lt;/span&gt; &lt;span style="color: #666666"&gt;]&lt;/span&gt;; &lt;span style="color: #008000; font-weight: bold"&gt;then&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;    &lt;/span&gt;notify-send -i &lt;span style="color: #BA2121"&gt;&amp;quot;gtk-network&amp;quot;&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;Computer-Monitor&amp;quot;&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;The following hosts are online:$online_hosts&amp;quot;&lt;/span&gt;
  &lt;span style="color: #008000; font-weight: bold"&gt;fi&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;  &lt;/span&gt;sleep 300
&lt;span style="color: #008000; font-weight: bold"&gt;done&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;i&gt;Syntax-Highlighter: &lt;a href="http://pygments.org/"&gt;Pygments&lt;/a&gt;. Hier im Blog wird das Script zur Anzeige eventuell umgebrochen! Einfach in eine Datei kopieren und es sollte alles funktionieren.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;In der dritten Zeile muss die hosts-Variable natürlich noch mit Werten belegt werden. Ein Beispiel könnte so aussehen:&lt;/p&gt;

&lt;pre class="terminal"&gt;&lt;span style="color: #19177C"&gt;hosts&lt;/span&gt;&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BA2121"&gt;&amp;quot;stefan-desktop stefan-netbook 192.168.178.99&amp;quot;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Die Sleep-Zeit kann natürlich auch noch angepasst werden. Die Zeit muss in Sekunden angegeben werden, momentan sind es bei mir als 5 Minuten.&lt;/p&gt;

&lt;p&gt;Anzumerken ist, dass das benötigte Debian/Ubuntu-Paket &lt;i&gt;libnotify-bin&lt;/i&gt; standardmäßig &lt;b&gt;nicht&lt;/b&gt; installiert ist. Ansonsten benötigt das Script nicht viel mehr ;)&lt;/p&gt;

&lt;p&gt;Das Script liegt bei mir gleich im Autostart und erfüllt hoffentlich seinen Zweck :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2880563480774454617?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2880563480774454617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/03/benachrichtigung-uber-laufende-rechner.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2880563480774454617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2880563480774454617'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/03/benachrichtigung-uber-laufende-rechner.html' title='Benachrichtigung über laufende Rechner im Netzwerk'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-C3w1uboIpk/S5VHjtAIBaI/AAAAAAAABAM/T5hSw5CXrG4/s72-c/computermonitor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2853829552894083179</id><published>2010-03-06T23:31:00.006+01:00</published><updated>2010-03-08T19:57:09.083+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='Drobox'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>dirlisting.py</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-C3w1uboIpk/S5LXre-8rxI/AAAAAAAAA_8/bBT2wj6NksY/s1600-h/dirlisting.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 86px;" src="http://2.bp.blogspot.com/_-C3w1uboIpk/S5LXre-8rxI/AAAAAAAAA_8/bBT2wj6NksY/s200/dirlisting.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5445652041495785234" /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a href="http:/www.dropbox.com"&gt;Dropbox&lt;/a&gt; ist eine schöne und vor allem praktische Sache. Doch etwas nervig ist es, wenn man immer wieder die Links herausrücken muss. Diese Arbeit möchte ich mir in Zukunft ersparen und habe (mal wieder) ein &lt;a href="http://sites.google.com/site/haliner/opensource"&gt;kleines Python-Script&lt;/a&gt; geschrieben. Genauer gesagt ist es ein Python 3-Script. Nicht das es mit mit Python 2.6 nicht funktioniert hätte, aber dem ständigen Ärger mit Unicode-Zeichen umgehe ich gerne. Sinn und Zweck ist es, dass die Verzeichnisstruktur übersichtlich in eine HTML-Datei gepackt wird. Diese resultierende Datei muss nun nur noch mit Dropbox synchronisiert werden und schon muss man nur noch einen einzigen Link weitergeben ;) Ich denke, den kann sogar ich mir merken :)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sites.google.com/site/haliner/opensource"&gt;Das Script&lt;/a&gt; ist wie immer auf meiner Homepage zu finden und steht unter einer freien Lizenz (GPL v3) allen zur Verfügung. Es erzeugt eine valide HTML 4 Strict-Seite, welche UTF-8 enkodiert ist. Zum Einsatz kommen auch CSS und ganz wenig Javascript (welches aber für die Funktionalität der Seite nicht benötigt wird!). Übrigens wird der Quelltext der HTML-Seite auch ordentlich eingerückt, so das eine spätere Nachbearbeitung sehr einfach sein sollte.&lt;/p&gt;

&lt;p&gt;Der Aufruf des Scripts ist sehr einfach:&lt;/p&gt;

&lt;pre class="terminal"&gt;cd ~/Dropbox/Public
python3 ~/dirlisting.py &gt; dirlisting.html&lt;/pre&gt;

&lt;p&gt;Nun muss nur noch der Link für die Datei „dirlisting.html“ weitergereicht werden. Ein Beispiel einer solchen Seite ist an den Blogpost angehangen.&lt;/p&gt;

&lt;p style="text-align: justify"&gt;Wie immer würde ich mich freuen, falls jemandem das kleine Script gefällt. Wer Fehler findet oder Anregungen hat, kann sich jederzeit melden. (Ich habe es bisher nur mit Linux getestet, mit Windows wird wahrscheinlich das mit &lt;i&gt;os.path.join(...)&lt;/i&gt; generierte Linkziel Probleme bereiten...)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2853829552894083179?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2853829552894083179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/03/dirlistingpy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2853829552894083179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2853829552894083179'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/03/dirlistingpy.html' title='dirlisting.py'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-C3w1uboIpk/S5LXre-8rxI/AAAAAAAAA_8/bBT2wj6NksY/s72-c/dirlisting.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4221778239217652651</id><published>2010-02-25T18:54:00.005+01:00</published><updated>2010-03-07T20:49:57.925+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ExIP'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='freie Software'/><title type='text'>ExIP - External IP Monitor</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/S4a7gnQKzfI/AAAAAAAAA_w/oQC1WlRLZoc/s1600-h/screenshot_exip_mask.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 188px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/S4a7gnQKzfI/AAAAAAAAA_w/oQC1WlRLZoc/s200/screenshot_exip_mask.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5442243368690830834" /&gt;&lt;/a&gt;
&lt;p&gt;Dass die IP-Adresse bei jeder Einwahl ins Internet dynamisch geändert wird, ist hinlänglich bekannt. Mir kam jedoch die Idee, diesen Sachverhalt etwas genauer zu „untersuchen“. Aus dieser Idee ist ein kleines &lt;a href="http://sites.google.com/site/haliner/exip"&gt;Shell-Script&lt;/a&gt; entstanden, welches mir die aktuelle (externe) IP-Adresse holt und mit dieser eine Rückwärts-Namensauflösung (&lt;a href="http://de.wikipedia.org/wiki/RDNS"&gt;rDNS&lt;/a&gt;) vollzieht. Die Daten werden schnell in eine &lt;a href="http://de.wikipedia.org/wiki/CSV_%28Dateiformat%29"&gt;CSV-Datei&lt;/a&gt; geschoben. Jedoch ist dies natürlich alles andere als informativ und übersichtlich. Deswegen entwickelte ich dazu noch ein kleines &lt;a href="http://de.wikipedia.org/wiki/Python_%28Programmiersprache%29"&gt;Python&lt;/a&gt;-Script, welches mir diese CSV-Datei in eine &lt;a href="http://de.wikipedia.org/wiki/SQLite"&gt;SQLite3&lt;/a&gt;-Datenbank überführt (Jaaa, die Älteren unter euch werden merken, dass ich es gerne kompliziert mag *g*). Der Grund ist dabei eigentlich relativ trivial: Ich wollte nochmal meine SQL-Grundkenntnisse auffrischen, da ich diese für ein kommendes Projekt exzessiv nutzen und hoffentlich auch erweitern werde. Ok, zurück zu ExIP: Aus dieser SQLite3-Datenbank kann das Script nun noch eine hübsche HTML-Seite generieren, die die folgenden Elemente beinhaltet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP Cloud (Auflistung der letzten IPs. Je mehr Einträge in der Datenbank, desto größer die IP)&lt;/li&gt;
&lt;li&gt;IP/Hostname Tabelle (geordnete Liste mit allen IPs und Hostnamen)&lt;/li&gt;
&lt;li&gt;Datum/IP Tabelle&lt;/li&gt;
&lt;li&gt;Weitere Informationen über die Datenbank&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ich lasse das IP/Hostname-Sammel-Script bei mir per Cronjob alle 10 Minuten ausführen. Dann werde ich mal in der Zukunft die Statistik ansehen und ich werde wissen, aus welchem Bereich mir denn eigentlich meine IP-Adressen zugeteilt werden ;) (Hm, vermutlich gibt es irgendwo ein Tabelle, wo drin steht, welcher Anbieter welche Räume zur Verfügung hat. Aber wo wäre da der Spaß? :D)&lt;/p&gt;

&lt;p&gt;Im Prinzip war es das schon. Ich weiß selbst nicht, ob die Scripte irgendwelchen größeren Nutzen haben, aber ich überlasse sie einfach mal als &lt;i&gt;freie Software&lt;/i&gt;. Mehr dazu auf der &lt;a href="http://sites.google.com/site/haliner/exip"&gt;Projektseite&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4221778239217652651?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4221778239217652651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/02/exip-external-ip-monitor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4221778239217652651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4221778239217652651'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/02/exip-external-ip-monitor.html' title='ExIP - External IP Monitor'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/S4a7gnQKzfI/AAAAAAAAA_w/oQC1WlRLZoc/s72-c/screenshot_exip_mask.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-9096531145020420196</id><published>2010-02-13T14:10:00.008+01:00</published><updated>2010-06-20T20:22:51.880+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DesktopNova'/><category scheme='http://www.blogger.com/atom/ns#' term='Compiz'/><category scheme='http://www.blogger.com/atom/ns#' term='gWallpapers'/><title type='text'>DesktopNova und der Compiz-Desktop-Würfel</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/S3aokVwbxBI/AAAAAAAAA-0/ndnL7-PFmCM/s1600-h/screenshot_compiz_soft.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 152px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/S3aokVwbxBI/AAAAAAAAA-0/ndnL7-PFmCM/s200/screenshot_compiz_soft.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5437718942365500434" /&gt;&lt;/a&gt;&lt;p style="text-align: justify;"&gt;Da eine Frage bereits einige Menschen im Zusammenhang mit &lt;i&gt;gWallpapers&lt;/i&gt; beschäftigt hat, poste ich hier mal eine Antwort auf diese:&lt;/p&gt;

&lt;p style="text-align: justify; clear: left;"&gt;Frage: &lt;b&gt;Lässt sich gWallpapers so konfigurieren, dass es in Verbindung mit Compiz auf jeder Arbeitsfläche ein anderes Hintergrundbild setzt?&lt;/b&gt;&lt;/p&gt;

&lt;p style="text-align: justify; clear: left;"&gt;Antwort: Erstmal kann ich sagen, dass mich die Frage wenig verwundert. Immerhin sollte man die Dinge ja auch vollständig ausnutzen, wenn man schon so schöne Gimmicks wie Compiz nutzen kann. Außerdem rockt &lt;a href="http://de.wikipedia.org/wiki/FLOSS"&gt;FLOSS&lt;/a&gt; ja sowieso, da gerade hier riesige Verbesserungen möglich sind :D.&lt;/p&gt;

&lt;p style="text-align: justify; clear: left;"&gt;Momentan ist es jedoch nicht möglich, es ist aber geplant. Wenn ich mich nicht irre, gibt es momentan noch kein Programm, welches dies überhaupt in akzeptabler Form unterstützt (also ein Grund mehr, dies zu implementieren ;)).&lt;/p&gt;

&lt;p style="text-align: justify; clear: left;"&gt;&lt;a href="http://wallpapoz.akbarhome.com/"&gt;Wallpapoz&lt;/a&gt; beispielsweise emuliert das Vorgehen nur, indem es das Hintergrundbild bei einem Wechsel der Arbeitsfläche setzt. Das Problem dabei ist, dass es eine merkliche Verzögerung gibt. Wenn man sich den Würfel betrachtet erkennt man außerdem, dass auf allen Flächen das gleiche Hintergrundbild gesetzt ist. Um es vereinfacht auszudrücken: Es wird das globale Hintergrundbild gesetzt. Wenn der Benutzer die Arbeitsfläche wechselt, schaut Wallpapoz nach, welches Hintergrundbild für die aktuelle Arbeitsfläche gesetzt werden soll und setzt es (global, also für alle Arbeitsflächen). Bei voll sichtbaren Würfel sieht man allerdings auf jeder Arbeitsfläche das gleiche Bild. (Bitte nicht auf die Goldwaage legen, ich habe den Quellcode nur kurz überflogen ;)). Jedoch erkennt es Systeme mit mehreren Monitoren, was ich von DesktopNova nicht behaupten kann, da ich es nie getestet habe (und auch kein solches System besitze).&lt;/p&gt;

&lt;p style="text-align: justify; clear: left;"&gt;Ein Bugreport für die Implementierung eines Prozesses wie der bei Wallpapoz existiert bereits: &lt;a href="https://bugs.launchpad.net/desktopnova/+bug/322848"&gt;https://bugs.launchpad.net/desktopnova/+bug/322848&lt;/a&gt;&lt;/p&gt;

&lt;p style="text-align: justify; clear: left;"&gt;Die einzige vernünftige Lösung dir mir bekannt (und die ich auch anstrebe) ist, ist die Verwendung des Compiz-eigenen Wallpaper-Plugin. Das wäre die einzige Möglichkeit Hintergrundbilder auf dem Würfel getrennt darzustellen. (So das man bei voll sichtbaren Würfel auch die einzelnen Hintergrundbilder sieht.) Der Nachteil ist, dass dann Nautilus (der Gnome-Dateimanager) den Desktop nicht mehr verwalten darf. Nautilus selbst zeichnet normalerweise das Hintergrundbild und zeigt die Desktop-Symbole an. Wenn man jetzt Nautilus untersagt, den Desktop zu verwalten, dann kann das Compiz-Wallpaper-Plugin zwar das Bild zeichnen, es fehlen aber die Desktop-Symbole (Starter, Ordner, etc.). Die Lösung ist also leider auch nicht optimal.&lt;/p&gt;

&lt;p style="text-align: justify; clear: left;"&gt;Zusätzlich ist DesktopNova darauf ausgelegt jeweils &lt;i&gt;ein&lt;/i&gt; neues Bild zu setzen. Da habe ich noch keine Idee, wie man das Konzept integrieren könnte. Aber das spielt erstmal eine untergeordnete Rolle.&lt;/p&gt;

&lt;p style="text-align: justify; clear: left;"&gt;&lt;i&gt;Auf jeden Fall möchte ich in absehbarer Zeit ein Modul für DesktopNova mitliefern, welches mit dem Compiz-Wallpapers-Plugin kommuniziert und so erstmal ein einheitliches Bild für alle Compiz-Arbeitsflächen setzt. Wie es dann weitergeht, wird sich zeigen. Zumindest wäre dann der Grundstein gelegt.&lt;/i&gt;&lt;/p&gt;

&lt;p style="text-align: justify; clear: left;"&gt;Ich hoffe, ich konnte das einigermaßen verständlich erklären :)&lt;/p&gt;


&lt;p&gt;Stefan&lt;/p&gt;

&lt;p&gt;//edit: gWallpapers durch DesktopNova ersetzt und Links korrigiert.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-9096531145020420196?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/9096531145020420196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/02/gwallpapers-und-der-compiz-desktop.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/9096531145020420196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/9096531145020420196'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/02/gwallpapers-und-der-compiz-desktop.html' title='DesktopNova und der Compiz-Desktop-Würfel'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/S3aokVwbxBI/AAAAAAAAA-0/ndnL7-PFmCM/s72-c/screenshot_compiz_soft.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-6969409479518173284</id><published>2010-01-19T16:32:00.000+01:00</published><updated>2010-01-19T16:33:58.916+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gWallpapers'/><title type='text'>„gWallpapers“ sucht neuen Namen</title><content type='html'>&lt;div style="text-align: justify;"&gt;Momentan bin ich damit beschäftigt, ein ordentliches Debian Paket für gWallpapers zu bauen. Dieses soll letztendlich in das Debian Archiv aufgenommen werden. (Nebenbei bemerkt, dass macht wirklich Spaß und die Leute sind nett und hilfsbereit. :))

Nun hat mein „Mentor“ oder „Sponsor“ eine gute Frage gestellt: Warum fängt der Name eigentlich mit einem „g“ an? Es ja keine reine Gnome-Anwendung (mehr).

Das stimmt und das ist mir auch schon seit geraumer Zeit bewusst, jedoch fällt mir kein neuer Name ein. Ich denke eine Umbenennung wäre sinnvoll, damit es nicht zu Missverständnissen kommt. Eine Umbenennung jetzt wäre auch besser als später, zu mal ich nicht davon abgeneigt bin, weitere Denktopumgebungen zu unterstützen, wenn es mir möglich ist.

&lt;span style="font-weight: bold;"&gt;Wenn irgendjemand Vorschläge oder Ideen für einen neuen Namen einbringen könnte, dann wäre ich wirklich sehr dankbar :)&lt;/span&gt;

Gruß, Stefan&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-6969409479518173284?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/6969409479518173284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2010/01/gwallpapers-sucht-neuen-namen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6969409479518173284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6969409479518173284'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2010/01/gwallpapers-sucht-neuen-namen.html' title='„gWallpapers“ sucht neuen Namen'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-274469062152998996</id><published>2009-12-08T21:05:00.005+01:00</published><updated>2010-03-08T19:46:50.946+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pidgin'/><category scheme='http://www.blogger.com/atom/ns#' term='Script'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Chat'/><title type='text'>Pidgin-Chat-Analyzer</title><content type='html'>&lt;p&gt;Ich bin ein sehr gesprächiger Mensch. Jaa - sehr gesprächig. Doch wie würde ich das herausfinden, wenn ich es nicht vorher wüsste? Deswegen habe ich mir ein kleines Python-Script geschrieben, welches genau dies untersucht.&lt;/p&gt;

&lt;p&gt;Es wertet die Nachrichtenmitschnitte von Pidgin aus und zählt dabei die Wörter. Jedoch werden die gezählten Wörter direkt den Namen zugeordnet. Somit kann man schnell überblicken, wer denn da rumspammt :-D.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sites.google.com/site/haliner/opensource"&gt;Das Script&lt;/a&gt; kann von meiner Homepage heruntergeladen werden. Es benötigt Python 3 (es würde auch mit 2.x gehen, allerdings nutze ich den neuen Syntax. Ich denke, ich werde es nochmal portieren). Die Daten werden von der Standard-Eingabe gelesen. Ein Beispiel-Aufruf könnte demnach so aussehen:&lt;/p&gt;

&lt;pre class="terminal"&gt;find ~/.purple/logs/icq -name '*.txt' -print0 | xargs -0 cat | ./pidgin-chat-analyzer.py&lt;/pre&gt;

&lt;p&gt;Und ja. Ich bin ein sehr gesprächiger Mensch: 126.439 Wörter meinerseits gegen 80.389.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-274469062152998996?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/274469062152998996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/12/pidgin-chat-analyzer.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/274469062152998996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/274469062152998996'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/12/pidgin-chat-analyzer.html' title='Pidgin-Chat-Analyzer'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-8194808563016119856</id><published>2009-11-22T11:33:00.004+01:00</published><updated>2009-11-22T11:39:31.307+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Handschriftanalyse'/><title type='text'>Handschriftanalyse</title><content type='html'>&lt;div style="text-align: justify;"&gt;Eigentlich wollte ich den &lt;a href="http://haliner.blogspot.com/2009/11/handschriftanalyse.html"&gt;Test&lt;/a&gt; nochmal machen, da ich mir öfters unsicher war. Das das hatte ich erst vergessen, aber heute hatte ich mal wieder Langeweile. Das Ergebnis fiel recht ähnlich aus, passt aber meiner Meinung nach noch besser.
&lt;/div&gt;&lt;blockquote&gt;Die Deutung der Handschrift brachte folgendes Ergebnis:

Stefan ist selbstbewusst und bereit,
seine Stärken auch anderen zu zeigen.
Er ist locker und großzügig.

Stefan ist ein impulsiver, unsteter, vielseitiger und unkonventioneller Typ.
Es fällt ihm nicht leicht, sich anzupassen.

Er ist sinnlich, warmherzig, gemütlich und phantasievoll.
Im Großen und Ganzen wirkt er gelassen bis uninteressiert,
wenn er aber von einer Sache überzeugt ist, überrascht er
seine Umwelt durch sein überschwängliches und begeisterungsfähiges Auftreten.

Stefan ist ein sehr gefühlsbestimmter Mensch.
Oft werden Entscheidungen gefühlsmäßig gefällt, obwohl bei
rein rationeller Überlegung eine andere Entscheidung die richtige wäre.

Er arbeitet sehr genau und zeichnet sich durch rationales, analytisches Denken aus.

Stefan ist sehr stark um Gerechtigkeit bemüht.
Er versucht stets, sich für andere einzusetzen.

Stefan ist ein impulsiver und phantasievoller Idealist.

Stefan ist insofern bescheiden und wenig aufdringlich,
als dass er es nicht nötig hat, die Umwelt bei jeder Gelegenheit
auf die eigenen Stärken aufmerksam zu machen.&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;Ich bin also ein phantasievoller Idealist... Vielleicht sollte ich doch anfangen Gedichte zu schreiben. Dank »Tonio Kröger« weiß ich ja jetzt, wie ich aus einem drohenden inneren Zwiespalt wieder herauskomme *g*.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-8194808563016119856?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/8194808563016119856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/11/handschriftanalyse_22.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8194808563016119856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8194808563016119856'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/11/handschriftanalyse_22.html' title='Handschriftanalyse'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-95087376376576701</id><published>2009-11-21T23:20:00.002+01:00</published><updated>2009-11-21T23:22:28.709+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mathematik'/><title type='text'>Mathe macht glücklich™</title><content type='html'>Ein Tippfehler auch: &lt;a href="http://www.google.de/search?q=e"&gt;http://www.google.de/search?q=e&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-95087376376576701?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/95087376376576701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/11/mathe-macht-gluck.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/95087376376576701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/95087376376576701'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/11/mathe-macht-gluck.html' title='Mathe macht glücklich™'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4540368914210550137</id><published>2009-11-07T10:59:00.004+01:00</published><updated>2009-11-07T11:24:11.514+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod Touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>iPod Touch ‒ der Countdown läuft (auch rückwärts *g*)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/SvVKV7hWQeI/AAAAAAAAA8A/RmmE-Ss2uY4/s1600-h/IMG_0009.PNG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/SvVKV7hWQeI/AAAAAAAAA8A/RmmE-Ss2uY4/s320/IMG_0009.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5401305068716048866" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;Gestern Abend habe ich die Stoppuhr im iPod Touch gestartet. Allerdings habe ich diese vergessen wieder zu stoppen (Jaaa, so ist das eben mit den zerstreuten Professoren :D). Irgendwann habe ich das iPod dann ausgemacht. Also nicht nur gesperrt, sondern richtig aus. Als ich es heute früh allerdings wieder anmachte, staunte ich nicht schlecht, dass die Uhr noch immer lief. Danach wusste ich sofort, dass ich über 9 Stunden geschlafen habe *g*.
Jetzt stellt sich mir natürlich die Frage: Wie haben die das gemacht? Läuft das Programm im Hintergrund weiter? Oder speichert das Programm die Startzeit und bildet dann die Differenz zur momentanen Zeit. Ich würde eher auf die zweite Möglichkeit tippen, da es wesentlich CPU-schonender sein dürfte. Außerdem ist es genauer und Apples Entwickler sind ja nicht dumm. Aber was passiert dann, wenn man die Zeit einfach umstellt? Ich denke das bedarf einem kleinen Test :)
Deswegen habe ich gleich mal einen Wecker gestellt und das Gerät ausgeschalten. Damit sollte sich der Trick eigentlich gut nachvollziehen lassen. Der Wecker klingelte nicht. Also ist die von mir erwartete zweite Methode.
Was passiert aber nun, wenn man die Stoppuhr startet und die Zeit umstellt? Wenn ich die Zeit um eine Stunde vorstelle, dann zeigt mir auch die Stoppuhr auch eine Stunde mehr an.  Auf die selbe Weise lassen sich auch negative Zeiten zusammenbasteln. Ätsch, Apple, Bug gefunden :D&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4540368914210550137?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4540368914210550137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/11/ipod-touch-der-countdown-lauft-auch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4540368914210550137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4540368914210550137'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/11/ipod-touch-der-countdown-lauft-auch.html' title='iPod Touch ‒ der Countdown läuft (auch rückwärts *g*)'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/SvVKV7hWQeI/AAAAAAAAA8A/RmmE-Ss2uY4/s72-c/IMG_0009.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2573476579428172781</id><published>2009-11-07T10:29:00.009+01:00</published><updated>2010-03-08T16:34:55.845+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gamepad'/><category scheme='http://www.blogger.com/atom/ns#' term='Joystick'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu &amp; mein Gampad</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-C3w1uboIpk/SvVEN4qz6eI/AAAAAAAAA7U/jRminRd2ldM/s1600-h/Gamepad.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_-C3w1uboIpk/SvVEN4qz6eI/AAAAAAAAA7U/jRminRd2ldM/s200/Gamepad.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5401298333441714658" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;Eigentlich hatte ich ja was ganz anderes vor, aber als ich den Schieber am Computerschreibtisch öffnete, musste ich da einfach mal aufräumen (und das will etwas heißen :D). 99,&lt;span style="text-decoration: overline;"&gt;9&lt;/span&gt; % des Zeugs konnte entsorgt werden. Doch dort fand ich auch mein altes Gamepad. Also habe ich das gleich mal an einen USB-Port angestöpselt und war recht erstaunt, als es mit Ubuntu beinahe out-of-the-box funktionierte. Das Ding ging schon mit Windows und originalen Treiber nicht so richtig :).
Tja, X-Moto funktioniert schon prima mit dem Gamepad und macht gleich viel mehr Spaß.
Damit das Gamepad funktionierte, musste ich einfach nur das Kernel-Modul joydev laden. Wer es permanent benötigt, kann es in der Datei &lt;span style="font-style: italic;"&gt;/etc/modules&lt;/span&gt; hinzufügen und es wird bei jedem Start geladen.
&lt;/div&gt;&lt;pre class="terminal"&gt;sudo modprobe joydev&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Vielleicht benötigen manche Programme die Gerätedatei unter &lt;span style="font-style: italic;"&gt;/dev/js0&lt;/span&gt;. Da kann man einfach einen symbolischen Link anlegen:
&lt;/div&gt;&lt;pre class="terminal"&gt;sudo ln -s /dev/input/js0 /dev/js0&lt;/pre&gt;
&lt;div style="text-align: justify; color:#c55;"&gt;&lt;span style="font-weight:bold;"&gt;Anmerkung:&lt;/span&gt; Ich musste das Modul joydev gar nicht laden. Mit Ubuntu funktioniert das auch ohne out-of-the-box. Das ist natürlich nicht schlecht. (Es handelt sich übrigens um ein USB-Gamepad)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2573476579428172781?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2573476579428172781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/11/ubuntu-mein-gampad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2573476579428172781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2573476579428172781'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/11/ubuntu-mein-gampad.html' title='Ubuntu &amp; mein Gampad'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-C3w1uboIpk/SvVEN4qz6eI/AAAAAAAAA7U/jRminRd2ldM/s72-c/Gamepad.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-6115066733393924735</id><published>2009-11-05T19:13:00.003+01:00</published><updated>2009-11-05T19:25:06.517+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='gWallpapers'/><title type='text'>Fieser Fehler</title><content type='html'>&lt;div style="text-align: justify;"&gt;Abgesehen davon, dass mir der Deutschunterricht scheinbar schadet, da ich im Titel schon eine Alliteration verwendet habe, stößt mir noch ein anderes Problem mächtig auf...

Unter normalen Umständen hätte ich am Samstag die Version 0.7 von gWallpapers freigegeben. Schon alleine deswegen, weil ich in nächster Zeit nicht alle geplanten Features hätte implementieren können. Doch jetzt gibt es einen richtig fiesen Fehler im Code. Und zwar genau an einer Stelle, die mehr als ein Jahr lang problemlos funktionierte.

Als ob das nicht genug wäre, funktioniert derselbe Code auch noch in einem neuen Projekt, aber eben nicht in dieser verflixten Bibliothek die dynamisch geladen wird.

Dem ein oder anderen wird sicher aufgefallen sein, dass ich noch eine Weile beschäftigt sein werde :) Erst nach dem alle &lt;a href="http://forum.ubuntuusers.de/post/2217183/"&gt;hier&lt;/a&gt; aufgelisteten Bugs behoben sind, werde ich die Version 0.7 freigeben.

Ich melde mich wieder, wenn ich von der Käferjagd wieder zurück bin. Möge die Macht mit mir sein :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-6115066733393924735?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/6115066733393924735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/11/fieser-fehler.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6115066733393924735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6115066733393924735'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/11/fieser-fehler.html' title='Fieser Fehler'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-3113144477142319105</id><published>2009-11-02T20:45:00.010+01:00</published><updated>2009-11-21T23:34:07.993+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Handschriftanalyse'/><title type='text'>Handschriftanalyse</title><content type='html'>&lt;div style="text-align: justify;"&gt;Durch &lt;a href="http://franzibloggt.blogspot.com/2009/10/handschriftdeutung.html"&gt;Franzis Blogpost&lt;/a&gt; wurde ich auf &lt;a href="http://www.graphologies.de/"&gt;eine Seite für Handschriftdeutung&lt;/a&gt; aufmerksam gemacht. Vielleicht ist das Ganze gar nicht so esoterisch, wie ich vorher angenommen habe. Auf jeden Fall ist es ziemlich interessant:
&lt;/div&gt;
Mein Ergebnis:&lt;blockquote&gt;Die Deutung der Handschrift brachte folgendes Ergebnis:

Stefan Haller ist selbstbewusst und bereit,
seine Stärken auch anderen zu zeigen.
Er ist locker und großzügig.

Ihm ist sehr wichtig, nach außen etwas darzustellen.

Stefan Haller ist ein impulsiver, unsteter, vielseitiger und unkonventioneller Typ.
Es fällt ihm nicht leicht, sich anzupassen.

Er ist sinnlich, warmherzig, gemütlich und phantasievoll.
Im Großen und Ganzen wirkt er gelassen bis uninteressiert,
wenn er aber von einer Sache überzeugt ist, überrascht er
seine Umwelt durch sein überschwängliches und begeisterungsfähiges Auftreten.

Stefan Haller ist ein sehr gefühlsbestimmter Mensch.
Oft werden Entscheidungen gefühlsmäßig gefällt, obwohl bei
rein rationeller Überlegung eine andere Entscheidung die richtige wäre.

Stefan Haller ist anderen Menschen gegenüber immer offen und aufgeschlossen.
Der Umgang mit Menschen macht ihm Spaß,
der ideale Arbeitsplatz ist da, wo er mit anderen Menschen zu tun hat.

Er arbeitet sehr genau und zeichnet sich durch rationales, analytisches Denken aus.

Stefan Haller ist sehr stark um Gerechtigkeit bemüht.
Er versucht stets, sich für andere einzusetzen.

Stefan Haller wirkt oft etwas nervös und wenig entspannt.

Er hält nichts von übertriebener Toleranz. Seine Antworten fallen schon mal etwas heftiger aus.&lt;/blockquote&gt;
&lt;div style="text-align: justify;"&gt;Ich bin mir noch nicht ganz sicher, ob das alles so stimmt :)
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-3113144477142319105?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/3113144477142319105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/11/handschriftanalyse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3113144477142319105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3113144477142319105'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/11/handschriftanalyse.html' title='Handschriftanalyse'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2959258648397400036</id><published>2009-10-24T12:08:00.003+02:00</published><updated>2009-10-24T12:14:32.740+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Wave'/><title type='text'>Google Wave Einladung erhalten</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ein gefühltes halbes Jahr ist vergangen, seit ich mich bei Google Wave angemeldet habe. Das Projekt ist noch nicht fertig gestellt, so dass es wie bei Google Mail nur mit Einladung von anderen genutzt werden kann. Heute ist meine Einladung von Google endlich gekommen.

Google Wave verspricht ein vollkommen neues Konzept der Kommunikation, so dass e-Mail, Instant Messaging und viele weitere Aspekte zu einer Webapplikation zusammengeführt werden.

Ich bin mal gespannt, wie es genau funktioniert und ausschaut...
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2959258648397400036?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2959258648397400036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/10/google-wave-einladung-erhalten.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2959258648397400036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2959258648397400036'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/10/google-wave-einladung-erhalten.html' title='Google Wave Einladung erhalten'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-1136428170362223384</id><published>2009-10-23T20:49:00.003+02:00</published><updated>2009-10-23T20:50:43.895+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod Touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Jailbreak'/><title type='text'>Jailbreak - was ist das?</title><content type='html'>Bevor es zum praktischen Teil geht, erstmal ein paar Informationen:
&lt;div style="text-align: justify;"&gt;Normalerweise verbietet Apple, dass auf dem iPhone oder dem iPod nicht gewollte Programme verwendet werden. So dürfen nur Programme aus dem AppStore zusätzlich installiert werden und der Zugriff auf das Dateisystem ist von Haus aus gesperrt und Teile von diesem sind sogar verschlüsselt. So werden die Audiodateien nicht wie bei einem anderen Player direkt auf das Dateisystem kopiert, sondern in eine spezielle Datenbank. Diese soll logischerweise auch nur von iTunes geschrieben werden können, sonst könnte man ja andere Programme nutzen ;)
Genau hier greift der Jailbreak ein. Es nutzt Lücken im Betriebssystem (modifiziertes Mac OS mit Darwin-Kernel, gebootet mit iBoot) aus. Diese Lücken werden »Exploits« genannt.
Die meisten Jailbreak installieren über einen Exploit einmal ein Paketverwaltungssystem (z.B. apt von Debian) auf dem Gerät. So kann dann mit Cydia, Icy, Rock und Co. verschiedenste Software aus ebenso verschiedenen Quellen nachinstalliert werden.
Es gibt zwar auch Software aus dem AppStore, aber es gibt strenge Richtlinien, ob ein Programm in den AppStore darf. So dürfen keine eigenen Browser, Musik- und Videoplayer verbreitet werden. Auch gibt es kein Terminal, kein Download-Plugin für Safari und keinen Dateisystembrowser.
Ein Jailbreak ist nicht illegal (Die Garantie von Apple kann aber aufgrund des Eingriffs ins System entfallen!), ein Unlock jedoch schon. Beim Unlock wird Carrier-Sperre vom iPhone entfernt, so dass es nicht nur mit den von Apple gewünschten Providern (AT&amp;amp;T, T-Mobile) genutzt werden kann.

Es gibt unterschiedliche Teams oder Einzelpersonen, die sich mit dem Jailbreak beschäftigen. Die wichtigsten und aktuellsten sind: &lt;a href="http://blog.iphone-dev.org/"&gt;iphone-dev-team&lt;/a&gt;, &lt;a href="http://chronic-dev.org/blog/"&gt;Chronic Dev-Team&lt;/a&gt; und &lt;a href="http://iphonejtag.blogspot.com/"&gt;geohot&lt;/a&gt;. &lt;a href="http://www.saurik.com/"&gt;Saurik&lt;/a&gt; hat Cydia programmiert.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-1136428170362223384?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/1136428170362223384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/10/jailbreak-was-ist-das.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/1136428170362223384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/1136428170362223384'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/10/jailbreak-was-ist-das.html' title='Jailbreak - was ist das?'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-9135054691747605517</id><published>2009-10-22T21:38:00.006+02:00</published><updated>2010-03-08T16:35:28.907+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod Touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Softwareentwicklung'/><title type='text'>Hello World!</title><content type='html'>&lt;p&gt;Es hat mich fast ein Woche gekostet, aber jetzt funktioniert endlich mein gcc-Compiler auf dem iPod:&lt;/p&gt;

&lt;pre class="terminal"&gt;stefans-iPod:~/src mobile$ echo 'main () { printf("Hello World!\n"); }' &gt; test.c
stefans-iPod:~/src mobile$ gcc -o test test.c
test.c: In function 'main':
test.c:1: warning: incompatible implicit declaration of built-in function 'printf'
stefans-iPod:~/src mobile$ ldid -S test
stefans-iPod:~/src mobile$ ./test
Hello World!&lt;/pre&gt;

&lt;p&gt;Jetzt habe ich alles ausreichend getestet und werde die gesamte Arbeit vom Anfang bis zum Ende in meinem Blog niederschreiben. Ich hoffe ich werde dem einen oder anderen helfen können, denn es gibt im Internet kaum zusammenhängende Informationen zum Thema Jailbreak und der Softwareentwicklung mit Linux für den iPod bzw. das iPhone. Und wenn mal etwas findet, dann ist es veraltet ;) Aber zum Glück funktionieren viele Dinge mit der 3.x-Firmware genauso wie mit der 2.x-Firmware.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-9135054691747605517?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/9135054691747605517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/10/hello-world.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/9135054691747605517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/9135054691747605517'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/10/hello-world.html' title='Hello World!'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-6448095984452174813</id><published>2009-10-13T17:11:00.005+02:00</published><updated>2009-10-13T17:22:00.739+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod Touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>Linux rockt den iPod Touch ... eher nicht</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/StSZnAya56I/AAAAAAAAA58/0YDPZArcrVQ/s1600-h/IMG_3994.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/StSZnAya56I/AAAAAAAAA58/0YDPZArcrVQ/s200/IMG_3994.JPG" alt="" id="BLOGGER_PHOTO_ID_5392103549374752674" border="0" /&gt;&lt;/a&gt;Apples iPod Touch ist wirklich ein klasse Gerät. Die Bedienung ist einfach nur super intuitiv. Eigentlich ist der iPod Touch ja nicht nur ein portabler Musikspieler, sondern ein richtiges PDA. Was mir allerdings überhaupt nicht gefällt, ist Apples Geschäftgspolitik: Meiner Meinung nach macht Apples Vorgehen das gesamte Produkt kaputt. Für einen normalen Benutzer reichen die vorhanden Applikationen sicherlich aus, aber das kleine Wundergerät würde viel mehr schaffen. Gut es gibt den AppStore, aber da kommt auch nur wieder das rein, was Apple möchte. Außerdem möchte ich keinen iTunes-Account, so bleiben mir auch die wenigen freien Apps verwehrt. Das ganze ist ja noch nicht das Problem, man muss es ja nicht nutzen. Aber selbst Firmware-Updates zu einer neuen Major-Version sind kostenplichtig. Gut, es ist nicht viel, ca. 4€, aber dennoch für mich etwas ungewöhnlich. Sogar eigene Programme kann ich nicht entwickeln, da ich weder einen Mac habe und schon gar keine 99$ pro Jahr blechen möchte. (Ok, die Entwicklungsumgebung gibt es umsonst, die 99$ sind fällig, falls man seine Software z.B. via AppStore publizieren möchte) Auch verhindert Apple durch ständige Datenbankänderungen das Ableichen der Inhalte mit einem Nicht-iTunes-Programm. So muss ich mich mit VirtualBox und iTunes abfinden, was zwar nicht das Gelbe vom Ei ist, aber doch besser als nichts. Warum beschränkt Apple dermaßen alle Nutzer? Das Ding wäre doch mit einem Dateimanager, PDF-Reader und einem Downloader in Safari beispielsweise noch produktiver. Ich denke die Antwort liegt klar auf der Hand: Apple möchte den größtmöglichen Gewinn aus dem iPod und dem iPhone ziehen und bastelt sie für sich zu Geldruckmaschinien um. Ich denke das Geschäft lohnt sich ;)
Nichtsdestotrotz finde ich das Gerät den blanken Hammer. Apple hat definitiv enormes technisches Sachverständnis und die Produkte sind durch Stil und Ästhetik bekannt. Doch noch mehr Respekt fällt den Hackern zu, die unermüdlich daran arbeiten, Apple ein Schnippchen zu schlagen. Zum Glück ist ein sogenannter »Jailbreak« nicht illegal. Lediglich das Unlocken des iPhones ist rechtlich nicht erlaubt. So gibt es verschiedene Möglichkeiten um fremde Programme nutzen zu können. Allerdings hat es einige Zeit gedauert, bis ich mir einen Überblick über alle Tools verschafft habe. Jailbreaking-Tools kommen und gehen und einige sind schon veraltet, andere funktionieren nur mit älteren Versionen. Auch funktionieren nicht alle mit Mac, Windows oder Linux. In den nächsten Tagen möchte ich deswegen einige Posts dem iPod Touch widmen. Das meiste funktioniert natürlich genauso mit dem iPhone. Ich werde diese dann mit »iPod Touch« und »iPhone« taggen.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-6448095984452174813?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/6448095984452174813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/10/linux-rockt-den-ipod-touch-eher-nicht.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6448095984452174813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6448095984452174813'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/10/linux-rockt-den-ipod-touch-eher-nicht.html' title='Linux rockt den iPod Touch ... eher nicht'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/StSZnAya56I/AAAAAAAAA58/0YDPZArcrVQ/s72-c/IMG_3994.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-7340751228664521818</id><published>2009-09-07T17:08:00.000+02:00</published><updated>2009-09-07T17:08:44.806+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gWallpapers'/><title type='text'>gWallpapers: Bin ich schon drin?!</title><content type='html'>&lt;div style="text-align: justify;"&gt;Am Wochenende habe ich meine äußerst wertvolle Zeit mal damit verbracht, etwas richtig Sinnvolles zu machen: Programmieren :-)
Seit fast einem halben Jahr habe ich bis auf wenige Kleinigkeiten nicht an gWallpapers (&lt;a href="https://sites.google.com/site/haliner/gwallpapers/gwallpapers-de"&gt;Homepage&lt;/a&gt; und &lt;a href="https://launchpad.net/gwallpapers"&gt;Launchpad-Seite&lt;/a&gt;) gebastelt und den Zustand wollte ich natürlich schleunigst etwas ändern. Das hatte ich mir zwar schon öfters mal vorgenommen, doch diesmal hat es endlich geklappt und ich bin jetzt endlich wieder richtig in dem Projekt drin und kann da weitermachen, wo ich aufgehört habe. (Auch wenn die Einarbeitungsphase schwerer als gedacht war.) Zumindest rückt der Release-Termin für gWallpapers 0.7 Stück für Stück näher und es macht wieder richtig Spaß dran zu arbeiten.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-7340751228664521818?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/7340751228664521818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/09/gwallpapers-bin-ich-schon-drin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7340751228664521818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7340751228664521818'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/09/gwallpapers-bin-ich-schon-drin.html' title='gWallpapers: Bin ich schon drin?!'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-3313406942080002652</id><published>2009-09-07T16:41:00.005+02:00</published><updated>2009-09-07T17:08:09.749+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Taschenrechner'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows-Bashing'/><title type='text'>Taschenrechner-Freeze</title><content type='html'>&lt;div style="text-align: justify;"&gt;Seit Jahren habe ich es nicht geschafft, meinen Grafiktaschenrechner von Casio klein zu kriegen, doch heute ist der Tag gekommen :-) Als ich &lt;a href="http://haliner.blogspot.com/2009/07/ean-barcode-programm-fur-casio.html"&gt;meine EAN-Programme&lt;/a&gt; auf den Computer spielen wollte, habe ich mit CasioCom aus Versehen ein leeres Programm auf den Taschenrechner hochgeladen. Toll, das konnte man ja einfach löschen. Doch dadurch hat sich dann in dem vorherigen Programm ein @ am Ende eingeschlichen. Das konnte ich auch eben so einfach entfernen und das Programm funktioniert wie gewohnt. Allerdings hat es meinem Taschenrechner nicht gefallen, dass ich dann in Mathe ein neues Programm erstellt habe. Denn bei der Ausführung von diesem war auf einmal ein Programm namens »unbenannt« vorhanden. Doch als ich das wiederum gelöscht habe, bestanden die anderen Programme nur noch aus vielen kryptischen Zeichen und der Taschenrechner hat sich aufgehangen. Ein Hardreset hat da geholfen und glücklicherweise hat ich vorher mit dem Cafix (Linux-Programm! Das geht wenigstens *hust*) ein Backup aller Programme angelegt. Was würde ich denn nur ohne die geballte Kraft von Linux und seinen Tools machen? Aber eh ich weiter über so eine sinnlose Frage philosophiere, mache ich lieber etwas Ordentliches ;-)

&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;/*** END OF WINDOWS BASHING... ***/&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-3313406942080002652?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/3313406942080002652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/09/taschenrechner-freeze.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3313406942080002652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3313406942080002652'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/09/taschenrechner-freeze.html' title='Taschenrechner-Freeze'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2190105894007386148</id><published>2009-08-16T20:13:00.004+02:00</published><updated>2009-08-22T21:24:04.627+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='identi.ca'/><category scheme='http://www.blogger.com/atom/ns#' term='Microblogging'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Microblogging</title><content type='html'>&lt;div style="text-align: justify;"&gt;Heute habe ich mich dazu entschieden mich bei &lt;a href="http://identi.ca/"&gt;identi.ca&lt;/a&gt; anzumelden. Nun, es werden sich einige fragen, warum ich mich nicht für twitter entschieden haben. Aber der Grund ist ganz einfach: identi.ca nutzt freie Software (Natürlich und wie immer »frei« im Sinne »Freiheit«) :)
&lt;/div&gt;
Mein Profil: &lt;a href="http://identi.ca/haliner"&gt;http://identi.ca/haliner&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2190105894007386148?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2190105894007386148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/08/microblogging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2190105894007386148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2190105894007386148'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/08/microblogging.html' title='Microblogging'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4242099795747455458</id><published>2009-08-15T23:02:00.006+02:00</published><updated>2009-09-07T17:11:43.208+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Compiz'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Arbeitsflächenwechsel mit Mausrad auf dem Desktop unterbinden</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ein äußert nerviges "Feature" ist es, das bei Ubuntu standardmäßig die Arbeitsfläche gewechselt wird, wenn man das Mausrad auf dem Desktop betätigt. Das ist gerade bei einem Touchpad schnell ungewollt ausgelöst. Doch es lässt sich relativ einfach beheben. Als Erstes muss man sich den Compizconfig-Settings-Manager (CCSM) installieren. Das geht bei Ubuntu einfach mit:&lt;/div&gt;&lt;div class="terminal"&gt;sudo apt-get install compizconfig-settings-manager&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;Danach startet man das Programm aus &lt;span style="font-style: italic;"&gt;System &gt; Einstellungen &gt; Compizconfig-Einstellungs-Manager&lt;/span&gt;. Bei &lt;span style="font-style: italic;"&gt;»Arbeitsfläche«&lt;/span&gt; wählt man &lt;span style="font-style: italic;"&gt;»Arbeitsflächenumschalter«&lt;/span&gt; und scrollt ganz nach rechts (1). Danach einfach auf die drei unteren Schaltflächen klicken und die Funktion deaktivieren (2).
&lt;/div&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/SocjKmfZFAI/AAAAAAAAA5M/fF4rL6MCajI/s1600-h/screenshot_003.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 171px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/SocjKmfZFAI/AAAAAAAAA5M/fF4rL6MCajI/s320/screenshot_003.png" alt="" id="BLOGGER_PHOTO_ID_5370299745700484098" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4242099795747455458?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4242099795747455458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/08/arbeitsflachenwechsel-mit-mausrad-auf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4242099795747455458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4242099795747455458'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/08/arbeitsflachenwechsel-mit-mausrad-auf.html' title='Arbeitsflächenwechsel mit Mausrad auf dem Desktop unterbinden'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/SocjKmfZFAI/AAAAAAAAA5M/fF4rL6MCajI/s72-c/screenshot_003.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-1252328014022131016</id><published>2009-08-10T19:39:00.004+02:00</published><updated>2009-08-10T19:55:45.702+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Panormabilder'/><category scheme='http://www.blogger.com/atom/ns#' term='hugin'/><title type='text'>Mit hugin Panoramafotos erstellen</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ewig hatte ich nach einem Programm gesucht, mit dem ich Panoramen erstellen kann. Natürlich soll es auch einigermaßen leicht bedienbar sein. Durch Zufall konnte ich jetzt von &lt;a href="http://hugin.sourceforge.net/"&gt;»hugin«&lt;/a&gt; in der &lt;a href="http://www.freiesmagazin.de/20090802-augustausgabe-2009-erschienen"&gt;aktuellen Ausgabe des »freienMagazin«&lt;/a&gt; lesen. Das Programm ist wirklich sehr empfehlenswert und macht auch ohne große Einstellungen ordentliche Bilder. Dennoch kann man sich in das Thema auch weiter einarbeiten und dann die volle Power des Programmes nutzen.&lt;/div&gt;

&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/l1oDL_67cHDTHDksc33oiQ?feat=directlink"&gt;&lt;img src="http://lh5.ggpht.com/_-C3w1uboIpk/SnmoD3Ns9fI/AAAAAAAAA4I/x7fyYzdJ7cs/s400/Panorama-Purtschellerhaus.jpg" alt="Panorama #1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/AY3buKT9_iO4R58owtmOCA?feat=directlink"&gt;&lt;img src="http://lh4.ggpht.com/_-C3w1uboIpk/SnmzEkGY4ZI/AAAAAAAAA4c/EQQw3dz8QVw/s400/Panorama-Berchdesgaden%20mit%20Watzmann.jpg" alt="Panorama #2" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/tWAtYO6Sz-TEY19n1HdkBw?feat=directlink"&gt;&lt;img src="http://lh6.ggpht.com/_-C3w1uboIpk/SnqNbv7t10I/AAAAAAAAA4s/AUUmAoo9tD8/s400/Panorama-Bolilmark.jpg" alt="Panorama #3" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-1252328014022131016?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/1252328014022131016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/08/mit-hugin-panoramafotos-erstellen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/1252328014022131016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/1252328014022131016'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/08/mit-hugin-panoramafotos-erstellen.html' title='Mit hugin Panoramafotos erstellen'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_-C3w1uboIpk/SnmoD3Ns9fI/AAAAAAAAA4I/x7fyYzdJ7cs/s72-c/Panorama-Purtschellerhaus.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2540419080529604382</id><published>2009-08-10T19:17:00.006+02:00</published><updated>2009-08-10T19:36:14.653+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fotos'/><category scheme='http://www.blogger.com/atom/ns#' term='Urlaub'/><title type='text'>Urlaubsfotos</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ich habe mich dazu entschieden einige &lt;a href="http://picasaweb.google.com/haliner"&gt;Fotos aus dem Urlaub&lt;/a&gt; online zu stellen. Es handelt sich meist um Naturfotos und alle Fotos sind unter CC-BY-SA lizenziert.&lt;/div&gt;

&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/WuvXepNCZ-gGCfT5CkNXiQ?feat=directlink"&gt;&lt;img src="http://lh4.ggpht.com/_-C3w1uboIpk/SniQoGCLxZI/AAAAAAAAAsQ/8JYxDOxalzE/s400/IMG_2721.JPG" alt="Schmetterlingsfoto" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2540419080529604382?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2540419080529604382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/08/urlaubsfotos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2540419080529604382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2540419080529604382'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/08/urlaubsfotos.html' title='Urlaubsfotos'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_-C3w1uboIpk/SniQoGCLxZI/AAAAAAAAAsQ/8JYxDOxalzE/s72-c/IMG_2721.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4770797984396303653</id><published>2009-08-10T18:59:00.002+02:00</published><updated>2009-08-10T19:17:44.942+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Screenshottool'/><category scheme='http://www.blogger.com/atom/ns#' term='Shutter'/><title type='text'>Shutter</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ein nettes Screenshot-Tool, was schon jetzt zur festen Einrichtung von meinem Ubuntu, ist &lt;a href="http://shutter-project.org/"&gt;Shutter&lt;/a&gt; (ehemals gScrot). Eine ausführliche Anleitung findet man in jedem gut sortierten &lt;a href="http://wiki.ubuntuusers.de/Shutter"&gt;Ubuntu(users)-Wiki&lt;/a&gt; ;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4770797984396303653?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4770797984396303653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/08/shutter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4770797984396303653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4770797984396303653'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/08/shutter.html' title='Shutter'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-3447471074351130871</id><published>2009-07-13T20:55:00.003+02:00</published><updated>2011-07-15T21:13:18.580+02:00</updated><title type='text'>Mit Unison die Timestamps synchronisieren</title><content type='html'>&lt;div style="text-align: justify;"&gt;Um die wichtigsten Daten auf dem Desktop und Netbook synchron zu halten nutze ich Unison. Dennoch stellte sich ein ziemliches Problem in den Weg, da anscheinend die Zugriffsdaten auf die Dateien nicht ausgetauscht wird. So haben die selben Dateien mit dem selben Inhalt auf den beiden Rechnern unterschiedliche Zugriffsdaten, was unter normalen Umständen kein großes Problem darstellt. Allerdings habe ich mit rsync einige Ordner auf eine externe Festplatte kopiert. Später wollte ich die Daten von dem anderen Rechner aus die Daten wieder auf die Festplatte mit rsync kopieren, da ich einige Änderungen vorgenommen habe. Allerdings erkannte rsync alle Dateien in den Ordnern als neu, da die Zugriffsdaten unterschiedlich waren. Mit der Option -c versucht rsync die Änderungen zwar nur noch über den Dateiinhalt zu suchen, dass dauert allerdings jedes mal ziemlich lange, da die Datenmenge mehrere Gigabyte umfasst.
Deswegen habe ich nach einer Lösung geforscht, die die Umstände bei Unison behebt. Man muss die Dateien in ~/.unison mit der Endung *.prf bearbeiten und in einer neuen Zeile »times = true« eingeben. Zukünftig werden auch die Timestamps der Dateien synchronisiert (Unison nutzt für die Bestimmung der Änderungen jedoch immer noch den Inhalt der Dateien - an diesem Zustand hat sich also nichts verändert.) Nun kann man, wenn die Dateien auf beiden Rechnern synchronisert sind, das zu synchronisierende Verzeichnis löschen und die Dateien mit Unison erneut synchroniseren lassen. (Man kann auch normal synchronisieren, allerdings wird dann jede Datei mit geänderten Eigenschaften gemeldet.) Jetzt haben alle Dateien auf den beiden Rechnern den selben Stand.&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/SluFBEd1z9I/AAAAAAAAAok/lnRhDjzul8Q/s1600-h/screenshot_002.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 106px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/SluFBEd1z9I/AAAAAAAAAok/lnRhDjzul8Q/s200/screenshot_002.png" alt="" id="BLOGGER_PHOTO_ID_5358022435112603602" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-3447471074351130871?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/3447471074351130871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/07/mit-unison-die-timestamps.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3447471074351130871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3447471074351130871'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/07/mit-unison-die-timestamps.html' title='Mit Unison die Timestamps synchronisieren'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-C3w1uboIpk/SluFBEd1z9I/AAAAAAAAAok/lnRhDjzul8Q/s72-c/screenshot_002.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2496859259909485101</id><published>2009-07-13T20:45:00.008+02:00</published><updated>2009-09-07T17:11:49.592+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pipes'/><category scheme='http://www.blogger.com/atom/ns#' term='pv'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Pipes betrachten mit pv</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ein nützliches Tool für die Shell ist pv. Mit ihr kann man den Lesefortschritt aus einer Pipe betrachten. So kann man sich z.B. den Fortschritt beim Komprimieren von gzip verfolgen:&lt;/div&gt;&lt;div class="terminal"&gt;pv file | gzip file &amp;gt; file.zip&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;Das Programm kann man bei Ubuntu und Debian einfach mit dem folgenden Befehl installieren:&lt;/div&gt;&lt;div class="terminal"&gt;sudo apt-get install pv&lt;/div&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/SluCr3jyDbI/AAAAAAAAAoc/FVD7-eP5z8k/s1600-h/screenshot_007.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 140px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/SluCr3jyDbI/AAAAAAAAAoc/FVD7-eP5z8k/s200/screenshot_007.png" alt="" id="BLOGGER_PHOTO_ID_5358019871847353778" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2496859259909485101?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2496859259909485101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/07/pipes-betrachten-mit-pv.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2496859259909485101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2496859259909485101'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/07/pipes-betrachten-mit-pv.html' title='Pipes betrachten mit pv'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-C3w1uboIpk/SluCr3jyDbI/AAAAAAAAAoc/FVD7-eP5z8k/s72-c/screenshot_007.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-3420074567297134782</id><published>2009-07-13T15:22:00.003+02:00</published><updated>2009-07-13T15:38:41.703+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Barcode'/><category scheme='http://www.blogger.com/atom/ns#' term='EAN'/><category scheme='http://www.blogger.com/atom/ns#' term='Projekt'/><category scheme='http://www.blogger.com/atom/ns#' term='Taschenrechner'/><category scheme='http://www.blogger.com/atom/ns#' term='Urlaub'/><title type='text'>EAN-Barcode-Programm für Casio Grafiktaschenrechner</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/SlsvEmjEOvI/AAAAAAAAAV4/hi0cJFRx5PI/s1600-h/EAN-8.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 60px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/SlsvEmjEOvI/AAAAAAAAAV4/hi0cJFRx5PI/s200/EAN-8.png" alt="" id="BLOGGER_PHOTO_ID_5357927937800944370" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;Im Urlaub beim Einkaufen habe ich mir die Produkte mal etwas näher angesehen und relativ schnell fiel meine Aufmerksamkeit auf die aufgedruckten Barcodes. Eigentlich interessiert mich dieses Thema schon etwas länger, aber in den Ferien hatte ich endlich etwas Zeit, um mich damit näher zu beschäftigen. Glücklicherweise suchten Bekannte ein Lexikon für ihren PC und ich habe ihnen das Offline-Wikipedia von zeno.org heruntergeladen. Dies schlummerte noch immer auf der Platte und so konnte ich die entsprechenden Seiten auch ohne Internetzugang betrachten. Genau genommen gibt es hunderte Arten von Barcodes, aber bei den auf Flaschen, Dosen, Schachteln und allen anderen Sachen aufgedruckten Codes handelt es sich um &lt;a href="http://de.wikipedia.org/wiki/European_Article_Number"&gt;EAN-Codes&lt;/a&gt;. Von diesen gibt es wiederum zwei Arten, nämlich EAN-8 und EAN-13. Diese besitzen eine Zeichenlänge von acht bzw. dreizehn Ziffern. Das alles hat natürlich sofort meinen Ergeiz geweckt und ich nahm mir einen Casio Grafiktaschenrechner (den ich *zufällig* mit dabei hatte :b)
Gesagt getan und so schuf ich nach und nach ein Programm, welches letztendlich drei Funktionen besitzt: Das Umwandeln von dem Barcode in eine Nummer, das Umwandeln von einer Nummer in einen Barcode (Barcode wird dabei ebenfalls gezeichnet) und das Errechnen und Prüfen der Prüfziffer. Alles funktioniert mit EAN-8, als auch mit EAN-13 Codes und die Ziffernlänge wird automatisch ausgewählt.  Weitere Details zu dem Programm, welches übrigens unter der GPL lizenziert ist, findet ihr auf &lt;a href="https://sites.google.com/site/haliner/ean-tr"&gt;meiner Homepage&lt;/a&gt;. Dort sind auch einige Screenshots zu finden. Dummerweise fehlen mir zwei Dinge: Einmal ein Taschenrechnerkabel um den Taschenrechner mit der Computer zu verbinden und das Programm zu übertragen und ein Barcode-Scanner. Ich habe den Programmcode vorerst abgetippt, allerdings kann ich hoffentlich von einem Kumpel das Kabel mal leihen. Ohne den Barcode-Scanner weiß ich allerdings nicht, ob der gezeichnete Barcode auch tatsächlich erkannt ist. Eigentlich habe ich alles nach Wikipedia-Artikel implementiert, allerdings kann die Praxis ja anders ausehen. Aber immerhin ist es schön anzusehen ;)
Ich hoffe der ein oder andere kann aus dem Programm einen Nutzen ziehen, auch wenn es nicht bis in das letzte Details ausgereift ist und der Code unter anderem auch etwas aufgebläht ist. Aber für mich war es wichtig, dass es funktioniert und das tut es auch. Und was nicht ist kann ja noch werden - ich bekomme ja später auch mal das Taschenrechnerkabel und außerdem ist es ja Open-Source. Mit welchen Taschenrechnern das Programm funktioniert kann ich nicht genau sagen, allerdings habe ich es mit dem Casio CFX-9850GC Plus erfolgreich getestet. Vielleicht gibt es aber auch andere Grafiktaschenrechner, die den Basic-Code interpretieren können. Eine Portierung auf andere Systeme ist allerdings wegen der fehlenden Kommentare im Code (der Taschenrechner unterstützt das nicht und außerdem würde der Code dann auch viel mehr Platz verschlingen) eher ungewöhnlich.
Als Nächstes möchte ich den Quellcode weiter optimieren, damit er kleiner und verständlicher wird.
Danach möchte ich ebenfalls eine EAN-Biobliothek für den Computer schreiben. Diese soll noch mehr Funktionen bereitstellen und vielleicht schaffe ich es sogar durch Segmentierung eines Fotos den EAN-Code daraus auszulesen. Aber das ist momentan rein spekulativ.&lt;/div&gt;
&lt;a href="https://sites.google.com/site/haliner/ean-tr"&gt;Link zur Projektseite&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/Sls4i9QOebI/AAAAAAAAAW8/7Idvs_FMT14/s1600-h/EAN-8.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 134px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/Sls4i9QOebI/AAAAAAAAAW8/7Idvs_FMT14/s200/EAN-8.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5357938354896665010" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/Sls4mc1ZFdI/AAAAAAAAAXE/-pojqnBElfA/s1600-h/EAN-13.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 164px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/Sls4mc1ZFdI/AAAAAAAAAXE/-pojqnBElfA/s200/EAN-13.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5357938414913656274" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-3420074567297134782?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/3420074567297134782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/07/ean-barcode-programm-fur-casio.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3420074567297134782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3420074567297134782'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/07/ean-barcode-programm-fur-casio.html' title='EAN-Barcode-Programm für Casio Grafiktaschenrechner'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-C3w1uboIpk/SlsvEmjEOvI/AAAAAAAAAV4/hi0cJFRx5PI/s72-c/EAN-8.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-8241727959984986588</id><published>2009-05-23T20:57:00.002+02:00</published><updated>2009-09-07T17:11:56.247+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jabber'/><category scheme='http://www.blogger.com/atom/ns#' term='Pidgin'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='XMPP'/><title type='text'>Pidgin für Jabber-Dateitransfer einrichten</title><content type='html'>&lt;div style="text-align: justify;"&gt;Seit dem ich Linux nutze, versuche ich möglichst für alle neuen Kontakte Jabber nutzen. Allerdings bin ich auf einen Misstand aufmerksam geworden, der beispielsweise bei ICQ nicht auftritt: Der Dateitransfer funktioniert nicht richtig (zumindest wenn man hinter einem Router sitzt und NAT zuschlägt). Natürlich habe ich versucht das hinzubiegen und mir ist es glücklicherweise auch gelungen. Leider ist es nicht ganz so einfach wie mit proprietären Protokollen, aber was nicht ist, kann ja noch werden :)

Als Erstes muss man sich um einen Stun-Server kümmern, damit Pidgin die öffentliche IP herausfinden kann. Dazu öffnet man den Einstellungsdialog über »Werkzeuge &gt; Einstellungen« und wählt den Tab »Netzwerk« aus. Hier gibt man einen Stun-Server wie z.B. »stunserver.org« ein und lässt Pidgin die IP-Adresse automatisch bestimmen.
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/ShhFk0VeMWI/AAAAAAAAAHM/mp8mLt9t4nI/s1600-h/screenshot_001.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 306px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/ShhFk0VeMWI/AAAAAAAAAHM/mp8mLt9t4nI/s320/screenshot_001.png" alt="" id="BLOGGER_PHOTO_ID_5339093857074032994" border="0" /&gt;&lt;/a&gt;
Nun muss man noch eine Portweiterleitung aktivieren. Dazu gibt es zwei Wege, nämlich einmal den automatischen über UPnP (Universal Plug &amp;amp; Play) und einmal den manuellen. Allerdings sagt mir der UPnP-Weg wegen der mangelnden Sicherheit nicht zu. Wer dies dennoch möchte, muss UPnP bei seinem Router aktivieren und die Checkbox markieren.

Beim manuellen Weiterleiten stellt man einen festen Portbereich in Pidgin ein (»Port-Bereich, auf dem gelauscht werden soll, manuell bestimmen«). Dann öffnet man die Konfiguration des Routers und leitet die Ports an den Rechner weiter (»Port-Forwarding«).

Auch bei mehreren Rechnern im Netzwerk funktioniert es auch. Man stellt bei den verschiedenen Rechner verschiedene Port-Bereiche ein und leitet sie seperat an die Rechner weiter. So funktioniert es bei mir ebenfalls sehr gut.&lt;/div&gt;

Weitere Informationen:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ubuntufreunde.de/forum/2865/pidgin_und_jabber_dateitransfer_funktioniert_nicht.html"&gt;Ubuntufreun.de Beitrag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.pidgin.im/ticket/1768"&gt;Bugreport von Pidgin&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-8241727959984986588?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/8241727959984986588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/05/pidgin-fur-jabber-dateitransfer.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8241727959984986588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8241727959984986588'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/05/pidgin-fur-jabber-dateitransfer.html' title='Pidgin für Jabber-Dateitransfer einrichten'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-C3w1uboIpk/ShhFk0VeMWI/AAAAAAAAAHM/mp8mLt9t4nI/s72-c/screenshot_001.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-6475128835399352427</id><published>2009-05-07T20:33:00.004+02:00</published><updated>2010-03-08T16:35:57.964+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbook'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='GPS'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Netbook und GPS-Mouse mit Ubuntu</title><content type='html'>&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/SiqS16yfq0I/AAAAAAAAAH0/fV_kPBeqEjo/s1600-h/IMG_0121.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 200px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/SiqS16yfq0I/AAAAAAAAAH0/fV_kPBeqEjo/s200/IMG_0121.JPG" alt="" id="BLOGGER_PHOTO_ID_5344245362840283970" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;Ein nettes Zubehör für den Acer Aspire One ist eine GPS-Mouse, also einem GPS-Empfänger, der die zur Anzeige und Bearbeitung der Daten einen Computer voraussetzt. Die Wahl fiel dabei auf einen NaviLock NL-402U. Dieser unterstüzt auch das neue Galileo-Satellitensystem, welches in den kommenden Jahren aufgebaut werden soll. (Das geschieht übrigens per Firmware-Update und man benötigt wahrscheinlich mal wieder Windows.) Das Gerät funktioniert mit Ubuntu out-of-the-box und kann mit &lt;a href="http://wiki.ubuntuusers.de/Gpsd"&gt;gpsd&lt;/a&gt; angesteuert werden. Jedoch funktioniert der Befehl vom Ubuntuusers-Wiki bei mir nicht. Es fehlt der Parameter »-b«, denn dieser bewirkt, dass nur lesend auf das Gerät zugegriffen wird. Ohne diesen gibt es Probleme, zumindest bei mir. Der Befehl sieht demzufolge in voller Länge so aus:&lt;/div&gt;&lt;pre class="terminal"&gt;gpsd -b /dev/ttyACM0&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Der Dämon gpsd übermittelt die Daten jedoch lediglich an andere Programme, damit diese sich nicht um den GPS-Empfänger kümmern müssen. Ich habe hier mal eine kleine Programmliste zusammengestellt, die ich für nützlich empfinde:&lt;/div&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.tangogps.org/"&gt;TangoGPS&lt;/a&gt;&lt;/b&gt; - Nutzt verschiedene »Tile-Server« (unter anderem dem von OpenStreetMap.org) und stellt mit diesen die Karte dar. Es ist nicht zu Navigation geeignet, aber meiner Meinung nach des beste und einfachste Programm zur Positionsbestimmung. Bei Ubuntu kann es mit dem Paket »tangogps« installiert werden.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://wiki.openstreetmap.org/wiki/JTileDownloader"&gt;JTileDownloader&lt;/a&gt;&lt;/b&gt; - Mit dem Programmen lassen sich schnell und einfach die »Kacheln« von verschiedenen Bereichen herunterladen. Besonders praktisch für TangoGPS.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://www.navit-project.org/"&gt;Navit&lt;/a&gt;&lt;/b&gt; - Hiermit ist es möglich den Computer als Navigationsgerät zu nutzen (z.B. im Auto). Siehe auch den &lt;a href="http://wiki.ubuntuusers.de/Navit"&gt;Wikiartikel von Ubuntuusers&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/SiqVN517llI/AAAAAAAAAIM/qJNrHfKs9oI/s1600-h/screenshot_002.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 195px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/SiqVN517llI/AAAAAAAAAIM/qJNrHfKs9oI/s200/screenshot_002.png" alt="" id="BLOGGER_PHOTO_ID_5344247973926377042" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-6475128835399352427?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/6475128835399352427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/05/netbook-und-gps-mouse-mit-ubuntu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6475128835399352427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/6475128835399352427'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/05/netbook-und-gps-mouse-mit-ubuntu.html' title='Netbook und GPS-Mouse mit Ubuntu'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-C3w1uboIpk/SiqS16yfq0I/AAAAAAAAAH0/fV_kPBeqEjo/s72-c/IMG_0121.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4477534501599279751</id><published>2009-04-17T10:59:00.015+02:00</published><updated>2010-03-08T16:36:11.712+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jaunty Jackalope'/><category scheme='http://www.blogger.com/atom/ns#' term='acerfand'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Acer Aspire One'/><category scheme='http://www.blogger.com/atom/ns#' term='rc.local'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu »Jaunty Jackalope«, /etc/rc.local und acerfand</title><content type='html'>&lt;div style="text-align: justify;"&gt;Damit ich den Lüfter meines Acer Aspire Ones bei niedrigen Temperaturen ausschalten kann, nutze ich das Script &lt;a href="http://www.electronpusher.org/%7Erachel/acerfand"&gt;acerfand&lt;/a&gt; (Anleitung dazu &lt;a href="http://wiki.ubuntuusers.de/Baustelle/Acer_Aspire_One#Luefter"&gt;hier&lt;/a&gt; und &lt;a href="https://help.ubuntu.com/community/AspireOne"&gt;hier&lt;/a&gt;). Da ich das Script nicht immer beim Starten per Hand ausführen möchte, habe ich es in die Datei /etc/rc.local geschrieben (vor dem »exit 0«!). Das klappt auch sehr gut, zumindest mit Ubuntu »Intrepid Ibex«. Beim Testen von »Jaunty« fiel mir allerdings auf, dass das Script nicht mehr automatisch gestartet wird. Nach einiger Recherche im Internet habe ich auch &lt;a href="https://bugs.launchpad.net/ubuntu/+source/sysvinit/+bug/332210"&gt;diesen Bug-Report&lt;/a&gt; gefunden. Anscheinend wurde das Verhalten von /etc/rc.local in »Jaunty« geändert und das Script wird am Ende von der Ausführung von /etc/rc.local terminiert. Der Grund dafür ist der, dass es immer noch mit dem Terminal (tty) verbunden ist und wenn das Terminal geschlossen wird, dann wird auch das Script beendet. Eine einfache Möglichkeit ist das Benutzen von »start-stop-daemon«. Damit kann man das Script so starten, dass es komplett vom Terminal losgelöst wird. Dafür ist der Parameter »--background« zuständig (siehe &lt;a href="http://man.cx/start-stop-daemon%288%29/de"&gt;»man start-stop-daemon«&lt;/a&gt;).
Der komplette Befehl sieht demnach so aus: (acerfand muss sich in /usr/local/bin befinden!)
&lt;/div&gt;&lt;pre class="terminal"&gt;start-stop-daemon --start --name acerfand --startas /usr/local/bin/acerfand --background&lt;/pre&gt;
Die Datei /etc/rc.local könnte so aussehen:
&lt;pre class="terminal"&gt;#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

start-stop-daemon --start --name acerfand --startas /usr/local/bin/acerfand --background

exit 0&lt;/pre&gt;

&lt;div style="border: 1px solid red; padding: 1em; text-align: justify;"&gt;Achtung: Es ist wichtig, dass man die letzte Zeile des acerfand-Scriptes von »govern &amp;amp;« nach »govern« ändert, da der Workaround ansonsten nicht funktioniert!&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;Vielen Dank an Tobias Mahs für sein Feedback. Ansonsten hätte ich auf den Sachverhalt mit dem »&amp;amp;« nicht geachtet. ;-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4477534501599279751?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4477534501599279751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/04/ubuntu-jaunty-jackalope-etcrclocal-und.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4477534501599279751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4477534501599279751'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/04/ubuntu-jaunty-jackalope-etcrclocal-und.html' title='Ubuntu »Jaunty Jackalope«, /etc/rc.local und acerfand'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2029019470479827306</id><published>2009-03-23T20:32:00.007+01:00</published><updated>2009-04-17T12:51:20.720+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Feedreader'/><category scheme='http://www.blogger.com/atom/ns#' term='Liferea'/><title type='text'>Liferea - Linux Feedreader</title><content type='html'>&lt;div style="text-align: justify;"&gt;Bisher habe ich meine Feeds immer als Lesezeichen im Firefox gespeichert, doch mit der Zeit wurde das zu unkomfortabel und zu unübersichtlich, so dass ich nach einem anderen Programm geschaut habe. Das habe ich auch recht schnell gefunden, nämlich Liferea. Diese Anwendung ist sehr übersichtlich und nun macht das Feed lesen wieder Spaß : )
Nach dem Start platziert es sich im System-Tray und zeigt an, wenn neue Nachrichten verfügbar sind. Es hat eine integrierte HTML-Vorschau und startet auf Wunsch den Browser um die Nachricht darin zu betrachten.
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/ScfmMp5MuWI/AAAAAAAAAGs/UcqIHvVOjUs/s1600-h/screenshot_Liferea.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 242px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/ScfmMp5MuWI/AAAAAAAAAGs/UcqIHvVOjUs/s320/screenshot_Liferea.png" alt="" id="BLOGGER_PHOTO_ID_5316470990212741474" border="0" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2029019470479827306?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2029019470479827306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/03/liferea-gnome-feedreader.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2029019470479827306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2029019470479827306'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/03/liferea-gnome-feedreader.html' title='Liferea - Linux Feedreader'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-C3w1uboIpk/ScfmMp5MuWI/AAAAAAAAAGs/UcqIHvVOjUs/s72-c/screenshot_Liferea.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-4572871859583357313</id><published>2009-03-23T19:41:00.009+01:00</published><updated>2009-09-07T17:12:15.820+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Jaunty'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Upgrade'/><title type='text'>Upgrade auf Jaunty</title><content type='html'>&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-C3w1uboIpk/ScffJCkRWoI/AAAAAAAAAFg/gRboqNjIiQc/s1600-h/ubuntulogo.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 54px; height: 55px;" src="http://3.bp.blogspot.com/_-C3w1uboIpk/ScffJCkRWoI/AAAAAAAAAFg/gRboqNjIiQc/s320/ubuntulogo.png" alt="" id="BLOGGER_PHOTO_ID_5316463231534979714" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;Schon gestern habe ich mich dazu entschieden mein Desktopsystem von Ubuntu 8.10 »Intrepid Ibex« auf 9.04 »Jaunty Jackalope«. Ich habe auf dem Netbook und auf dem Desktop schon lange Jaunty auf einer seperaten Partition installiert, jedoch wollte ich jetzt mit dem Hauptsystem umsteigen. (Ich empfehle keinem, der nicht wirklich weiß was er tut, diesen Schritt zu gehen. Ubuntu »Jaunty Jackalope« ist momentan immer noch in Entwicklung und wird erst Ende April 2009 freigegeben!) Allerdings wurde ich gestern nicht mehr ganz fertig da noch allerhand heruntergeladen werden musste. Heute habe ich mir das System passend eingerichtet und musste feststellen, dass Jaunty viele kleine Verbesserungen bekommen hat, die das Arbeiten spürbar erleichtern. Als erstes habe ich mir erstmal den nVidia-Treiber installiert, damit alles wieder flüssig dargestellt wird und Compiz ordentlich funktioniert. Bei mir ist Jaunty spürbar schneller, so dass das Hochfahren und das Anmelden sehr schnell vonstatten geht. Das neue Benachrichtigungssystem ist in meinen Augen sehr gut gelungen und stört beim Arbeiten kaum. Viele Programme wurden aktualisiert und so ist jetzt Gnome 2.26 an Bord.
Nur das Design ist in meinen Augen noch nicht so gelungen. Ich finde, dass der schwarze GDM-Anmeldebildschirm nicht unbedingt zu Ubuntu passt und das alte USplash-Theme gefiel mir auch besser. Das ist jedoch Geschmackssache und mir gefällt Jaunty trotzdem sehr gut. Und das Design wird in der nächsten Ubuntu-Version 9.10 »Karmic Koala« noch einmal stark überarbeitet.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-4572871859583357313?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/4572871859583357313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/03/upgrade-auf-jaunty.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4572871859583357313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/4572871859583357313'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/03/upgrade-auf-jaunty.html' title='Upgrade auf Jaunty'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-C3w1uboIpk/ScffJCkRWoI/AAAAAAAAAFg/gRboqNjIiQc/s72-c/ubuntulogo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-3030964659648003706</id><published>2009-03-02T14:07:00.004+01:00</published><updated>2009-03-02T14:32:38.935+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Xfce'/><category scheme='http://www.blogger.com/atom/ns#' term='gWallpapers'/><title type='text'>Xfce 4.6 freigeben</title><content type='html'>&lt;div style="text-align: justify;"&gt;Die lang erwartete neue Xfce-Version 4.6 ist endlich erschienen. Leider habe ich mich erst vor kurzem entschlossen, dass gesamte Modul-System aus &lt;a href="https://sites.google.com/site/haliner/gwallpapers/gwallpapers-de"&gt;gWallpapers&lt;/a&gt; zu entfernen, so dass es nur noch das Hintergrundbild in einem Gnome-System auswechseln kann. Dabei scheint die neue Version mir deutlich entgegenzukommen: Statt dem ehemals verwendeten MCS wird jetzt Xfconf verwendet. Dieser scheint sich an dem in Gnome verwendeten Gconf zu orientieren. Für mich würde dies bedeuten, dass ich das Hintergrundbild in Xfce wahrscheinlich doch explizit setzen kann.

Ich selbst nutze Xfce momentan nicht, bin aber durchaus interessiert. Eventuell werde ich das mal auf dem Acer Aspire One testen. Die bisherigen Xfce-Version trafen nicht ganz meinen Geschmack, aber die neuen Funktionen, welche in der &lt;a href="http://www.xfce.org/about/tour"&gt;Xfce 4.6 Tour&lt;/a&gt; vorgestellt werden, sehen nicht schlecht aus.

Weitere Informationen zu Xfce 4.6 findet man auch im &lt;a href="http://ikhaya.ubuntuusers.de/2009/03/02/linux-desktop-xfce-in-version-4.6-erschienen/"&gt;Ikhaya&lt;/a&gt; von ubuntuusers.de.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-3030964659648003706?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/3030964659648003706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/03/xfce-46-freigeben.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3030964659648003706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/3030964659648003706'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/03/xfce-46-freigeben.html' title='Xfce 4.6 freigeben'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-2730344936132819566</id><published>2009-01-12T20:25:00.010+01:00</published><updated>2009-09-07T17:12:22.480+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Last.fm'/><category scheme='http://www.blogger.com/atom/ns#' term='VagaMule'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>VagaMule - der Last.fm Esel</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-C3w1uboIpk/SWufCue9ibI/AAAAAAAAAEA/KDKCQw8jfak/s1600-h/vagamule.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 128px; height: 128px;" src="http://1.bp.blogspot.com/_-C3w1uboIpk/SWufCue9ibI/AAAAAAAAAEA/KDKCQw8jfak/s320/vagamule.png" alt="" id="BLOGGER_PHOTO_ID_5290497056463227314" border="0" /&gt;&lt;/a&gt;Last.fm ist für viele Leute ein Begriff. Es ist ein Portal, bei dem man nach vielen Interpreten oder Titel suchen und diese anhören kann. Der Dienst ist komplett kostenlos und das Musik-Archiv ist riesig. Das Erfolgsrezept stammt vom Radio: Der Nutzer kann nach einem Interpreten suchen, hat aber keinen direkten Einfluss auf die Playlist. Man hört dabei immer die Titel, die so &lt;span style="font-style: italic;"&gt;ähnlich&lt;/span&gt; sind wie die gesuchten. So kann man auch nach anderen Interpreten suchen, die ähnliche Musik machen.

Einer der Last.fm-Clienten für Linux ist »Vagalume«. Er ist sehr einfach zu bedienen. Für alle Interessierten, hier ein Link zur &lt;a href="http://vagalume.igalia.com/"&gt;Homepage&lt;/a&gt; bzw. zum &lt;a href="http://wiki.ubuntuusers.de/Vagamule"&gt;ubuntuusers-Wiki&lt;/a&gt;.

Der Benutzer »zebob« aus dem &lt;a href="http://ubuntuusers.de/"&gt;ubuntuusuers-Portal&lt;/a&gt; hat einen Patch für LastExit (ein anderer Last.fm-Client) und Vagalume geschrieben. Dieser bewirkt, dass die angehörten Titel auch als Musik-Stream auf der Festplatte landen. Dieser Patch wurde allerdings von den Autoren von Vagalume nicht  übernommen, da das Aufzeichnen von Radio-Sendungen (wozu Last.fm zählt) in vielen Ländern nicht legal ist.

Daraus entstand ein Fork von Vagalume, welcher »VagaMule« genannt wurde. Der Patch (und andere) wurde in diese Version übernommen.

Die Verwendung dieses Programms ist in Deutschland nach dem Urhebergesetz §53 legal! (In anderen Ländern sollten Sie vorher selber recherchieren.)

Die neuste Version findet man auf &lt;a href="http://mtrons.googlepages.com/vagalume"&gt;dieser Seite&lt;/a&gt; und eine Anleitung für Ubuntu findet man im&lt;a href="http://wiki.ubuntuusers.de/Vagamule"&gt; ubuntuusers-Wiki&lt;/a&gt;.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/SWugO5UnFXI/AAAAAAAAAEI/dLoOrkED2l0/s1600-h/vagamule-1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 173px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/SWugO5UnFXI/AAAAAAAAAEI/dLoOrkED2l0/s320/vagamule-1.png" alt="" id="BLOGGER_PHOTO_ID_5290498365042660722" border="0" /&gt;&lt;/a&gt;

Diese beiden Projekte sowie das Last.fm-Projekt finde ich sehr interessant und ich habe schon viele neue Interpreten kennen gelernt. Ich denke, dass dadurch gerade unbekannte Künstler unterstützt werden, denn der ein oder andere (wie ich) wird auf sie aufmerksam und kauft sich ab und zu eine neue CD.

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-2730344936132819566?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/2730344936132819566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/01/vagamule-der-lastfm-esel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2730344936132819566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/2730344936132819566'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/01/vagamule-der-lastfm-esel.html' title='VagaMule - der Last.fm Esel'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-C3w1uboIpk/SWufCue9ibI/AAAAAAAAAEA/KDKCQw8jfak/s72-c/vagamule.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-8489389325434285689</id><published>2009-01-12T15:35:00.001+01:00</published><updated>2009-09-07T17:12:28.877+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbook'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Fedora'/><category scheme='http://www.blogger.com/atom/ns#' term='Acer Aspire One'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Acer Aspire One A150L</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Zum letzten Weihnachtsfest habe ich einen Acer Aspire One geschenkt bekommen. Die vorinstallierte Linux-Distribution ist nicht schlecht, allerdings ist sie für mich etwas ungewohnt. Ich habe Ubuntu 8.10 »Intrepid Ibex« und Fedora 10 »Cambridge« darauf installiert. Das funktionierte alles ohne Probleme. Kleinigkeiten funktionieren manchmal noch nicht ganz. Für Ubuntu gibt es ein sehr gutes Wiki, wo unter anderem auch beschrieben wird, wie man Ubuntu am besten für den Acer Aspire One startklar macht. Hier ein &lt;a href="http://wiki.ubuntuusers.de/Baustelle/Acer_Aspire_One"&gt;Link zu dem Artikel&lt;/a&gt;.

Die Verarbeitung des Netbooks finde ich einfach nur klasse. Der Display ist wunderbar. Obwohl er nicht matt ist, spiegelt er nicht zu stark. Ich denke, er eignet sich auch für einen Einsatz im Freien. (Zugegeben, getestet habe ich es noch nicht. Aber -20 °C möchte ich ihm im Moment nicht zumuten :)) Auch die Tastatur ist hervorragend.

Obwohl das Display relativ klein ist, lässt sich mit dem Netbook gut arbeiten. Ich habe allerdings die Schriftgröße von 10 px auf 8 px herunter gesetzt. So passen bedeutend mehr Inhalte darauf.

Hier noch ein Bild des Netbooks, sowie ein Screenshot des tuxigen Desktops:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/SWtTzhZwhAI/AAAAAAAAADw/gt-wonvwZck/s1600-h/Netbook.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 181px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/SWtTzhZwhAI/AAAAAAAAADw/gt-wonvwZck/s200/Netbook.jpg" alt="" id="BLOGGER_PHOTO_ID_5290414331881620482" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-C3w1uboIpk/SWtT00RrALI/AAAAAAAAAD4/h5QxOSfgP2s/s1600-h/Desktop.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 117px;" src="http://4.bp.blogspot.com/_-C3w1uboIpk/SWtT00RrALI/AAAAAAAAAD4/h5QxOSfgP2s/s200/Desktop.png" alt="" id="BLOGGER_PHOTO_ID_5290414354127847602" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-8489389325434285689?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/8489389325434285689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/01/acer-aspire-one-a150l_11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8489389325434285689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/8489389325434285689'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/01/acer-aspire-one-a150l_11.html' title='Acer Aspire One A150L'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-C3w1uboIpk/SWtTzhZwhAI/AAAAAAAAADw/gt-wonvwZck/s72-c/Netbook.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5225187212028091396.post-7793587882536311975</id><published>2009-01-11T19:43:00.006+01:00</published><updated>2009-01-12T15:19:29.794+01:00</updated><title type='text'>Erster Post</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ich habe mich heute dazu entschlossen, dieses Blog zu eröffnen.

Hauptsächlich soll es bei den Beiträgen um meine aktuellen Projekte, Ubuntu oder andere Linux-Distributionen gehen. Linux ist eine tolle Sache und es gibt immer wieder tolle Neuigkeiten. Ich nutze Linux schon seit mehreren Jahren und bin damit gänzlich zufrieden.

Allerdings erstmal etwas zu meiner Person: Ich heiße Stefan Haller und bin am 29.09.1992 geboren (im Moment also 16 Jahre alt). Ich gehe auf ein Gymnasium. Vor allem die naturwissenschaftlichen Fächer begeistern mich dabei sehr. Schon früh begann ich mich mit Computern zu beschäftigen. Irgendwann brachte mir dann mein Onkel das Programmieren bei. Zur damaligen Zeit nutzte ich noch Windows. Jahre vergingen und ich stieß auf Linux. Ich habe mich schon öfters für Linux interessiert, der Umstieg gelang mir aber erst vor ein paar Jahren. Seitdem nutze ich komplett Linux (vor allem Ubuntu). Ein Wechsel zurück kommt für mich nicht mehr in Frage. Ich vermisse gar nichts! Schon alleine die freundliche Community, die sich um jede Linux-Distribution gebildet hat ist einfach nur Spitze! Die Programme finde ich viel besser. Das Open-Source-Modell zeigt hier seine Stärken. Seitdem stelle ich meine Software ebenfalls zur freien Verfügung und nehme auch an dem ein oder anderem Projekt teil.

Ich werde hier in eher unregelmäßigen Abständen etwas zu den verschiedenen Linux-Distributionen  schreiben. Außerdem finde ich manchmal neue Software, welche ich hier auch vorstellen möchte. Zu guter Letzt möchte ich hier auch noch Informationen zu meinen Projekte verbreiten.

Ich hoffe der ein oder andere findet hier ein paar interessante Neuigkeiten.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5225187212028091396-7793587882536311975?l=haliner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haliner.blogspot.com/feeds/7793587882536311975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://haliner.blogspot.com/2009/01/erster-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7793587882536311975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5225187212028091396/posts/default/7793587882536311975'/><link rel='alternate' type='text/html' href='http://haliner.blogspot.com/2009/01/erster-post.html' title='Erster Post'/><author><name>Stefan Haller</name><uri>http://www.blogger.com/profile/05091005507107881323</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
