<?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-28736414</id><updated>2012-02-16T07:14:10.740Z</updated><category term='bittorrent'/><category term='gsoc'/><category term='photo'/><category term='smtp'/><category term='personal'/><category term='maths'/><category term='freeview'/><category term='programming'/><category term='kamaelia'/><category term='ubuntu'/><category term='puzzle'/><category term='v4l-dvb'/><category term='http'/><category term='c++'/><title type='text'>Ryan's Dev Blog</title><subtitle type='html'>Programming, maths, computer science, technology...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-28736414.post-8731766538386244191</id><published>2008-04-10T11:10:00.001+01:00</published><updated>2008-04-10T11:10:19.656+01:00</updated><title type='text'>Peacock</title><content type='html'>&lt;style type="text/css"&gt;.flickr-photo { border: solid 2px #000000; }.flickr-yourcomment { }.flickr-frame { text-align: left; padding: 3px; }.flickr-caption { font-size: 0.8em; margin-top: 0px; }&lt;/style&gt;&lt;div class="flickr-frame"&gt;	&lt;a href="http://www.flickr.com/photos/rjlothian/2383515016/" title="photo sharing"&gt;&lt;img src="http://farm3.static.flickr.com/2356/2383515016_bb6a9f2a5a.jpg" class="flickr-photo" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;	&lt;span class="flickr-caption"&gt;&lt;a href="http://www.flickr.com/photos/rjlothian/2383515016/"&gt;Peacock&lt;/a&gt;, originally uploaded by &lt;a href="http://www.flickr.com/people/rjlothian/"&gt;rjlothian&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;				&lt;p class="flickr-yourcomment"&gt;	&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-8731766538386244191?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/8731766538386244191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=8731766538386244191' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/8731766538386244191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/8731766538386244191'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2008/04/peacock.html' title='Peacock'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2356/2383515016_bb6a9f2a5a_t.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-6260386086064158422</id><published>2008-04-10T11:08:00.001+01:00</published><updated>2008-04-10T11:08:24.090+01:00</updated><title type='text'>Tulips</title><content type='html'>&lt;style type="text/css"&gt;.flickr-photo { border: solid 2px #000000; }.flickr-yourcomment { }.flickr-frame { text-align: left; padding: 3px; }.flickr-caption { font-size: 0.8em; margin-top: 0px; }&lt;/style&gt;&lt;div class="flickr-frame"&gt;	&lt;a href="http://www.flickr.com/photos/rjlothian/2377954158/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3277/2377954158_1f66803c62.jpg" class="flickr-photo" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;	&lt;span class="flickr-caption"&gt;&lt;a href="http://www.flickr.com/photos/rjlothian/2377954158/"&gt;Tulips&lt;/a&gt;, originally uploaded by &lt;a href="http://www.flickr.com/people/rjlothian/"&gt;rjlothian&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;				&lt;p class="flickr-yourcomment"&gt;	&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-6260386086064158422?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/6260386086064158422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=6260386086064158422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/6260386086064158422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/6260386086064158422'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2008/04/tulips.html' title='Tulips'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3277/2377954158_1f66803c62_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-2120567023652357526</id><published>2008-04-10T11:06:00.002+01:00</published><updated>2008-04-10T11:07:12.293+01:00</updated><title type='text'>Robin</title><content type='html'>&lt;style type="text/css"&gt;.flickr-photo { border: solid 2px #000000; }.flickr-yourcomment { }.flickr-frame { text-align: left; padding: 3px; }.flickr-caption { font-size: 0.8em; margin-top: 0px; }&lt;/style&gt;&lt;div class="flickr-frame"&gt; &lt;a href="http://www.flickr.com/photos/rjlothian/2377940108/" title="photo sharing"&gt;&lt;img src="http://farm3.static.flickr.com/2068/2377940108_3545320a15.jpg" class="flickr-photo" alt="" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;span class="flickr-caption"&gt;&lt;a href="http://www.flickr.com/photos/rjlothian/2377940108/"&gt;Robin&lt;/a&gt;, originally uploaded by &lt;a href="http://www.flickr.com/people/rjlothian/"&gt;rjlothian&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;    &lt;p class="flickr-yourcomment"&gt; Taken inside the Eden Project, Cornwall.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-2120567023652357526?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/2120567023652357526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=2120567023652357526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2120567023652357526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2120567023652357526'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2008/04/robin.html' title='Robin'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2068/2377940108_3545320a15_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-2766925363485961899</id><published>2008-03-20T21:44:00.002Z</published><updated>2008-03-20T21:46:29.711Z</updated><title type='text'>CRC algorithm</title><content type='html'>I've written a &lt;a href="http://www.ryanlothian.com/articles/crc-algorithm"&gt;CRC checksum generator in Haskell&lt;/a&gt; to complement my &lt;a href="http://www.ryanlothian.com/compsci/error-detection-and-correction"&gt;error detection/correction article&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-2766925363485961899?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/2766925363485961899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=2766925363485961899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2766925363485961899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2766925363485961899'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2008/03/crc-algorithm.html' title='CRC algorithm'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-5317993684431184016</id><published>2008-03-19T11:20:00.001Z</published><updated>2008-03-19T11:21:28.996Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='maths'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>My graph plotter</title><content type='html'>I've finally got around to upgrading my graph plotter to work online.&lt;br /&gt;You can play with the live demo at &lt;a href="http://graph.ryanlothian.com/"&gt;http://graph.ryanlothian.com/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://graph.ryanlothian.com/graphs/4acb35a843d762efb459d413d3247149.png"&gt;&lt;/img&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-5317993684431184016?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/5317993684431184016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=5317993684431184016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/5317993684431184016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/5317993684431184016'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2008/03/my-graph-plotter.html' title='My graph plotter'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-2874402262797146013</id><published>2008-03-19T11:16:00.001Z</published><updated>2008-03-19T11:19:01.197Z</updated><title type='text'>Review of OpenSuSE 10.3</title><content type='html'>Is Ubuntu still king of distros? I took the plunge and installed OpenSuSE. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ryanlothian.com/articles/review-opensuse-10.3"&gt;Read more&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-2874402262797146013?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/2874402262797146013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=2874402262797146013' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2874402262797146013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2874402262797146013'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2008/03/review-of-opensuse-103.html' title='Review of OpenSuSE 10.3'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-3006447457281225640</id><published>2008-03-19T11:14:00.004Z</published><updated>2008-03-19T11:16:48.290Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='maths'/><category scheme='http://www.blogger.com/atom/ns#' term='puzzle'/><title type='text'>Tiger and duck problem</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ryanlothian.com/articles/tiger-problem.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; " src="http://www.ryanlothian.com/articles/tiger-problem.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A duck floats at the centre of a circular lake.&lt;br /&gt;&lt;br /&gt;A hungry tiger waits a the edge of the lake, watching the duck.&lt;br /&gt;&lt;br /&gt;The tiger can run four times the speed at which the duck can swim, but it can only go over land (i.e. around the circumference of the circle).&lt;br /&gt;&lt;br /&gt;How can the duck reach the edge of the lake before the tiger and hence escape?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ryanlothian.com/articles/puzzles/tiger-and-duck"&gt;Need a hint?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-3006447457281225640?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/3006447457281225640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=3006447457281225640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/3006447457281225640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/3006447457281225640'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2008/03/tiger-and-duck-problem.html' title='Tiger and duck problem'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-6866587369714286558</id><published>2007-09-21T08:43:00.000+01:00</published><updated>2007-09-21T08:47:36.571+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><title type='text'>A day at the zoo (photo)</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/rjlothian/1196678338/" title="Parrot"&gt;&lt;img src="http://farm2.static.flickr.com/1298/1196678338_7212faada9.jpg" alt="Parrot" height="333" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;Canon EF 100mm USM Macro f/2.8&lt;br /&gt;f/4.5 1/320sec ISO 400&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-6866587369714286558?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/6866587369714286558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=6866587369714286558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/6866587369714286558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/6866587369714286558'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2007/09/day-at-zoo-photo.html' title='A day at the zoo (photo)'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1298/1196678338_7212faada9_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-324377336465674797</id><published>2007-09-21T08:39:00.000+01:00</published><updated>2007-09-21T08:42:05.689+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>A first look at Ubuntu Gutsy</title><content type='html'>I've been trying out Ubuntu's latest alpha-release: Gutsy Gibbon (7.10). You can find screenshots and a log of my experiences with Gutsy on &lt;a href="http://ryan.nfshost.com/articles/ubuntu/gutsy"&gt;my website.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-324377336465674797?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/324377336465674797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=324377336465674797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/324377336465674797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/324377336465674797'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2007/09/first-look-at-ubuntu-gutsy.html' title='A first look at Ubuntu Gutsy'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-7210784920518726462</id><published>2006-11-03T16:50:00.000Z</published><updated>2006-11-03T17:00:36.319Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu Edgy</title><content type='html'>Ubuntu Edgy is now out. Release highlights include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Firefox 2.0... which isn't really a huge improvement over 1.5.&lt;/li&gt;&lt;li&gt;a splash screen that doesn't work (at least for me)&lt;/li&gt;&lt;li&gt;Xorg 7.1&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ATI drivers that are too old to work with Xorg 7.1 properly&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a compile of MPlayer that complains about its compilation options every time your run it&lt;/li&gt;&lt;li&gt;more shades of brown and orange&lt;/li&gt;&lt;li&gt;etc.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;It also has up to date software, like  Edgy isn't bad though, worth upgrading if you don't mind a few hours of hassle. It fixes a few pesky bugs in Dapper, like not being able to change the frequency of my CPU's second core through the GUI. And having the latest things is always nice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-7210784920518726462?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/7210784920518726462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=7210784920518726462' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/7210784920518726462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/7210784920518726462'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/11/ubuntu-edgy.html' title='Ubuntu Edgy'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-8642418613148450166</id><published>2006-09-30T23:45:00.000+01:00</published><updated>2006-09-29T00:30:26.359+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><title type='text'>Kamaelia 0.5.0 Released!</title><content type='html'>Kamaelia is an intuitive way to structure applications -- as a network of components which message each other. Much like Unix pipes implemented in Python. It was originally designed by BBC Research for rapid development of server software.&lt;br /&gt;&lt;br /&gt;Here's a taster of what a Kamaelia application looks like: (built with the GUI)&lt;br /&gt;&lt;pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/7070/3507/1600/composer-filedownloader.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger2/7070/3507/320/composer-filedownloader.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt;And here's some equivalent Python code:&lt;br /&gt;&lt;pre&gt;Pipeline(&lt;br /&gt;  ConsoleReader(eol=""),&lt;br /&gt;  SimpleHTTPClient(),&lt;br /&gt;  SimpleFileWriter("downloadedfile.txt"),&lt;br /&gt;).run()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Those 5 lines of Python give you a console-based HTTP downloading program (like wget or curl but with less options) using existing components.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the console reader sends lines of text (URLs) the user enters to...&lt;/li&gt;&lt;li&gt;the HTTP client, which fetches the associated page. It then forwards on the page data to...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the file writer, which appends all messages it's sent to a file on disk.&lt;/li&gt;&lt;/ul&gt;It's as simple as that.&lt;br /&gt;&lt;br /&gt;Version 0.5.0 is a major release - lots of functionality has been added from Google Summer of Code 2006. Key highlights of this release:&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;BitTorrent support&lt;/span&gt; (using the official BitTorrent client) - includes preliminary 'streaming over BitTorrent' support. Lets you integrate P2P in your own Kamaelia applications.&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;img style="margin: 10px; cursor: pointer;" src="http://photos1.blogger.com/blogger2/7070/3507/320/TorrentTkGUI-screenshot.png" alt="Kamaelia BitTorrent client GUI" title="Kamaelia BitTorrent client GUI" border="0" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;HTTP client&lt;/span&gt;&lt;span&gt; and nascent seaside-style pure-python &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;webserver&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;OpenGL&lt;/span&gt;&lt;span&gt; (e.g. the checkers/draughts board on the right)&lt;/span&gt;&lt;img src="http://photos1.blogger.com/blogger2/7070/3507/400/thfcheckers.0.png" title="OpenGL checkers example" alt="OpenGL checkers example" style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" border="0" /&gt;&lt;/li&gt;&lt;li&gt;Strong &lt;span style="font-weight: bold;"&gt;DVB&lt;/span&gt; (freeview TV) support on Linux - including the foundations of a PVR&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Collaborative whiteboarding&lt;/span&gt; with audio (speex encoded) - draw and talk together over the internet&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;V&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;isual composition&lt;/span&gt; of Kamaelia systems - create and link components on screen, see the code produced (the screenshot near the top of the article)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;For more information see the &lt;a href="http://kamaelia.sourceforge.net/Home"&gt;Kamaelia website&lt;/a&gt;. You can get a copy of Kamaelia and Axon from Sourceforge, together with most of the dependencies in the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=122494&amp;package_id=183774&amp;amp;release_id=451251"&gt;mega bundle&lt;/a&gt;. If you have any problems or questions, just pop along to #kamaelia on &lt;span style="font-style: italic;"&gt;irc.freenode.net&lt;/span&gt;. No Python experience is needed to get started!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-8642418613148450166?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/8642418613148450166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=8642418613148450166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/8642418613148450166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/8642418613148450166'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/09/kamaelia-050-released.html' title='Kamaelia 0.5.0 Released!'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-6535172539426751951</id><published>2006-09-25T00:11:00.000+01:00</published><updated>2006-09-25T00:15:56.625+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><category scheme='http://www.blogger.com/atom/ns#' term='bittorrent'/><title type='text'>Curse of BitTorrent strikes again</title><content type='html'>Some oddness was noticed with my Torrent components after they were moved into the Kamaelia main tree -  they no longer worked. TorrentTkGUI just sat there when started - it didn't even get as far as popping up a window. It turned out that BitTorrent expects a locale directory in ./ - a 'feature' added to the code base recently. We're now including the required English locale file where it is expected (as it is only 409 bytes) and considering removing the need for locale files as we only use BitTorrent for the backend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-6535172539426751951?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/6535172539426751951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=6535172539426751951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/6535172539426751951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/6535172539426751951'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/09/curse-of-bittorrent-strikes-again.html' title='Curse of BitTorrent strikes again'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-7362308070859625383</id><published>2006-09-21T21:53:00.000+01:00</published><updated>2006-09-21T21:56:54.458+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu 6.06 (Dapper) on my Inspiron 6400</title><content type='html'>Ubuntu Dapper Drake is working very nicely on my new laptop. I had to install the ATI proprietary drivers manually as the ones in the repositories are too old to support my Radeon X1300. I have written some brief notes on &lt;a href="http://ronline.no-ip.info/linux/inspiron6400.php"&gt;how to setup Ubuntu on a Inspiron 6400&lt;/a&gt;. Now I can finally break my code on a true SMP machine :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-7362308070859625383?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/7362308070859625383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=7362308070859625383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/7362308070859625383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/7362308070859625383'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/09/ubuntu-606-dapper-on-my-inspiron-6400.html' title='Ubuntu 6.06 (Dapper) on my Inspiron 6400'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-358271319688120255</id><published>2006-09-21T13:08:00.000+01:00</published><updated>2006-09-21T13:10:30.867+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><title type='text'>Efficient serving using flow control</title><content type='html'>Generally, different parts of Kamaelia systems run at different throughputs. You may be able to read file faster than you can serve it to your clients (because they or you have slow network connections). They may not be able to decompress images at the rate they can read their data into memory. By slowing down data sources to reflect the rate at which later components can process/transmit that data, we can save a lot of memory.&lt;br /&gt;Unpausing of components upon recipient.recv is due to be added to Axon in the next few weeks. This is very important for HTTPServer as it allows it to handle bottlenecks efficiently.&lt;br /&gt;Three ways a file could be sent over a network:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Example A&lt;/span&gt; - without considering bottlenecks&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 153, 0);"&gt;FileReader&lt;/span&gt; ---&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;TCPClient&lt;/span&gt; -&gt; -&gt; (slow network) -&gt; -&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;TCPServer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;If the rate at which one can read a file from disk is faster than the rate at which the network can send (as it generally is), then the file ends up being stored in memory in TCPClient's inbox queue.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Example B&lt;/span&gt; - considering bottlenecks but without unpausing upon recv&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;RateAdaptiveFileReader&lt;/span&gt; ---&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;TCPClient&lt;/span&gt; -&gt; -&gt; (slow network) -&gt; -&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;TCPServer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Now let us assume that we have a file reader that won't read any more from disk until the number of chunks of data in its outbox goes below a certain value. If the file reader pauses when its outbox length reaches this value, having nothing to do, it won't be woken when messages are removed from its outbox, so most of the file will never be read. Thus the file reader cannot pause, so it has to poll its outbox repeatedly. Polling is a bad thing - it uses large amounts of CPU unnecessarily. This is how HTTPServer currently works.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Example C&lt;/span&gt; - considering bottlenecks with unpausing upon recv&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 102, 0);"&gt;RateAdaptiveFileReader&lt;/span&gt; ---&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;TCPClient&lt;/span&gt; -&gt; -&gt; (slow network) -&gt; -&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;TCPServer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;As with Example B, except that the file reader can pause while it's waiting for the TCPClient to send stuff on. This is how HTTPServer is intended to be (and can be made to be with a few small changes).&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-358271319688120255?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/358271319688120255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=358271319688120255' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/358271319688120255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/358271319688120255'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/09/http-server-efficiency-unpausing-with.html' title='Efficient serving using flow control'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-1435105881346682133</id><published>2006-09-21T12:45:00.000+01:00</published><updated>2006-09-21T13:04:32.750+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><category scheme='http://www.blogger.com/atom/ns#' term='gsoc'/><category scheme='http://www.blogger.com/atom/ns#' term='bittorrent'/><title type='text'>HTTP server improvements and the release of GSoC 2006 work</title><content type='html'>My HTTP  and BitTorrent components produced for Google Summer of Code 2006 are now in Kamaelia's main tree (/Code/Python/Kamaelia/ in subversion).&lt;br /&gt;&lt;br /&gt;I'm auditing HTTP server components for security and efficiency to get it past the 'toy' stage of development. So far, I've begun setting limits for request sizes (not POST body sizes, just header and URI sizes). I have also improved standards-compliance by converting HTTP version numbers to tuples of the form (major, minor). This makes comparisons much easier than if they were stored as strings.&lt;br /&gt;&lt;br /&gt;I have also augmented the CharacterFIFO (character queue) class that originated in Chunkifier with a "popline" method, allowing it to be used in HTTPParser. This character queue replaces the old, inefficient concatenation methods that were previously in use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-1435105881346682133?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/1435105881346682133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=1435105881346682133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/1435105881346682133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/1435105881346682133'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/09/http-server-improvements-and-release-of.html' title='HTTP server improvements and the release of GSoC 2006 work'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-2066009163621205760</id><published>2006-09-14T09:32:00.000+01:00</published><updated>2006-09-14T09:53:41.024+01:00</updated><title type='text'>Implicit pausing MiniAxon</title><content type='html'>Consider a version of Axon where microprocesses pause by default after each iteration of &lt;span style="font-family:courier new;"&gt;main&lt;/span&gt;. Such a setup encourages the writing of efficient components by making polling difficult (but not impossible - a clock/tick threadedcomponent could send a wakeup message every second). This removes the ideas of pausing and unpausing - &lt;span style="font-family:courier new;"&gt;activate()&lt;/span&gt; can be used instead of &lt;span style="font-family:courier new;"&gt;unpause()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I also have different ideas about trigging the activation/unpausing of components. The component should be able to specify events that wake it.  For inboxes, the receipt of a message could wake the parent component, or not. For outboxes, the removal of a sent message from the recipient inbox (through &lt;span style="font-family:courier new;"&gt;recv()&lt;/span&gt;) could also wake the parent.&lt;br /&gt;&lt;br /&gt;There are occasions when you would not want delivery to an inbox to wake the component:&lt;br /&gt;Consider this component:&lt;br /&gt;&lt;pre class="python"&gt;&lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;class&lt;/span&gt; Combiner&lt;span style="color:black;"&gt;(&lt;/span&gt;component&lt;span style="color:black;"&gt;)&lt;/span&gt;:&lt;br /&gt;  Inboxes = &lt;span style="color:black;"&gt;[&lt;/span&gt;&lt;span style="color: rgb(86, 129, 193);"&gt;"a"&lt;/span&gt;, &lt;span style="color: rgb(86, 129, 193);"&gt;"b"&lt;/span&gt;&lt;span style="color:black;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: rgb(220, 20, 60);"&gt;__main__&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;:&lt;br /&gt;      &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;while&lt;/span&gt; &lt;span style="color: rgb(255, 69, 0);"&gt;1&lt;/span&gt;:&lt;br /&gt;          &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;while&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.&lt;span style="color:black;"&gt;dataReady&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(86, 129, 193);"&gt;"a"&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt; &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;and&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.&lt;span style="color:black;"&gt;dataReady&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(86, 129, 193);"&gt;"b"&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;:&lt;br /&gt;              newmsg = &lt;span style="color:black;"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.&lt;span style="color:black;"&gt;recv&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(86, 129, 193);"&gt;"a"&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.&lt;span style="color:black;"&gt;recv&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(86, 129, 193);"&gt;"b"&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;]&lt;/span&gt;&lt;br /&gt;              &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.&lt;span style="color:black;"&gt;send&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;newmsg, &lt;span style="color: rgb(86, 129, 193);"&gt;"outbox"&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;yield&lt;/span&gt; &lt;span style="color: rgb(255, 69, 0);"&gt;1&lt;/span&gt;&lt;/pre&gt;It waits until both inbox A and inbox B have at contain one message each, takes the first (oldest) message from each, combines them into a two-element list and sends that list on.&lt;br /&gt;If A contains messages, but B contains none, the &lt;span style="font-family:courier new;"&gt;Combiner&lt;/span&gt; is waiting for B. The addition&lt;br /&gt;of messages to A does not merit waking the component - it won't be able to do anything more than it could do before.&lt;br /&gt;&lt;br /&gt;Syntax such as:&lt;br /&gt;&lt;pre class="python"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.&lt;span style="color:black;"&gt;wakeOn&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(86, 129, 193);"&gt;"b"&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;could be used to accomplish this selectiveness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-2066009163621205760?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/2066009163621205760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=2066009163621205760' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2066009163621205760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2066009163621205760'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/09/implicit-pausing-miniaxon.html' title='Implicit pausing MiniAxon'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-3793091232059957843</id><published>2006-09-12T12:16:00.000+01:00</published><updated>2006-09-12T12:27:19.463+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><title type='text'>BlitScheduler - a new approach to using pygame with Kamaelia</title><content type='html'>Structure for blitting (using any 2d graphics library, but initially pygame):&lt;br /&gt;- BlitScheduler component (which subclasses Scheduler) controls a single surface&lt;br /&gt;- Visual components (e.g. line, sprite) are activated with a BlitScheduler component&lt;br /&gt;- For each frame/refresh of the screen, BlitScheduler follows the following procedure:&lt;br /&gt;&lt;br /&gt;1. Sort the visual components associated with it by z-order (so the backmost is first).&lt;br /&gt;2. Send a message to the blit inbox of every visual component containing a reference to the shared surface (controlled by that BS)&lt;br /&gt;3. Run the generator of each visual component in turn (by z-order)&lt;br /&gt;4. Flip the surface (updating it to show the newly rendered surface).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-3793091232059957843?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/3793091232059957843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=3793091232059957843' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/3793091232059957843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/3793091232059957843'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/09/blitscheduler-new-approach-to-using.html' title='BlitScheduler - a new approach to using pygame with Kamaelia'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-4245143025941294022</id><published>2006-09-10T11:15:00.001+01:00</published><updated>2006-09-10T11:15:20.238+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><title type='text'>Logo clone in Kamaelia</title><content type='html'>I'm making a simple LOGO clone - eventually I intend to allow users to telnet to a shared display and command their own turtle. So far I have a single console-controlled turtle that understands LEFT, RIGHT, FORWARD and BACK, but no lines are drawn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-4245143025941294022?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/4245143025941294022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=4245143025941294022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/4245143025941294022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/4245143025941294022'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/09/logo-clone-in-kamaelia.html' title='Logo clone in Kamaelia'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-409832539107861088</id><published>2006-09-01T22:49:00.000+01:00</published><updated>2006-09-01T22:50:30.466+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Dell Core2 laptops out</title><content type='html'>Hurrah! Dell UK has finally started selling Core 2 laptops, just in time for me going to university. My new Inspiron 6400 should be with me in just over a week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-409832539107861088?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/409832539107861088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=409832539107861088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/409832539107861088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/409832539107861088'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/09/dell-core2-laptops-out.html' title='Dell Core2 laptops out'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-4898096151354312234</id><published>2006-08-31T19:45:00.000+01:00</published><updated>2006-08-31T19:51:12.446+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smtp'/><title type='text'>Mail server design considerations</title><content type='html'>Creating a decent mail server is more difficult than it first appears. There are a number of issues which require consideration:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;no mail that has been accepted should be lost if power is lost or the server is restarted&lt;/li&gt;&lt;li&gt;mail messages should never need to be kept fully in memory - they can reach many MB each&lt;br /&gt;&lt;/li&gt;&lt;li&gt;only one copy of each message should be stored on disc, regardless of number of recipients&lt;/li&gt;&lt;li&gt;the delivery of messages for remote hosts that cannot be delivered now (e.g. due to network problems) should be reattempted after a delay of a set number of minutes or hours&lt;/li&gt;&lt;li&gt;each message should get a unique id so it can be tracked by the administrator&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-4898096151354312234?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/4898096151354312234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=4898096151354312234' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/4898096151354312234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/4898096151354312234'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/08/mail-server-design-considerations.html' title='Mail server design considerations'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-1490219820422709272</id><published>2006-08-28T14:33:00.000+01:00</published><updated>2007-09-21T09:01:02.927+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><category scheme='http://www.blogger.com/atom/ns#' term='smtp'/><title type='text'>Kamaelia mail server</title><content type='html'>I have made a simple mail server for Kamaelia. Currently it can receive mail and store it but not forward it on. See /Sketches/RJL/SMTP/ in SVN.&lt;br /&gt;The server's design follows the normal SimpleServer format except that each SMTPServer instance links itself to a shared QualityStorage component which handles saving messages (the 'quality' being that it confirms write-completition). A separate delivery component copies (hard links) messages into local mailboxes.&lt;br /&gt;&lt;br /&gt;&lt;div style='text-align: center;'&gt;&lt;br /&gt;&lt;a href='http://ryan.nfshost.com/kamaelia/mailserver.png'&gt;&lt;br /&gt;&lt;img src='http://ryan.nfshost.com/kamaelia/mailserver-thumb.png' alt='Mail server component topology' /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Mail server topology (when finished)&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-1490219820422709272?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/1490219820422709272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=1490219820422709272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/1490219820422709272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/1490219820422709272'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/08/smtp-server.html' title='Kamaelia mail server'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-6236214967329538043</id><published>2006-08-24T18:31:00.000+01:00</published><updated>2006-08-24T18:55:15.444+01:00</updated><title type='text'>HTTP Spider</title><content type='html'>HTTP Spider has been added to my catalgoue of Kamaelia examples.&lt;br /&gt;Given an initial URL it downloads that page and then, by a breadth-first search, all pages that are linked to by downloaded pages. It can be limited to only download pages with a given prefix.&lt;br /&gt;&lt;br /&gt;This example is fairly basic, not saving any pages to disc nor honouring robots.txt files, but it demonstrates the principal and could be adapted to look for 404s or to index a website for searching fairly easily.&lt;p style='text-align: center;'&gt;&lt;br /&gt;&lt;a href='http://ronline.no-ip.info/kamaelia/httpspider.png'&gt;&lt;br /&gt;&lt;img src='http://ronline.no-ip.info/kamaelia/httpspider-thumb.png' alt='HTTP Spider' /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-6236214967329538043?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/6236214967329538043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=6236214967329538043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/6236214967329538043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/6236214967329538043'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/08/http-spider.html' title='HTTP Spider'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-2913031743476979629</id><published>2006-08-23T14:15:00.001+01:00</published><updated>2008-03-19T22:57:14.134Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='v4l-dvb'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='freeview'/><title type='text'>Freeview on Linux (v4l-dvb)</title><content type='html'>Up-to-date &lt;a href="http://www.ryanlothian.com/articles/v4l-dvb"&gt;instructions for using a Freecom DVB-T USB stick on linux are now on my website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;I recently ordered a &lt;a href="http://www.ebuyer.com/UK/product/94486"&gt;Freecom DVB-T (freeview) USB2 stick&lt;/a&gt;. Getting it working on Windows XP was fairly easy but Ubuntu was a different matter. These instructions also allow you to install v4l-dvb on Ubuntu if you have a different adaptor (but then you'll need to find the right firmware yourself).&lt;br /&gt;&lt;br /&gt;(These instructions are for the UK only and are followed at your own risk.)&lt;br /&gt;&lt;br /&gt;Plug in the USB stick then enter these commands to the terminal:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sudo apt-get install dvb-utils mercurial build-essential linux-headers-$(uname -r)&lt;br /&gt;hg clone http://linuxtv.org/hg/v4l-dvb&lt;br /&gt;cd v4l-dvb&lt;br /&gt;hg update -C 4501&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;# if you aren't using the same adaptor as me, omit the next 2 lines&lt;br /&gt;wget http://thadathil.net:8000/dvb/fw/dvb-usb/dvb-usb-wt220u-fc03.fw&lt;br /&gt;sudo cp dvb-usb-wt220u-fc03.fw /lib/firmware/$(uname -r)/&lt;br /&gt;&lt;br /&gt;sudo reboot&lt;br /&gt;&lt;/pre&gt;Note: the hg update -C ensures that you use a version of v4l-dvb that I know works (some later revisions do not work for me). At your own peril, omit it and so use the latest version.&lt;br /&gt;Your USB stick's LED should be amber upon restart meaning it's working but not tuned in. I'm using Kaffeine as my player - open it now.&lt;br /&gt;&lt;pre&gt;kaffeine&lt;br /&gt;&lt;/pre&gt;It should detect you have DVB and copy some files into your home directory. Now&lt;span style="font-weight: bold;"&gt; close Kaffeine&lt;/span&gt;.&lt;br /&gt;Then you need to find the name of the transmitter nearest to you using &lt;a href="http://www.wolfbane.com/cgi-bin/tvd.exe"&gt;WolfBane&lt;/a&gt;. I'll assume you are closest to Rowridge.&lt;br /&gt;&lt;pre&gt;cd ~/.kde/share/apps/kaffeine/dvb-t/&lt;br /&gt;cp uk-Rowridge uk-OriginalRowridge&lt;br /&gt;nano uk-Rowridge&lt;br /&gt;&lt;/pre&gt;Round the frequency to 3 significant figures, e.g.&lt;br /&gt;&lt;pre&gt;# Rowridge, Isle of Wight&lt;br /&gt;# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy&lt;br /&gt;T 490000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE&lt;/pre&gt;Now start kaffeine again, select uk-Rowridge (if that's your transmitter) and tell it to scan for channels. Add the channels it finds, close the scanning window and pick a channel. Your USB stick's LED should be green.&lt;br /&gt;&lt;br /&gt;And that's all there is to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-2913031743476979629?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/2913031743476979629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=2913031743476979629' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2913031743476979629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/2913031743476979629'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/08/freeview-on-linux.html' title='Freeview on Linux (v4l-dvb)'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-7021260235717407678</id><published>2006-08-22T19:54:00.000+01:00</published><updated>2006-08-22T20:00:25.315+01:00</updated><title type='text'>Bad ubuntu</title><content type='html'>Ubuntu has been lax in its software testing - in the last few days it rolled out a broken X.org x-server package which renders PCs console-only upon reboot. Thinking it was something I'd done I spent some time trying old kernels etc. - eventually I found an article explaining the cause and solution (using apt to downgrade to an older version). Unfortunately another bug also cropped up as a result of this - Python/Tkinter no longer works. It gives an obscure error message about not knowing what colour "Black" is and dies. I finally tracked this down (with Google) to changes I'd made to xorg.conf while trying to fix it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-7021260235717407678?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/7021260235717407678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=7021260235717407678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/7021260235717407678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/7021260235717407678'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/08/bad-ubuntu.html' title='Bad ubuntu'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-8317171362510524801</id><published>2006-08-22T19:47:00.000+01:00</published><updated>2006-08-22T19:54:51.826+01:00</updated><title type='text'>IOI and Exam Results</title><content type='html'>I've returned from the IOI in Mexico, having had a great time. I gained the top Bronze Medal (only 1 mark off a silver!) which I'm quite pleased with. I also received my exam results when I got home.&lt;br /&gt;&lt;br /&gt;A-levels:&lt;br /&gt;Physics - A&lt;br /&gt;Computing - A&lt;br /&gt;Maths - A&lt;br /&gt;Further Maths - A&lt;br /&gt;ICT - A&lt;br /&gt;General Studies - B&lt;br /&gt;&lt;br /&gt;AS-levels:&lt;br /&gt;Critical Thinking - A&lt;br /&gt;&lt;br /&gt;STEP papers: (advanced mathematics papers)&lt;br /&gt;STEP 1 - Distiction (1)&lt;br /&gt;STEP 2 - Distiction (1)&lt;br /&gt;&lt;br /&gt;And I also successfully completed a Cisco (CCNA 1-4) course.&lt;br /&gt;&lt;br /&gt;I've achieved the grades required to get into university - studying Mathematics and Computer Science at Oxford.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-8317171362510524801?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/8317171362510524801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=8317171362510524801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/8317171362510524801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/8317171362510524801'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/08/ioi-and-exam-results.html' title='IOI and Exam Results'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115506826180574066</id><published>2006-08-08T21:14:00.000+01:00</published><updated>2006-08-08T21:17:42.150+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><title type='text'>Online documentation</title><content type='html'>&lt;a href="http://ronline.no-ip.info/kamaelia/"&gt;Online documentation&lt;/a&gt; for the Kamaelia components I've made is now available. These contain the doc-strings from the files they reference but also visual diagrams and links to other pages not possible in the plain text source-code files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115506826180574066?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115506826180574066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115506826180574066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115506826180574066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115506826180574066'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/08/online-documentation.html' title='Online documentation'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115434922333726556</id><published>2006-07-31T13:24:00.000+01:00</published><updated>2006-07-31T13:33:43.380+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><category scheme='http://www.blogger.com/atom/ns#' term='bittorrent'/><title type='text'>P2P Streaming Success</title><content type='html'>The P2P streaming example I've been working on for Kamaelia is now in a working state. It allows any octet stream to be distributed automatically using the BitTorrent protocol. I have tested it over a LAN and it correctly shared and reconstructed my source stream in real-time.&lt;br /&gt;&lt;br /&gt;Octet Stream -&gt; Seed -&gt; Swarm&lt;br /&gt;Swarm &lt;--&gt; Peer&lt;br /&gt;&lt;br /&gt;Though further testing is required, this approach could theoretically scale to thousands of peers per seed/tracker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115434922333726556?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115434922333726556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115434922333726556' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115434922333726556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115434922333726556'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/07/p2p-streaming-success.html' title='P2P Streaming Success'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115390330396144318</id><published>2006-07-26T09:30:00.000+01:00</published><updated>2006-07-26T09:43:49.756+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><title type='text'>Proposed system for subcomponent flexibility</title><content type='html'>Many Kamaelia components need to create their own subcomponents at run-time, e.g. my HTTP client spawns a TCPClient to connect to the server. However, this can cancel out much of the flexibility that a component-based architecture provides. As an alternative to hard-coding the class of each subcomponent, I propose that every subcomponent should be created from by a function provided as an argument at that components creation.&lt;br /&gt;&lt;br /&gt;For example, in SingleShotHTTPClient:&lt;br /&gt;&lt;pre class="python"&gt;&lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: rgb(0, 0, 205);"&gt;__init__&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;, starturl, postbody = &lt;span style="color: rgb(86, 129, 193);"&gt;""&lt;/span&gt;, connectionclass = TCPClient&lt;span style="color:black;"&gt;)&lt;/span&gt;:&lt;br /&gt;...&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.&lt;span style="color:black;"&gt;connectionclass&lt;/span&gt; = connectionclass&lt;/pre&gt;And whenever a TCPClient was created in the old code, connectionclass  is now called with the same parameters. The possibilities added by this are great:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;for debugging, TCPClient could be replaced with a local console masquerading as a TCP connection.&lt;/li&gt;&lt;li&gt;TCPClient could also be replaced by a SOCKSTCPClient allowing it to go via a SOCKS proxy.&lt;/li&gt;&lt;li&gt;for logging purposes, connectionclass could be a wrapper function (rather than a class) that wrote the host addresses accessed to a file before spawning and returning a TCPClient&lt;/li&gt;&lt;li&gt;etc.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Most importantly, all these things could be done without having to change the code of HTTPClient.py. I propose that this practice should become standard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115390330396144318?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115390330396144318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115390330396144318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115390330396144318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115390330396144318'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/07/proposed-system-for-subcomponent.html' title='Proposed system for subcomponent flexibility'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115342401756309696</id><published>2006-07-20T20:26:00.000+01:00</published><updated>2006-07-20T20:33:37.580+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><category scheme='http://www.blogger.com/atom/ns#' term='gsoc'/><title type='text'>Packaging and finishing touches</title><content type='html'>I finally received the initial GSoC payment last week - thanks to Google for getting it sorted.&lt;br /&gt;I'm working on packaging up my Kamaelia components - including the Torrent, HTTP, Util and IRC directories of /Sketches/RJL. Documentation is almost complete and I'm making the final touches to my components with a view to getting it all done by the first week of August.&lt;br /&gt;&lt;br /&gt;Then, with some Python magic you'll be able to do the following to use my HTTPClient, as if it was part of the main-tree:&lt;br /&gt;&lt;pre class="python"&gt;&lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;import&lt;/span&gt; Kamaelia.&lt;span style="color:black;"&gt;Community&lt;/span&gt;.&lt;span style="color:black;"&gt;RJL&lt;/span&gt;.&lt;span style="color:black;"&gt;Namespace&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;from&lt;/span&gt; Kamaelia.&lt;span style="color:black;"&gt;Protocol&lt;/span&gt;.&lt;span style="color:black;"&gt;HTTP&lt;/span&gt;.&lt;span style="color:black;"&gt;HTTPClient&lt;/span&gt; &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;import&lt;/span&gt; SimpleHTTPClient&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115342401756309696?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115342401756309696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115342401756309696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115342401756309696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115342401756309696'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/07/packaging-and-finishing-touches.html' title='Packaging and finishing touches'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115203632043131864</id><published>2006-07-04T18:58:00.000+01:00</published><updated>2006-07-04T19:05:20.443+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><title type='text'>HTTP and streaming</title><content type='html'>I've made some big changes to my HTTP code. HTTPParser no longer waits for the end of a response/request before sending information about it on - it now follows the format:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HEADER&lt;/li&gt;&lt;li&gt;BODYCHUNK&lt;/li&gt;&lt;li&gt;BODYCHUNK&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;li&gt;BODYCHUNK&lt;/li&gt;&lt;li&gt;END&lt;/li&gt;&lt;/ul&gt;This allows memory to be saved and lower latency processing. As a result of this modification, my HTTP client now allows HTTP streaming.&lt;br /&gt;&lt;br /&gt;My HTTP client has also been refactored to support this change - it is now split into a SingleShotHTTPClient which handles a single URL before terminating and a SimpleHTTPClient which uses the SSHC with a Carousel component to handle several requests one after another. I've also added a Kamaelia component called IcecastClient which can stream MP3 audio from a SHOUTcast/Icecast server. As the SHOUTcast protocol is almost identical to HTTP, this component subclasses SSHC.&lt;br /&gt;&lt;br /&gt;Documentation will be my next focus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115203632043131864?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115203632043131864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115203632043131864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115203632043131864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115203632043131864'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/07/http-and-streaming.html' title='HTTP and streaming'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115161697788814235</id><published>2006-06-29T22:25:00.000+01:00</published><updated>2006-06-29T22:36:17.940+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><category scheme='http://www.blogger.com/atom/ns#' term='bittorrent'/><title type='text'>TorrentService and TorrentPatron</title><content type='html'>The MainLine BitTorrent client is unfortunately not thread-safe, even segfaulting in some versions if you try to run two instances simultaenously. In any case, several BitTorrent clients would likely be less efficient than one controlling several downloads/uploads. To work around this problem, I've made it so a single TorrentClient (TC) can be shared between several components. TorrentPatron (TP) should now be used in place of TC in all user code. TP is completely compatible with TC's input/output IPC messages but any number of TPs can be created without things breaking.&lt;br /&gt;&lt;br /&gt;When a TP spawns, it checks whether a TS exists. If it doesn't find one, it creates a new one. Either way it then registers with the TS to use the 'service' that TS provides. This then allows TP to relay requests to TC through TS and receive them from TC through TS in turn. TS co-ordinates how the TPs are 'multiplexed' to safely use TC together.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115161697788814235?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115161697788814235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115161697788814235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115161697788814235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115161697788814235'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/06/torrentservice-and-torrentpatron.html' title='TorrentService and TorrentPatron'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115141727471204212</id><published>2006-06-27T14:48:00.000+01:00</published><updated>2006-06-27T15:10:52.716+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>IOI training weekend</title><content type='html'>Last weekend I attended an IOI training session in Guildford. Six of us - the British team and the two reserves selected at the &lt;a href="http://www.olympiad.org.uk/"&gt;BIO&lt;/a&gt; - were invited, with food, travel expenses, and lodgings all provided. The event was generously hosted and funded by &lt;a href="http://www.lionhead.com/"&gt;Lionhead Studios&lt;/a&gt;. We were programming in the the room where they keep their BAFTAs!&lt;br /&gt;It was very educational and relaxed weekend. We got a lot of work done over the Saturday and Sunday - covering a large amount of algorithms material, and doing a fair few past competition questions. I hadn't been to a BIO training weekend before, as they haven't done them over the last two years, so this was quite an experience, and a very enjoyable one at that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115141727471204212?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115141727471204212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115141727471204212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115141727471204212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115141727471204212'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/06/ioi-training-weekend.html' title='IOI training weekend'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115070951965192015</id><published>2006-06-19T10:14:00.000+01:00</published><updated>2006-06-19T10:35:17.673+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gsoc'/><title type='text'>Google Package</title><content type='html'>&lt;img src="http://ronline.no-ip.info/googlebook.jpg" style="float: right; margin-left: 10px;" /&gt;FedEx sent me tracking information about a package for me a few days ago. I received a pleasant surprise at about 8AM this morning - a notebook all the way from Google in California. I was barely awake so early, having been expecting it at around noon. The notebook has a nice black-blue covering (see right) - it's rather too nice to use. For now it's just for looking at.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115070951965192015?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115070951965192015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115070951965192015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115070951965192015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115070951965192015'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/06/google-package.html' title='Google Package'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115064069666153207</id><published>2006-06-18T15:04:00.000+01:00</published><updated>2006-06-18T15:24:56.683+01:00</updated><title type='text'>TorrentClient</title><content type='html'>I've added multiple torrent support to my TorrentClient component through a complete rewrite of its interface to BitTorrent. It now requires MainLine (official BitTorrent client) beta 4.9.9 but unlike previous versions requires no changes to its code. This means that it will work straight-away on any machine with BitTorrent 4.9.9 installed. I've done some light testing and it successfully downloaded two test torrents overnight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115064069666153207?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115064069666153207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115064069666153207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115064069666153207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115064069666153207'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/06/torrentclient.html' title='TorrentClient'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-115023158900591491</id><published>2006-06-13T21:37:00.000+01:00</published><updated>2006-06-19T10:44:07.366+01:00</updated><title type='text'>Progress and TDD</title><content type='html'>I have moved the HTTPParser component of HTTPServer to its own file. HTTP requests and responses are very similiar (the only major difference being the first line) so this allows some nice code reuse. As such, my new HTTPClient component also uses this parser component.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0321146530/026-6597653-8531611"&gt;&lt;img src="http://ronline.no-ip.info/tdd.jpg" style="margin-left: 10px; float: right;" /&gt;&lt;/a&gt;&lt;br /&gt;The BitTorrent-Kamaelia interface component now also works for those who have twisted installed.&lt;br /&gt;I'm reading 'Test-Driven Development' - a book sent to me by the BBC (cheers!). It's a programming methodology that advocates writing automated tests and then code to satisfy those tests in that order rather than coding and then testing it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-115023158900591491?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/115023158900591491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=115023158900591491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115023158900591491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/115023158900591491'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/06/progress-and-tdd.html' title='Progress and TDD'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114959374586782118</id><published>2006-06-06T12:31:00.000+01:00</published><updated>2006-06-06T12:35:45.873+01:00</updated><title type='text'>HTTPServer fixed</title><content type='html'>HTTPServer is now fixed - the charset issues have been resolved and it no longer uses 100% CPU all the time (thanks to changes to Axon and the Kamaelia TCP components). It also closes connections when appropriate. Kambot now allows timed reminders to be set which may prove useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114959374586782118?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114959374586782118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114959374586782118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114959374586782118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114959374586782118'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/06/httpserver-fixed.html' title='HTTPServer fixed'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114926290393053640</id><published>2006-06-02T16:38:00.000+01:00</published><updated>2006-06-02T16:42:25.556+01:00</updated><title type='text'>Kamaelia Wiki</title><content type='html'>&lt;img src='http://ronline.no-ip.info/kamaelia-wiki/skins/common/images/wiki.png' style='border: 0; float: right; margin-left: 1em;' /&gt;I've started a &lt;a href='http://ronline.no-ip.info/kamaelia-wiki/'&gt;Kamaelia Wiki&lt;/a&gt; that I (and others if they wish) can use to document Kamaelia and our Kamaelia-related projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114926290393053640?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114926290393053640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114926290393053640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114926290393053640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114926290393053640'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/06/kamaelia-wiki.html' title='Kamaelia Wiki'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114907952107621871</id><published>2006-05-31T13:40:00.000+01:00</published><updated>2006-05-31T13:45:21.083+01:00</updated><title type='text'>Hurrah!</title><content type='html'>For the last few days I've been trying to get Boost.Python examples to compile with no success whatsoever. After over an hour of messing about with Jamfiles, bjam and Jamrules (and all the other things that Boost decided they would require to compile a 12-line program) this morning, I chanced upon a page that gave the &lt;a href="http://woldlab.caltech.edu/%7Ediane/index.cgi/geek/programming/python-boost-2005-11-18-23-45.html"&gt;g++ commands needed&lt;/a&gt;, bypassing the ridiculously troublesome boost-build procedure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114907952107621871?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114907952107621871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114907952107621871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114907952107621871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114907952107621871'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/05/hurrah.html' title='Hurrah!'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114892137705765702</id><published>2006-05-29T16:45:00.000+01:00</published><updated>2006-05-29T17:49:37.096+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='kamaelia'/><title type='text'>Axon in C++</title><content type='html'>Axon is the core of Kamaelia - the stuff that co-ordinates everything else, ensuring messages go from outboxes to their recipients' inboxes and running the components in turn. Kamaelia is primarily written in Python but there is proof-of-concept code for C++ in the CVS.&lt;br /&gt;I've been creating my own (not-so-)MiniAxon in C++, focusing on efficiency unless it would overcomplicate the API. A Kamaelia implementation in C++ must provide much that the Python developer takes for granted. For example, Duff's device serves as a potent and yet intrinsically sinful implementation of generators:&lt;br /&gt;&lt;pre class="cpp"&gt;&lt;span style="color: rgb(51, 153, 0);"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; generatorstate = &lt;span style="color: rgb(0, 170, 221);"&gt;0&lt;/span&gt;, x = &lt;span style="color: rgb(0, 170, 221);"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;switch&lt;/span&gt; &lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;generatorstate&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(102, 102, 102);"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;case&lt;/span&gt; &lt;span style="color: rgb(0, 170, 221);"&gt;0&lt;/span&gt;:&lt;br /&gt;     std::&lt;span style="color: rgb(0, 0, 221);"&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style="color: rgb(255, 136, 51);"&gt;"Hello World&lt;span style="color: rgb(255, 136, 51); font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;;&lt;br /&gt;     generatorstate = &lt;span style="color: rgb(0, 170, 221);"&gt;1&lt;/span&gt;; &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 170, 221);"&gt;1&lt;/span&gt;;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;case&lt;/span&gt; &lt;span style="color: rgb(0, 170, 221);"&gt;1&lt;/span&gt;:&lt;br /&gt;     &lt;span style="color: rgb(0, 0, 255);"&gt;for&lt;/span&gt; &lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;;;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(102, 102, 102);"&gt;{&lt;/span&gt;&lt;br /&gt;        std::&lt;span style="color: rgb(0, 0, 221);"&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &lt;span style="color: rgb(255, 136, 51);"&gt;"&lt;span style="color: rgb(255, 136, 51); font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;;&lt;br /&gt;        x = x + &lt;span style="color: rgb(0, 170, 221);"&gt;1&lt;/span&gt;;&lt;br /&gt;        generatorstate = &lt;span style="color: rgb(0, 170, 221);"&gt;2&lt;/span&gt;; &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 170, 221);"&gt;1&lt;/span&gt;;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;case&lt;/span&gt; &lt;span style="color: rgb(0, 170, 221);"&gt;2&lt;/span&gt;:&lt;br /&gt;        std::&lt;span style="color: rgb(0, 0, 221);"&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &lt;span style="color: rgb(255, 136, 51);"&gt;"&lt;span style="color: rgb(255, 136, 51); font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;;&lt;br /&gt;        x = x * x;&lt;br /&gt;        generatorstate = &lt;span style="color: rgb(0, 170, 221);"&gt;3&lt;/span&gt;; &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 170, 221);"&gt;1&lt;/span&gt;;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;case&lt;/span&gt; &lt;span style="color: rgb(0, 170, 221);"&gt;3&lt;/span&gt;:&lt;br /&gt;        ;&lt;br /&gt;     &lt;span style="color: rgb(102, 102, 102);"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(102, 102, 102);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; main&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;{&lt;/span&gt;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  std::&lt;span style="color: rgb(0, 0, 221);"&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style="color: rgb(255, 136, 51);"&gt;"Run 1 time&lt;span style="color: rgb(255, 136, 51); font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  std::&lt;span style="color: rgb(0, 0, 221);"&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style="color: rgb(255, 136, 51);"&gt;"Run 2 times&lt;span style="color: rgb(255, 136, 51); font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  std::&lt;span style="color: rgb(0, 0, 221);"&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style="color: rgb(255, 136, 51);"&gt;"Run 5 times&lt;span style="color: rgb(255, 136, 51); font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  generator&lt;span style="color: rgb(102, 102, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;)&lt;/span&gt;;&lt;br /&gt;  std::&lt;span style="color: rgb(0, 0, 221);"&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style="color: rgb(255, 136, 51);"&gt;"Run 10 times&lt;span style="color: rgb(255, 136, 51); font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114892137705765702?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114892137705765702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114892137705765702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114892137705765702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114892137705765702'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/05/axon-in-c.html' title='Axon in C++'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114882808129871620</id><published>2006-05-28T15:39:00.000+01:00</published><updated>2006-05-28T16:03:31.306+01:00</updated><title type='text'>Character set woes</title><content type='html'>I've found another bug in my HTTPServer - Python's character set support is  horrid. Unfortunately, Python assumes that everything is ASCII by default, rather than a more sensible choice like UTF-8, and I've yet to get it to play nicely with Unicode. What's worse is that this bug only occurs when the IRC logs contain special characters:&lt;br /&gt;&lt;pre&gt;UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 19621: ordinal not in range(128)&lt;/pre&gt;What a nasty complication to an otherwise simple language!&lt;br /&gt;&lt;br /&gt;I've made something nice to use for my streaming testing - a video of the swans at the local lake.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://ronline.no-ip.info/cygnet.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;I'm playing around with Boost.Python, with an aim to wrapping &lt;a href="http://www.rasterbar.com/products/libtorrent.html"&gt;libtorrent&lt;/a&gt; although I've yet to get the examples to compile!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114882808129871620?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114882808129871620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114882808129871620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114882808129871620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114882808129871620'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/05/character-set-woes.html' title='Character set woes'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114873045965175151</id><published>2006-05-27T12:43:00.000+01:00</published><updated>2006-05-27T12:47:40.066+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Apt-proxy</title><content type='html'>I discovered &lt;a href="https://wiki.ubuntu.com/AptProxyHowTo"&gt;apt-proxy&lt;/a&gt; today. Like a standard HTTP proxy, it caches files (packages) requested, but as it understands that what it's downloading is for apt, it can intelligently delete out of date packages. Since I've got Dapper installed on 3 PCs now, this should save me a fair bit of time and bandwidth. Apt-proxy is running well on my old 500 MHz server (which has Ubuntu Breezy on it).&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114873045965175151?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114873045965175151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114873045965175151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114873045965175151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114873045965175151'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/05/apt-proxy.html' title='Apt-proxy'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114865346642708358</id><published>2006-05-26T15:13:00.000+01:00</published><updated>2006-05-26T20:40:17.986+01:00</updated><title type='text'>Metalink</title><content type='html'>I found (or more accurately was pointed to) another cool possible basis for Kamaelia component - &lt;a href="http://metalinker.org/"&gt;metalink&lt;/a&gt;. It's a download metadata format/system for grabbing parts of a download from multiple sources. For example, if your BitTorrent download is stuck at 99.2% then there's FTP mirrors you could try, or if the primary HTTP server for a file is slow you could grab bits from several mirrors. It's a good idea but I had some reservations - namely that you really should store hashes for parts of the file as well as the whole so that the correctness of each section can be confirmed, rather than having to start again if one byte was wrong. This is how BitTorrent checks the integrity of files. The author kindly sent me the Metalink 3.0 Draft Specification which I'm perusing right now. It's XML based and so easily extensible which is nice.&lt;br /&gt;&lt;br /&gt;In other news, I've added a non-witty mode to Kambot (say "stfu kambot" to toggle it) to stop it from saying stuff during meetings etc. on #kamaelia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114865346642708358?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114865346642708358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114865346642708358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114865346642708358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114865346642708358'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/05/metalink.html' title='Metalink'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114857719246270412</id><published>2006-05-25T18:08:00.000+01:00</published><updated>2006-05-25T18:16:57.720+01:00</updated><title type='text'>And so it begins...</title><content type='html'>This is to be my progress log for my work on &lt;a href="http://kamaelia.org"&gt;Kamaelia&lt;/a&gt; for Google Summer of Code 2006. I'll be making a set of BitTorrent components for downloading and uploading files through BitTorrent, for making .torrent files and for moving .torrent files from A to B. The scope of my work is somewhat wider than just BitTorrent however. I've made a basic but effective HTTP server and an IRC logger bot for Kamaelia so far.&lt;br /&gt;I'm currently experimenting with using SWIG to wrap C++ modules for Python.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114857719246270412?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114857719246270412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114857719246270412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114857719246270412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114857719246270412'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/05/and-so-it-begins.html' title='And so it begins...'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114866459779459298</id><published>2006-05-22T18:28:00.000+01:00</published><updated>2006-05-26T18:29:57.803+01:00</updated><title type='text'>HTTP Benchmarking</title><content type='html'>&lt;p&gt;Benchmarking my HTTP server revealed some issues - I was not closing components after their TCP connection closed. Initially I was getting throughput of about 5 hits/sec. After some tweaks, such as only yielding when left with nothing to do, I managed to get 100 hits/sec for highly dynamic pages or 800 hits/sec for small static pages when using persistent connections. This is fairly good, although an simple, efficient webserver written in C could probably handle several thousand hits/sec. I've been using siege to do the load testing/benchmarking.&lt;/p&gt; &lt;p&gt;I found a bug in the Kamaelia TCP components - they raised an exception when the remote host disconnected unexpectedly, taking down the entire HTTP server in the process. :D&lt;/p&gt;   &lt;p&gt;I've made a handy little Python script to convert tabbed code to spaced code.&lt;/p&gt; &lt;pre class="python"&gt;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;#!/usr/bin/env python&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: rgb(220, 20, 60);"&gt;sys&lt;/span&gt;, &lt;span style="color: rgb(220, 20, 60);"&gt;string&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;def&lt;/span&gt; tabsToSpaces&lt;span style="color: black;"&gt;(&lt;/span&gt;path&lt;span style="color: black;"&gt;)&lt;/span&gt;:&lt;br /&gt;   myfile = &lt;span style="color: rgb(0, 128, 0);"&gt;open&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;path, &lt;span style="color: rgb(86, 129, 193);"&gt;"rb"&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;   contents = myfile.&lt;span style="color: black;"&gt;read&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;   myfile.&lt;span style="color: black;"&gt;close&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;   lines = &lt;span style="color: rgb(220, 20, 60);"&gt;string&lt;/span&gt;.&lt;span style="color: black;"&gt;split&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;contents, &lt;span style="color: rgb(86, 129, 193);"&gt;"&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;   contents = &lt;span style="color: black;"&gt;[&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;for&lt;/span&gt; line &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;in&lt;/span&gt; lines:&lt;br /&gt;       tabs = &lt;span style="color: rgb(255, 69, 0);"&gt;0&lt;/span&gt;&lt;br /&gt;       replacement = &lt;span style="color: rgb(86, 129, 193);"&gt;""&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;while&lt;/span&gt; line&lt;span style="color: black;"&gt;[&lt;/span&gt;tabs:tabs&lt;span style="color: rgb(255, 69, 0);"&gt;+1&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;/span&gt; == &lt;span style="color: rgb(86, 129, 193);"&gt;"&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;\t&lt;/span&gt;"&lt;/span&gt;:&lt;br /&gt;           tabs += &lt;span style="color: rgb(255, 69, 0);"&gt;1&lt;/span&gt;&lt;br /&gt;           replacement += &lt;span style="color: rgb(86, 129, 193);"&gt;"    "&lt;/span&gt;&lt;br /&gt;       contents.&lt;span style="color: black;"&gt;append&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;replacement + line&lt;span style="color: black;"&gt;[&lt;/span&gt;tabs:&lt;span style="color: black;"&gt;]&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;br /&gt;   contents = &lt;span style="color: rgb(220, 20, 60);"&gt;string&lt;/span&gt;.&lt;span style="color: black;"&gt;join&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;contents, &lt;span style="color: rgb(86, 129, 193);"&gt;"&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;   myfile = &lt;span style="color: rgb(0, 128, 0);"&gt;open&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;path, &lt;span style="color: rgb(86, 129, 193);"&gt;"wb"&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;   myfile.&lt;span style="color: black;"&gt;write&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;contents&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;   myfile.&lt;span style="color: black;"&gt;close&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;if&lt;/span&gt; __name__ == &lt;span style="color: rgb(86, 129, 193);"&gt;"__main__"&lt;/span&gt;:&lt;br /&gt;   &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;len&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(220, 20, 60);"&gt;sys&lt;/span&gt;.&lt;span style="color: black;"&gt;argv&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt; != &lt;span style="color: rgb(255, 69, 0);"&gt;2&lt;/span&gt;:&lt;br /&gt;       &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;print&lt;/span&gt; &lt;span style="color: rgb(86, 129, 193);"&gt;"Usage: tabsToSpaces.py &lt;file&gt;"&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(221, 34, 17); font-weight: bold;"&gt;else&lt;/span&gt;:&lt;br /&gt;       tabsToSpaces&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(220, 20, 60);"&gt;sys&lt;/span&gt;.&lt;span style="color: black;"&gt;argv&lt;/span&gt;&lt;span style="color: black;"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 69, 0);"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114866459779459298?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114866459779459298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114866459779459298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114866459779459298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114866459779459298'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/05/http-benchmarking.html' title='HTTP Benchmarking'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114866497872587039</id><published>2006-05-20T18:33:00.000+01:00</published><updated>2006-06-01T22:14:10.556+01:00</updated><title type='text'>Dapper Drake - First Impressions</title><content type='html'>&lt;p&gt;&lt;a href="http://www.ubuntu.com/"&gt;&lt;img style="padding: 1em; float: right;" src="http://ronline.no-ip.info/ubuntulogo.png" alt="Ubuntu" /&gt;&lt;/a&gt;I've upgraded to Ubuntu 6.06 (Dapper Drake) beta and I have to say I'm fairly impressed on the whole. The upgrade procedure from 5.10 was very simple - modify your apt sources.list to say 'dapper' where it previously said 'breezy', then run &lt;span style="font-family:courier new;"&gt;apt-get update&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;apt-get dist-upgrade&lt;/span&gt;. It's a lot less troublesome to get setup than Fedora Core 5 was, although I'm only using the x86 version of Ubuntu rather than AMD64 as I did with Fedora.&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;I was having a minor problem with colour (&lt;span style="font-family:courier new;"&gt;#fcfcfc &lt;/span&gt;would appear considerably darker than &lt;span style="font-family:courier new;"&gt;#f0f0f0&lt;/span&gt;) but the new nVidia drivers (available through apt in Dapper) fixed it.  I also had problems on an older Pentium II machine - everything after grub and before the login screen is garbled most likely due to buggy ATi drivers (it's a All-in-Wonder based on the Radeon 7200). I'm considering going back to Breezy on that PC.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:courier new;"&gt;sudo dpkg-reconfigure gnome-applets&lt;/span&gt; fixed the CPU applet (after the upgrade it was no longer SUID so you couldn't pick a frequency. The gnome-art package is great for customising the appearance of Gnome.&lt;/p&gt;&lt;p&gt;It also has Firefox 1.5, gstreamer-0.10 and a working mplayer package and Eclipse C++ support which were some of the main things I wanted, seeing as I had them on Fedora Core 5 before.&lt;/p&gt;In summary, Dapper is better than any Linux distro I've seen before, but only by a little. Its default colour scheme (brown and orange) is hideous but the other colour schemes don't look as modern. Legacy ATi support needs work - I've seen similar problems reported on the Ubuntu bug tracker. The games, as with most Linuxes, are pathetic. They are of no comparison to the majority of commercial games. That said, if I wanted my PC primarily for gaming, I'd be using Windows XP Home Edition...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114866497872587039?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114866497872587039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114866497872587039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114866497872587039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114866497872587039'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/05/dapper-drake-first-impressions.html' title='Dapper Drake - First Impressions'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28736414.post-114866533046629100</id><published>2006-05-19T18:38:00.000+01:00</published><updated>2006-05-27T13:15:15.703+01:00</updated><title type='text'>All up and working again</title><content type='html'>&lt;a href="http://uk.asus.com/products4.aspx?l1=2&amp;l2=7&amp;amp;l3=0&amp;model=484&amp;amp;modelmenu=1" rel="nofollow"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 200px;" src="http://uk.asus.com/440%5Cimages%5Cproducts%5C484%5C484_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;My new graphics card (an Asus nVidia 6200 AGP) arrived and my computer is working fine again thanks to it. It's also passively cooled - there has been a noticeable drop in the PC's noise level. Though it's not as powerful as my broken 6600GT was, it was a good buy at £35.&lt;br /&gt;For your information, the faulty component was an XFX product - I will be avoiding them at all costs in the future.&lt;br /&gt;HTTPServer is coming along. I've added better support for complex URLs.&lt;br /&gt;I've also tied it to the IRC logger successfully.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28736414-114866533046629100?l=rjlsoc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rjlsoc.blogspot.com/feeds/114866533046629100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28736414&amp;postID=114866533046629100' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114866533046629100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28736414/posts/default/114866533046629100'/><link rel='alternate' type='text/html' href='http://rjlsoc.blogspot.com/2006/05/all-up-and-working-again.html' title='All up and working again'/><author><name>Ryan</name><uri>http://www.blogger.com/profile/14716957057558873163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
