<?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'><id>tag:blogger.com,1999:blog-15441793</id><updated>2009-11-20T21:08:39.479+01:00</updated><title type='text'>Hear me roar</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.0x63.nu/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15441793.post-6188111564491838040</id><published>2007-11-19T21:47:00.000+01:00</published><updated>2007-11-20T22:42:14.939+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xmms2'/><category scheme='http://www.blogger.com/atom/ns#' term='openmoko'/><title type='text'>Openmoko xmms2 client</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gDLrxrjght8/R0H3Cs_TBmI/AAAAAAAAAAM/EK5Bpp-IGbo/s1600-h/x2r-omoko-screenshot.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_gDLrxrjght8/R0H3Cs_TBmI/AAAAAAAAAAM/EK5Bpp-IGbo/s400/x2r-omoko-screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5134656675987523170" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally I got around publishing the source for the little XMMS2 client I've been working on (when not preparing the DrKosmos release). It is designed for use on the FIC neo1973 phone, turning it into a remote control for your XMMS2. Most time was wasted fighting with bitbake. Or rather getting bitbake and waf to get along.&lt;br /&gt;&lt;br /&gt;Avahi is used to detect XMMS2 servers on your network. x2r starts with a serverbrowser listing the XMMS2 servers on your network (+ some hardcoded addresses, later version will allow adding to this list). After server is selected and connected to the "now playing screen" is shown (see screenshot to the left). See screen cast in very crappy quality below.&lt;br /&gt;&lt;br /&gt;I wrote some simple custom gtk widgets using gob2 for use in x2r. Those are available in the awidgets repository on git.0x63.nu.&lt;br /&gt;&lt;br /&gt;The bitbake-files for xmms2 and x2r are available in the omoko-apps repo at git.0x63.nu.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Update:&lt;/i&gt; ipkgs are available at &lt;a href="http://0x63.nu/files/ipkgs/"&gt;http://0x63.nu/files/ipkgs/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Btw, I have some plans for a playlist screen aswell, just need to find the time to implement it.&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-476b069e958dc2da" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.blogger.com/img/videoplayer.swf?videoUrl=http%3A%2F%2Fv11.nonxt8.googlevideo.com%2Fvideoplayback%3Fid%3D476b069e958dc2da%26itag%3D5%26begin%3D0%26len%3D86400000%26app%3Dblogger%26et%3Dplay%26el%3DEMBEDDED%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1271185097%26sparams%3Did%252Citag%252Cip%252Cipbits%252Cexpire%26signature%3D38DF5418747844CC915F7C58C991A2B9DA82F69E.361C93CBA0521C32C2E6AA05112B34166402B2DA%26key%3Dck1&amp;amp;thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer2%3Fapp%3Dblogger%26contentid%3D476b069e958dc2da%26offsetms%3D5000%26itag%3Dw320%26sigh%3DB1Xd9V7zeS1KihpQHCI6dKmQjOc&amp;amp;messagesUrl=video.google.com%2FFlashUiStrings.xlb%3Fframe%3Dflashstrings%26hl%3Den&amp;amp;nogvlm=1"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;embed width="320" height="266" src="http://www.blogger.com/img/videoplayer.swf?videoUrl=http%3A%2F%2Fv11.nonxt8.googlevideo.com%2Fvideoplayback%3Fid%3D476b069e958dc2da%26itag%3D5%26begin%3D0%26len%3D86400000%26app%3Dblogger%26et%3Dplay%26el%3DEMBEDDED%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1271185097%26sparams%3Did%252Citag%252Cip%252Cipbits%252Cexpire%26signature%3D38DF5418747844CC915F7C58C991A2B9DA82F69E.361C93CBA0521C32C2E6AA05112B34166402B2DA%26key%3Dck1&amp;amp;thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer2%3Fapp%3Dblogger%26contentid%3D476b069e958dc2da%26offsetms%3D5000%26itag%3Dw320%26sigh%3DB1Xd9V7zeS1KihpQHCI6dKmQjOc&amp;amp;messagesUrl=video.google.com%2FFlashUiStrings.xlb%3Fframe%3Dflashstrings%26hl%3Den&amp;amp;nogvlm=1" type="application/x-shockwave-flash"&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/15441793-6188111564491838040?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=476b069e958dc2da&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/6188111564491838040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=6188111564491838040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/6188111564491838040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/6188111564491838040'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2007/11/openmoko-xmms2-client.html' title='Openmoko xmms2 client'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gDLrxrjght8/R0H3Cs_TBmI/AAAAAAAAAAM/EK5Bpp-IGbo/s72-c/x2r-omoko-screenshot.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-8790226544610712603</id><published>2007-09-22T11:47:00.000+02:00</published><updated>2007-09-22T17:19:40.449+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NIH'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='feeds'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>Batteries included</title><content type='html'>I used to read a few news feeds in &lt;a href="http://www.mozilla.com/thunderbird/"&gt;Thunderbird&lt;/a&gt;, it worked pretty nice (except that things got badly corrupted if disk got full). However I started working from different computers to a larger extent, so I wanted to maintain state across computers so articles I have read are marked as such on all computers I use. I did actually consider using some online service such as google reader, but I realized that I want more control and it would be nice to be able to read stuff offline.&lt;br /&gt;&lt;br /&gt;So I decided I wanted to store them to maildirs accessible over imap. I found quite a few different tools to get feeds converted into email in different formats. Newspipe looked most promising, so I set it up to pipe to procmail using a special procmail.rc-file. But things didn't really behave they way I wanted. It also wanted to run in daemon mode, I would have preferred it to run from cron.&lt;br /&gt;&lt;br /&gt;Well, how hard can it be to write a pythonscript that grabs feeds and stores into maildirs, I thought. I had heard about &lt;a href="http://feedparser.org/"&gt;feedparser&lt;/a&gt;, it was supposed to be good. apt-get install python-feedparser. Firing up the python interactive console poking around a bit with feedparser, grabbing rss/atom feeds was indeed a walk in the park. I recall having seen something about maildir support in python somewhere. Yes, google tells me there is a maildir module shipped with python. Batteries included. But at first the documentation didn't seem correct, it mentioned stuff that wasn't available in the module on my system. Oh, it had been updated for Python2.5, I finally got to write my first real python2.5 script (yet I didn't manage to squeeze in a with-operator or usage of the new generator features). I had to maintain state across invocations, so throw in another standard module, pickle and feeddir was born.&lt;br /&gt;&lt;br /&gt;So now I have &lt;i&gt;feeddir.py update&lt;/i&gt; in cron. And can do &lt;i&gt;feeddir.py add feeds.xmms2planet http://planet.xmms.se/rss20.xml&lt;/i&gt; to add a new feed which will be available for subscription in my imap clients (unders feeds/xmms2planet).&lt;br /&gt;&lt;br /&gt;Code can be found &lt;a href="http://git.0x63.nu/?p=feeddir.git;a=summary"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-8790226544610712603?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/8790226544610712603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=8790226544610712603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/8790226544610712603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/8790226544610712603'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2007/09/batteries-included.html' title='Batteries included'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-278132942387588926</id><published>2007-09-07T23:56:00.000+02:00</published><updated>2007-09-08T00:26:38.528+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><category scheme='http://www.blogger.com/atom/ns#' term='xmms2'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Playlist language</title><content type='html'>This code has been sitting in my homedir for quite a while, finally got around to clean it up enough to publish it. There still is way too many rough edges, but the implementation isn't very interesting anyway.&lt;br /&gt;&lt;br /&gt;I wanted a readable language for custom playlist formatting, instead of some hard to read string like: &lt;i&gt;$if(%album artist%,%album%,%artist%)|$if(%album artist%,$num(%tracknumber%,2) -  %title%,%album%)|$if($not(%album artist%),$num(%tracknumber%,2) - %title%)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Playlists are pretty much rows of data, which should be processed one by one, doing different things depending on what they contain. So lets have a language that has the form list(predicate + list(actions)), a bit like awk. There is no need to have multiple levels of nesting, so making use of indentation should be simple, a bit like python.&lt;br /&gt;&lt;br /&gt;So, without further delay, here is an example in the playlist language where awk meets python:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;:title &amp;&amp;amp; :artist == lastartist&lt;br /&gt;       pad(lastartist)&lt;br /&gt;       emit(" + ")&lt;br /&gt;       emit(:title)&lt;br /&gt;       emit(CR)&lt;br /&gt;       done()&lt;br /&gt;&lt;br /&gt;:title &amp;&amp;amp; :artist&lt;br /&gt;       emit()&lt;br /&gt;       emit(:artist)&lt;br /&gt;       emit(" - ")&lt;br /&gt;       emit(:title)&lt;br /&gt;       set(lastartist, :artist)&lt;br /&gt;       emit(CR)&lt;br /&gt;       done()&lt;br /&gt;&lt;br /&gt;"always"&lt;br /&gt;       set(lastartist, "")&lt;br /&gt;       emit(:url)&lt;br /&gt;       emit(CR)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://git.0x63.nu/?p=pll.git;a=summary"&gt;...and here is the (crappy) implementation&lt;/a&gt;. There is no loops and things to avoid the halting problem.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BTW. I put the cunit-wrapper in &lt;a href="http://git.0x63.nu/?p=scu.git;a=summary"&gt;git aswell&lt;/a&gt;, and added an &lt;a href="http://git.0x63.nu/?p=scu.git;a=blob;h=b224d11c81a14a28866daf52c8f827e464b0286d;hb=6b101fbc3586e66ad784e98ae01fa44f91898042;f=test_0.c"&gt;example&lt;/a&gt; that is a 1:1 conversion of &lt;a href="http://cunit.sourceforge.net/example.html"&gt;the cunit example&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-278132942387588926?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/278132942387588926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=278132942387588926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/278132942387588926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/278132942387588926'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2007/09/playlist-language.html' title='Playlist language'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-9098292924189559944</id><published>2007-08-29T19:31:00.000+02:00</published><updated>2007-09-07T23:55:53.686+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unittest'/><category scheme='http://www.blogger.com/atom/ns#' term='cunit'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>C unit testing framework</title><content type='html'>There was some complaints about how much boilerplate code was required in CUnit, and how much cleaner c++ tests were. I found it a bit absurd to use c++ unit test framework to test c-code just because of the boilerplate code, so I whipped up some wrapper around CUnit to avoid the boilerplate code, and poured in some gcc-extensions and linker tricks to make it work nicely. It is available for download &lt;a href="http://0x63.nu/files/scu.tgz"&gt;here&lt;/a&gt;. So now you have the choice between portable tests or lots of boilerplate code.&lt;br /&gt;&lt;br /&gt;A test suite looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;INIT("Stupid testsuite") {&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CLEANUP() {&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;TEST(test_1, "Test case 1") {&lt;br /&gt;        CU_ASSERT(0 == 10 - 10);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;TEST(test_2, "Test case 2") {&lt;br /&gt;        int i = 10 + 20;&lt;br /&gt;        CU_ASSERT(i == 30);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Oh, did I mention that each testsuite is put in a separate shared object which the runner loads using libdl?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-9098292924189559944?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/9098292924189559944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=9098292924189559944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/9098292924189559944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/9098292924189559944'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2007/08/c-unit-testing-framework.html' title='C unit testing framework'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-114946073519526660</id><published>2006-06-05T00:32:00.000+02:00</published><updated>2006-06-05T01:34:51.840+02:00</updated><title type='text'>I've been rebooted</title><content type='html'>Friday I was at &lt;a href="http://reboot.dk/"&gt;reboot 8&lt;/a&gt;. There was a few presentations worth mentioning...&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Jesse James Garrett - Beyond tagging: User generated information structure.&lt;/i&gt; The really interesting part was when he showed how Amazon instrument in every link to be able to compleatly track how the user surfed, not only what pages, but also exactly where in the pages (s)he clicked on the links. This got me thinking about applying this to desktop applications and doing a variant of the "test coverage feedback" stuff for GUI design, but instead of getting coverage data the GUI should be instrumented and track every action in the GUI and give feedback on how the users interact with the application. The problem is of course to analyze the data; a tool that just gives a list of the most important things to optimize in the GUI would probably be a good start. Using every user as a test person that improve the usability can't be bad, can it? Luckily I'm not writing any GUI application currently, so I wont try to implement it :)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Jeremy Keith - In Praise Of The Hyperlink&lt;/i&gt;. A great presentation; a wonderful loveletter to the hyperlink. I really can't make the presentation justice in this blog entry, but there is two things that I just have to relay. #1: Permalink should be a tautology - links want to be permanent. #2: Google bot is a quantum device; when I visit a webpage with a number of links, universe spawns a number of parallell universes, one for each link, and I will remain in the one corresponding to the link I click on - google bot however is a quantum device and will follow all of them, and exist in several universes.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Chris Heathcote - A mobile Internet manifesto&lt;/i&gt;. This guy from nokia gave a good presentation. I totally agree that the real blocker for good mobile apps is that operators charge per transferred amount of data. I did a pretty cool demo with his phone basically running a port of apache and mod_python and controlling the phone over the web. It wouldn't be that useful in it self, but it really allows to build applications that pushes data into the phone. Nokia is definitly doing the right thing opening up the platform with python. My next phone might even be a noika.&lt;br /&gt;&lt;br /&gt;Categories: &lt;a href="http://technorati.com/tag/reboot8"&gt;reboot8&lt;/a&gt; &lt;a href="http://technorati.com/tag/web"&gt;web&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-114946073519526660?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/114946073519526660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=114946073519526660' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/114946073519526660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/114946073519526660'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2006/06/ive-been-rebooted.html' title='I&apos;ve been rebooted'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-114399670024750434</id><published>2006-04-02T18:30:00.000+02:00</published><updated>2006-04-22T23:12:26.513+02:00</updated><title type='text'>-multicast +caching followup</title><content type='html'>(ok, this post has been in draft state for almost month, so I guess I'll just publish it, before it is totally outdated.)&lt;br /&gt;&lt;br /&gt;I got quite a few reactions on my previous post. Most saying something like: "Pretty nice, but content providers wont allow it to happen". Unfortunately I have to agree to a large extent. It would have been better if they understood that it is in their interest. People really want time shifting, they will buy recording devices instead if the it is not supported directly in the service. So the content providers will actually have better control with the caching scheme.&lt;br /&gt;&lt;br /&gt;It is also interesting to relate this to the "network neutrality"/"broadband discrimination"  discussion. The caching should decrease the amount of traffic through the carriers. Instead of starting paying the carriers lots of money, the money could be spent deploying caches at the ISPs.&lt;br /&gt;&lt;br /&gt;There are even content providers that have realized that the situation is not sustainable. http://www.svd.se/dynamiskt/noje/did_12262248.asp (A short summary in English: SVT (the public service television in Sweden) is starting to search for alternative methods for distributing their on demand "internet TV". The huge increase in popularity has caused higher traffic costs, which is the main problem with the current method of distribution; "The more people watching, the higher cost").&lt;br /&gt;&lt;br /&gt;Categories: &lt;a href="http://technorati.com/tag/multicast"&gt;multicast&lt;/a&gt; &lt;a href="http://technorati.com/tag/IpTV"&gt;IpTV&lt;/a&gt; &lt;a href="http://technorati.com/tag/VOD"&gt;VOD&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-114399670024750434?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/114399670024750434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=114399670024750434' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/114399670024750434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/114399670024750434'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2006/04/multicast-caching-followup.html' title='-multicast +caching followup'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-114164543537281343</id><published>2006-03-06T12:31:00.000+01:00</published><updated>2006-03-06T13:08:35.826+01:00</updated><title type='text'>How caching supersedes multicast</title><content type='html'>After some discussion with Alexander I've spent some time during the last week thinking about and discussing multicast and distribution of television. I decided that it would probably be a good idea to have it written down.&lt;br /&gt;&lt;br /&gt;Multicast is an effective method to deliver the same data to the several nodes at the same time, but what are the applications of multicast? There are two basic criteria that must be fulfilled for an application to benefit from multicast.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There must more than one node requesting the same data at the same time. If only one node want the data at that specific moment the multicasting becomes unicasting.&lt;/li&gt;&lt;li&gt;There can't be any strict requirements that the data will be delivered correctly. It is a one way communication channel, and resending data that one node have lost would deliver it to all nodes. Yes, there are schemes of different complexities to make it "reliable", but they are at best a ugly hack.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;This makes the group of applications where multicast is useful very limited. There is actually only one single application that clearly is many nodes requesting the same data at the same time; Television and radio. The triple playing and putting every service into IP packets makes us need multicast enabled networks?&lt;br /&gt;&lt;br /&gt;The way television and radio is works today is just a consequence of the technology used to deliver the data to the viewers; the data is broadcast (either via radio waves or via shared media in CATV-networks) to many receivers at the same time. The broadcasting by definition forces the viewers to watch the programs at the same time (or use a time shifting device such as a VHS recorder). But why would I want watch the latest episode of "Lost" Wednesdays at 21:00 just because it is scheduled for broadcast at that time. Almost everyone can say a time that would suit them better. Why should this misfeature of TV and radio be reimplemented when the technology to distribute it is changed?&lt;br /&gt;&lt;br /&gt;All TV and radio should be on demand, giving the viewer the power to decide when he or she wants to watch the programme. This is already happening to a large extent, although in a way that is not blessed by the creators of the content, by people downloading with file sharing applications such as bittorrent. The main two reasons people download TV programmes are that the commercial breaks are removed and, probably more important, they can watch it at any time. Another datapoint is how podcasting has changed how people listen to radio. People download the shows they are interested in and listen to it &lt;span style="font-style: italic;"&gt;when it suits&lt;/span&gt;. The huge popularity of podcasting is a strong indication of that people want to consume media when it suits them, and not at a time scheduled by the broadcasting company because a limitation in the technology.&lt;br /&gt;&lt;br /&gt;Such paradigm shift in how media is delivered will make the need of multicast to distribute television and radio void. There will be very few cases when many people watch the same thing at the same time, and that is live broadcasts, which in principle is limited to large sport events such as the Olympic games, world championships or the final of some league. But that would just be a very very small share of the media that benefits from multicast.&lt;br /&gt;&lt;br /&gt;But can the network cope with unicasting all that data to the viewers? Lets say that 5 million persons (a big city or a small country) is watching about one hour of TV each  evening between 18:00 and 24:00 and that it is a 4Mbps stream. Then we have 5M*4Mbps*1h/6h ~= 3Tbps. That's quite some bandwidth required. So maybe fully deployed on demand TV is impossible?&lt;br /&gt;&lt;br /&gt;It can be assumed that there will be temporal locality; people will watch the same things at approximately the same time. The evening a new episode of "Lost" is released many people will watch it, or at least the during the next days. There is also a high probability that there will be some geographical locality; some programmes have a audience that is based on the region they live in, regional news is one example. Both temporal and geographical locality are always strong cases for caching. The caches will work like some kind of relay stations. The placement of the caches is crucial, they can't be too far from the end users and serve too many users because then their load will affect large parts of the network and they can't be too close either because then there will be less benefit of the caching. But it should be easy to create a model to find the optimal placement.&lt;br /&gt;&lt;br /&gt;The caches would grab their content from the content-provider when they don't have the data available. The content-provider could be far away, but there should atleast be much peak bandwidth available even though the QoS can't be guaranteed. That shouldn't cause any problems, because it would easily be able to download the full media file much faster than the end user views it. The path from the cache to the end user is much shorter and is much more controllable environment where QoS applies. The caches are actually doing some kind of multicast, but on layer 7 instead of the IP layer, and they also implement timeshifting.&lt;br /&gt;&lt;br /&gt;The cache operators would be the new television networks, which buys content and distributes it to the customers. It could be the ISP that own and operates the caches. It could also be a separate entity, maybe even a separate AS, but the caches need to be closer to the end users than the normal peering points allows for, so it would be some kind of new schemes for exchanging traffic between AS:es much closer to the end users. Most likely it would be easier to just put the caches in the ISP's network.&lt;br /&gt;&lt;br /&gt;To conclude: media wants to be consumed at the most convenient time, therefore it will not be consumed simultaneously and multicast is not beneficial.&lt;br /&gt;&lt;br /&gt;Categories: &lt;a href="http://technorati.com/tag/multicast"&gt;multicast&lt;/a&gt; &lt;a href="http://technorati.com/tag/IpTV"&gt;IpTV&lt;/a&gt; &lt;a href="http://technorati.com/tag/VOD"&gt;VOD&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-114164543537281343?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/114164543537281343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=114164543537281343' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/114164543537281343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/114164543537281343'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2006/03/how-caching-supersedes-multicast.html' title='How caching supersedes multicast'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-113744369218661750</id><published>2006-01-16T21:02:00.000+01:00</published><updated>2006-01-21T02:53:21.073+01:00</updated><title type='text'>Release driven by test coverage feedback</title><content type='html'>Tried something new when releasing &lt;span style="font-style: italic;"&gt;XMMS2 0.2 DrBombay&lt;/span&gt;. Set a requirement to reach a "test goal" before releasing. This means that the release was postponed until enough test coverage feedback was released.&lt;br /&gt;&lt;br /&gt;XMMS2 includes a small tool called xmms2-et that, when enabled, sends basic test coverage data to a central server. xmms2-et sends one small UDP packet for each song played. The packet includes information about operating system, version of xmms2 and what plugins are being used to play current song. By looking at this data it is possible to get an picture of how much testing different components are getting. This can be very helpful in rc-phase (release candidate), because you will know that a certain version has at least played a certain number of songs. This will make it much easier to say that the specific version is good and a release can be made, while being pretty confident that there are no serious bugs.&lt;br /&gt;&lt;br /&gt;Of course it all depends on the users running xmms2-et to report any problems they find. Getting lots of feedback data doesn't help if the users doesn't report any problems they have found, then it will have a negative effect instead, you will feel confident that a version works good because it has gotten so much testing while it actually is broken and users just don't report the errors.&lt;br /&gt;&lt;br /&gt;To try to mitigate this problem and to increase community involvement a web page with test goals were created. It showed how much testing different components needed and how much testing they got so far. This way testers could easily see how testing was going. The release was delayed until all componets had reached 100% of their test goal. This way the  users testing was the ones who had the power of "deciding" when to release, they could easily see if some component was lagging behind on the test goal page and give that one some extra testing to decrease the time left to release.&lt;br /&gt;&lt;br /&gt;In xmms2 it is easy to identify different components and there is a natural event (playing next song) when feedback data can be submitted immediately. Another method that might be better in other (and maybe this to really) cases is to collect the testing data offline into a file which can be mailed or submitted in another way. That way it could easier be expanded to some more finegrained analysis, even including full call-graph analysis. Distributed gcov, when will someone write that, or does it already exist?&lt;br /&gt;&lt;br /&gt;Using test coverage feedback data to drive releases was a very interesting experiment and next release of xmms2 will definitely try it again and hopefully refine it. Next time more people will know what it is all about  the community involvement will hopefully be larger and it will be an even more well tested release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-113744369218661750?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/113744369218661750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=113744369218661750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/113744369218661750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/113744369218661750'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2006/01/release-driven-by-test-coverage.html' title='Release driven by test coverage feedback'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-113666341760738639</id><published>2006-01-07T20:15:00.000+01:00</published><updated>2006-01-07T21:02:40.556+01:00</updated><title type='text'>UTF-8</title><content type='html'>So, I have started to use utf-8 as default character set on my primary laptop.&lt;br /&gt;&lt;br /&gt;Why did I change from iso-8859-1 (aka latin 1)?&lt;br /&gt;&lt;br /&gt;I don't have much use of the huge amount of different characters that I'm able to write with utf-8, of course it is fun to be able to look at Asian or even Braille characters, but all languages I know use western characters, and 8859-1 gives me full coverage for those. (Sweden has not switched to the Euro currency, so I don't have much use of the euro sign (€), and if I had 8859-15 would have been enough).&lt;br /&gt;&lt;br /&gt;But I want to contribute to making utf-8 an universal standard characterset. Even if it isn't perfect it actually has the potential of becoming THE characterset. Wouldn't it be nice to never have to care about what encoding is used?&lt;br /&gt;&lt;br /&gt;Ever since reading &lt;a href="http://www.cl.cam.ac.uk/%7Emgk25/ucs/utf-8-history.txt"&gt;http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt&lt;/a&gt; I have appreciated the design of utf-8 (especially the "Criteria for the Transformation Format" is must-read). But it has taken several years until I finally switched. The main reason for the switch was a reinstall of the operating system because of a dying harddrive. Ofcourse the recode-support in new irssi helped in making the decision too :)&lt;br /&gt;&lt;br /&gt;The thing I find most annoying at the moment is that the locale isn't propagated across ssh-sessions. So I have to change the .bashrc on all machines I log in to to setup the locale correctly (or am I missing something?). Otherwise everything seems to just work.&lt;br /&gt;&lt;br /&gt;Sidenote:&lt;br /&gt;My blog appears on &lt;a href="http://planet.xmms.se/"&gt;planet.xmms.se&lt;/a&gt;, but I stillhaven'tt written a single word about xmms2 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-113666341760738639?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/113666341760738639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=113666341760738639' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/113666341760738639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/113666341760738639'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2006/01/utf-8.html' title='UTF-8'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-112479836795994419</id><published>2005-08-23T10:41:00.000+02:00</published><updated>2005-09-21T13:07:54.240+02:00</updated><title type='text'>To skype or not to skype</title><content type='html'>While I do like the userfriendliness  and extreme ease of use of skype, it has a few big problems, that by them self probably had made me avoid skype, and combined even made me motivated enough to write this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Skype uses a proprietary protocol.&lt;/span&gt; The information about how the clients communicate (with login server/other clients/supernodes) is not publicly available. This means that it is not possible to create third part clients without a blessing from Skype Technologies S.A [or what ever they are called, some Evil Corporation&lt;tm&gt; at least :) ], if they do it at all. The official client of course isn't open source, so you cant derive the protocol from that in an easy way. The client being closed source also makes the need of writing third part clients even larger. But even more important, there is no way to do a security analysis of the protocol! I don't really care if the protocol is secure or not, but I want to know how secure it is so I know when I should and when I shouldn't use it. &lt;span style="font-weight: bold;"&gt;All protocols that claims to be secure should be open for public scrutinizing.&lt;/span&gt; The skype protocol claims to use RSA to negotiate AES-keys, but without information about the implementation it impossible to say anything about the security.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The skype network is assembled in an ad hoc way.&lt;/span&gt; You don't know how your call is routed. Your call may be routed though nodes that are completely out of your control, you cant sign an agreement about a good service level with them. Other users calls may be routed through you, degrading your performance. The end-to-end nature of skype is totally in line with the internet philosophy with the network being dumb, but this is spoiled by having traffic routed through other nodes.&lt;br /&gt;&lt;br /&gt;Read more here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.simson.net/ref/2005/OSI_Skype6.pdf"&gt;Simson L. Garfinkel, &lt;span style="font-style: italic;"&gt;VoIP and Skype Security&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://arxiv.org/pdf/cs.NI/0412017"&gt;Salman A. Baset and Henning Schulzrinne, &lt;span style="font-style: italic;"&gt;An Analysis of the Skype Peer-to-Peer Internet Telephony Protocol&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-112479836795994419?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/112479836795994419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=112479836795994419' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/112479836795994419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/112479836795994419'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2005/08/to-skype-or-not-to-skype.html' title='To skype or not to skype'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15441793.post-112411101183231671</id><published>2005-08-15T14:56:00.000+02:00</published><updated>2005-08-15T15:05:12.106+02:00</updated><title type='text'>First POST!</title><content type='html'>Usually I quote &lt;a href="http://vger.kernel.org/%7Edavem/"&gt;davem&lt;/a&gt; whenever people start talking about blogs:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Sorry, I totally don't understand the whole blog phenomenon and what drives people to update these things constantly. It's like the internet equivalent of a bullhorn "HERE IS WHAT I HAVE TO SAY AND THE BORING SHIT I DID TODAY, HEAR ME ROAR!"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;However, lately I have realized that there actually exists some quality blogs, &lt;a href="http://schneier.com/blog/"&gt;Schneier's&lt;/a&gt; being one of the few. My blog will of course not be one of those.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15441793-112411101183231671?l=blog.0x63.nu' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.0x63.nu/feeds/112411101183231671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15441793&amp;postID=112411101183231671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/112411101183231671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15441793/posts/default/112411101183231671'/><link rel='alternate' type='text/html' href='http://blog.0x63.nu/2005/08/first-post.html' title='First POST!'/><author><name>Anders Waldenborg</name><uri>http://www.blogger.com/profile/11727818539263156471</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17768319551088565435'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>