<?xml version="1.0" encoding="utf-8"?>
    <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
      <channel>
        <title>Jochem van der Vorm</title>
        <link>http://vorm.net</link>
        <description>
            Personal musings and rants on life, culture, music and technology
        </description>
        <generator>vorm.net rss-generator</generator>
        <pubDate>Fri, 04 Jul 2008 19:58:54 +0200</pubDate>
    <item>
      <title>Ubuntu Hardy Heron</title>
      <link>http://vorm.net/ubuntu_hardy_heron</link>
      <guid isPermaLink="true">http://vorm.net/ubuntu_hardy_heron</guid>
      <category>personal</category>
      <category>linux</category>
      <category>photos</category>
      <category>web</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Today I installed Ubuntu Hardy Heron on a desktop computer.
I am pretty distro/desktop agnostic (see  my ten year
anniversary post), but since Debian Etch is a bit old for a desktop and Hardy Heron has Long 
Term Support (I do not want to update/fix a computer every half year!!) Ubuntu was my choice.

 There are unlimited gnome improvements which I don't care about, but some things 
stand out for me in this release. 

 

   Firefox 3 is much better than 2. The memory improvements and
  the renewed linux (gtk) focus helps. And luckily you can disable the stupid new urlbar in
  about:config  with browser.urlbar.maxRichResults = 0 . 

   The way non-free installation for media-playback, video drivers and browser plugins
  is handled, is sweet! The installation of this software is painless here. I even got a nice
  64-bit(!) Java firefox plugin, which I was unable to install in Debian (thanks redhat/icedtea). 

   And most important: the colors in the gnome-terminal are smoothened.  Now that is what _I_
  call eye candy (see screenshot below). Less work and much more satisfaction than the integrated
  compiz.real ;-). 



 



So thanks again for all free software developers!      </description>
      <content:encoded><![CDATA[

<p> Today I installed <a href="http://www.ubuntu.com">Ubuntu Hardy Heron</a> on a desktop computer.
I am pretty distro/desktop agnostic (see <a href="http://vorm.net/10_years_gnu_linux"> my ten year
anniversary post</a>), but since <a href="http://www.debian.org
">Debian Etch</a> is a bit old for a desktop and Hardy Heron has Long 
Term Support (I do not want to update/fix a computer every half year!!) Ubuntu was my choice.</p>

<p> There are unlimited gnome improvements which I don't care about, but some things 
stand out for me in this release. </p>

<ul> 

  <li> <a href="http://mozilla.org">Firefox 3</a> is much better than 2. The memory improvements and
  the renewed linux (gtk) focus helps. And luckily you can disable the stupid new urlbar in
  <tt>about:config</tt>  with <tt>browser.urlbar.maxRichResults = 0 </tt>.</li> 

  <li> The way <tt>non-free</tt> installation for media-playback, video drivers and browser plugins
  is handled, is sweet! The installation of this software is painless here. I even got a nice
  64-bit(!) Java firefox plugin, which I was unable to install in Debian (thanks <a
  href="http://icedtea.classpath.org/wiki/Main_Page">redhat/icedtea</a>).</li> 

  <li> And most important: the colors in the gnome-terminal are smoothened.  Now that is what _I_
  call eye candy (see screenshot below). Less work and much more satisfaction than the integrated
  compiz.real ;-).</li> 

</ul>

<p style="text-align:center"> 
<img src='http://vorm.net/site/images/gnome-terminal.jpg' style='width:710;border-style: none' alt='screenshot,background Leiden (by Jochem)' />
</p>

<p>So thanks again for all free software developers!</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Helping the environment</title>
      <link>http://vorm.net/helping_the_environment</link>
      <guid isPermaLink="true">http://vorm.net/helping_the_environment</guid>
      <category>music</category>
      <category>linux</category>
      <category>science</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>A lot of work is done in making linux suspend work better. For me it works perfect (from linux
kernel 2.6.20 or so). Therefore I wanted to go a step further and let my class A, heavy power-using
receiver switch off when my desktop computer suspends (to ram).  And switch back on when my computer
wakes up. The motivation is that I only listen music via my computer.

To achieve this  I bought the Gembird Silver Shield, a USB-switchable power adapter.  I was
prepared to do some nice USB snooping and C programming to get this device working in linux, but
(un)fortunately there was already a working utility
for this device.

Configuration for suspend/hibernate is not so easy and documentation is sparse for the user mode
utilities. Since it took me more than the usual googling I will summarize my conclusions here for
later use. First the gnome-screensaver measures the idle time. After this timeout is expired the
gnome-power-manager starts to measure his own timeout (so before suspend the two times will stack).
When the gnome-power-manager times out it will look at the Inhibit flag. If there is no inhibiting (for
example my rhythmbox pushes Inhibiting, because I do not want to suspend when music is playing) your
computer will suspend.  

Since a custom script should be added to switch the power-switch off via usb with
sispmctl the suspend-backend is important. Gnome power manager can use multiple backends to
go to suspend mode. This works via hal (the hardware abstraction layer). Configuration for
this is in /usr/share/hal/information. HAL is responsible for calling the suspend-backend.
The default suspend-backend on my machine is pm-utils.  (which can be tested with
pm-(suspend/hibernate/power-save etc.). I also have a package called hibernate (which can
also suspend, confusing isnt' it?). A third one is suspend2 (which can also hibernate....).
These backends have different ways of adding custom hooks.

 To add a hook to hibernate I added a file called local in
/etc/hibernate/scriptlets.d/. The API is as follows (ugly in my book):


# -*- sh -*-

UsbPowerSocketDown() {
      /usr/bin/sispmctl -f1
}
UsbPowerSocketUp() {
      /usr/bin/sispmctl -o1
}

AddUsbOptions() {
      AddSuspendHook 10 UsbPowerSocketDown
      AddResumeHook 10 UsbPowerSocketUp
      return 0
}

AddUsbOptions


Pm-utils has a much nicer API. To add a custom hook add a file to /etc/pm/sleep.d . This
uses init style ordering. So look in /usr/lib/pm-utils/sleep.d/ for a proper number.  I
needed to talk to the usb-bus AFTER the modules were loaded, so a number lower than 50.  So I added
/etc/pm/sleep.d/10usbpoweroptions with content like this: 


#!/bin/bash
case $1 in
    suspend)
        /usr/bin/sispmctl -f1 
    ;;
    resume)
        sleep 1
        /usr/bin/sispmctl -o1 
    ;;
esac


After all this fiddling it works like a charm! Now hopefully one standard will emerge; because
how to achieve the same result with KDE I don't know. I had to manually patch rhythmbox to change
calling (via dbus) the Inhibit method from org.gnome.powermanager to
org.freedesktop.powermanagement
(because i used a wrong combination of versions..), so this suggests a move in the right
direction.      </description>
      <content:encoded><![CDATA[

<p>A lot of work is done in making linux suspend work better. For me it works perfect (from linux
kernel 2.6.20 or so). Therefore I wanted to go a step further and let my class A, heavy power-using
receiver switch off when my desktop computer suspends (to ram).  And switch back on when my computer
wakes up. The motivation is that I only listen music via my computer.</p>

<p>To achieve this  I bought the Gembird Silver Shield, a USB-switchable power adapter.  I was
prepared to do some nice USB snooping and C programming to get this device working in linux, but
(un)fortunately there was already a <a href="http://sispmctl.sourceforge.net/">working utility</a>
for this device.</p>

<p>Configuration for suspend/hibernate is not so easy and documentation is sparse for the user mode
utilities. Since it took me more than the usual googling I will summarize my conclusions here for
later use. First the gnome-screensaver measures the idle time. After this timeout is expired the
gnome-power-manager starts to measure his own timeout (so before suspend the two times will stack).
When the gnome-power-manager times out it will look at the Inhibit flag. If there is no inhibiting (for
example my rhythmbox pushes Inhibiting, because I do not want to suspend when music is playing) your
computer will suspend.  </p>

<p>Since a custom script should be added to switch the power-switch off via usb with
<tt>sispmctl</tt> the suspend-backend is important. Gnome power manager can use multiple backends to
go to suspend mode. This works via <tt>hal</tt> (the hardware abstraction layer). Configuration for
this is in <tt>/usr/share/hal/information</tt>. HAL is responsible for calling the suspend-backend.
The default suspend-backend on my machine is <tt>pm-utils</tt>.  (which can be tested with
pm-(suspend/hibernate/power-save etc.). I also have a package called <tt>hibernate</tt> (which can
also suspend, confusing isnt' it?). A third one is <tt>suspend2</tt> (which can also hibernate....).
These backends have different ways of adding custom hooks.</p>

<p> To add a hook to hibernate I added a file called <tt>local</tt> in
<tt>/etc/hibernate/scriptlets.d/</tt>. The API is as follows (ugly in my book):
</p>
<pre>
# -*- sh -*-

UsbPowerSocketDown() {
      /usr/bin/sispmctl -f1
}
UsbPowerSocketUp() {
      /usr/bin/sispmctl -o1
}

AddUsbOptions() {
      AddSuspendHook 10 UsbPowerSocketDown
      AddResumeHook 10 UsbPowerSocketUp
      return 0
}

AddUsbOptions
</pre>

<p>Pm-utils has a much nicer API. To add a custom hook add a file to <tt>/etc/pm/sleep.d</tt> . This
uses init style ordering. So look in <tt>/usr/lib/pm-utils/sleep.d/</tt> for a proper number.  I
needed to talk to the usb-bus AFTER the modules were loaded, so a number lower than 50.  So I added
<tt>/etc/pm/sleep.d/10usbpoweroptions</tt> with content like this: </p>

<pre>
#!/bin/bash
case $1 in
    suspend)
        /usr/bin/sispmctl -f1 
    ;;
    resume)
        sleep 1
        /usr/bin/sispmctl -o1 
    ;;
esac
</pre>

<p>After all this fiddling it works like a charm! Now hopefully one standard will emerge; because
how to achieve the same result with KDE I don't know. I had to manually patch rhythmbox to change
calling (via dbus) the Inhibit method from <tt>org.gnome.powermanager</tt> to
<tt>org.freedesktop.powermanagement</tt>
(because i used a wrong combination of versions..), so this suggests a move in the right
direction.</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Good 2008 to everyone</title>
      <link>http://vorm.net/good_2008_to_everyone</link>
      <guid isPermaLink="true">http://vorm.net/good_2008_to_everyone</guid>
      <category>holiday</category>
      <category>personal</category>
      <category>photos</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>There is only one week between this picture and the one below.... The trick is of course the
invention of the aeroplane, which enabled me to make a trip to Egypt, a wonderful country. See more soon in my photo section of this site.

Anyway, good 2008 to everyone!      </description>
      <content:encoded><![CDATA[

<p>
<img src='http://vorm.net/site/images/egypte.jpg' style='width:95%;border-style: none' alt='desert in egypt, by
Jochem' />
There is only one week between this picture and the one below.... The trick is of course the
invention of the aeroplane, which enabled me to make a trip to Egypt, a wonderful country. See more soon in <a
href="http://vorm.net/photos/">my photo section</a> of this site.
</p>
<p>Anyway, good 2008 to everyone!</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Happy holidays</title>
      <link>http://vorm.net/happy_holidays</link>
      <guid isPermaLink="true">http://vorm.net/happy_holidays</guid>
      <category>holiday</category>
      <category>personal</category>
      <category>photos</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>From a snowy Leiden I wish you pleasant holidays and a good 2008!      </description>
      <content:encoded><![CDATA[

<p>
<img src='http://vorm.net/site/images/leiden_thumb.jpg' style='width:95%;border-style: none' alt='Snow in
Leiden, by Jochem' />
<br/>
From a snowy Leiden I wish you pleasant holidays and a good 2008!
</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Qemu/kvm and xorg screen resolution</title>
      <link>http://vorm.net/qemu_and_xorg_screen_resolution</link>
      <guid isPermaLink="true">http://vorm.net/qemu_and_xorg_screen_resolution</guid>
      <category>linux</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Fast virtualization is cheap nowadays on linux. Just apt-get install kvm on a recent kernel and
VT-enabled processor and you are ready to run all kind of different os-es on
your host. No more recompiling the vmware kernel modules *again* or fiddling with xen-modified
kernels and difficult networking setups. Yeah! 

One problem I encountered was getting a decent resolution (f.g. 1280x1024 or higher) in the guest
xserver (xorg). Google was not really helpful this time so therefore I post this note for future
reference. Qemu emulates two kind of video cards,
standard is a cirrus, -std-vga provides you with a vesa one. Vesa was not able to help me (garbled
screen), so using the (default) cirrus emulator is the way to go for a linux guest.

The trick was in changing the monitor sync and refresh rates, autodetection did not work properly
(in my centos 4.0 guest). So here is my working snippet of /etc/X11/xorg.conf:



Section "Device"
  Identifier  "Generic Video Card"
  Driver      "cirrus"
EndSection

Section "Monitor"
  Identifier  "Generic Monitor"
  Option    "DPMS"
  HorizSync 28-64
  VertRefresh 43-60
EndSection      </description>
      <content:encoded><![CDATA[

<p>Fast virtualization is cheap nowadays on linux. Just <tt>apt-get install kvm</tt> on a recent kernel and
VT-enabled processor and you are ready to run all kind of different <a href="http://oszoo.org">os-es</a> on
your host. No more recompiling the vmware kernel modules *again* or fiddling with xen-modified
kernels and difficult networking setups. Yeah!</p> 

<p>One problem I encountered was getting a decent resolution (f.g. 1280x1024 or higher) in the guest
xserver (xorg). Google was not really helpful this time so therefore I post this note for future
reference. <a href="http://fabrice.bellard.free.fr/qemu/">Qemu</a> emulates two kind of video cards,
standard is a cirrus, -std-vga provides you with a vesa one. Vesa was not able to help me (garbled
screen), so using the (default) cirrus emulator is the way to go for a linux guest.</p>

<p>The trick was in changing the monitor sync and refresh rates, autodetection did not work properly
(in my centos 4.0 guest). So here is my working snippet of <tt>/etc/X11/xorg.conf</tt>:
</p>

<pre>
Section "Device"
  Identifier  "Generic Video Card"
  Driver      "cirrus"
EndSection

Section "Monitor"
  Identifier  "Generic Monitor"
  Option    "DPMS"
  HorizSync 28-64
  VertRefresh 43-60
EndSection
</pre>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>10 years GNU/Linux</title>
      <link>http://vorm.net/10_years_gnu_linux</link>
      <guid isPermaLink="true">http://vorm.net/10_years_gnu_linux</guid>
      <category>linux</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>I am using
GNU/Linux for 10 years! As a celebration I made a white chocolate cake (recept) with tux on it. Thanks to all the volunteers for this great
combination of free software. In the past I have used all major distributions, nowadays I am stuck
with Debian. In fact I am rather distro-agnostic, if it 
runs xterm, screen, vim, mplayer, gcc and mutt I am happy. Pro is the nice Debian philosophy, 
con the fact that is has not incorporated SElinux yet. So perhaps I will switch in the next 10 years
again?


Sidenote for R. Stallman: when i am using gnu/linux 25 years I promise to make a gnu cake :-D.      </description>
      <content:encoded><![CDATA[

<p><img src='http://vorm.net/site/images/tuxcake.jpg' style='padding-left:14px; float:right' alt='' /> I am using
GNU/Linux for 10 years! As a celebration I made a white chocolate cake (<a
href="http://vorm.net/recept/143">recept</a>) with tux on it. Thanks to all the volunteers for this great
combination of free software. In the past I have used all major distributions, nowadays I am stuck
with <a href="http://www.debian.org">Debian</a>. In fact I am rather distro-agnostic, if it 
runs xterm, screen, vim, mplayer, gcc and mutt I am happy. Pro is the nice Debian philosophy, 
con the fact that is has not incorporated SElinux yet. So perhaps I will switch in the next 10 years
again?
</p>

<p>Sidenote for R. Stallman: when i am using gnu/linux 25 years I promise to make a <a
href="http://www.gnu.org/graphics/agnuhead.html">gnu</a> cake :-D.</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Older again</title>
      <link>http://vorm.net/older_again</link>
      <guid isPermaLink="true">http://vorm.net/older_again</guid>
      <category>personal</category>
      <category>photos</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Last saturday I lost/gained another year depending on your worldview.
Anyway, had a good day between the apes.      </description>
      <content:encoded><![CDATA[

<p><img src='http://vorm.net/photos/apenheul/thumbs/img-3.jpg' style='padding-left:14px; float:right' alt='' />
Last saturday I lost/gained another year depending on your worldview.
Anyway, had a good day between the <a href="http://vorm.net/photos/apenheul">apes</a>.
</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Alsa versus OSS</title>
      <link>http://vorm.net/alsa_versus_oss</link>
      <guid isPermaLink="true">http://vorm.net/alsa_versus_oss</guid>
      <category>linux</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Last week I read a thread on the
mplayer-dev mailinglist. It was about setting the default sound output from Alsa to OSS. It is now
OSS for a default compile of the tarball. However OSS is deprecated in linux AND in almost all
distributions that ship mplayer (my favorite media player) set the default output to Alsa.

Most in charge mplayer developers are pro OSS and do not want to switch. One of the arguments is
that OSS is now GPL and is used other unices as well . There are also arguments about library vs.
unix semantics. Alsa has an OSS compatibility mode (actually two, one in-kernel and one in-library).
However using this blocks soft-mixing. This means that another program playing sounds can not do
this while using default mplayer compile. 

Both sides have some good arguments (i truly understand the points for OSS!, it is just not
realistic), but discussing them in this context is useless and the way it is done on this
mailing-list is very childish and out of reality. Mplayer should set Alsa as default output for
linux, because 1) all major distributions do this and do this with good reason: 2) OSS in linux is
deprecated. Reading this thread made me feel tired of (the immaturity of) the open source scene.

But today I am a happy guy again. Some troll suggested removing Alsa from the linux kernel and I
was afraid of another useless thread. However I found a message from Takashi (one
of Alsa's most productive driver and patchwriters:


Honestly, I'm not fully against changing the current code base (or
crap, whatever, any childish name). There are indeed many misdesigns.
But, replacing with the above is no option, IMO. The OSS have also
many misdesigns, so the same argument would start again. One should
learn something from history...

Anyway, if it's going to be more constructive, I'm willing to join in.

Takashi




Hannu (the main OSS developer)
then said this: 


We have no intention to push OSS back to the kernel or to replace ALSA. That alternative is not
realistic any more. In addition OSS is a cross-platform product and staying more or less outside
various kernel trees should provide better flexibility.

What we would like to push is that the old "deprecated" OSS/Free are removed from the kernel.
OSS/Free is based on about years old OSS API version which was too limited for many applications.
Having OSS/Free in the kernel doesn't serve any purpose.

Also we would like to stop the silly OSS vs ALSA war. OSS and ALSA are rather different. Both of
them have some good points and bad points. For ordinary users it doesn't matter which API is used by
the applications as long as they work. Just the application developers can see the real difference.
Some of them prefer OSS while some other prefer ALSA and this should be their "freedom of choice".

I think the ideal solution would be that both ALSA and OSS APIs can co-exist by sharing the same low
level drivers (which has already been demonstrated). The low level driver interfaces in both systems
are practically identical. This means that ALSA's core can work with OSS' drivers and vice versa.

Today both OSS and ALSA teams have to spend significant amounts of time in emulating the "alien"
APIs. Making OSS and ALSA to co-exist will require some work in both sides but that should be
nothing when compared to the effort required for emulation.

Just my 2 cents.

Best regards,
Hannu


Fortunately there are still a lot of sane people in the community. Thanks!      </description>
      <content:encoded><![CDATA[

<p>Last week I read a <a
href="http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2007-May/thread.html">thread</a> on the
mplayer-dev mailinglist. It was about setting the default sound output from Alsa to OSS. It is now
OSS for a default compile of the tarball. However OSS is deprecated in linux AND in almost all
distributions that ship mplayer (my favorite media player) set the default output to Alsa.</p>

<p>Most in charge mplayer developers are pro OSS and do not want to switch. One of the arguments is
that OSS is now GPL and is used other unices as well . There are also arguments about library vs.
unix semantics. Alsa has an OSS compatibility mode (actually two, one in-kernel and one in-library).
However using this blocks soft-mixing. This means that another program playing sounds can not do
this while using default mplayer compile. </p>

<p>Both sides have some good arguments (i truly understand the points for OSS!, it is just not
realistic), but discussing them in this context is useless and the way it is done on this
mailing-list is very childish and out of reality. Mplayer should set Alsa as default output for
linux, because 1) all major distributions do this and do this with good reason: 2) OSS in linux is
deprecated. Reading this thread made me feel tired of (the immaturity of) the open source scene.</p>

<p>But today I am a happy guy again. Some troll suggested removing Alsa from the linux kernel and I
was afraid of another useless thread. However I found a <a
href="http://www.ussg.iu.edu/hypermail/linux/kernel/0706.3/0317.html">message from Takashi</a> (one
of Alsa's most productive driver and patchwriters:</p>

<p><i>
Honestly, I'm not fully against changing the current code base (or
crap, whatever, any childish name). There are indeed many misdesigns.
But, replacing with the above is no option, IMO. The OSS have also
many misdesigns, so the same argument would start again. One should
learn something from history...
<br /><br />
Anyway, if it's going to be more constructive, I'm willing to join in.
<br /><br />
Takashi
</i></p>


<p>
Hannu (the main OSS developer)
then said <a href="http://www.ussg.iu.edu/hypermail/linux/kernel/0706.3/0515.html">this</a>: </p>

<p><i>
We have no intention to push OSS back to the kernel or to replace ALSA. That alternative is not
realistic any more. In addition OSS is a cross-platform product and staying more or less outside
various kernel trees should provide better flexibility.
<br /><br />
What we would like to push is that the old "deprecated" OSS/Free are removed from the kernel.
OSS/Free is based on about years old OSS API version which was too limited for many applications.
Having OSS/Free in the kernel doesn't serve any purpose.
<br /><br />
Also we would like to stop the silly OSS vs ALSA war. OSS and ALSA are rather different. Both of
them have some good points and bad points. For ordinary users it doesn't matter which API is used by
the applications as long as they work. Just the application developers can see the real difference.
Some of them prefer OSS while some other prefer ALSA and this should be their "freedom of choice".
<br /><br />
I think the ideal solution would be that both ALSA and OSS APIs can co-exist by sharing the same low
level drivers (which has already been demonstrated). The low level driver interfaces in both systems
are practically identical. This means that ALSA's core can work with OSS' drivers and vice versa.
<br /><br />
Today both OSS and ALSA teams have to spend significant amounts of time in emulating the "alien"
APIs. Making OSS and ALSA to co-exist will require some work in both sides but that should be
nothing when compared to the effort required for emulation.
<br /><br />
Just my 2 cents.
<br /><br />
Best regards,
Hannu
</i></p>

<p>Fortunately there are still a lot of sane people in the community. Thanks!</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>The Wicklow Way</title>
      <link>http://vorm.net/the_wicklow_way</link>
      <guid isPermaLink="true">http://vorm.net/the_wicklow_way</guid>
      <category>holiday</category>
      <category>photos</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Back from a nice holiday. Photos are updated.      </description>
      <content:encoded><![CDATA[

<p>
<a href="http://vorm.net/photos/wicklow/"><img src='http://vorm.net/photos/wicklow/lq/img-33.jpg' style='width:95%;border-style: none'  alt='walking the wicklow way' /></a>
<br />
Back from a nice holiday. Photos are updated.
</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Dead on</title>
      <link>http://vorm.net/deadon</link>
      <guid isPermaLink="true">http://vorm.net/deadon</guid>
      <category>linux</category>
      <category>science</category>
      <category>web</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Good presentation on captchas by google. See this video.
The group that is headed by the prof doing the presentation should easily be able to break current 
current used image
captchas if their statements are true... 


 Perhaps I like it because perfectly reflects my own opinion though ;-).      </description>
      <content:encoded><![CDATA[

<p>Good presentation on captchas by google. See <a
href="http://video.google.com/videoplay?docid=-8246463980976635143">this video</a>.
The group that is headed by the prof doing the presentation should easily be able to break current 
current used <a href="http://www.jacobsschool.ucsd.edu/news/news_releases/release.sfe?id=650">image
captchas</a> if their statements are true... 
</p>

<p> Perhaps I like it because perfectly reflects my own <a
href="http://vorm.net/captchas">opinion</a> though ;-).  </p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>You've got mail</title>
      <link>http://vorm.net/youvegotmail</link>
      <guid isPermaLink="true">http://vorm.net/youvegotmail</guid>
      <category>linux</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Since I have searched for the maildirmake command on debian now two times (using 
http://packages.debian.org and apt-cache) 
with no result, I decided to blog the answer here.

You need to apt-get install courier-base. (and then /etc/init.d/courier-authdaemon stop; 
update-rc.d remove courier-authdaemon. This is not logical (I do not need
courier at all, only postfix and mutt), so this post will help me and probably others 
in the future.


[update] After hitting save I thought of an easier solution (?), 
use something like
echo 'function maildirmake { mkdir -p "$1"/{cur,new,tmp}; chmod -R 700 "$1";}' &#233;gt;&#233;gt; ~/.bashrc

[/update]      </description>
      <content:encoded><![CDATA[

<p>Since I have searched for the maildirmake command on debian now two times (using 
<a href="http://packages.debian.org">http://packages.debian.org</a> and apt-cache) 
with no result, I decided to blog the answer here.
</p>
<p>You need to <tt>apt-get install courier-base</tt>. (and then <tt>/etc/init.d/courier-authdaemon stop; 
update-rc.d remove courier-authdaemon</tt>. This is not logical (I do not need
courier at all, only postfix and mutt), so this post will help me and probably others 
in the future.
</p>

<p><i>[update]</i><br/> After hitting save I thought of an easier solution (?), 
use something like<br/>
<tt>echo 'function maildirmake { mkdir -p "$1"/{cur,new,tmp}; chmod -R 700 "$1";}' &#233;gt;&#233;gt; ~/.bashrc</tt>

<br /><i>[/update]</i></p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Away</title>
      <link>http://vorm.net/away</link>
      <guid isPermaLink="true">http://vorm.net/away</guid>
      <category>holiday</category>
      <category>linux</category>
      <category>web</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Linux and 64 bit computers are a good combination. The first linux 64 bit support dates from 1995.
To be able to compile everything from source really helps supporting a platform. Windows mostly runs
32 bit programs at this moment, because proprietary software vendors (which account for most windows
software) are not really fast in releasing new versions. Not all is well for linux though.
Macromedia Flash is such a proprietary program of which no 64 bit player exists. Now, I do not
really like flash (see also a previous entry about this, but
for some reason flash is used to display movies on the web. If you think that that is weird, I
  agree. What has a vector renderer to do with a movie codec? The masters from youtube.com can perhaps tell you; we just have to comply.

I like to watch movies, so now I have a problem... Or not? Fortunately the flash way of
bringing movies is just an container trick around a normal mpeg movie, and my favorite
audio/movieplayer mplayer can play them just fine. 

So if you are on debian, add contrib to /etc/apt/sources.list
and apt-get install iceweasel iceweasel-greasemonkey mozilla-mplayer (the
mplayer plugin is broken for firefox in etch at this moment). Now you only need a way to let
mozilla know how to feed the movies. This can be done with a simple script like
Michael
Sheldons's.

So finally I can be an ultrahip blagotuber and and
bring you movies ;-)

Happy Christmas Everyone!      </description>
      <content:encoded><![CDATA[

<p>Linux and 64 bit computers are a good combination. The first linux 64 bit support dates from 1995.
To be able to compile everything from source really helps supporting a platform. Windows mostly runs
32 bit programs at this moment, because proprietary software vendors (which account for most windows
software) are not really fast in releasing new versions. Not all is well for linux though.
Macromedia Flash is such a proprietary program of which no 64 bit player exists. Now, I do not
really like flash (see also <a href="http://vorm.net/sparkle">a previous entry about this</a>, but
for some reason flash is used to display movies on the web. If you think that that is weird, I
  agree. What has a vector renderer to do with a movie codec? The masters from <a
  href="http://youtube.com">youtube.com</a> can perhaps tell you; we just have to comply.</p>

<p>I like to watch movies, so now I have a problem... Or not? Fortunately the flash way of
bringing movies is just an container trick around a normal mpeg movie, and my favorite
audio/movieplayer <a href="http://www.mplayerhq.hu/">mplayer</a> can play them just fine. </p>

<p>So if you are on debian, add <i>contrib</i> to <tt>/etc/apt/sources.list</tt>
and <tt>apt-get install iceweasel iceweasel-greasemonkey mozilla-mplayer</tt> (the
mplayer plugin is broken for firefox in etch at this moment). Now you only need a way to let
mozilla know how to feed the movies. This can be done with a simple script like
<a href="http://blog.mikeasoft.com/2006/11/24/playing-youtube-videos-without-flash/">Michael
Sheldons's</a>.</p>

<p>So finally I can be an ultrahip <a href="http://www.xkcd.com/c181.html">blagotuber</a> and and
bring you movies ;-)</p>

<p>Happy Christmas Everyone!</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Kaleidoscope</title>
      <link>http://vorm.net/kaleidoscope</link>
      <guid isPermaLink="true">http://vorm.net/kaleidoscope</guid>
      <category>holiday</category>
      <category>personal</category>
      <category>photos</category>
      <category>web</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>During some longer than normal train travelling I had time to rework some site bits.
Permalink code is rewritten, pages are now integrated into my journal and the archive navigation is
date based. Tag support is added to site and feeds 

Also I added photos from an autumn week 
in Morocco. This trip is really recommended in october.      </description>
      <content:encoded><![CDATA[

<p>During some longer than normal train travelling I had time to rework some site bits.
Permalink code is rewritten, pages are now integrated into my journal and the archive navigation is
date based. Tag support is added to site and feeds </p>

<p>Also I added <a href="http://vorm.net/photos/morocco">photos</a> from an autumn week 
in Morocco. This trip is really recommended in october.</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Decipher</title>
      <link>http://vorm.net/decipher</link>
      <guid isPermaLink="true">http://vorm.net/decipher</guid>
      <category>linux</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Since some
time I am an user of encfs.  I actually did want to
encrypt my whole root filesystem (just for fun, nothing to hide ;-)), but the loopback way is a hack
and the old weak initialization vectors make watermark attacks easy. The weak key management was
also a showstopper.  Now that luks is relatively standard I hoped that with ubuntus upcoming edgy the
eft the dm crypt + luks  setup would be well
enough integrated.

Unfortunately this is not the case. The installer does not support this yet. There is a myriad of
conflicting documentation on how to set this up properly. Most of these are misleading and outdated.
There are thousand ways to do this.. but I wanted to do it in a way that will be supported properly
in the future.  This guide
is the best there is on this topic and following it literally does work for Edgy Eft.

One thing Edgy has changed (compared to the guide, which is actually for Dapper Drake) is that the latest
cryptsetup package already has encrypted root initramsfs hooks. With adding cryptopts in the kernel
line (or via kopts in grub) or making a /etc/initramfs-tools/conf.d/cryptoroot file the system
_should_ come up automatically with the passphrase question. After a lot of fiddling (every distro
seems to have their on ways of specifying the parameters) I still did not get this working. If you
use the kernel line options cryptsetup is not installed in the initrd and if you use the conf file option,
the proper kernel modules are not loaded.

Usually I behave like a good open source citizen and file nice bug reports about this, instead of
whining in a journal entry. This time the 1000 different ways of doing these + the already very
confusing bug reports about this package, left me feeling disqualified to do so. In the end, just
following the guide for ubuntu
and writing my own initramfs non configurable hook functions (which conflict with the future
cryptopts settings !!) seems the best way right now.  What makes the situation even more difficult
for starters is that google does not list the proper page for ubuntu but a very outdated howto, so
hopefully this entry will help the proper guide bubble up.

Hopefully this is something that is going to get better in future! Distributors, please fix this
and standardize!  On the bright side, the debian future for this looks most
promising, clean implementation and support in the beta installer..      </description>
      <content:encoded><![CDATA[

<img src='http://vorm.net/site/images/decipher.jpg' style='padding-left:14px; float:right' alt='' /> <p>Since some
time I am an user of <a href="http://enfs.sourceforge.net">encfs</a>.  I actually did want to
encrypt my whole root filesystem (just for fun, nothing to hide ;-)), but the loopback way is a hack
and the old weak initialization vectors make watermark attacks easy. The weak key management was
also a showstopper.  Now that luks is relatively standard I hoped that with <a
href="http://www.ubuntu.com">ubuntus</a> upcoming <a href="http://vorm.net/https://wiki.ubuntu.com/EdgyEft">edgy the
eft</a> the <a href="http://luks.endorphin.org/dm-crypt">dm crypt + luks </a> setup would be well
enough integrated.</p>

<p>Unfortunately this is not the case. The installer does not support this yet. There is a myriad of
conflicting documentation on how to set this up properly. Most of these are misleading and outdated.
There are thousand ways to do this.. but I wanted to do it in a way that will be supported properly
in the future.  <a href="http://vorm.net/https://help.ubuntu.com/community/EncryptedFilesystem">This guide</a>
is the best there is on this topic and following it literally does work for Edgy Eft.</p>

<p>One thing Edgy has changed (compared to the guide, which is actually for Dapper Drake) is that the latest
cryptsetup package already has encrypted root initramsfs hooks. With adding cryptopts in the kernel
line (or via kopts in grub) or making a /etc/initramfs-tools/conf.d/cryptoroot file the system
_should_ come up automatically with the passphrase question. After a lot of fiddling (every distro
seems to have their on ways of specifying the parameters) I still did not get this working. If you
use the kernel line options cryptsetup is not installed in the initrd and if you use the conf file option,
the proper kernel modules are not loaded.</p>

<p>Usually I behave like a good open source citizen and file nice bug reports about this, instead of
whining in a journal entry. This time the 1000 different ways of doing these + the already very
confusing bug reports about this package, left me feeling disqualified to do so. In the end, just
following <a href="http://vorm.net/https://help.ubuntu.com/community/EncryptedFilesystem">the guide for ubuntu</a>
and writing my own initramfs non configurable hook functions (which conflict with the future
cryptopts settings !!) seems the best way right now.  What makes the situation even more difficult
for starters is that google does not list the proper page for ubuntu but a very outdated howto, so
hopefully this entry will help the proper guide bubble up.</p>

<p>Hopefully this is something that is going to get better in future! Distributors, please fix this
and standardize!  On the bright side, the <a href="http://www.debian.org">debian</a> future for this looks most
promising, clean implementation and support in <a
href="http://www.debian.org/devel/debian-installer/News/2006/20060811">the beta installer.</a>.</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>S/G541 (A flat major)</title>
      <link>http://vorm.net/sgaflatmajor</link>
      <guid isPermaLink="true">http://vorm.net/sgaflatmajor</guid>
      <category>holiday</category>
      <category>personal</category>
      <category>photos</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Back from my holiday in Belgium and Luxembourg.
I had a good time, turned 30; now I am trying to get back to business.      </description>
      <content:encoded><![CDATA[

<p>
Back from my holiday in <a href="http://vorm.net/photos/ardennen2006_2/">Belgium and Luxembourg</a>.
I had a good time, turned 30; now I am trying to get back to business.
</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Faraway voice</title>
      <link>http://vorm.net/farawayvoice</link>
      <guid isPermaLink="true">http://vorm.net/farawayvoice</guid>
      <category>linux</category>
      <category>science</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Hacked a bit more on audio captchas lately, but the source is not in
releasable form right now.. Anyway, I now recognize the audio captchas from microsoft 95% correct and from google
(also blogger/blogspot) 60%+
by tweaking the segmentation. captchas.net (35%) and paypal.com (10%) are also doable, but some improvements are still needed.


Time to add some neural network learning.      </description>
      <content:encoded><![CDATA[

<p> Hacked a bit more on <a href="http://vorm.net/captchas">audio captchas</a> lately, but the source is not in
releasable form right now.. Anyway, I now recognize the audio captchas from <a
href="http://passport.net">microsoft</a> 95% correct and from <a href="http://google.com">google</a>
(also <a href="http://blogger.com">blogger/blogspot</a>) 60%+
by tweaking the segmentation. <a href="http://captchas.net">captchas.net</a> (35%) and <a
href="http://paypal.com">paypal.com</a> (10%) are also doable, but some improvements are still needed.
</p>

<p>Time to add some neural network learning.
</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Danza Ritual del Fuego </title>
      <link>http://vorm.net/danzaritualdelfuego</link>
      <guid isPermaLink="true">http://vorm.net/danzaritualdelfuego</guid>
      <category>holiday</category>
      <category>personal</category>
      <category>photos</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Back
from a long week Andalusia. It took me a while to get used to the weather (dropping from 27 C to -2
C!) and updating this page. The atmosphere (and the trip) were great. Nature was beautiful (where
can I donate for bringing mountains to Holland ;-) and the (medieval) buildings special (especially the
mix between christian and moorish architecture). The romans also had discovered the good weather
and fertile ground early and left lots of trails (some villages still have a roman ground-map and
small white 3-level 'concrete flats').


Just before I left, I bought a new Canon 350D. One of the most mainstream (SLR) camera's.  I
had some positive experience with the analog version and reviews of the digital thing were ok. I am
very happy with it.  It
works fine with gphoto2.
 (Sorry for the analog camera
 lovers).

These two items combined gives some new photo albums on this site. Enjoy.      </description>
      <content:encoded><![CDATA[

<p> <img src='http://vorm.net/site/images/andalusia.jpg' style='padding-left:14px; float:right' alt='By me' /> Back
from a long week Andalusia. It took me a while to get used to the weather (dropping from 27 C to -2
C!) and updating this page. The atmosphere (and the trip) were great. Nature was beautiful (where
can I donate for bringing mountains to Holland ;-) and the (medieval) buildings special (especially the
mix between christian and moorish architecture). The romans also had discovered the good weather
and fertile ground early and left lots of trails (some villages still have a roman ground-map and
small white 3-level 'concrete flats').
</p>

<p>Just before I left, I bought a new Canon 350D. One of the most mainstream (SLR) camera's.  I
had some positive experience with the analog version and reviews of the digital thing were ok. I am
very happy with it.  It
works fine with <a href="http://www.gphoto.org">gphoto2</a>.
 (Sorry for the <a href="http://arstechnica.com/news.ars/post/20060418-6627.html">analog camera
 lovers</a>).</p>

<p>These two items combined gives some new <a href="http://vorm.net/photos/">photo albums</a> on this site. Enjoy.</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Forever may not be long enough</title>
      <link>http://vorm.net/forevermaynotbelongenough</link>
      <guid isPermaLink="true">http://vorm.net/forevermaynotbelongenough</guid>
      <category>linux</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>For
years I have struggled to find a proper music player. Most players are too playlist- and metatag
oriented for my taste. My files are all stored in a nice directory hierarchy with proper
filenames.  The tags are very incomplete and buggy (a lot my music file predate ID3 tag
standards, i8n is a disaster in most tags).  

XMMS and winamp were pretty
usable and fast (no meta-data reading in advance, but newer versions tried to do the same database
building as other new programs (and failed)). One feature was particularly missing from these
players: the ability to play random albums. This should (imho) be the standard setting of any music
player: You are working and want to listen to an album in the background. Also it would be nice
if you would be able to give a subset of your collection (for example all jazz music) and
than the software picks an album for you in this genre. XMMS and winamp lack these features. 

Even newer music players (banshee, amarok, rhythmbox, XMMS2, beep, windows media player, mpd, etc.)
cannot do this, although they come closer nowadays. However I have lots of trouble trying them. For
years they crashed on loading my large (100Gb+) collection. Now they usually do not crash anymore, but start
crunching for hours (sometimes days) and when they finish loading the library and you restart the
application; it just crunches again on their index for minutes. And more often than not, they load
the index (sometimes 100MB+) to memory.  This is intolerable if you just want to listen to one
song. 

I realized pretty quick that just whining is not going to help, so I wrote my own player in a few 
lines of Perl. It is far from perfect: I really want to:


NOT start gconf-tool externally
use gstreamer-perl bindings, instead of mplayer
thread/fork so better key-bindings are possible


Despite these drawbacks I use it for months already and it works flawlessly . Therefore I release the
script to the world. It sets your album cover in the background and just starts playing random
directories (=albums in my library). 

download randomalbum.      </description>
      <content:encoded><![CDATA[

<p><img src='http://vorm.net/site/images/randomalbum.jpg' style='padding-left:14px; float:right' 
alt='Some rights reserved by nailbender (http://www.flickr.com/photos/nailbender)' 
title='Some rights reserved by nailbender (http://www.flickr.com/photos/nailbender)'/>For
years I have struggled to find a proper music player. Most players are too playlist- and metatag
oriented for my taste. My files are all stored in a nice directory hierarchy with proper
filenames.  The tags are very incomplete and buggy (a lot my music file predate ID3 tag
standards, i8n is a disaster in most tags).  </p>

<p><a href="http://www.xmms.org">XMMS</a> and <a href="http://winamp.com">winamp</a> were pretty
usable and fast (no meta-data reading in advance, but newer versions tried to do the same database
building as other new programs (and failed)). One feature was particularly missing from these
players: the ability to play random albums. This should (imho) be the standard setting of any music
player: You are working and want to listen to an album in the background. Also it would be nice
if you would be able to give a subset of your collection (for example all jazz music) and
than the software picks an album for you in this genre. XMMS and winamp lack these features. </p>

<p>Even newer music players (<a href="http://www.banshee-project.org">banshee</a>, <a
href="http://amarok.kde.org/">amarok</a>, <a href="http://rhythmbox.sourceforge.net/">rhythmbox</a>, <a
href="http://xmms2.xmms.org/">XMMS2</a>, <a href="http://freshmeat.net/projects/beep-player/">beep</a>, <a
href="http://microsoft.com">windows media player</a>, <a href="http://www.musicpd.org/">mpd</a>, etc.)
cannot do this, although they come closer nowadays. However I have lots of trouble trying them. For
years they crashed on loading my large (100Gb+) collection. Now they usually do not crash anymore, but start
crunching for hours (sometimes days) and when they finish loading the library and you restart the
application; it just crunches again on their index for minutes. And more often than not, they load
the index (sometimes 100MB+) to memory.  This is intolerable if you just want to listen to one
song.</p> 

<p>I realized pretty quick that just whining is not going to help, so I wrote my own player in a few 
lines of Perl. It is far from perfect: I really want to:

</p><ul>
<li>NOT start gconf-tool externally</li>
<li>use gstreamer-perl bindings, instead of mplayer</li>
<li>thread/fork so better key-bindings are possible</li>
</ul><p>

Despite these drawbacks I use it for months already and it works flawlessly . Therefore I release the
script to the world. It sets your album cover in the background and just starts playing random
directories (=albums in my library). </p>

<p><a href="http://vorm.net/downloads/randomalbum.pl.html">download randomalbum</a>.  </p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Defeating audio (voice) captchas</title>
      <link>http://vorm.net/captchas</link>
      <guid isPermaLink="true">http://vorm.net/captchas</guid>
      <category>linux</category>
      <category>science</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Introduction 

For some years semi turing tests under the name of "captchas" can be found on the web, to prevent
bots from filling in forms. When I first saw the visual variant I thought recognizing the characters with a
computer algoritm should be easy. A bit of surfing and searching on the internet learned me
that I was right, most were broken already. Reinventing the wheel is not very useful, so I left the
topic alone.

Later I found a post about voice captchas. Since there was not too much information about this on
the net and I was bored (ill at home), I decided to give it a shot. I started easy, willing to
enhance the used algoritms to those used in speech recognition (like hmm, viterbi, baum-welch,
entropy coding, etc.) when needed. This proved not to be necessary, the first feature complete
(segmentation and matching) code worked relatively well on microsofts captchas. Later I tweaked it a
bit to also work on google captchas.

On this page you can find proof of concept code to break voice captchas. Do not expect advanced
software (pattern recnognition science is so much further) or code that can be used in other
projects, I quitted the project when it worked. Initially (february 2006) I kept the code on my
harddisk, but later (may 2006) I published it (see disclosure motivation).

How does it work
This is not a complete guide, but some pointers to the source (read it luke).
As a starting point, consider the configtype struct:



typedef struct {
    int samplerate;
    int byterate;
    int winsize;
    int band_cnt;
    int word_length;
    int word_overlap;
    int threshold_energy;
    int file_offset;
    char trainfile[255];
} configtype;



The program starts with reading the audio file (in the header it could read the
samplerate and byterate, but I am lazy). file_offset bytes are skipped in the
beginning of the file, because google starts with a bell.  The first step is that all samples are
treated with a hamming window (arbitrary choice, most window types should do). The winsize is in
samples (eg 512 samples on 8000 Hz provides a 64 ms window). Now the blocks are transformed into the
frequency domain with a DFT After that the frequencies are put in band_cnt bins. These bins
are not equally wide, the higher the frequency, the larger the band (this has to do with human
hearing (mel/bark scale), but I doubt this is actually useful at the current incarnation of the
program).  

Now the program looks at the highest frequency bin. Every block that has more energy in a window
than threshold_energy is considered a peak, and these peaks are used the segment the input
file in the different spoken words. The word_length tells the program how many windows long
a word is (so all words are considered the same length which is a current weakness of
devoicecaptcha). word_overlap helps in localizing the peaks. When the locations of the
words are know all frequency bins are written for word_length windows around the peaks.
This is called the profile of the word.

The profiles for know words are put in trainfile. When a guess has to be made, the
profiles for the words in the file are subtracted from those in the trainfile and the smallest
deviation is chosen as the proper word. That is all.

The algoritms in devoicecaptcha are at this moment really naive. There are a lot of
possible improvements. Perhaps in the future I will enhance the program a bit, for now I think the
33% (as on googles captchas) is good enough (and I am too lazy to reimplement htk, which should do the trick also (I guess)).

Proof of concept

The code is rather messy, but since this applies to most p0f code consider that 1337 ;-).  
Download devoicecaptcha.c and compile it with
it:

gcc -lfftw3 -std=c99 devoicecaptcha.c

As you can see you need fftw, an allround fourier transform
library, which is packaged for most distributions, so you can be lazy (apt-get install
fftw3-dev or similar).

When started with ./a.out captcha.wav you also need a data set (a msn one and a google one are
available. If you have downloaded the same captchas (see links) as I 
have, it will print a guess on stdout.

As said before, devoicecaptcha works with a comparison to a trained set. To build up a training
set and test the effectiveness of various parameters you can start devoicecaptcha with a third bogus
argument, eg ./a.out captcha.wav --print.

What I did was download a large set of captchas with lwp and transcribed them with the proper words with
something like:

for i in google/*.wav; do aplay $i &#233;amp;> /dev/null &#233;amp;; read j; mv $i google/$j.wav; done

I ended up with a directory with filenames like "123456.wav" where 123456 are the digits spoken
in the captcha. On this directory I unleased a small ruby script, which splits the files in a
training and testing set, builds a training set and tests the rest. This script can be found under
train.rb.

 If you have broken other voice captchas with my code (or with an addition to my code), please
let me know, so I can update this page.

MSN 

MSN (passport) audio captchas are really weak. Only digits are used, there are always ten
digits and the noise is weak and constant. The distance between the words is relatively constant.
Devoicecaptcha guesses all ten digits correct on around the 75% of all cases, with a training
set of about 40 files.

A data set which can be used for the english MSN (aka passport, aka msn live) voice captchas (which I
got from passport.net) can be downloaded
under the name msn.txt. It is also possible to create your own
training data (see above).  

Google

Googles voice captchas are more difficult to break than the captchas by microsoft. Google employs
different speakers, uses better noise artifacts and a random number of words. The dictionary is (as
microsofts) limited
to digits only. The devoicecaptcha program scores around 33% on these voice captchas with a
training set of 60 files. This is high enough for use in a bot.  

A data set which can be used for the google captchas (in english, google also provides captchas
in multiple languages) can be found under google.txt.
The files were found at Google new account.

These captchas are also in use by blogger and blogspot for comments

Others 

If you know other voice captcha systems, let me know.
Perhaps I will have some time to look into them (and perhaps not). I will at least add them to the
links section on this page, so together with the provided source other people
can try to beat them.

Disclosure motivation

I did not release the source code on this page without hesitation, because it 
might help spammers in their goals. And I hate spam. However there are some reasons I released
the code anyway:


  I do not believe captchas actually work. Almost all visual captchas are
    broken already (read for example Microsofts
    paper on visual captchas or ez-gimpy which can defeat the 
    "human insolvable" captchas at yahoo). Or look at the versatile
    pwntcha.
    Although I do believe humans can fool computers for quite some 
    time in the future, I suspect that computers can always beat computer generated challenges 
    (without a "secret" as in PKI).
  
  Spam is a human problem and I believe human problems should be solved by humans. 
  Legislation and law enforcement are in my opinion the best ways to deal with spammers.
  If captchas did no harm anyone this would of course not be enough reason for releasing this code,
  but
  
  Captchas make the web a more difficult place for disabled people (see http://www.w3.org/ and more annoying for everyone.
   I hope the community will be motivated to find other solutions (and I am happy that
   the w3 organization cares for people with disabilities and a usable web for 
   everyone, including the deaf-blind).
  
  I am a proponent of full disclosure.


Some people might ask what kind of solutions I do suggest for solving the spam problem.  Spamassasin catches thousands of spam mails for me; it is
expensive in cpu cycles (so putting spammers in jail is preferred), but the multi-tiered approach
(neural network detection together with several lists of wrong-doers) works relatively well and can
be applied to other forms of spam.  

Playing the cat/mouse game with more difficult captchas, when the previous challenge is broken
will work, but is not satisfactory in the end. I encounter more human unsolvable captchas everyday.
I do understand that corporations play this game however; in the real world thresholds do help.  

Links

Information

Wikipedias entry on captchas is a very good starting 
point on this topic (as usual) and contains links to pages about breaking visual captchas
Inaccessibility of CAPTCHA by w3.org
Microsofts paper on visual captchas
PWNtcha - captcha decoder by sam hocevar

Broken voice captchas

Google signup 
Microsofts passport service
blogger and blogspot also
use google voice captchas, so these are broken to.

Working on voice captchas

Google.com A slightly better segmentation and better
database gives me 60%+ recognition rate, but this is yet unreleased.
Paypal audio captcha Relatively well done (best one I found
actually), but I expect to
release support for this captcha "any time now"
Captchas.net HEAD works now. I will release this soon, but
I am too lazy to generate a training set, so stuck at 33% recognition rate for now.

Not working on voice captchas

Standards
schmmandards proposal The use of generated speech is probably weak;  
positive point is the use of human parsing ("the  three numbers are one, two three").
 For now I haven"t seen it actually used.

Do you know different implementations of audio captchas? Please  contact
me.      </description>
      <content:encoded><![CDATA[

<h2>Introduction</h2> 

<p>For some years semi turing tests under the name of "captchas" can be found on the web, to prevent
bots from filling in forms. When I first saw the visual variant I thought recognizing the characters with a
computer algoritm should be easy. A bit of surfing and searching on the internet learned me
that I was right, most were broken already. Reinventing the wheel is not very useful, so I left the
topic alone.</p>

<p>Later I found a post about voice captchas. Since there was not too much information about this on
the net and I was bored (ill at home), I decided to give it a shot. I started easy, willing to
enhance the used algoritms to those used in speech recognition (like hmm, viterbi, baum-welch,
entropy coding, etc.) when needed. This proved not to be necessary, the first feature complete
(segmentation and matching) code worked relatively well on microsofts captchas. Later I tweaked it a
bit to also work on google captchas.</p>

<p>On this page you can find proof of concept code to break voice captchas. Do not expect advanced
software (pattern recnognition science is so much further) or code that can be used in other
projects, I quitted the project when it worked. Initially (february 2006) I kept the code on my
harddisk, but later (may 2006) I published it (see <a href="http://vorm.net/#motive">disclosure motivation</a>).</p>

<h2>How does it work</h2>
<p>This is not a complete guide, but some pointers to the source (read it luke).
As a starting point, consider the <tt>configtype</tt> struct:</p>

<div>
<pre>
typedef struct {
    int samplerate;
    int byterate;
    int winsize;
    int band_cnt;
    int word_length;
    int word_overlap;
    int threshold_energy;
    int file_offset;
    char trainfile[255];
} configtype;
</pre>
</div>

<p>The program starts with reading the audio file (in the header it could read the
<tt>samplerate</tt> and <tt>byterate</tt>, but I am lazy). <tt>file_offset</tt> bytes are skipped in the
beginning of the file, because google starts with a bell.  The first step is that all samples are
treated with a hamming window (arbitrary choice, most window types should do). The <tt>winsize</tt> is in
samples (eg 512 samples on 8000 Hz provides a 64 ms window). Now the blocks are transformed into the
frequency domain with a DFT After that the frequencies are put in <tt>band_cnt</tt> bins. These bins
are not equally wide, the higher the frequency, the larger the band (this has to do with human
hearing (mel/bark scale), but I doubt this is actually useful at the current incarnation of the
program).  </p>

<p>Now the program looks at the highest frequency bin. Every block that has more energy in a window
than <tt>threshold_energy</tt> is considered a peak, and these peaks are used the segment the input
file in the different spoken words. The <tt>word_length</tt> tells the program how many windows long
a word is (so all words are considered the same length which is a current weakness of
devoicecaptcha). <tt>word_overlap</tt> helps in localizing the peaks. When the locations of the
words are know all frequency bins are written for <tt>word_length</tt> windows around the peaks.
This is called the profile of the word.</p>

<p>The profiles for know words are put in <tt>trainfile</tt>. When a guess has to be made, the
profiles for the words in the file are subtracted from those in the trainfile and the smallest
deviation is chosen as the proper word. That is all.</p>

<p>The algoritms in devoicecaptcha are at this moment really naive. There are a lot of
possible improvements. Perhaps in the future I will enhance the program a bit, for now I think the
33% (as on googles captchas) is good enough (and I am too lazy to reimplement <a
href="http://htk.eng.cam.ac.uk/">htk</a>, which should do the trick also (I guess)).</p>

<h2>Proof of concept</h2>

<p>The code is rather messy, but since this applies to most p0f code consider that 1337 ;-).  
Download <a href="http://vorm.net/downloads/devoicecaptcha.c">devoicecaptcha.c</a> and compile it with
it:</p>

<p><tt>gcc -lfftw3 -std=c99 devoicecaptcha.c</tt></p>

<p>As you can see you need <a href="http://www.fftw.org">fftw</a>, an allround fourier transform
library, which is packaged for most distributions, so you can be lazy (<tt>apt-get install
fftw3-dev</tt> or similar).</p>

<p>When started with <tt>./a.out captcha.wav</tt> you also need a data set (a <a
href="http://vorm.net/downloads/msn.txt">msn</a> one and a <a href="http://vorm.net/downloads/google.txt">google</a> one are
available. If you have downloaded the same captchas (see <a href="http://vorm.net/#links">links</a>) as I 
have, it will print a guess on stdout.</p>

<p>As said before, devoicecaptcha works with a comparison to a trained set. To build up a training
set and test the effectiveness of various parameters you can start devoicecaptcha with a third bogus
argument, eg <tt>./a.out captcha.wav --print</tt>.</p>

<p>What I did was download a large set of captchas with <a
href="http://search.cpan.org/dist/libwww-perl/">lwp</a> and transcribed them with the proper words with
something like:</p>

<p><tt>for i in google/*.wav; do aplay $i &#233;amp;> /dev/null &#233;amp;; read j; mv $i google/$j.wav; done</tt></p>

<p>I ended up with a directory with filenames like "123456.wav" where 123456 are the digits spoken
in the captcha. On this directory I unleased a small ruby script, which splits the files in a
training and testing set, builds a training set and tests the rest. This script can be found under
<a href="http://vorm.net/downloads/train.rb">train.rb</a>.</p>

<p> If you have broken other voice captchas with my code (or with an addition to my code), please
let me know, so I can update this page.</p>

<h2>MSN</h2> 

<p>MSN (passport) audio captchas are really weak. Only digits are used, there are always ten
digits and the noise is weak and constant. The distance between the words is relatively constant.
Devoicecaptcha guesses all ten digits correct on around the 75% of all cases, with a training
set of about 40 files.</p>

<p>A data set which can be used for the english MSN (aka passport, aka msn live) voice captchas (which I
got from <a href="http://vorm.net/https://accountservices.passport.net/reg.srf">passport.net</a>) can be downloaded
under the name <a href="http://vorm.net/downloads/msn.txt">msn.txt</a>. It is also possible to create your own
training data (see above).  </p>

<h2>Google</h2>

<p>Googles voice captchas are more difficult to break than the captchas by microsoft. Google employs
different speakers, uses better noise artifacts and a random number of words. The dictionary is (as
microsofts) limited
to digits only. The devoicecaptcha program scores around 33% on these voice captchas with a
training set of 60 files. This is high enough for use in a bot.  </p>

<p>A data set which can be used for the google captchas (in english, google also provides captchas
in multiple languages) can be found under <a href="http://vorm.net/downloads/google.txt">google.txt</a>.
The files were found at <a
href="http://vorm.net/https://www.google.com/accounts/NewAccount">Google new account</a>.
</p>
<p>These captchas are also in use by blogger and blogspot for comments</p>

<h2>Others</h2> 

<p>If you know other voice captcha systems, <a href="http://vorm.net/contact">let me know</a>.
Perhaps I will have some time to look into them (and perhaps not). I will at least add them to the
<a href="http://vorm.net/#links">links</a> section on this page, so together with the provided source other people
can try to beat them.</p>

<h2>Disclosure motivation</h2>
<a id="motive" />
<p>I did not release the source code on this page without hesitation, because it 
might help spammers in their goals. And I hate spam. However there are some reasons I released
the code anyway:</p>

<ul>
  <li>I do not believe captchas actually work. Almost all visual captchas are
    broken already (read for example <a href="http://www.ceas.cc/papers-2005/160.pdf">Microsofts
    paper on visual captchas</a> or <a
    href="http://www.cs.sfu.ca/~mori/research/gimpy/">ez-gimpy</a> which can defeat the 
    "human insolvable" captchas at yahoo). Or look at <a href="http://sam.zoy.org/pwntcha/">the versatile
    pwntcha</a>.
    Although I do believe humans can fool computers for quite some 
    time in the future, I suspect that computers can always beat computer generated challenges 
    (without a "secret" as in PKI).
  </li>
  <li>Spam is a human problem and I believe human problems should be solved by humans. 
  Legislation and law enforcement are in my opinion the best ways to deal with spammers.
  If captchas did no harm anyone this would of course not be enough reason for releasing this code,
  but
  </li>
  <li>Captchas make the web a more difficult place for disabled people (see <a
  href="http://www.w3.org/TR/turingtest/">http://www.w3.org/</a> and more annoying for everyone.
   I hope the community will be motivated to find other solutions (and I am happy that
   the w3 organization cares for people with disabilities and a usable web for 
   everyone, including the deaf-blind).
  </li>
  <li>I am a proponent of full disclosure.</li>
</ul>

<p>Some people might ask what kind of solutions I do suggest for solving the spam problem.  <a
href="http://spamassassin.apache.org/">Spamassasin</a> catches thousands of spam mails for me; it is
expensive in cpu cycles (so putting spammers in jail is preferred), but the multi-tiered approach
(neural network detection together with several lists of wrong-doers) works relatively well and can
be applied to other forms of spam.  </p>

<p>Playing the cat/mouse game with more difficult captchas, when the previous challenge is broken
will work, but is not satisfactory in the end. I encounter more human unsolvable captchas everyday.
I do understand that corporations play this game however; in the real world thresholds do help.  </p>

<h2>Links</h2>
<a id="links" />
<p>Information</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Captcha">Wikipedias entry</a> on captchas is a very good starting 
point on this topic (as usual) and contains links to pages about breaking visual captchas</li>
<li><a href="http://www.w3.org/TR/turingtest/">Inaccessibility of CAPTCHA</a> by w3.org</li>
<li><a href="http://www.ceas.cc/papers-2005/160.pdf">Microsofts paper on visual captchas</a></li>
<li><a href="http://sam.zoy.org/pwntcha/">PWNtcha - captcha decoder</a> by sam hocevar</li>
</ul>
<p>Broken voice captchas</p>
<ul>
<li><a href="http://vorm.net/https://www.google.com/accounts/NewAccount">Google signup </a></li>
<li><a href="http://vorm.net/https://accountservices.passport.net/reg.srf">Microsofts passport service</a></li>
<li><a href="http://www.blogger.com">blogger</a> and <a href="http://blogspot.com">blogspot</a> also
use google voice captchas, so these are broken to.</li>
</ul>
<p>Working on voice captchas</p>
<ul>
<li><a href="http://www.google.com">Google.com</a> A slightly better segmentation and better
database gives me 60%+ recognition rate, but this is yet unreleased.</li>
<li><a href="http://www.paypal.com/">Paypal audio captcha </a>Relatively well done (best one I found
actually), but I expect to
release support for this captcha "any time now"</li>
<li><a href="http://www.captchas.net">Captchas.net </a>HEAD works now. I will release this soon, but
I am too lazy to generate a training set, so stuck at 33% recognition rate for now.</li>
</ul>
<p>Not working on voice captchas</p>
<ul>
<li><a href="http://www.standards-schmandards.com/index.php?2005/01/01/11-captcha">Standards
schmmandards proposal</a> The use of generated speech is probably weak;  
positive point is the use of human parsing ("the <i> three</i> numbers are one, two three").
 For now I haven"t seen it actually used.</li>
</ul>
<p>Do you know different implementations of audio captchas? Please  <a href="http://vorm.net/contact">contact
me</a>.</p><br />      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Home on Monday</title>
      <link>http://vorm.net/homeonmonday</link>
      <guid isPermaLink="true">http://vorm.net/homeonmonday</guid>
      <category>personal</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>From now on I live in Leiden. I enjoyed my 11 years in Delft, but it was time for a different place.


Leiden was inhabited (at least) from 300 BC (actually the Romans lived in Katwijk, but this sounds
better ;-)). In 900 AC, where the Oude rijn, the Nieuwe
Rijn and the Mare come together, a tower was built, which began urbanization and in 1266 the city received city rights.

Leiden also housed the first dutch university and was home of the Nobel price winner Kamerlingh Onnes.      </description>
      <content:encoded><![CDATA[

<p>
<img src='http://vorm.net/site/images/moving.jpg' style='padding-left:14px; float:right' 
alt='By maarten' 
title='By maarten' 
/>
From now on I live in Leiden. I enjoyed my 11 years in Delft, but it was time for a different place.
</p>
<p>
Leiden was inhabited (at least) from 300 BC (actually the Romans lived in Katwijk, but this sounds
better ;-)). In 900 AC, where the Oude rijn, the Nieuwe
Rijn and the Mare come together, a tower was built, which began urbanization and in 1266 the city received city rights.
</p><p>
Leiden also housed the first dutch university and was home of the Nobel price winner Kamerlingh Onnes.
</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Nine million bicycles</title>
      <link>http://vorm.net/ninemillionbicycles</link>
      <guid isPermaLink="true">http://vorm.net/ninemillionbicycles</guid>
      <category>music</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>While the
music industry is having their holy war against downloaders to disguise the bringing of yet another
clone (this time Norah Jones II: Katie Melua); it is time for someone to show the music industries
hypocrisy, with their blatant copying of classical music. 

Just kidding of course ;), I actually like the Melua cd's. Especially Mike Bright
Eyes Batt's songwriting is very smooth. Time to find out where
Mike got his ideas and start with some analysis for my (not yet in shape) coverlist, this time with the megahit Nine million bicycles.


The chord sequence is something like:



  Verse:   | I iii | ii IV | ii I |
  Refrain: | iv I  | iv vi | iv I | ii V | 


 The verse is a disguised form of the I-IV-I, the tonic-subdominant progression. The mediant
(iii) is there to provide some color, the ii is very much linked with the IV (the relative minor of
IV). A similar progression can be found in preludes by Bach (for example the prelude from cello suite
6 in D).  

 In the refrain  the subdominant is taken and the key is referred to minor. This is an early
romantic period trick (A. Pollack calls this barbershop harmony) for example used in
Schubert's songs. I will look for a specific example, but I don't have a CD with this music.
Actually I am not so sure where the vi comes from??  

So in my (probably wrong) view Nine million bicycles is a mix of a Bach prelude and  
a  Schubert-style song.      </description>
      <content:encoded><![CDATA[

<p><img src='http://vorm.net/site/images/katiemelua.jpg' style='padding-left:14px; float:right' alt='Some rights
reserved by Marco Wessel (http://www.flickr.com/photos/mhw/)' title='Some rights reserved by Marco
Wessel (http://www.flickr.com/photos/mhw/)'/> While the
music industry is having their holy war against downloaders to disguise the bringing of yet another
clone (this time Norah Jones II: <b>Katie Melua</b>); it is time for someone to show the music industries
hypocrisy, with their blatant copying of classical music. </p>

<p>Just kidding of course ;), I actually like the Melua cd's. Especially <b>Mike</b> <i>Bright
Eyes</i> <b>Batt</b>'s songwriting is very smooth. Time to find out where
Mike got his ideas and start with some analysis for my (not yet in shape) <a
href="http://vorm.net/coverlist/">coverlist</a>, this time with the megahit <b>Nine million bicycles</b>.</p>

<p>
The chord sequence is something like:
</p>

<pre>
  Verse:   | I iii | ii IV | ii I |
  Refrain: | iv I  | iv vi | iv I | ii V | 
</pre>

<p> The verse is a disguised form of the I-IV-I, the tonic-subdominant progression. The mediant
(iii) is there to provide some color, the ii is very much linked with the IV (the relative minor of
IV). A similar progression can be found in preludes by Bach (for example the prelude from cello suite
6 in D).  </p>

<p> In the refrain  the subdominant is taken and the key is referred to minor. This is an early
romantic period trick (A. Pollack calls this <i>barbershop harmony</i>) for example used in
Schubert's songs. I will look for a specific example, but I don't have a CD with this music.
Actually I am not so sure where the vi comes from??  </p>

<p>So in my (probably wrong) view Nine million bicycles is a mix of a Bach prelude and  
a  Schubert-style song.</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Ensembles </title>
      <link>http://vorm.net/ensembles</link>
      <guid isPermaLink="true">http://vorm.net/ensembles</guid>
      <category>music</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>In the beginning I played at various flute ensembles at
my music school. From 2000-2002 I played early music with the Consort of
Muesli. This consort existed of Dorothea Schulz, recorders,
flutes and bass flutesMargje Bekkering, various
recordersJitske Kuiper, various recordersJochem van
der Vorm, renaissance and baroque traverso



 Image of Consort of Muesli playing at Dordrecht
for a historical event      </description>
      <content:encoded><![CDATA[In the beginning I played at various flute ensembles at
my music school. From 2000-2002 I played early music with the Consort of
Muesli. This consort existed of <ul><li>Dorothea Schulz, recorders,
flutes and bass flutes</li><li>Margje Bekkering, various
recorders</li><li>Jitske Kuiper, various recorders</li><li>Jochem van
der Vorm, renaissance and baroque traverso</li></ul><br /><p
style="vertical-align:center">

<img src="http://vorm.net/site/images/consort.jpg" alt="Consort of Muesli" />

</p><i> Image of Consort of Muesli playing at Dordrecht
for a historical event</i>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Promise(d) me</title>
      <link>http://vorm.net/promisedme</link>
      <guid isPermaLink="true">http://vorm.net/promisedme</guid>
      <category>linux</category>
      <category>web</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>As promised here, I wrote a better
version of the quickviewer for the 
vim calendar plugin. It now properly wraps around year ends. 


#!/usr/bin/env perl
use Date::Calc;

$dir = "~/diary";
for ($i = 0; $i &#233;lt; 90; $i++) &#233;#123;
  $fn = "$dir/$y/$m/$d.cal" 
    if(($y,$m,$d)=Add_Delta_Days(Today(),$i));
  if (-f $fn) &#233;#123;
    printf "%2d %s", $d, substr(Month_to_Text($m),0,3);
    open IN, $fn; while (&#233;lt;IN&#233;gt;) &#233;#123;print "\t$_" if (! /^\s*$/);&#233;#125;
    close IN;
  &#233;#125;
&#233;#125;


Compared to last year's entry you could say I was far more efficient in 2005
than in 2004, but also a lot lazier. I leave it to you to assess the correctness
of this statement.

Happy 2006 everyone!      </description>
      <content:encoded><![CDATA[ 

<p>As promised <a href="http://vorm.net/letsparty">here</a>, I wrote a better
version of the quickviewer for the <a href="http://www.vim.org/scripts/script.php?script_id=52">
vim calendar plugin</a>. It now properly wraps around year ends. </p>

<pre>
#!/usr/bin/env perl
use Date::Calc;

$dir = "~/diary";
for ($i = 0; $i &#233;lt; 90; $i++) &#233;#123;
  $fn = "$dir/$y/$m/$d.cal" 
    if(($y,$m,$d)=Add_Delta_Days(Today(),$i));
  if (-f $fn) &#233;#123;
    printf "%2d %s", $d, substr(Month_to_Text($m),0,3);
    open IN, $fn; while (&#233;lt;IN&#233;gt;) &#233;#123;print "\t$_" if (! /^\s*$/);&#233;#125;
    close IN;
  &#233;#125;
&#233;#125;
</pre>

<p>Compared to last year's entry you could say I was far more efficient in 2005
than in 2004, but also a lot lazier. I leave it to you to assess the correctness
of this statement.</p>

<p>Happy 2006 everyone!</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>

    <item>
      <title>Copycat</title>
      <link>http://vorm.net/copycat</link>
      <guid isPermaLink="true">http://vorm.net/copycat</guid>
      <category>music</category>
      <author>jochem@vorm.net (Jochem van der Vorm)</author>
      <description>Today I added a new  page to this site, containing 
a list of pop songs borrowing certain elements of famous
classical music. You can find this list of classical
covers by clicking on the link or in the menu on the right.

This page is by no means in the shape I intended, but perhaps I will
try harder if others can look over my shoulders.

  Pop and rock songs often borrow some parts of melody, rhythm or harmony of
classical songs. When listening to (pop) music I sometimes notice, but later
almost always  forget the connection between the song and a classical piece.
Since knowing useless facts can be fun, I have decided to write these
"classical covers" down. 

It is very difficult to exactly pinpoint when a song is a "cover". Therefore
I decided not to maintain a bare list, but also write a few words about
the connection between the songs, ranging from a small theme or chord
progression to a literary transcription in the same key.  I try to mention the
oldest occurrence in written music, which is very often from the Renaissance or
Baroque, simply because mankind started most annotating around this time.

Hopefully I will find some time in the future to accomplish part of these goals.      </description>
      <content:encoded><![CDATA[ 

<p><img src="http://vorm.net/site/images/steinway.jpg" style="padding-left:14px; float:right"
alt="Some rights reserved by nailbender (http://www.flickr.com/photos/nailbender)" 
title="Some rights reserved by nailbender (http://www.flickr.com/photos/nailbender)"/>Today I added a new  page to this site, containing 
a list of pop songs borrowing certain elements of famous
classical music. You can find this <a href="http://vorm.net/coverlist/">list of classical
covers</a> by clicking on the link or in the menu on the right.</p>

<p>This page is by no means in the shape I intended, but perhaps I will
try harder if others can look over my shoulders.</p>

<p>  Pop and rock songs often borrow some parts of melody, rhythm or harmony of
classical songs. When listening to (pop) music I sometimes notice, but later
almost always  forget the connection between the song and a classical piece.
Since knowing useless facts can be fun, I have decided to write these
"classical covers" down. </p>

<p>It is very difficult to exactly pinpoint when a song is a "cover". Therefore
I decided not to maintain a bare list, but also write a few words about
the connection between the songs, ranging from a small theme or chord
progression to a literary transcription in the same key.  I try to mention the
oldest occurrence in written music, which is very often from the Renaissance or
Baroque, simply because mankind started most annotating around this time.</p>

<p>Hopefully I will find some time in the future to accomplish part of these goals.</p>      ]]></content:encoded>
      <pubDate>Thu, 01 Jan 1970 01:00:00 +0100</pubDate>
    </item>
</channel>
    </rss>