<?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-36023878</id><updated>2012-02-16T14:33:53.288+01:00</updated><category term='linux'/><category term='barcamp'/><category term='belgium'/><category term='hack'/><category term='visualization'/><category term='idea'/><category term='stacktrace'/><category term='emacs'/><category term='semantic'/><category term='java'/><category term='encoding'/><category term='puntkom'/><category term='programming'/><category term='utf-8'/><category term='social'/><category term='tomcat'/><category term='environment'/><category term='lisp'/><category term='art'/><category term='bash'/><category term='reddit'/><category term='v for vendetta'/><category term='dijkstra'/><category term='slime'/><category term='eid'/><category term='twitterswarm'/><category term='mda'/><category term='notsoso'/><category term='movie'/><category term='decomposition'/><category term='tax on web'/><category term='tags'/><category term='freebase'/><category term='taxes'/><category term='code_swarm'/><category term='typography'/><category term='little miss sunshine lock stock and 2 smoking barrels'/><category term='text'/><category term='opensource'/><category term='animation'/><category term='twitter'/><category term='taxonweb'/><category term='checklist'/><category term='video'/><category term='pulp fiction'/><category term='ubuntu'/><category term='flobots'/><category term='json'/><title type='text'>Edge of the desert</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-36023878.post-1541119869134511166</id><published>2010-06-20T13:27:00.003+02:00</published><updated>2010-07-04T19:48:59.820+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='taxes'/><category scheme='http://www.blogger.com/atom/ns#' term='tax on web'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='belgium'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='eid'/><category scheme='http://www.blogger.com/atom/ns#' term='taxonweb'/><title type='text'>Death and taxes</title><content type='html'>It's that time of the year again to start filing taxes, and here in Belgium we are "blessed" to be able to use our Belgian eid to file those taxes electronically at our governments &lt;ahref="http://www.taxonweb.be"&gt;Tax on Web&lt;/a&gt; site.  &lt;h2&gt;Linux support&lt;/h2&gt;Officialy, there are some drivers available for Redhat and Ubuntu 9.10. However, remembering last years debacle of trying to follow those instructions, I decided to not stumble into that tarpit and just did a bit of googling around.  After pulling together some various bits and pieces, this is what I did to make it work:  &lt;ol&gt;&lt;li&gt;   &lt;pre&gt;$ sudo apt-get install libacr38u libacr38ucontrol0 beid-tools pcscd libpcsclite-dev beidgui libbeid2 libbeidlibopensc2&lt;br /&gt;  &lt;/pre&gt;&lt;/li&gt;&lt;li&gt; Reboot. Yes, I know this is Linux and I know it is 2010. The problem is   the pcscd service won't start properly without a reboot. If you have a   better clue then I do, you can probably fix this without a reboot, but   there it is.   &lt;/li&gt;&lt;li&gt; Launch firefox and navigate to   file:///usr/share/beid/beid-pkcs11-register.html Depending on your   version of Firefox that may or may not properly install the pkcs11   module. For me it did not so I moved on to the next step.   &lt;/li&gt;&lt;li&gt; In firefox, navigate to Edit &gt; Preferences &gt; Advanced &gt; Security Devices Click on Load and fill out   file:///usr/lib/libbeidpkcs11.so.2 as the Module   filename. Then click OK.   &lt;/li&gt;&lt;/ol&gt;After these steps I was able to log in to the Tax on Web site.  Hope this is helpful to somebody else out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-1541119869134511166?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/1541119869134511166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=1541119869134511166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/1541119869134511166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/1541119869134511166'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2010/06/its-that-time-of-year-again-to-start.html' title='Death and taxes'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-7186156851319418079</id><published>2010-04-02T14:58:00.002+02:00</published><updated>2010-04-07T23:43:51.812+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='typography'/><category scheme='http://www.blogger.com/atom/ns#' term='art'/><category scheme='http://www.blogger.com/atom/ns#' term='pulp fiction'/><category scheme='http://www.blogger.com/atom/ns#' term='text'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='flobots'/><category scheme='http://www.blogger.com/atom/ns#' term='little miss sunshine lock stock and 2 smoking barrels'/><category scheme='http://www.blogger.com/atom/ns#' term='v for vendetta'/><title type='text'>Animated typography is awesome</title><content type='html'>&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/HePWBNcugf8&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/HePWBNcugf8&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/c6Q0dfrbr10&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/c6Q0dfrbr10&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nRIZ97okXgQ&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/nRIZ97okXgQ&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tP5yA3RwzOk&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/tP5yA3RwzOk&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6mnvvVi4HaI&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/6mnvvVi4HaI&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-7186156851319418079?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/7186156851319418079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=7186156851319418079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/7186156851319418079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/7186156851319418079'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2010/04/animated-typography-is-awesome.html' title='Animated typography is awesome'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-3404592166236385725</id><published>2010-03-31T20:07:00.008+02:00</published><updated>2010-04-07T23:58:37.137+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mda'/><category scheme='http://www.blogger.com/atom/ns#' term='code_swarm'/><category scheme='http://www.blogger.com/atom/ns#' term='puntkom'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='twitterswarm'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Visualizing tweets over a 16 hour span, a Twitterswarm</title><content type='html'>&lt;p&gt;Every second thursday of the month, the &lt;a href="http://193.190.56.244/mda/"&gt;Media and Design Academy&lt;/a&gt; organizes its &lt;a href="http://www.puntkom.nu/"&gt;puntKom&lt;/a&gt; event. A few work colleagues have attended these events on and off and my employer, &lt;a href="http://www.nascom.be/"&gt;Nascom&lt;/a&gt;, has been known to provide the attendees with free snacks and beer.&lt;/p&gt;&lt;p&gt;During one puntKom, people challenged us to do an actual presentation for their next theme, which was to be "20 lines of code". The main idea was to come up with something cool / quirky which could be done in 20 lines of code and give a short presentation about it. After the usual discussion on how worthless loc is as a measurement and how most heavy lifting would always be done by frameworks, a few colleagues and I had a short brainstorming session to see if we could think of something interesting.&lt;/p&gt;&lt;h3&gt;The plan&lt;/h3&gt;&lt;p&gt;It quickly became clear that to do something visually interesting, we would have to find some data, and glue it into an interesting visualization scheme. So we had to come up with 3 components; glue, data and a visualization idea.&lt;/p&gt;&lt;h3&gt;Glue, data and visualizations&lt;/h3&gt;&lt;p&gt;As any linux user will tell you, the best way to glue stuff together on a computer is to use a quick and dirty bash script. Finding the glue was easy, and from the start, I had wanted to do something with &lt;a href="http://vis.cs.ucdavis.edu/~ogawa/codeswarm/"&gt;code_swarm&lt;/a&gt;. The only thing left to do was to come up with a good dataset. After considering a few different sources, we ended up with the plan to pull down all the tweets we could that showed up for a few predefined search results and feed those to code_swarm.&lt;/p&gt;&lt;img border="0" height="240" src="http://vis.cs.ucdavis.edu/~ogawa/codeswarm/eclipse-640px.png" width="320" /&gt;&lt;h3&gt;Approach&lt;/h3&gt;&lt;p&gt;After the brainstorming, I was given some time to hack together ourlittle idea. I started out by breaking down the problem in the followingsubproblems:&lt;/p&gt;&lt;img src="http://2.bp.blogspot.com/_WrKIxrKy5gk/S7OMBTcj1dI/AAAAAAAAABE/8vzTRMxhx3A/s320/twitterigami1.gif" /&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt;Fetch a bunch of tweets from Twitter&lt;/li&gt;&lt;li&gt;  Convert those tweets to a format usable by code_swarm&lt;/li&gt;&lt;li&gt;  Run code_swarm to generate a bunch of png's&lt;/li&gt;&lt;li&gt;  Use ffmpeg to generate a video out of those png's&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;The first problem wasn't too hard, a simple wget to the Twitter search api to fetch the .atom version worked just fine. Until it didn't. It turns out that Twitter auto throttles ip's that make a lot of requests to their search api, and while normal Twitter api usage is linked to a specific Twitter account, their search api usage is linked to an ip. A pretty harsh constraint when there's about 80 colleagues with various Twitter clients hitting that same api.&lt;/p&gt;&lt;p&gt;Luckily, the Twitter engineers were kind enough to return a HTTP 420 code and a Retry-After header whenever a request was throttled, which allowed me to just put the script to sleep for the specified time whenever a 420 occured. After this fix, fetching tweets was a breeze.&lt;/p&gt;&lt;p&gt;As for the second problem, converting an atom feed to a custom xml format is annoying enough without a 20 loc constraint, so I googled around a bit for some xslt tools. Pretty soon I discovered the excellent &lt;a href="http://xmlstar.sourceforge.net/"&gt;XMLStarlet&lt;/a&gt; tool which would allow me to generate and apply XSLT from the commandline, the perfect tool to glue into my script.&lt;/p&gt;&lt;p&gt;One thing that was annoying me was how to convert the dates of the tweets to the millisecond format required by code_swarm, so I ended up tweaking code_swarm's source to also accept the standard tweet date format.&lt;/p&gt;&lt;p&gt;From this point, it was fairly straight forward to come up with a semi-decent configuration file for code_swarm, feed my xml to it, and then let ffmpeg lose on the generated png's as per the code_swarm wiki instructions.&lt;/p&gt;&lt;h3&gt;Results&lt;/h3&gt;&lt;p&gt;The code ended up looking a bit like this:    &lt;style type="text/css"&gt;    &lt;!--      .builtin {        /* font-lock-builtin-face */        color: #8cd0d3;      }      .comment {        /* font-lock-comment-face */        color: #7f9f7f;      }      .comment-delimiter {        /* font-lock-comment-delimiter-face */        color: #708070;      }      .keyword {        /* font-lock-keyword-face */        color: #f0dfaf;        font-weight: bold;      }      .sh-quoted-exec {        /* sh-quoted-exec */        color: #fa8072;      }      .string {        /* font-lock-string-face */        color: #cc9393;      }      .variable-name {        /* font-lock-variable-name-face */        color: #f0dfaf;      }      a {        color: inherit;        background-color: inherit;        font: inherit;        text-decoration: inherit;      }      a:hover {        text-decoration: underline;      }    --&gt;    &lt;/style&gt;  &lt;/head&gt;  &lt;body&gt;    &lt;pre style="color: #dcdccc; background-color: #3f3f3f;"&gt;&lt;br /&gt;&lt;span class="comment-delimiter"&gt;#&lt;/span&gt;&lt;span class="comment"&gt;!/bin/&lt;/span&gt;&lt;span class="keyword"&gt;bash&lt;/span&gt;&lt;span class="comment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;function&lt;/span&gt; twitter_to_swarm { xmlstarlet sel --text -N &lt;span class="variable-name"&gt;a&lt;/span&gt;=http://www.w3.org/2005/Atom -N &lt;span class="variable-name"&gt;twitter&lt;/span&gt;=http://api.twitter.com/ --template --match &lt;span class="string"&gt;'//a:entry'&lt;/span&gt; -o &lt;span class="string"&gt;'&amp;amp;lt;event filename=&amp;amp;quot;'&lt;/span&gt; -v &lt;span class="string"&gt;'a:author/a:name'&lt;/span&gt; -o &lt;span class="string"&gt;'lang:'&lt;/span&gt; -v &lt;span class="string"&gt;'twitter:lang'&lt;/span&gt; -o &lt;span class="string"&gt;'&amp;amp;quot;'&lt;/span&gt; -o &lt;span class="string"&gt;' date=&amp;amp;quot;'&lt;/span&gt; -v &lt;span class="string"&gt;'a:updated'&lt;/span&gt; -o &lt;span class="string"&gt;'&amp;amp;quot; '&lt;/span&gt; -o &lt;span class="string"&gt;'author=&amp;amp;quot;'&lt;/span&gt; -v &lt;span class="string"&gt;'/a:feed/a:title'&lt;/span&gt; -o &lt;span class="string"&gt;'&amp;amp;quot;/&amp;amp;gt;'&lt;/span&gt; -n $&lt;span class="variable-name"&gt;1&lt;/span&gt; | sed -e &lt;span class="string"&gt;'s/ since:.*- Twitter Search//'&lt;/span&gt; | sed -e &lt;span class="string"&gt;'s/date="\([^T.]*\)T\([^Z.]*\)Z"/date="\1 \2"/'&lt;/span&gt; | sed -e &lt;span class="string"&gt;'s/&amp;amp;/&amp;amp;amp;/g'&lt;/span&gt; &amp;gt;&amp;gt; $&lt;span class="variable-name"&gt;2&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;&lt;span class="builtin"&gt;read&lt;/span&gt; PAGE STATUS &amp;lt;&amp;lt;&amp;lt;$(&lt;span class="sh-quoted-exec"&gt;echo&lt;/span&gt; 1 200)&lt;br /&gt;&lt;span class="keyword"&gt;for&lt;/span&gt; p&lt;span class="keyword"&gt; in&lt;/span&gt; &lt;span class="string"&gt;"$@"&lt;/span&gt;; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="variable-name"&gt;QUERY&lt;/span&gt;=$(&lt;span class="sh-quoted-exec"&gt;perl&lt;/span&gt; -MURI::Escape -e &lt;span class="string"&gt;'foreach $argnum (0 .. $#ARGV) {print uri_escape($ARGV[$argnum])."+";}'&lt;/span&gt; $&lt;span class="variable-name"&gt;p&lt;/span&gt;)&lt;br /&gt;    &lt;span class="keyword"&gt;until&lt;/span&gt; [ $&lt;span class="variable-name"&gt;PAGE&lt;/span&gt; -gt 15 ]; &lt;span class="keyword"&gt;do&lt;/span&gt;&lt;br /&gt;        &lt;span class="variable-name"&gt;RESPONSE&lt;/span&gt;=$(&lt;span class="sh-quoted-exec"&gt;wget&lt;/span&gt; --server-response -Oout.wget http://search.twitter.com/search.atom?&lt;span class="variable-name"&gt;q&lt;/span&gt;=$&lt;span class="variable-name"&gt;QUERY&lt;/span&gt;&lt;span class="string"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="variable-name"&gt;rpp&lt;/span&gt;=100&lt;span class="string"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="variable-name"&gt;page&lt;/span&gt;=$&lt;span class="variable-name"&gt;PAGE&lt;/span&gt;&lt;span class="string"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="variable-name"&gt;since&lt;/span&gt;=&lt;span class="sh-quoted-exec"&gt;`date +%Y-%m-%d`&lt;/span&gt; 2&amp;gt;&amp;amp;1)&lt;br /&gt;        &lt;span class="variable-name"&gt;STATUS&lt;/span&gt;=$(&lt;span class="sh-quoted-exec"&gt;echo&lt;/span&gt; $&lt;span class="variable-name"&gt;RESPONSE&lt;/span&gt; | grep &lt;span class="string"&gt;'HTTP/'&lt;/span&gt; | sed -e &lt;span class="string"&gt;'s/.*HTTP\/[^ ]* \([^ ]*\).*/\1/'&lt;/span&gt; | tail -1)&lt;br /&gt;        &lt;span class="keyword"&gt;case&lt;/span&gt; $&lt;span class="variable-name"&gt;STATUS&lt;/span&gt;&lt;span class="keyword"&gt; in&lt;/span&gt;&lt;br /&gt;            200) &lt;span class="builtin"&gt;echo&lt;/span&gt; STATUS $&lt;span class="variable-name"&gt;STATUS&lt;/span&gt; for page $&lt;span class="variable-name"&gt;PAGE&lt;/span&gt; &amp;amp;&amp;amp; twitter_to_swarm out.wget out.xml &amp;amp;&amp;amp; &lt;span class="builtin"&gt;let&lt;/span&gt; PAGE+=1;;&lt;br /&gt;            420) &lt;span class="variable-name"&gt;SLEEP&lt;/span&gt;=$(&lt;span class="sh-quoted-exec"&gt;echo&lt;/span&gt; $&lt;span class="variable-name"&gt;RESPONSE&lt;/span&gt; | grep &lt;span class="string"&gt;'Retry-After'&lt;/span&gt; | sed -e &lt;span class="string"&gt;'s/.*Retry-After[^ ]* \([^ ]*\).*/\1/'&lt;/span&gt;) &amp;amp;&amp;amp; &lt;span class="keyword"&gt;until&lt;/span&gt; [ $&lt;span class="variable-name"&gt;SLEEP&lt;/span&gt; -le 0 ]; &lt;span class="keyword"&gt;do &lt;/span&gt;&lt;span class="builtin"&gt;echo&lt;/span&gt; sleeping $&lt;span class="variable-name"&gt;SLEEP&lt;/span&gt; seconds &amp;amp; sleep 10 &amp;amp;&amp;amp; &lt;span class="builtin"&gt;let&lt;/span&gt; SLEEP-=10; &lt;span class="keyword"&gt;done&lt;/span&gt;;;&lt;br /&gt;            *) &lt;span class="builtin"&gt;echo&lt;/span&gt; STATUS $&lt;span class="variable-name"&gt;STATUS&lt;/span&gt; for page $&lt;span class="variable-name"&gt;PAGE&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class="builtin"&gt;let&lt;/span&gt; &lt;span class="variable-name"&gt;PAGE&lt;/span&gt;=17;;&lt;br /&gt;        &lt;span class="keyword"&gt;esac&lt;/span&gt;; &lt;span class="keyword"&gt;done&lt;/span&gt;; &lt;span class="builtin"&gt;let&lt;/span&gt; &lt;span class="variable-name"&gt;PAGE&lt;/span&gt;=1&lt;br /&gt;&lt;span class="keyword"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;span class="builtin"&gt;echo&lt;/span&gt; &lt;span class="string"&gt;'&amp;lt;file_events&amp;gt;'&lt;/span&gt; &amp;gt; result.xml &amp;amp;&amp;amp; cat out.xml | sort -t &lt;span class="string"&gt;'"'&lt;/span&gt; -k 3 -r &amp;gt;&amp;gt; result.xml &amp;amp;&amp;amp; &lt;span class="builtin"&gt;echo&lt;/span&gt; &lt;span class="string"&gt;'&amp;lt;/file_events&amp;gt;'&lt;/span&gt; &amp;gt;&amp;gt; result.xml&lt;br /&gt;&lt;span class="builtin"&gt;echo&lt;/span&gt; Generating images... &amp;amp;&amp;amp; &lt;span class="builtin"&gt;cd&lt;/span&gt; codeswarm/ &amp;amp;&amp;amp; codeswarm ../mpeg.config &amp;amp;&amp;amp; &lt;span class="builtin"&gt;cd&lt;/span&gt; .. &amp;amp;&amp;amp; &lt;span class="builtin"&gt;echo&lt;/span&gt; Done.&lt;br /&gt;&lt;span class="builtin"&gt;echo&lt;/span&gt; Generating video... &amp;amp;&amp;amp; ffmpeg -f image2 -r 24 -i images/twitter-%05d.png -sameq ./result.mov -pass 2 &amp;amp;&amp;amp; &lt;span class="builtin"&gt;echo&lt;/span&gt; Done. Generated result.mov&lt;/pre&gt;&lt;/p&gt;I ran the script with parameters to search for tweets containing, google buzz or buzz, haiti, snow and iPad. The resulting video ended up looking like this:&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/j8LtpA5KJHk&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/j8LtpA5KJHk&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The terms that were searched for float through space, every colored dot that moves towards a search term is a tweet matching that term. It's a bit hard to see, but tweets are also colored depending on the language they're in, the following leged was used:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;yellow for English&lt;/li&gt;&lt;li&gt;cyan for German&lt;/li&gt;&lt;li&gt;violet for French&lt;/li&gt;&lt;li&gt;red for Portuguese&lt;/li&gt;&lt;li&gt;blue for Dutch&lt;/li&gt;&lt;li&gt;purple for Spanish&lt;/li&gt;&lt;li&gt;brown for Japanese&lt;/li&gt;&lt;li&gt;pink for Italian&lt;/li&gt;&lt;li&gt;grey for Other&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Rerun dammit&lt;/h3&gt;I wasn't completely satisfied with the first result, since it turned out to only cover a very short timespan. This was due to the fact that the Twitter api only returns a max of 1500 tweets, so I modified the script above a bit so that I could schedule it as a cronjob and run it every hour. I then let my cronjob run for about 16 hours and produced the video below with the results:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-M_z_Vlx544&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-M_z_Vlx544&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-3404592166236385725?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/3404592166236385725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=3404592166236385725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/3404592166236385725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/3404592166236385725'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2010/03/visualizing-tweets-over-16-hour-span.html' title='Visualizing tweets over a 16 hour span, a Twitterswarm'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WrKIxrKy5gk/S7OMBTcj1dI/AAAAAAAAABE/8vzTRMxhx3A/s72-c/twitterigami1.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-3782831291739595764</id><published>2007-05-07T19:57:00.002+02:00</published><updated>2010-03-31T12:35:20.525+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social'/><category scheme='http://www.blogger.com/atom/ns#' term='freebase'/><category scheme='http://www.blogger.com/atom/ns#' term='semantic'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='notsoso'/><title type='text'>Social tips and a semantic wikipedia</title><content type='html'>Two barcamp talks in particular interested me enough that I just had to find out more about them.&lt;br /&gt;&lt;br /&gt;&lt;p style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;a href="http://farm1.static.flickr.com/226/486200818_c016a1b37e_m_d.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="John Baeyens on Not so-so" border="0" src="http://farm1.static.flickr.com/226/486200818_c016a1b37e_m_d.jpg" title="John Baeyens on Not so-so" /&gt;&lt;/a&gt;First of these was &lt;a href="http://blog.notsoso.com/"&gt;John Baeyens&lt;/a&gt;' talk on his soon-to-go-live social tips website "not so-so", of which you can find the current test version &lt;a href="http://test.notsoso.com/"&gt;right here&lt;/a&gt;.&lt;br /&gt;Basically, not so-so is kind of a mix between blogging and delicious in that you write up a short review, or tip on something (anything!) you like, which you then automatically share with the rest of the community. You can stay up to date with the tips that other people submit by following those people ala the delicious network feature. Extra features that are currently in the works are a calendar system and a rating system. The rating system in particular seems very interesting to me, as it could be tied to a recommendation system to put you in touch with people that share your interests, or just interesting tips from people not currently in your network. John's reply to the question "I want to see all events today within a radius of 20km from where I live" was along the lines of: "We have the data, we just need to implement it.".&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://farm1.static.flickr.com/170/486203318_6fe38b4bcd_m_d.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="Will Moffat on Freebase.com" border="0" src="http://farm1.static.flickr.com/170/486203318_6fe38b4bcd_m_d.jpg" title="Will Moffat on Freebase.com" /&gt;&lt;/a&gt;The other cool talk was given by &lt;a href="http://hamstersoup.com/"&gt;Will Moffat&lt;/a&gt;. It was a short introduction to &lt;a href="http://www.freebase.com/"&gt;Freebase&lt;/a&gt; which is basically a queryable service containing a structured version of the Wikipedia data. The database is queryable through JavaScript and returns a list of results using JSON, allowing for some interesting mash-up ideas. Better yet it's also possible to update the database using JavaScript. Currently freebase is still in alpha phase and registration is on an invite only basis. There are still some open questions though, mainly, how are the Freebase people going to deal with vandalism, as currently doesn't appear to be moderated. Also, will this project be able to gain enough interest as to gain a large enough userbase to actually fill out all the currently missing data.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pictures by &lt;a href="http://blog.heymans.org/"&gt;Bert Heymans&lt;/a&gt;, for more pictures, check out &lt;a href="http://www.flickr.com/photos/heymans/"&gt;his flickr stream&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/36023878-3782831291739595764?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/3782831291739595764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=3782831291739595764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/3782831291739595764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/3782831291739595764'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2007/05/social-tips-and-semantic-wikipedia.html' title='Social tips and a semantic wikipedia'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-3354915144433600945</id><published>2007-05-04T17:16:00.000+02:00</published><updated>2007-05-04T19:23:23.164+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='barcamp'/><title type='text'>Barcamp Brussels #3</title><content type='html'>&lt;p&gt;Tomorrow I will be attending the third Barcamp Brussels event which will mark the end of my barcamp virginity. Looking over the &lt;a href="http://barcamp.org/BarCampBrussels3"&gt; barcamp wiki&lt;/a&gt;, it looks like there will be plenty of interesting topics to mull over. I'm particularly interested in &lt;a href="http://frank.be/"&gt;Frank Louwers&lt;/a&gt;' talk on OpenID and the talk that &lt;a href="http://blog.defv.be/2007/5/3/ook-ik"&gt;Jan de Poorter&lt;/a&gt; will be having on Rails.&lt;br /&gt;As for myself, I had been planning on doing something around &lt;a href="http://en.wikipedia.org/wiki/Collaborative_Filtering"&gt;Collaborative Filtering&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Slope_One"&gt;Slope One&lt;/a&gt;, but a busy schedule has kept me from putting together something even remotely cohesive. I'm thinking of taking some pictures and if anyone is interested in the slope one stuff, I can always annoy anyone who asks :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-3354915144433600945?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/3354915144433600945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=3354915144433600945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/3354915144433600945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/3354915144433600945'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2007/05/barcamp-brussels-3.html' title='Barcamp Brussels #3'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-607856673347574023</id><published>2007-04-26T07:32:00.000+02:00</published><updated>2007-04-26T08:01:48.819+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='utf-8'/><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>Tomcat UTF-8 CharsetMapper</title><content type='html'>&lt;p&gt;Just a quickie I thought I'd share, if you're running into encoding problems using Tomcat and JSTL's fmt:xxx tags, you might want to implement your own Tomcat CharsetMapper. The following example will fix things for UTF-8 encoding:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public class UTF8CharsetMapper extends CharsetMapper {&lt;br /&gt;    public UTF8CharsetMapper() {&lt;br /&gt;        super();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public UTF8CharsetMapper(String name) {&lt;br /&gt;        super(name);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getCharset(Locale locale) {&lt;br /&gt;        return "UTF-8";&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;You should then edit your Tomcat's server.xml file by mapping your Context's charsetMapperClass attribute to your custom made CharsetMapper:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Context charsetMapperClass="your.package.here.UTF8CharsetMapper" otherParam="xxx"&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;&amp;lt;/Context&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-607856673347574023?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/607856673347574023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=607856673347574023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/607856673347574023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/607856673347574023'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2007/04/tomcat-utf-8-charsetmapper.html' title='Tomcat UTF-8 CharsetMapper'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-3700567543938912478</id><published>2006-12-05T01:50:00.000+01:00</published><updated>2006-12-05T08:06:51.080+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='checklist'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='utf-8'/><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>UTF-8 Checklist</title><content type='html'>&lt;p&gt;This is getting tedious, again I wasted a good 40 minutes looking for a solution as to why my perfectly fine utf-8 text which was being submitted through a get form was being garbled up by the server. So, as a matter of checklist, I'm going to sum up a few things that can be quickly run through to see why utf-8 might not be working. Mind you, this is going to be Java oriented, since that's where the source of my utf-8 woes lies, however, I don't have much doubt that getting a website properly using utf-8 is a pain in the ass in other languages as well. I'll gladly have anyone prove me wrong on that last assumption though.&lt;/p&gt;&lt;h2&gt;What you should know first&lt;/h2&gt;&lt;p&gt;The first thing you should know is that &lt;a href="http://www.joelonsoftware.com/articles/Unicode.html"&gt;There Ain't No Such Thing As Plain Text&lt;/a&gt;. there, that's said, now go read the article and then come back.&lt;/p&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;p&gt;The following checklist is mainly a shorter, version of stuff I stole from a Sun article called &lt;a href="http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/"&gt;Character Conversions from Browser to Database&lt;/a&gt;. You will learn more if you read that article, but my list is shorter.&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;First of all, make sure your container understands that the de facto encoding of any GET request it will receive will be in utf-8. In Tomcat, this is done by setting the property URIEncoding="UTF-8" inside your Connector definition. For other containers, there is always &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt; 'cause I'm lazy like that.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;For some containers, setting the equivalent of the above configuration will make both GET and POST work properly, this is not the case however with Tomcat. To let Tomcat use utf-8 as the default encoding for POST requests, set the following in your application's &lt;code&gt;web.xml&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;PARAMETER_ENCODING&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Okay, so now you have the encoding available as a parameter in every request, which means you can set it before reading any parameters like so:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;String paramEncoding = application.getInitParameter("PARAMETER_ENCODING");&lt;br /&gt;request.setCharacterEncoding(paramEncoding);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;If you are using a Servlet instead of a JSP, you can spread this code over the Servlet's &lt;code&gt;init()&lt;/code&gt; and &lt;code&gt;processRequest()&lt;/code&gt; methods:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;private String encoding;&lt;br /&gt;&lt;br /&gt; public void init() throws ServletException {&lt;br /&gt;     ServletConfig config = getServletConfig();&lt;br /&gt;     encoding = config.getInitParameter("PARAMETER_ENCODING");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt; throws ServletException, IOException {&lt;br /&gt;     if (encoding != null) {&lt;br /&gt;         request.setCharacterEncoding(encoding);&lt;br /&gt;     }&lt;br /&gt;     ...&lt;br /&gt; }&lt;/code&gt;&lt;br /&gt;Alternatively, you might put this code in a filter.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;When using JSP's, make sure you have your page directive set up correctly, and by correctly I mean:&lt;br /&gt;&lt;code&gt;&amp;lt;%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%&amp;gt;&lt;/code&gt;&lt;br /&gt;If you are going to enter anything in your JSP page directive, the above should be it.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Write proper HTML. The &amp;lt;meta&amp;gt; tag in your header should define the content attribute:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;It's also generally a good idea to set the accept-charset attribute of any forms you define:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;form name="form" action="action.do" method="post" accept-charset="UTF-8"&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The accept-charset attribute will tell confused clients what charsets the server will accept.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Alright, I think that will do nicely as an initial checklist. If I come across any other pointers, I'll edit this post and add them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-3700567543938912478?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/3700567543938912478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=3700567543938912478' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/3700567543938912478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/3700567543938912478'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2006/12/utf-8-checklist.html' title='UTF-8 Checklist'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-8627489111327469343</id><published>2006-11-17T00:02:00.000+01:00</published><updated>2006-11-17T19:12:41.987+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slime'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Slimy emacs</title><content type='html'>&lt;strong&gt;Slimy emacs&lt;/strong&gt;&lt;br /&gt;This blog entry is being typed in emacs21. I finally decided to clear the hurdle and start learning myself emacs and try to wrestle through Paul Graham's &lt;a href="http://www.paulgraham.com/onlisp.html"&gt;"On lisp"&lt;/a&gt;. Starting out with emacs has been fun, I've been working through the included tutorial, and the shortcut system already feels powerfull. Writing / programming without having to move my hand from keyboard to mouse is a really enticing prospect to me, and I'm intent on getting through the 36% of TUTORIAL remaining. This also seems like a really good time to finally trade in my azerty keyboard for a real one, which will have the added bonus of no longer having to adjust when switching from typing at home to typing at work.&lt;br /&gt;&lt;br /&gt;Anyway, emacs and lisp. So on to lisp, I first downloaded slime for emacs, and after including the following short lisp snippet in my .emacs file tried to launch it:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;(add-to-list 'load-path "/home/&lt;name&gt;/slime-2.0")&lt;br /&gt;(require 'slime)&lt;br /&gt;(setq inferior-lisp-program "clisp")&lt;br /&gt;(add-hook 'lisp-mode-hook (lambda () (slime-mode t)&lt;br /&gt;                                (local-set-key "\r" 'newline-and-indent)&lt;br /&gt;                                (setq lisp-indent-function 'common-lisp-indent-function)&lt;br /&gt;                                (setq indent-tabs-mode nil)))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Obviously, no clisp could be found since I'd been dumb enough to not install it first. So on to the next step of installing lisp. Now, my first version of my .emacs file did not refer to clisp, rather it refered to lisp as I was following the short tutorial on &lt;a href="http://www.unmutual.info/startingwithcl.html"&gt;unmutual.info&lt;/a&gt; and had chosen to use CMU Common Lisp. Right, so how to install CMU Common Lisp on my Ubuntu install, I visited the &lt;a href="http://www.cons.org/cmucl/"&gt;CMU Common Lisp website&lt;/a&gt; but then decided I'd rather use the synaptic packet manager. After a search for "lisp" presented me with a huge list of packages to install, I spent a good 10 minutes just skimming through them all untill I finally settled for the clisp package. A brief few seconds later, clisp and it's dependencies were installed and all I had to do was to edit my .emacs file to update my inferior-lisp-program from "lisp" to "clisp". Restart emacs, M-x slime, a quick compile and tada, slime ! Cool, now I just have 20% of emacs TUTORIAL and Paul Graham's "On Lisp" left to digest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-8627489111327469343?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/8627489111327469343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=8627489111327469343' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/8627489111327469343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/8627489111327469343'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2006/11/slimy-emacs.html' title='Slimy emacs'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-5308340258766276156</id><published>2006-10-29T09:22:00.000+01:00</published><updated>2006-11-17T19:12:57.124+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><category scheme='http://www.blogger.com/atom/ns#' term='movie'/><title type='text'>An inconvenient truth</title><content type='html'>I finally went to see Al Gore's  "&lt;a href="http://imdb.com/title/tt0497116/"&gt;An Inconvenient Truth&lt;/a&gt;"  last night, and it's really one of those must-see movies because it's quite an eye-opener. There aren't many things that stress the urgency of turning around our climate crisis as much as seeing a piece of ice the size of Rhode Island break away from Antarctica over the course of &lt;span style="font-style: italic;"&gt;days&lt;/span&gt;. The documentary does an excellent job in breaking down the scepticism that is surrounding global warming, it emphasizes that there is scientific &lt;span style="font-style: italic;"&gt;consensus&lt;/span&gt; and that global warming isn't just some theory. The idea that there is doubt over the veracity of global warming is being spoonfed to us through the political and economic propaganda machine. The main idea to take away from the movie, is to talk about global warming, help dispelling the myth of it being a theory as opposed to fact, and change. Make small changes to how you live, and encourage others to do the same.&lt;br /&gt;On the way back home I had a lengthy discussion with my dad and grandfather over how nothing would really change unless everyone participated and it was hard to explain them the irony of saying: "Well this won't work unless everyone changes, so I'm not changing". In the end though I managed to explain how the upward trend in global warming can not, in fact, be turned into a downward trend overnight, but that it would be a huge step forward if only we managed to slow it down, then let it stagnate, and then finally, let it diminish. I still think Al Gore said it better, and certainly more terse, when he said that some people go from denial to despair, without considering the steps in between. Despair will promote our inaction, and it doesn't seem like we have alot of time left for that. If you want to do something right now, the &lt;a href="http://climatecrisis.com/"&gt;climatecrisis.com&lt;/a&gt; website has a nice pdf with 10 easy tips to pollute less.&lt;br /&gt;&lt;br /&gt;Ironically and sadly, the only people that walked out during this movie were a bunch of teenagers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-5308340258766276156?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/5308340258766276156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=5308340258766276156' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/5308340258766276156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/5308340258766276156'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2006/10/inconvenient-truth.html' title='An inconvenient truth'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-893237346727099338</id><published>2006-10-19T12:40:00.000+02:00</published><updated>2010-04-07T23:15:56.947+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tags'/><category scheme='http://www.blogger.com/atom/ns#' term='reddit'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>Reddit and subreddits</title><content type='html'>There's currently a &lt;a href="http://reddit.com/info/msp5/comments"&gt;discussion&lt;/a&gt; going on on &lt;a  href="http://reddit.com/"&gt;reddit&lt;/a&gt; on the concept of subreddits. A subreddit is basically a clone of the reddit concept but it is limited to a certain topic, a good example is the &lt;a href="http://programming.reddit.com/"&gt;programming subreddit&lt;/a&gt;. To be completely fair, the discussion isn't really about the &lt;em&gt;concept&lt;/em&gt; of subreddits per se, but for the purpose of this blog entry, I'm going to pretend it is.&lt;br /&gt;&lt;br /&gt;Anyway, the discussion seems to be between largely two groups of people. One group argues that subreddits are fragmenting the community, while the other group loves subreddits for the way they (apparently) succinctly categorize submissions by their topic. Now, it's obvious that both groups have valid arguments, fragmenting a community is obviously not a good thing, while being able to group submissions by topic obviously is. To a certain extent people could argue that it is possible to group submissions by using the search, but the way it is dependant on the submission's title pretty much makes that an invalid argument in the long run.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So what could be a solution ?&lt;/span&gt;&lt;br /&gt;One possible solution that would allow people to both organize submissions by topic while at the same time keeping the community together on a single reddit would be a tagging system of some form. If people want to view mainly programming related submissions, they could hit the programming tag.&lt;br /&gt;&lt;br /&gt;Right now, subreddits are a way of categorizing submissions that is broken because it fragments the community for one, and secondly, it fragments discussion of a submission by allowing people to submit the same link to both a sub and the main reddit.  I do personally read the programming reddit frequently, but it is not visible at all to new people and so it does a good job in preventing people who might have only a latent interest in programming from reading the better programming related submissions. On the other hand, since there are no restrictions on what link you can submit to what reddit (how could there be), it also happens that good programming related submissions are only submitted to the main reddit. This basically forces people to read both the main reddit and the subreddit of their interest if they want to have the maximum amount of coverage for their favorite topic.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;" &gt;But, but, tags are broken !&lt;/span&gt;&lt;br /&gt;Ok, so there are some problems with tagging content, the largest issue being the fact that people do not use the same tag for the same thing, so there would still be a good amount of fragmentation. However, taking into account the great asset that the reddit community is, there should be no reason not to leverage that asset. It would be perfectly plausible to implement this in a way that people can only select tags from a predetermined pool. With this approach, the community could file requests for new tags, and if such a request is popular enough, it could be added to the existing pool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tag based filtering and modifying&lt;/span&gt;&lt;br /&gt;Once there is a consistent way to apply tags, users could start filtering on those tags, if there's a topic people don't like (a lot of people complain about the amount of submissions on politics) they could set their preferences to block submissions with that tag outright. Or a more subtle approach could be to allow users to configure their preferences so that submissions with a certain tag are only visible after they get a certain rating by the rest of the community. Or what about attributing a default modifier to particular tags; you're into programming but not into politics ? Well then why not apply a standard +5 modifier to submissions with the programming tags, and a -5 to those with a politics tag. How exactly to implement the weight of these modifiers is up for debate, but looking at the great job that the reddit creators did with their recommendation engine, I'm sure they could figure out a kickass way to factor in personal weights with community approval.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-893237346727099338?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/893237346727099338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=893237346727099338' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/893237346727099338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/893237346727099338'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2006/10/reddit-and-subreddits.html' title='Reddit and subreddits'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36023878.post-116121001640276953</id><published>2006-10-18T23:38:00.003+02:00</published><updated>2010-03-31T10:23:18.451+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='decomposition'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='dijkstra'/><category scheme='http://www.blogger.com/atom/ns#' term='stacktrace'/><title type='text'>Stack traces as coordinates</title><content type='html'>I picked up on Scott Rosenberg's &lt;a href="http://www.wordyard.com/category/code-reads/"&gt;code reads&lt;/a&gt; a while ago by following a post on reddit, and have started cursively following it. I've skipped out on reading the first book, The Mythical Man Month but I do intend to read up on that at some point in the future. Anyway, the reading material for this week consists of no less then three of &lt;a href="http://en.wikipedia.org/wiki/Dijkstra"&gt;Edsger Dijkstra&lt;/a&gt;'s articles / papers and I'm fully intent on keeping up with the several reads to come from now on.&lt;br /&gt;&lt;br /&gt;So I'm reading through "&lt;a href="http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF"&gt;Notes on structured programming&lt;/a&gt;" in which Dijkstra lays out the concept of a coordinate system to identify a discrete point in a computation process. Basically, this is what you want your stack trace to be, something blows up, and you want to know as much as possible about when and where exactly things went awry.&lt;br /&gt;&lt;br /&gt;In the context of understanding programs he notes how a mathematical theory and a computer program are both structured, timeless objects, but while the mathematical theory makes sense on it's own, the program doesn't make sense until its execution. With this in mind, he describes a way to decompose programs in such a way that it becomes easier for humans to make sense out of them. For this purpose, he distinguishes three types of decomposition: &lt;em&gt;concatenation&lt;/em&gt;, &lt;em&gt;selection&lt;/em&gt; and &lt;em&gt;repetition&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;We have now seen three types of decomposition; we could call them "concatenation", "selection" and "repetition" respectively. The first two are understood by enumerative reasoning, the lost one by mathematical induction.&lt;br /&gt;&lt;em&gt;- Dijkstra, notes on structured programming.&lt;/em&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;em&gt;Concatenation&lt;/em&gt; is used to decompose computations directly following each other, &lt;em&gt;selection&lt;/em&gt; is a way of decomposing computations that are executed based on a condition and &lt;em&gt;repetition&lt;/em&gt; is the decomposition of computations that are in a loop.&lt;br /&gt;Now, with these 3 types of decomposition, it becomes easier to read and understand a program because once you decompose a number of computations, you can then mentally abstract it, and view it as a single step.&lt;br /&gt;&lt;br /&gt;Once we have a properly decomposed program, we want to be able to make assertions about its computations, we want to know what value a certain variable has at a certain point in the program, during its execution. To be able to do this Dijkstra explains:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;In short, we are looking for a co-ordinate system in terms of which the discrete points of computation progress can be identified,... We can state our problem in another way. Given a program in action and suppose that before completion of the computation the latter is stopped at one of the discrete points of progress. How can we identify the point of interruption, for instance if we want to redo the computation up to the very same point ?&lt;br /&gt;&lt;em&gt;- Dijkstra, notes on structured programming.&lt;/em&gt;&lt;/blockquote&gt;&lt;br /&gt;As far as the concatenation and selection decompositions are concerned, it is trivial to do this by using what Dijkstra calls the &lt;em&gt;textual index&lt;/em&gt; of the program text, in other words, the line number. However, as we all know, due to the nature of loops, the same does not hold true for the repetition decomposition. Simply because a loop iterates over the same computations (with the same textual index) several times, the textual index is of no use to us for the purpose of indicating where we are in the computation progress. The solution ? Introduce a &lt;em&gt;dynamic index&lt;/em&gt;, a variable independent from the computation that keeps track of where exactly in the repetition we are. OK so now we almost have a coordinate system as described above, there's just one more concept that isn't covered yet,... functions. When a language allows for functions, we need a way to represent the exact point of progress where our function is called. A textual index won't suffice, since it is lacking context, however, we &lt;em&gt;can&lt;/em&gt; pass along the textual index of where our function was called.&lt;br /&gt;&lt;br /&gt;Mix all the above together, and you get a perfect stack trace which would give you:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the line number of the call producing the error&lt;/li&gt;&lt;li&gt;if the error-producing call is part of a function, the line number of the call invoking this function&lt;/li&gt;&lt;li&gt;if the error-producing call is nested in any loops, the dynamic index indicating the specific iteration of those loops&lt;/li&gt;&lt;/ul&gt;Hmm, now I wonder why the loop index is never provided in any stack traces I've seen up to now. Is it a design decision to reduce overhead from tracking dynamic index variables, or am I missing something obvious?&lt;br /&gt;Regardless, that's an interesting bit of history right there, and I'm only on page 29 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36023878-116121001640276953?l=edge-of-the-desert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edge-of-the-desert.blogspot.com/feeds/116121001640276953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36023878&amp;postID=116121001640276953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/116121001640276953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36023878/posts/default/116121001640276953'/><link rel='alternate' type='text/html' href='http://edge-of-the-desert.blogspot.com/2006/10/stack-traces-as-coordinates-i-picked.html' title='Stack traces as coordinates'/><author><name>Bart Vandendriessche</name><uri>http://www.blogger.com/profile/17769669692054200942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://home.euphonynet.be/div/pictures/ninja.jpg'/></author><thr:total>0</thr:total></entry></feed>
