<?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-405422244557633109</id><updated>2011-12-08T09:56:21.235+01:00</updated><category term='arduino'/><category term='py2pack'/><category term='WOMBAT'/><category term='packaging'/><category term='DNS'/><category term='debugging'/><category term='OBS'/><category term='Samba'/><category term='beagleboard'/><category term='antiSMASH'/><category term='props'/><category term='war on legacy code'/><category term='brechtbautheater'/><category term='BioPython'/><category term='Wine'/><category term='flask'/><category term='GenBank'/><category term='regex'/><category term='WorldForge'/><category term='GSoC'/><category term='defensive programming'/><category term='python'/><category term='plunger'/><category term='Launchpad'/><category term='printf debugging'/><category term='code cleanup'/><category term='testing'/><category term='hardware'/><title type='text'>Kai's Development Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-405422244557633109.post-6672138844954927296</id><published>2011-12-08T09:55:00.001+01:00</published><updated>2011-12-08T09:56:21.239+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='antiSMASH'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='GenBank'/><category scheme='http://www.blogger.com/atom/ns#' term='BioPython'/><title type='text'>Python Regexes: Named Groups. Cool Bananas</title><content type='html'>I'm currently writing a Python parser for GenBank files. I know BioPython has one, and it doesn't even suck, but BioPython requires a bunch of C extensions, so I can't go and just ship it with my Python application.

So I'm creating a BioPython-compatible API for the classes that I need for antiSMASH, without the dependency tail BioPython forces on me.

Having contributed to BioPerl before, I do like to use regular expressions for token-based parsers, especially as I'm not too fond of lexers in Python.

Now, a GenBank header is a peculiar thing that stems from the punch card ages, with a fixed-width format. Unfortunately, at some point that format changed, and things moved around. And there's a ton of programs out there that produce GenBank files that are slightly off. So parsing the header using a token-based approach seems like a good thing.

Now, let's look at the first line. That has a bunch of interesting information.

&lt;pre class="prettyprint"&gt;LOCUS       SCU49845     5028 bp    DNA             PLN       21-JUN-1999&lt;/pre&gt;

The 'LOCUS' tag explains what this line is about, then there's the accession number for the sequence, the length of the sequence, the type of the molecule, some classification where the sequence comes from, and the date the sequence last saw a major update.

The regex to parse this is pretty straightforward (yeah, right):
&lt;pre class="prettyprint"&gt;LOCUS\s+([\w.]+)\s+(\d+)\sbp\s(ss-|ds-|ms-|\s{3,3})(\S{2,4})\s+(linear\s\s|circular|\s{7,7})\s+(\w{3,3})\s+(\d\d-\w{3,3}-\d{4,4})&lt;/pre&gt;
Incidently, this is a great example for why people dislike regular expressions.

Now, in both Perl and Python, there's a way to define verbose regular expressions, so you can restate the regular expression as:
&lt;pre class="prettyprint"&gt;LOCUS\s+        # Header line starts with LOCUS tag followed by multiple spaces
(               # accession number regex:
  [\w.]+        # any alphanumeric character or '.'
)
\s+             # skip over whitespace
(               # sequence length
  \d+           # digits only
)\sbp\s         # skip ' bp ' string
(               # single, double or mixed stranded or nothing
  ss-|ds-|ms-|\s\s\s # can be all spaces
)
(               # Molecule type DNA, RNA, rRNA, mRNA, uRNA
  \S+
)
\s+
(               # linear, circular or seven spaces
  linear|circular|\s{7,7}
)\s+
(               # division code, three characters
 \w{3,3}
)
\s+
(               # date, in dd-MMM-yyyy
  \d\d-\w{3,3}-\d{4,4}
)&lt;/pre&gt;
This is already pretty decent, but Python can do one better. With the current version of the regex, I need to remember that the molecule type is the 4th group, so match.group(3) will be what I'm looking for. Python decided to extend the Perl extension syntax a bit more, to add named groups. With &lt;code&gt;?P&amp;lt;name&amp;gt;&lt;/code&gt; you can name groups. and then call match.group('name') to access them later. So the final version of the parser regex turns into 
&lt;pre class="prettyprint"&gt;LOCUS\s+        # Header line starts with LOCUS tag followed by multiple spaces
(?P&amp;lt;accession&amp;gt;  # accession number regex:
  [\w.]+        # any alphanumeric character or '.'
)
\s+             # skip over whitespace
(?P&amp;lt;length&amp;gt;     # sequence length
  \d+           # digits only
)\sbp\s         # skip ' bp ' string
(?P&amp;lt;stranded&amp;gt;   # single, double or mixed stranded or nothing
  ss-|ds-|ms-|\s\s\s # can be all spaces
)
(?P&amp;lt;molecule&amp;gt;   # Molecule type DNA, RNA, rRNA, mRNA, uRNA
  \S+
)
\s+
(?P&amp;lt;formation&amp;gt;  # linear, circular or seven spaces
  linear|circular|\s{7,7}
)\s+
(?P&amp;lt;division&amp;gt;   # division code, three characters
 \w{3,3}
)
\s+
(?P&amp;lt;date&amp;gt;       # date, in dd-MMM-yyyy
  \d\d-\w{3,3}-\d{4,4}
)&lt;/pre&gt; and you can use speaking names to access the group's contents later. Great to make the code more readable. Combined with a bunch of tests, that should stay maintainable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-6672138844954927296?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/6672138844954927296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=6672138844954927296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6672138844954927296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6672138844954927296'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/12/python-regexes-named-groups-cool.html' title='Python Regexes: Named Groups. Cool Bananas'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-1060189929121533762</id><published>2011-08-12T09:16:00.002+02:00</published><updated>2011-08-12T17:08:06.669+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='war on legacy code'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>From the frontline, day 5</title><content type='html'>&lt;div&gt;Another day, another piece of testing mayhem. I've completed the 0.1 version of my &lt;a href="http://pypi.python.org/pypi/Flask-Downloader/0.1"&gt;Flask-Downloader&lt;/a&gt; helper class. With this, I could complete my web app. Now, the downloader itself has a bunch of tests to make sure it's working as expected, but I was also going to test the corresponding code paths in the web app's tests.&lt;br /&gt;
The user can provide the input either by uploading a file or by giving an accession number. Testing for the file uploads was easy, as the Flask test client accepts file-like objects as data input for POST requests. So testing the app will do the right thing is as easy as:
&lt;pre class="prettyprint"&gt;def test_upload(self):
    file_handle = open(tmp_filename)
    data = dict(file=file_handle)
    rv = self.client.post('/upload', data=data)
    assert "upload succeeded" in rv.data
&lt;/pre&gt;
Assuming your upload function listens on '/upload' and returns a page that contains "upload ducceeded", of course.&lt;/div&gt;
&lt;div&gt;Testing file downloads is a bit more elaborated, because I don't actually want my downloader to connect to the internet during a test run. Minimock to the rescue! I can fake the download helper and create the same kind of output to fool the application code.
&lt;pre class="prettyprint"&gt;from minimock import Mock
from werkzeug import FileStore
def test_download(self):
    data = dict(id="FAKE")
    # now create the fake downloader
    tmp_file = open(tmp_file_path)
    dl.download = Mock('dl.download')
    dl.download.mock_returns = FileStore(stream=tmp_file)
     rv = self.client.post('/download', data=data)
    assert "download succeeded" in rv.data
&lt;/pre&gt;
With similar assumptions as in the example before, and also the idea that you have a pre-existing file in tmp_file_path. A StringIO file-like object should do the trick as well.&lt;/div&gt;
&lt;div&gt;With all the tests in place and a test coverage of 100%, I declare this campaign a success. I still need to deploy the new web app on my test server instead of the old one, but I'm going to do that next week. I will also continue my war on legacy code, now tackling the pieces that do the actual work. No war is over as quick as you'd initially hope after all. Also, I'm pretty sure the 100% code coverage don't mean there's not plenty of places for bugs to hide in, just that at least all of the code is looked at by the interpreter once. Still, it's a good conclusion to a busy week. Testing rocks.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-1060189929121533762?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/1060189929121533762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=1060189929121533762' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1060189929121533762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1060189929121533762'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/08/from-frontline-day-5.html' title='From the frontline, day 5'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-4759925533921115248</id><published>2011-08-11T13:24:00.006+02:00</published><updated>2011-08-11T23:58:03.254+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='war on legacy code'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>From the frontline, day 4</title><content type='html'>&lt;div&gt;Today, I decided to go for the downloader component that can download files on the behalf of the users. While looking at how to test this, I actually noticed that the mm_unit functionality has been merged into the minimock package. Sweet.&lt;br /&gt;
I wanted to keep this modular, a downloader sounds like a tool I could use in a couple of projects. So I created a Flask extension. There's a nice wizard script that automates the creation of the boilerplate files. Using the wizard, I created &lt;a href="https://github.com/kblin/flask-downloader"&gt;Flask-Downloader&lt;/a&gt;. It's pretty straightforward to use. There's a &lt;code class="prettyprint lang-python"&gt;download(url)&lt;/code&gt; function that will return a &lt;code class="prettyprint lang-python"&gt;werkzeug.FileStorage&lt;/code&gt; instance, just like the flask upload hander. I'll also add a &lt;code class="prettyprint lang-python"&gt;save(url)&lt;/code&gt; function that'll save the url's contents to a file without returning a file-like object.&lt;/div&gt;
&lt;div&gt;Not too much to write about, spent a lot of time researching stuff today. Hope to get done with my changes tomorrow. Let's see how that'll work out&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-4759925533921115248?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/4759925533921115248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=4759925533921115248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4759925533921115248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4759925533921115248'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/08/from-frontline-day-4.html' title='From the frontline, day 4'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-1298567622814717240</id><published>2011-08-10T09:21:00.004+02:00</published><updated>2011-08-10T18:18:17.963+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='war on legacy code'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>From the frontline, day 3</title><content type='html'>&lt;div&gt;Today, I decided to go and restructure my webapp into a package as recommended by the &lt;a href="http://flask.pocoo.org/docs/patterns/packages/"&gt;Flask "Larger Applications" pattern&lt;/a&gt;. Thanks to my existing test suite, the move was quick and pain-free. I had to fix imports in one of the tests, but apart from that, the only thing I had to do was splitting up the webapp.py file correctly into webapp/__init__.py, webapp/views.py and webapp/models.py.&lt;/div&gt;
&lt;div&gt;I then started playing with implementing the actual functionality for uploading files and creating database entries for the jobs submitted. Took a while to get this right, never done database stuff with Flask before. But again, pretty easy to set up tests for all this. Also, I discovered &lt;a href="http://packages.python.org/Flask-Testing/"&gt;Flask-Testing&lt;/a&gt;, making flask unit testing even more comfy. Just had to fix up the &lt;a href="http://twill.idyll.org/"&gt;Twill&lt;/a&gt; module Flask-Testing comes with to not use the md5 and sha modules, triggering deprecation warnings. Will continue to write the last tests for the job submission form tomorrow, and then see how to deal with making the web app download data from elsewhere for the user.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-1298567622814717240?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/1298567622814717240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=1298567622814717240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1298567622814717240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1298567622814717240'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/08/from-frontline-day-3.html' title='From the frontline, day 3'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-9063881312091306945</id><published>2011-08-09T09:41:00.006+02:00</published><updated>2011-08-10T09:20:43.744+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='war on legacy code'/><category scheme='http://www.blogger.com/atom/ns#' term='flask'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>From the frontline, day 2</title><content type='html'>&lt;div&gt;Looks like my system strikes back. A fitting thing to happen for an episode 2, I guess. Turns out that &lt;code&gt;nosetests&lt;/code&gt; and &lt;code&gt;virtualenv&lt;/code&gt; need some extra care and feeding when kept together. Installing another copy of nosetests into my virtualenv fixed the test failures I was seeing. Thanks to the folks on #python and #pocoo for pointing me the right way.&lt;/div&gt;
&lt;div&gt;Of course this broke the code coverage. Nothing a &lt;code&gt;pip install --upgrade coverage&lt;/code&gt; wouldn't fix, though. As an added bonus, the coverage html output now looks much nicer. I guess it was redesigned between whatever my system got and the version pip grabbed.&lt;/div&gt;
&lt;div&gt;Of course, after spending quite some time writing tests for my email sending module, the #pocoo folks point me at the already existing &lt;a href="http://packages.python.org/flask-mail"&gt;Flask-Mail&lt;/a&gt; extension, that integrates into the Flask test harness (as in, if you're testing, it won't send email) already. Oh well. Switched, ditched quite some code and corresponding tests. Even less stuff I have to maintain myself.&lt;/div&gt;
&lt;div&gt;Unfortunately, Flask-Mail doesn't seem to like it when you switch on &lt;code class="prettyprint"&gt;app.config['TESTING'] = True&lt;/code&gt; after initialization. Fortunately, you can still fiddle with the value used so it doesn't try sending emails, like so:
&lt;pre class="prettyprint"&gt;def setUp(self):
    webapp.app.config['TESTING'] = True
    webapp.mail.suppress = True
&lt;/pre&gt;
The key here is the &lt;code class="prettyprint"&gt;mail.suppress = True&lt;/code&gt; setting.
Once that's done, all the testing options work as expected. You can even have a look at the msg objects that would have been sent using the following snippet:
&lt;pre class="prettyprint"&gt;def test_sent_mail(self):
    """Test if emails were generated and sent correctly"""
    with webapp.mail.record_messages() as outbox:
        rv = self.app.post('/send-email',
                 data=dict(message="hello world"))
        assert len(outbox) == 1
        msg = outbox[0]
        assert "hello world" in msg.body
&lt;/pre&gt;
I like it, this really gets all the stuff I do under test in a very straightforward manner.
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-9063881312091306945?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/9063881312091306945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=9063881312091306945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/9063881312091306945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/9063881312091306945'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/08/from-frontline-day-2.html' title='From the frontline, day 2'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-4115087477114083658</id><published>2011-08-08T11:17:00.004+02:00</published><updated>2011-08-08T18:39:36.249+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='war on legacy code'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>From the frontline, day 1</title><content type='html'>&lt;div&gt;I've decided to start the campaign by ditching the existing PHP web app. I lost all confidence in it last Friday, when I found that it only worked by accident, due to a well-placed typo.&lt;br /&gt;
As I'm rewriting the web app anyway, I thought I could also ditch PHP altogether. Not that it's necessarily a bad language for web apps, but the rest of the code is perl or python, so getting rid of php means one less language to get confused by.&lt;/div&gt;

&lt;div&gt;Because this is the &lt;a href="http://kblin.blogspot.com/2011/08/war-on-legacy-code.html"&gt;War on Legacy Code&lt;/a&gt;, I'm not going to write untested code in this campaign. So first I need to brush up my python unit testing skills. I do have parts of a python version of the web app already (untested, that won't work later), but it's missing a user feedback form.&lt;br /&gt;
I don't want to send an email for every run of the test suite, so I need to mock up smtplib.SMTP. After some web research, I'll be using Ian Bicking's &lt;a href="http://blog.ianbicking.org/minimock.html"&gt;minimock&lt;/a&gt; to provide my mock objects. As I don't just run doctests (even though they're pretty cool), I decided to also throw in &lt;a href="http://blog.webmynd.com/2009/02/18/mocking-objects-in-python-unit-tests/"&gt;MiniMockUnit&lt;/a&gt;, which makes minimock print the output to a StringIO buffer instead of stdout. That way, you can easily put it in a normal unit test.
&lt;/div&gt;

&lt;div&gt;I usually run my tests using nosetests. Turns out, nosetests allows me to run both vanilla unit tests and doctests, and it also has a code coverage plugin. Thus,
&lt;pre&gt;nosetests -v --with-doctest --with-coverage --cover-html --cover-package="testmodule"&lt;/pre&gt; will get the module "testmodule" tested using available unit tests, doctests and the test coverage will be reported in html in the cover/ directory. The &lt;code&gt;--cover-package&lt;/code&gt; part seems to be needed to stop the coverage code from trying (and failing) to create coverage information files in the standard lib paths.&lt;/div&gt;

&lt;div&gt;To sum up, I didn't actually see much battle.. er.. code today but my arsenal is filled with testing tools, and I'm well prepared to jump into the fray tomorrow. Also, thanks to some help from the folks on #gsoc IRC on freenode, I now have decent syntax highlighting and formatting on my blog, so I might be able to post code samples for real now. Life is good so far.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-4115087477114083658?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/4115087477114083658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=4115087477114083658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4115087477114083658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4115087477114083658'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/08/from-frontline-day-1.html' title='From the frontline, day 1'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-4553783116664434867</id><published>2011-08-08T08:04:00.005+02:00</published><updated>2011-08-08T18:15:18.581+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='war on legacy code'/><category scheme='http://www.blogger.com/atom/ns#' term='antiSMASH'/><category scheme='http://www.blogger.com/atom/ns#' term='code cleanup'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='defensive programming'/><title type='text'>War on Legacy Code</title><content type='html'>Following the hallowed US American tradition of declaring war on whatever things you don't like, I've decided to declare war on legacy code this week.
&lt;br /&gt;
By legacy code, I mostly mean untested code, following the definition of Michael Feathers' book &lt;span style="font-style:italic;"&gt;Working with Legacy Code&lt;/span&gt;. That's a great read, by the way. If you're working with old code, you should go read it. I found that I've been doing most of the things mentioned already, but it's nice to see a systematic write-up about it.
&lt;br /&gt;
My chosen battlefield in this war is the code at my day job, mostly because it's in a much worse shape than the code I deal with in the various Open Source projects I'm involved in. Seeing how my day job code is a Frankenstein's monster of Perl, PHP and Python parts, some of the work will be to get some of the tests done twice. In particular, I really want to get rid of the PHP parts.
&lt;br /&gt;
I won't delve into the particulars of the code too much, it's published under the GPLv3 if anyone is interested. I will however try to post some daily news from the front lines, with things that I have thought about during that particular day of the battle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-4553783116664434867?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/4553783116664434867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=4553783116664434867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4553783116664434867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4553783116664434867'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/08/war-on-legacy-code.html' title='War on Legacy Code'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-731089594190385469</id><published>2011-06-19T22:29:00.004+02:00</published><updated>2011-06-21T22:16:54.531+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='brechtbautheater'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='props'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Geeky stage props made easy</title><content type='html'>&lt;div&gt;
Currently I'm involved in building the stage and props for an amateur theater, the &lt;a href="http://www.brechtbautheater.de/"&gt;Brechtbau Theater&lt;/a&gt; at my university. We're currently preparing for an Agatha Cristie play, "And then there were none". As a great opportunity, we are able to perform this piece in the city's professional theater, the &lt;a href="http://www.landestheater-tuebingen.de/events/view/id/46131/date/1311026400"&gt;Landestheater Tübingen (LTT)&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
Needless to say, we're really excited about this. Of course having to build a stage for a 300 seat theater is a bit different to building a stage for the 80 seat theater we've got at university. Also, we only have about four hours to set up the stage, and after the last night, we have to clear out immediately. While the way to build a modular stage design probably is worth a blog post on it's own, I want to talk about the electronics behind stage a bit today.&lt;/div&gt;
&lt;div&gt;
Without wanting to spoil some of the surprises we have in store for our audience, we're working on a stage design with lots of big cogwheels and other moving parts. We will power some of these with the cheapest and most readily available power source we have available: actors. But some of the stage has parts that are just out of reach, or need to be positioned more precisely. For this, I'm currently planning to use a combination of stepper motors and hobby servos, run by an Arduino Uno.&lt;/div&gt;
&lt;div&gt;
I'm still heavy in the prototyping stage, but I just wanted to share my discovery on how easy it is to do stuff like this with the Arduino. My current test setup looks a bit like &lt;br /&gt;&lt;a href="http://goo.gl/photos/f7cgza0vTJ" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-Ndz6_gmd8Sc/Tf0X2zcIyaI/AAAAAAAAAO4/eQKsfkhkpBc/s512/setup.jpg"&gt;&lt;/a&gt;
&lt;br/&gt;
Using an L293D (left) and an L293NE (right) IC, I'm running two Trinamic bipolar steppers, and I'm also controlling four servo motors. For making all of these move forwards and backwards, I had to write about 50 lines of code, including whitespace and some comments. Arguably, moving a couple of motors forward and backward in a loop isn't that intersting, but the amout of work the Arduino default libraries already take care of is just great.
&lt;/div&gt;
&lt;div&gt;Next, I'll have to figure out how to build a lamellar transport belt and move it with one of the steppers, while converting the circular movement of the other stepper to a linear movement. Never played with elaborate hardware stuff before, this is fun.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-731089594190385469?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/731089594190385469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=731089594190385469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/731089594190385469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/731089594190385469'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/06/geeky-stage-props-made-easy.html' title='Geeky stage props made easy'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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='https://lh5.googleusercontent.com/-Ndz6_gmd8Sc/Tf0X2zcIyaI/AAAAAAAAAO4/eQKsfkhkpBc/s72-c/setup.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-405422244557633109.post-2047199722149151035</id><published>2011-02-17T16:24:00.004+01:00</published><updated>2011-02-17T16:38:24.399+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packaging'/><category scheme='http://www.blogger.com/atom/ns#' term='Launchpad'/><category scheme='http://www.blogger.com/atom/ns#' term='OBS'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='py2pack'/><title type='text'>Packaging python modules, the really easy way</title><content type='html'>I just had to package up a python package to make installation of a software we use at work easier. The systems we run here are Suse- and Ubuntu-based, so I got to package RPMs and debs.

I did package the odd perl package and some bioinformatics tool before, but I haven't looked at it for a while, so I was pretty rusty. I use the &lt;a href="http://build.opensuse.org/"&gt;OpenSuse Build Service&lt;/a&gt; to build RPMs, and the nice folks in FreeNode's #opensuse-buildservice pointed me a &lt;a href="http://saschpe.wordpress.com/2010/12/12/braindead-python-packaging/"&gt;py2pack&lt;/a&gt;, a truly amazing piece of software that creates a .spec file for you from package information in pypi.

Now, I had to package pysvn, which happens to not link to the downloadable file from pypi. As it turns out, this just stopped me from using py2pack for downloading the file, &lt;code&gt;py2pack generate&lt;/code&gt; works fine. Filling in the missing License and Description information was easy, and my package was building on OBS in under five minutes.

For Ubuntu, &lt;a href="https://wiki.ubuntu.com/PackagingGuide/Python"&gt;Python packaging guide&lt;/a&gt; was a bit less comfortable, but a short while afterwards my Ubuntu package was built on &lt;a href="https://launchpad.net/"&gt;Launchpad&lt;/a&gt; as well.

Life is good. At least so far, now I get to make all of that work for system #3 in the department. This happens to be an OS sold by a company from the northern west coast of the USA, and it doesn't have an execute bit and can't deal with hashbang lines. Oh well, two out of three isn't too bad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-2047199722149151035?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/2047199722149151035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=2047199722149151035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2047199722149151035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2047199722149151035'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/02/packaging-python-modules-really-easy.html' title='Packaging python modules, the really easy way'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-3783470807821643672</id><published>2011-01-21T10:14:00.015+01:00</published><updated>2011-08-08T23:45:24.280+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='printf debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='defensive programming'/><title type='text'>Defensive programming to the rescue</title><content type='html'>I've just fixed a bug in a web app that I'm working on with a couple of colleagues, a bug that is a great example of a hard to find, easy to fix bug that could have been avoided by some defensive programming.

I thought I'd share this titbit to illustrate why defensive programming is a good idea.&lt;div&gt;The application we're working on consists of three parts:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;a web front-end that accepts jobs (php based)&lt;/li&gt;&lt;li&gt;a database keeping the job queue (SQL)&lt;/li&gt;&lt;li&gt;the back-end that runs the jobs (python)&lt;/li&gt;&lt;/ul&gt;The job is actually an external script, which is important for this bug as well.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;On the web front-end, the user gets to choose a couple of options for the job using check-boxes.&lt;/div&gt;&lt;div&gt;The bug we were seeing was that if the user just clicked one checkbox (and that wasn't the "all" checkbox), the external script would die with an "invalid options" error.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;The options are passed into the SQL database as a comma-separated string, and our first suspicion was that for single options, there was a trailing comma left. A quick look at the database dump showed that this was not the case.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;The next idea was that the back-end was not constructing the command line for the external script correctly. The code looked sane, but just to be sure I decided to do some printf debugging. In the printout of the command line, I finally found the bug. It was in the web front-end after all. Let's look at the code (changed a bit for brevity).&lt;/div&gt;
&lt;div&gt;&lt;pre class="prettyprint"&gt;// 1 is "all"
if($_POST["1"] == "on" ){
  $options = "1";
} else {
  for ($i = 2; $i &amp;lt;= 10; $i++) {
      if($_POST["$i"] == "on") {
          $options .= " " . $i . ",";
      }
  }
  $suffix = strripos($options, ",");
  $options = substr($options, 0, $suffix);
}
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;Can you spot the problem? &lt;pre&gt;$options .= " " . $i . ",";&lt;/pre&gt; is the culprit. It adds a leading white-space to the $options string. Looking at the database dump, that's easy to miss.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Now, why is this a problem? Let's look at the back-end code (changed for clarity again):&lt;/div&gt;
&lt;div&gt;&lt;pre class="prettyprint"&gt;
job = get_next_job_from_work_queue()
args = ['./do_stuff.py', job.filename]
args += ['--options', job.options != None and \
                      jobs.options or '1']
subprocess.call(args)
&lt;/pre&gt;
&lt;/div&gt;&lt;div&gt;The back-end uses an array for it's command line arguments to avoid having to call out to a shell first. This has the side effect that all the arguments are passed to the called script verbatim. Thus, a leading space character is kept and passed to the called application. This is &lt;b&gt;defensive programming fail #1&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Still, this doesn't explain why the white-space is a problem. For that, we need to look at do_stuff.py (Changed for clarity again).&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;pre class="prettyprint"&gt;value = options[options.index(i) + 1]
if i == "--options":
    if "," not in value and value not in ["1","2","3","4","5",\
                                          "6","7","8","9","10"]:
        invalidoptions(i)
&lt;/pre&gt;&lt;/code&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Assuming we clicked on the #7 check-box in the front-end, " 7" is passed to do_stuff.py. " 7" is not in &lt;code&gt;["1","2","3","4","5","6","7","8","9","10"]&lt;/code&gt;, so we fail. &lt;b&gt;Defensive programming fail #2&lt;/b&gt; is in the &lt;code&gt;value = options[options.index(i) + 1]&lt;/code&gt; line. Adding a strip() here would have avoided the bug. This was not found in manual testing, as the shell takes care of stripping the white-space characters for us. Still, a bit of defensive programming would have helped to avoid the issue.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;If I ever teach a programming course, one of the assignments will be finding and fixing a bug like this.&lt;/div&gt;

&lt;span style="font-weight:bold;"&gt;Update:&lt;/span&gt; 2011-08-08 Pretty-print code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-3783470807821643672?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/3783470807821643672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=3783470807821643672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/3783470807821643672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/3783470807821643672'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/01/defensive-programming-to-rescue.html' title='Defensive programming to the rescue'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-5241285112361157159</id><published>2011-01-17T07:36:00.004+01:00</published><updated>2011-01-17T07:47:33.505+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><category scheme='http://www.blogger.com/atom/ns#' term='antiSMASH'/><title type='text'>My Samba status 11/1</title><content type='html'>Hi folks,

you will have noticed that I failed to post any of my "On the way to Samba4" reports in December last year. That was because I failed to do any Samba work in December, spending all of my time on work-related things. A few co-workers and me had to rush to get a &lt;a href="http://antismash.secondarymetabolites.org/"&gt;web server&lt;/a&gt; up and running that allows biologists to figure out what secondary metabolites like antibiotics might be produced by their bacterium/fungus. After pulling a 90-hour-week to get finished between Christmas and New Year's Eve, I had to take some time off &lt;span style="font-style:italic;"&gt;not&lt;/span&gt; staring at a computer screen. Batteries recharged now, I'm ready to get into action.

Over the weekend, I've been getting the skeleton for some DNS torture tests set up, I'm hoping to flesh this out a bit more during the week.

Cheers,
Kai&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-5241285112361157159?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/5241285112361157159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=5241285112361157159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/5241285112361157159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/5241285112361157159'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2011/01/my-samba-status-111.html' title='My Samba status 11/1'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-2322138971650932075</id><published>2010-12-01T23:58:00.001+01:00</published><updated>2010-12-01T23:59:27.239+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><title type='text'>On the way to Samba 4, week 47</title><content type='html'>Not much to show for this week. I spent the week at a conference, and while I learned many interesting things, I didn't have time to get Samba-related work done. Let's try again for week 48.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-2322138971650932075?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/2322138971650932075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=2322138971650932075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2322138971650932075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2322138971650932075'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2010/12/on-way-to-samba-4-week-47.html' title='On the way to Samba 4, week 47'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-8665631917027910701</id><published>2010-11-24T23:05:00.003+01:00</published><updated>2010-11-24T23:11:16.241+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><title type='text'>On the way to Samba 4, week 46</title><content type='html'>Really not much time to work on Samba this week. So I didn't get around to really debug the failing echo test for quite a while. Then tridge pointed out that I was trying to use a connected UDP socket as if it was not connected, and things started to work like a charm.

It doesn't look like I'll have much more time during week 47. Hopefully I will get around to clean up the patches and push my example anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-8665631917027910701?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/8665631917027910701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=8665631917027910701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/8665631917027910701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/8665631917027910701'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2010/11/on-way-to-samba-4-week-46.html' title='On the way to Samba 4, week 46'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-2204394503137044601</id><published>2010-11-17T23:25:00.003+01:00</published><updated>2010-11-17T23:59:32.839+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><title type='text'>On the way to Samba 4, week 45</title><content type='html'>A bit late, as usual, but I finally have something productive again. I've got a Samba4 UDP echo server and async client library (including torture test suite), and they're almost working. :)
I'm saying almost because I can only get it to work manually right now, not from "make test". I'm sure it's some small thing I'm missing, I'm expecting this to be fixed soon.
The code also still lacks some explanatory comments, but should be ready for the mainline for the week 46 report.

The client library and torture test also runs against netcat, so two "implementations" of echo servers are supported for sure. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-2204394503137044601?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/2204394503137044601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=2204394503137044601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2204394503137044601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2204394503137044601'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2010/11/on-way-to-samba-4-week-45.html' title='On the way to Samba 4, week 45'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-7288929148856701225</id><published>2010-11-10T21:11:00.006+01:00</published><updated>2010-11-10T21:29:04.942+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>On the way to Samba 4, week 44</title><content type='html'>I usually hate it when real life stops me from coding, but in this case I had a really fun weekend off the computer. The downside is that the echo server still is not done. So not much happening on the Samba 4 front from my side.

One related news item though is the release of a new version of the &lt;a href="http://www.yoctoproject.org/"&gt;Yocto Project&lt;/a&gt;. Quoting from their website:&lt;blockquote&gt;The Yocto Project™ is an open source collaboration project that provides  templates, tools and methods to help you create custom Linux-based  systems for embedded products regardless of the hardware architecture.
&lt;/blockquote&gt;
Based on &lt;a href="http://www.openembedded.org/"&gt;OpenEmbedded&lt;/a&gt;, one of it's supported platforms is the &lt;a href="http://beagleboard.org/"&gt;Beagle board&lt;/a&gt;. This looks like a pretty good platform to play with to get a bunch of embedded Samba images to work. This goes straight on my todo list, as if that wasn't pretty full already. Still, maybe a nice setup to demo at the next &lt;a href="http://www.sambaxp.org/"&gt;SambaXP&lt;/a&gt; conference.
So, that's it with this week's installment of my Samba 4 blog post. Unless real life happens again, maybe next week I can show the world how a well-designed Samba 4 task looks like.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-7288929148856701225?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/7288929148856701225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=7288929148856701225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7288929148856701225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7288929148856701225'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2010/11/on-way-to-samba-4-week-44.html' title='On the way to Samba 4, week 44'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-6100364935399013492</id><published>2010-11-02T20:07:00.003+01:00</published><updated>2010-11-02T20:14:50.703+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><title type='text'>On the way to Samba 4, week 43</title><content type='html'>Last week, I didn't really get to spend much time on Samba 4. About the only thing I managed was working on a patch that renamed the s4 "net" binary to "samba-tool" while at the GSoC Mentor Summit 2010 with Jelmer.

The rename reduces the number of executables with the same name in s3 and s4, getting us a step closer to a fully merged build. Renaming the s4 net tool hopefully inconveniences less admins out there. If you've been bitten by this, sorry about that.

That's all there is for now for this week. With any luck, next week's post will be a bit longer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-6100364935399013492?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/6100364935399013492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=6100364935399013492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6100364935399013492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6100364935399013492'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2010/11/on-way-to-samba-4-week-43.html' title='On the way to Samba 4, week 43'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-815052982312379983</id><published>2010-10-27T08:19:00.003+02:00</published><updated>2010-10-27T08:34:22.837+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><category scheme='http://www.blogger.com/atom/ns#' term='DNS'/><title type='text'>On the way to Samba 4, week 42</title><content type='html'>This is the first installment of my hopefully regular progress reports on the things I did last week to get Samba 4 closer to a stable release.

The biggest piece of work certainly was finally pushing the DNS server implementation. Yes, that's correct, Samba 4 now has it's own DNS server. So far, all it does is serve out resource records from AD that it's authoritative for. You need to sync over the LDAP entries from another AD DC as well. Still, that's a good start, and thanks to the existing infrastructure in Samba4, it was possible to do all of this in about 1000 lines of code.
Features still missing from the DNS server so far:
&lt;ul&gt;&lt;li&gt;Recursive query support (needs a DNS resolver library, working on that)&lt;/li&gt;&lt;li&gt;Support for update requests so clients can update their own entries&lt;/li&gt;&lt;li&gt;On provisioning, we need to pre-load the database with a couple of DNS records&lt;/li&gt;&lt;/ul&gt;You can see a broad overview of the todo items for the DNS server in source4/dns_server/TODO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-815052982312379983?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/815052982312379983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=815052982312379983' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/815052982312379983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/815052982312379983'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2010/10/on-way-to-samba-4-week-42.html' title='On the way to Samba 4, week 42'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-6140243228573911623</id><published>2010-01-07T15:40:00.002+01:00</published><updated>2010-01-07T15:44:09.283+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.5.0 released</title><content type='html'>&lt;div id="release-notes"&gt;&lt;p&gt;The Wombat team is happy to release Wombat 0.5.0&lt;/p&gt; &lt;p&gt;Compared to the 0.4.0 release, Wombat 0.5.0 sports a lot of new features.&lt;/p&gt; &lt;p&gt;Notable differences are:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt; Now based on Pylons 0.9.7 and SQLAlchemy 0.5&lt;/li&gt;&lt;li&gt; No support for Python 2.4 anymore due to Pylons requirements&lt;/li&gt;&lt;li&gt;Users can now upload artwork&lt;/li&gt;&lt;li&gt;Uploaded artwork will be committed to the media repository after moderation by an administrator or lead artist&lt;/li&gt;&lt;li&gt; Tag-based browsing and other new UI features&lt;/li&gt;&lt;li&gt; A new subversion backend uses pysvn instead of executing the svn shell commands&lt;/li&gt;&lt;li&gt; Automated database cleanups&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Changes since the 0.4.5 release include:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Art upload features as mentioned above&lt;/li&gt;&lt;li&gt; Security hardening
&lt;ul&gt;&lt;li&gt;More resistance against command injection&lt;/li&gt;&lt;li&gt;More complicated password algorithm to slow down rainbow-table attacks&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Multiple bug fixes&lt;/li&gt;&lt;/ul&gt;As always, the &lt;a href="http://wombat.worldforge.org/"&gt;Wombat demo site&lt;/a&gt; has the latest version for you to test.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-6140243228573911623?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/6140243228573911623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=6140243228573911623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6140243228573911623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6140243228573911623'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2010/01/wombat-050-released.html' title='WOMBAT 0.5.0 released'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-7209425894313349772</id><published>2009-11-24T08:55:00.003+01:00</published><updated>2009-11-24T09:11:18.406+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>Wombat demo sites back up</title><content type='html'>It's aliiiiiiive!

Thanks to Thomas Ingham, a fellow Wombat developer, http://wombat.worldforge.org/ has a new home, ending a couple of months of downtime while I was looking for new hosting.

Tom's box has enough power to allow running two instances of Wombat. Following the next release, the &lt;a href="http://wombat.worldforge.org/"&gt;Wombat demo site&lt;/a&gt; will be running the latest released version of Wombat, while the &lt;a href="http://wombat-dev.worldforge.org/"&gt;Wombat development site&lt;/a&gt; will  be running the tip of the development tree, on an example media repository.

We're currently dealing with the teething pains of rolling out Wombat on a distro that is different from the one I develop on, but everything should be running fine in a couple of days.

Thanks again to Tom and his sysop Josh for giving two cute little Wombat web-apps a new home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-7209425894313349772?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/7209425894313349772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=7209425894313349772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7209425894313349772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7209425894313349772'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2009/11/wombat-demo-sites-back-up.html' title='Wombat demo sites back up'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-703293500502133098</id><published>2009-08-11T09:50:00.002+02:00</published><updated>2009-08-11T10:04:59.546+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><title type='text'>Guten Morgen net</title><content type='html'>After a couple of days of grinding through the code, the "net" tool from the Samba suite is finally ready to speak languages other than English. A bit over 1700 messages are now waiting for translators.

Note to self: Next time I work on i18n, I want combat pay.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-703293500502133098?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/703293500502133098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=703293500502133098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/703293500502133098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/703293500502133098'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2009/08/guten-morgen-net.html' title='Guten Morgen net'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-2823387525466277671</id><published>2009-06-05T10:23:00.003+02:00</published><updated>2009-06-05T10:37:12.754+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>Huston, we have a login</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/_XKRmYKVCXNk/SijXQsFTZiI/AAAAAAAAAJU/9Zu0-9K6dLU/s400/snoopy_closeup_small.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 350px;" src="http://lh6.ggpht.com/_XKRmYKVCXNk/SijXQsFTZiI/AAAAAAAAAJU/9Zu0-9K6dLU/s400/snoopy_closeup_small.jpg" alt="" border="0" /&gt;&lt;/a&gt;
After some initial issues, I have just joined my first XP box to Samba4 running on snoopy, my ARM-based system-on-a-chip home server.

So now I have a spiffy Active Directory setup running on a system that makes no noise, barely heats up, and that peaks at 2W power usage. If that's not green IT, I don't know what is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-2823387525466277671?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/2823387525466277671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=2823387525466277671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2823387525466277671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2823387525466277671'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2009/06/huston-we-have-login.html' title='Huston, we have a login'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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://lh6.ggpht.com/_XKRmYKVCXNk/SijXQsFTZiI/AAAAAAAAAJU/9Zu0-9K6dLU/s72-c/snoopy_closeup_small.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-405422244557633109.post-3859512109954878220</id><published>2009-05-21T13:02:00.003+02:00</published><updated>2009-05-21T13:22:01.276+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.4.5 released</title><content type='html'>The WOMBAT team is happy to announce the release of 0.4.5

WOMBAT 0.4.5 is mostly a bugfix release. Several backend and usability issues have been resolved.

Features include
&lt;ul&gt;&lt;li&gt;Tag cloud now really is a "cloud", not just a list of tags
&lt;/li&gt;&lt;li&gt;In directory view, clicking on the expanded information no longer collapses the extended information (bug #291724)
&lt;/li&gt;&lt;li&gt;Tag-based browsing now filters on multiple tags if desired
&lt;/li&gt;&lt;/ul&gt;
As always, check out &lt;a href="http://wombat.worldforge.org/"&gt;the WOMBAT live demo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-3859512109954878220?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/3859512109954878220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=3859512109954878220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/3859512109954878220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/3859512109954878220'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2009/05/wombat-045-released.html' title='WOMBAT 0.4.5 released'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-6728605077327283764</id><published>2009-03-23T09:11:00.002+01:00</published><updated>2009-03-23T09:14:42.783+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.4.4 released.</title><content type='html'>The WOMBAT team is happy to announce the release of 0.4.4

WOMBAT 0.4.4 introduces preliminary tag support for the beginning of a new browsing experience.

Features include
&lt;ul&gt;&lt;li&gt;Tags for assets and collections&lt;/li&gt;&lt;li&gt;Tag cloud replaces "unassigned file view"&lt;/li&gt;&lt;li&gt;Bug fixes for upgrade issues missed in 0.4.3&lt;/li&gt;&lt;/ul&gt;
As always, check out &lt;a href="http://wombat.worldforge.org/"&gt;the WOMBAT live demo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-6728605077327283764?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/6728605077327283764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=6728605077327283764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6728605077327283764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6728605077327283764'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2009/03/wombat-044-released.html' title='WOMBAT 0.4.4 released.'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-4053060100607548819</id><published>2009-03-17T15:14:00.003+01:00</published><updated>2009-03-17T15:24:56.360+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.4.3 released.</title><content type='html'>The WOMBAT team is happy to announce the release of 0.4.3

Different to other releases, this is a point release to follow the updated versions of Pylons 0.9.7 and SQLAlchemy 0.5 and contains no other changes.

This version does not support Python 2.4 anymore, WOMBAT 0.4.2 was the last version to support this.

As always, check out &lt;a href="http://wombat.worldforge.org/"&gt;the WOMBAT live demo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-4053060100607548819?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/4053060100607548819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=4053060100607548819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4053060100607548819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4053060100607548819'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2009/03/wombat-043-released.html' title='WOMBAT 0.4.3 released.'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-8301005086287941858</id><published>2009-01-01T16:53:00.002+01:00</published><updated>2009-01-01T16:56:34.187+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.4.2 released</title><content type='html'>Another year, with a brand-new WOMBAT release.

The biggest feature of the 0.4.2 release is an automated update function that keeps WOMBAT in sync with the media repository.

Other features include automated database cleanup and the return of the searchbox.

As always, check out &lt;a href="http://wombat.worldforge.org/"&gt;the WOMBAT live demo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-8301005086287941858?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/8301005086287941858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=8301005086287941858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/8301005086287941858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/8301005086287941858'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2009/01/wombat-042-released.html' title='WOMBAT 0.4.2 released'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-4561868751771773719</id><published>2008-10-31T17:56:00.003+01:00</published><updated>2008-10-31T19:08:44.371+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.4.1 released</title><content type='html'>The WOMBAT team is happy to announce the release of 0.4.1

Based on the UI revamp in release 0.4.0, new UI features in this release include:
&lt;ul&gt;&lt;li&gt; Custom icons that reflect the content of the media, if possible
&lt;/li&gt;&lt;li&gt;New stock icons from the Tango project
&lt;/li&gt;&lt;li&gt;Display total number of files under a directory to simplify browsing
&lt;/li&gt;&lt;/ul&gt;As always, the &lt;a href="http://wombat.worldforge.org/"&gt;WOMBAT demo page&lt;/a&gt; has the current version for you to test.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-4561868751771773719?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/4561868751771773719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=4561868751771773719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4561868751771773719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4561868751771773719'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/10/wombat-041-released.html' title='WOMBAT 0.4.1 released'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-8582327634092108307</id><published>2008-10-29T01:25:00.003+01:00</published><updated>2008-10-29T09:31:26.981+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.4.0 released</title><content type='html'>The WOMBAT team is happy to announce the release of 0.4.0

New features in this version include:
&lt;ul&gt;&lt;li&gt; Completely revamped look and feel&lt;/li&gt;&lt;li&gt;Support for users and roles&lt;/li&gt;&lt;li&gt;Actions that change the server's data&lt;/li&gt;&lt;/ul&gt;As always, the &lt;a href="http://wombat.worldforge.org/"&gt;WOMBAT demo page&lt;/a&gt; has the current version for you to test.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-8582327634092108307?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/8582327634092108307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=8582327634092108307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/8582327634092108307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/8582327634092108307'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/10/wombat-040-released.html' title='WOMBAT 0.4.0 released'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-518703474352670360</id><published>2008-08-13T13:08:00.002+02:00</published><updated>2008-08-13T14:23:20.947+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.3.0 released</title><content type='html'>The WOMBAT team is happy to announce the release of WOMBAT 0.3.0

New features for this version include:
&lt;ul&gt;&lt;li&gt;Completely redesigned data backend based on SQLAlchemy&lt;/li&gt;&lt;li&gt;Support for scanning and updating the repository without running an extra script to generate the metadata&lt;/li&gt;&lt;li&gt;Preliminary support for Assets and Collections, the WebUI still needs some work.&lt;/li&gt;&lt;/ul&gt;As always, the &lt;a href="http://wombat.worldforge.org/"&gt;WOMBAT demo site&lt;/a&gt; runs the latest version for you to test.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-518703474352670360?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/518703474352670360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=518703474352670360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/518703474352670360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/518703474352670360'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/08/wombat-030-released.html' title='WOMBAT 0.3.0 released'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-1837087217168230916</id><published>2008-08-03T23:19:00.002+02:00</published><updated>2008-08-03T23:26:25.718+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT status</title><content type='html'>Hi folks,

development around WOMBAT hasn't really slowed down, despite the lack of releases recently. We're currently working hard on bringing the back-end data model into a shape that will allow us to add more features to WOMBAT more easily.

I'm currently busy writing a svn xml parser that will load the metadata into a SQL database, instead of relying on files like we used to. This, together with a major overhaul of the overal design of the data model, gives us better integration with the SVN backend.

A next step in this design will be tracking svn updates file by file instead of forcing a re-scan of the whole data set.

Stay tuned for updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-1837087217168230916?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/1837087217168230916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=1837087217168230916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1837087217168230916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1837087217168230916'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/08/wombat-status.html' title='WOMBAT status'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-2799170210590775115</id><published>2008-07-19T16:29:00.002+02:00</published><updated>2008-07-19T16:37:09.727+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.2.1 released.</title><content type='html'>The WOMBAT development team is happy to release WOMBAT 0.2.1

This is mostly a bug fix release fixing an uncaught exception when
trying to create thumbnails for interlaced PNG files.
It also has some visual updates, displaying all available files for
the root directory and allowing to narrow down the number of files
by browsing into subdirectories, scrollable divs to better display
text files in place and a couple of others.

Note that the wombat demo website moved to &lt;a href="http://wombat.worldforge.org/"&gt;http://wombat.worldforge.org/&lt;/a&gt;, thanks to Anders (aka. Demitar) for hosting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-2799170210590775115?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/2799170210590775115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=2799170210590775115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2799170210590775115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/2799170210590775115'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/07/wombat-021-released.html' title='WOMBAT 0.2.1 released.'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-7729742139177509278</id><published>2008-07-15T19:44:00.003+02:00</published><updated>2008-07-15T19:54:37.682+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.2.0 released.</title><content type='html'>The WOMBAT team is happy to announce the release of WOMBAT 0.2.0

This second alpha release of WOMBAT is the first to feature integration with Subversion.
                         &lt;div id="sfwz"&gt;
&lt;/div&gt;&lt;div id="sfwz1"&gt;Other Features Include:&lt;ul&gt;&lt;li&gt;Advanced Searching: Search by author, file type or modified date from within the repository.&lt;/li&gt;&lt;li&gt;A new stylish logo from Orin Shepherd at &lt;a href="http://www.coalmarch.com"&gt;Coalmarch Productions&lt;/a&gt; (not a feature, but we're counting it as a definite addition.)&lt;/li&gt;&lt;li&gt;Thumbnail rendering for "most" image assets.&lt;/li&gt;&lt;li&gt;Inline file-detail viewing for quick side-by-side comparisons.&lt;/li&gt;&lt;li&gt;Application status screen with helpful statistics.&lt;/li&gt;&lt;li&gt;A better browsing experience on the whole.
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id="wq.4"&gt;Of course the &lt;a href="http://cookiebox.game-host.org/"&gt;live demo&lt;/a&gt; shows the current status.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-7729742139177509278?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/7729742139177509278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=7729742139177509278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7729742139177509278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7729742139177509278'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/07/wombat-020-released.html' title='WOMBAT 0.2.0 released.'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-8372574286164487582</id><published>2008-07-15T10:29:00.002+02:00</published><updated>2008-07-15T10:31:55.972+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.1.4 released.</title><content type='html'>New features for this release include:
&lt;ul&gt;&lt;li&gt;Thumbnail preview for images, provided the PIL module is available.
&lt;/li&gt;&lt;li&gt;Advanced search for things like "author", "file extension" and "creation date"&lt;/li&gt;&lt;li&gt;Various bug fixes.&lt;/li&gt;&lt;/ul&gt;As always, have a look at the &lt;a href="http://cookiebox.game-host.org/"&gt;live demo&lt;/a&gt; to see what's hot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-8372574286164487582?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/8372574286164487582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=8372574286164487582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/8372574286164487582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/8372574286164487582'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/07/wombat-014-released.html' title='WOMBAT 0.1.4 released.'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-753369210264664659</id><published>2008-07-12T23:39:00.002+02:00</published><updated>2008-07-12T23:42:44.401+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.1.3 released.</title><content type='html'>Features of this release include:
&lt;ul&gt;&lt;li&gt; Loading revision data from a prepared metadata dir, vastly improving scan speed.&lt;/li&gt;&lt;li&gt;Many more search options&lt;/li&gt;&lt;li&gt;Status information on the front page.&lt;/li&gt;&lt;li&gt;Various bug fixes&lt;/li&gt;&lt;/ul&gt;As always, the &lt;a href="http://cookiebox.game-host.org/"&gt;demo site&lt;/a&gt; awaits your tests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-753369210264664659?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/753369210264664659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=753369210264664659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/753369210264664659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/753369210264664659'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/07/wombat-013-released.html' title='WOMBAT 0.1.3 released.'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-1690573977696809246</id><published>2008-07-10T00:37:00.003+02:00</published><updated>2008-07-10T00:41:27.621+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>WOMBAT 0.1.2 released.</title><content type='html'>I'm happy to announce WOMBAT 0.1.2 with Subversion integration.
While I'm not too happy with the speed the integration gives us, it's a start.

0.1.2 also features some nifty AJAX magic to make the directory details go away when you don't need them and other visual improvements.

Oh, and as you can see I moved the announcements of WOMBAT micro version changes to my personal blog, in order to not spam the WorldForge website.

As always, you &lt;a href="http://cookiebox.game-host.org"&gt;can try out the current release of WOMBAT&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-1690573977696809246?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/1690573977696809246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=1690573977696809246' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1690573977696809246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1690573977696809246'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/07/wombat-012-released.html' title='WOMBAT 0.1.2 released.'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-7061091984191548041</id><published>2008-07-01T08:50:00.003+02:00</published><updated>2008-07-01T08:58:10.362+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WOMBAT'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>Introducing WOMBAT</title><content type='html'>Yesterday I got around to release WOMBAT, the WorldForge Open Media Browser/Archive Tool.

So finally I'm coding for WorldForge again after my last project stalled a little.
Like plunger, WOMBAT is written in Python. WOMBAT makes use of the Pylons webapp framework. Apart from the brain-dead egg distribution mechanism, it's really neat. From the developer side of things, the framework gives you a lot of help to work on features, not web glue.

I still have to get the FCGI connection to Apache working, but so far the demo site on my home box works fine standalone. Thanks to NAT, I can even pretend it's a real web server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-7061091984191548041?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/7061091984191548041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=7061091984191548041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7061091984191548041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7061091984191548041'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2008/07/introducing-wombat.html' title='Introducing WOMBAT'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-7354011213863542804</id><published>2007-12-14T10:06:00.000+01:00</published><updated>2007-12-14T10:38:35.721+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><title type='text'>Getting rid of warnings</title><content type='html'>If you have ever built Samba4, you will have noticed that gcc spits tons of warnings. As fixing little things all over the code is a good and easy way to get an idea what's done where, I have decided to go and fix as many of those warnings as possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-7354011213863542804?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/7354011213863542804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=7354011213863542804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7354011213863542804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7354011213863542804'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2007/12/getting-rid-of-warnings.html' title='Getting rid of warnings'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-6814028229812471855</id><published>2007-09-19T10:01:00.000+02:00</published><updated>2007-09-19T12:19:08.026+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><title type='text'>Improving Samba4 winbind, a look back</title><content type='html'>&lt;span style="font-size:180%;"&gt;What the project is about&lt;/span&gt;
Samba4 contains a basic winbind implementation, but it is still lacking many features. The goal of my project was to improve Samba4 winbind so that the nsswitch and pam functionality provided by Samba3's winbindd would be present in Samba4, too.

Simply copying code over from Samba3 would not do, of course, as the underlying architecture in Samba4 is different. Also, the goal was to improve readability of the code, as opposed to the more organically "grown" look of the Samba3 winbindd code.

In Samba4, there is a library taking care of user/group management called libnet. Samba4 winbind uses this library extensively.

&lt;span style="font-size:180%;"&gt;What was done so far
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Porting nsstest to Samba4
nsstest is a binary that test basic functionality of a nsswitch library. Once all the tests in nsstest work for libnss_winbind from Samba4, the winbind implementation is useable.

&lt;/li&gt;&lt;li&gt;Getting information about users / SIDs
This is the basic nsswitch getpwnam/getpwuid functionality returning a pwent structure. It is also possible to query for AD / NT domain information about the user/sid.

&lt;/li&gt;&lt;li&gt;User listing / enumeration
nsswitch provides a set of functions (setpwent/getpwent/endpwent) to iterate over a password database. The classic database is the /etc/passwd file, but of course using nsswitch, it's possible to use a directory like LDAP or AD.

&lt;/li&gt;&lt;li&gt;Mapping SIDs to user ids and back
This one is only stubbed out, as Samba4 doesn't handle that mapping yet. However, functions for this were needed to make winbind work, so I had to stub these out. The advantage is that the other code will automagically start to work correctly once these functions are implemented for real.

&lt;/li&gt;&lt;li&gt;Mapping SIDs to group ids and back
Much the same applies here, once idmapping is supported in Samba4, this will be replaced by real code.
&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;What is left to do
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Group enumeration
The libnet functions for group enumeration were not implemented by the time GSoC was up. Now these functions are in, so support for groups identical to the user functions will follow soon.

&lt;/li&gt;&lt;li&gt;NTLM caching
Due to time constraints, caching of NTLM blobs was discarded. The nsswitch/pam functionality was regarded as core importance.

&lt;/li&gt;&lt;li&gt;PAC/info3 caching
As with NTLM caching, PAC/info3 caching was discarded. Caching is only interesting once the other features are working and will be implemented eventually.

&lt;/li&gt;&lt;li&gt;Automated tests
Currently the only way to test all of the functionality is to wrap the wbinfo binary and let that take care of constructing the necessary winbind queries. This is a bit clumsy. Jerry Carter is currently working on a winbind client library that will allow to access the functionality of wbinfo without a wrapper. The tests will be implemented using that API once it is in the tree.
&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;Future (related) work&lt;/span&gt;
First of all, the features still left on the TODO list will be implemented. Group functions first, testing next if possible. There is more to winbind than this GSoC project was about, so the more missing features will be implemented. The caching will follow once the other features are working and tested.

An improved winbind will help Samba4 to not only act as an AD controller but also as a domain member.

&lt;span style="font-size:180%;"&gt;A look back&lt;/span&gt;
Complying with long-standing computer science tradition, I underestimated the amount of work that had to be done before I could start working on the actual features I was planning to implement. In the end I had to prioritize features and drop the least important ones to get finished in time. I did not expect to spend so much time figuring out my way around the libnet code.

However, the foundation for implementing the dropped features is laid, so I do not feel too bad about it. Samba4 winbind already works better than before. Pending group support and id mapping, it will be usable for simple scenarios.

&lt;span style="font-size:180%;"&gt;Conclusions&lt;/span&gt;
I still need to be more careful about the scheduling of projects and estimating the amount of work required to get features to work. Still, the only way to improve is to try and adjust the estimations accordingly. I feel more confident around the Samba4 code now, thanks to Metze, Jelmer and Andrew's help. Of course thanks to all the other team members for the help and advice offered, on IRC and the mailing lists.
Last but not least I would like to thank Google in general and Leslie Hawthorn in particular for running the third Summer of Code program in an efficient manner, making this a really enjoyable experience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-6814028229812471855?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/6814028229812471855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=6814028229812471855' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6814028229812471855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/6814028229812471855'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2007/09/improving-samba4-winbind-look-back.html' title='Improving Samba4 winbind, a look back'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-4282712932775841254</id><published>2007-07-27T13:56:00.000+02:00</published><updated>2007-07-27T16:15:10.955+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><title type='text'>Having a Campus Party</title><content type='html'>¡Buenas tardes, compañeros!&lt;br /&gt;&lt;br /&gt;Spending all of this week in Valencia, Spain for Campus Party 2007, I'm having loads of fun hanging out with the other Summer of Code students and all the nice people from Google.&lt;br /&gt;&lt;br /&gt;I have tried hard to get some work done for my Summer of Code project this week, but it's rather hard to really concentrate when you're in a room with thousands of people playing computer games, having shouting competitions and generally a lot of noise. I wish I had noise-canceling earphones.&lt;br /&gt;Still, I'm currently working on some code that should make my life easier next week. Writing utility functions is lots of work, but usually worth it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XKRmYKVCXNk/Rqn8YnpqVqI/AAAAAAAAAAM/K79ZmLwyaGM/s1600-h/campus_party_talking.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_XKRmYKVCXNk/Rqn8YnpqVqI/AAAAAAAAAAM/K79ZmLwyaGM/s320/campus_party_talking.jpg" alt="" id="BLOGGER_PHOTO_ID_5091878353609840290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Yesterday, I had a fun time delivering my presentation about experiences with Google Summer of Code and tips how to get into Google Summer of Code in 2008. The small lecture room that Google uses for the talks and tutorials was pretty full, so I hope some of these people will actually get into Google Summer of Code next year.  I did not really get into details on my current and previous projects but rather talked about  personal experiences and strategies to get your proposal accepted.&lt;br /&gt;&lt;br /&gt;Apart from writing code for my SoC project, preparing and giving the talk, I'm having fun with the Googlers and SoCers, hanging out at the beach at 3 in the night, having nice food and generally enjoying myself. Sleep is a bit short, but there's always something.&lt;br /&gt;&lt;br /&gt;¡Hasta luego!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-4282712932775841254?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/4282712932775841254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=4282712932775841254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4282712932775841254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/4282712932775841254'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2007/07/having-campus-party.html' title='Having a Campus Party'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XKRmYKVCXNk/Rqn8YnpqVqI/AAAAAAAAAAM/K79ZmLwyaGM/s72-c/campus_party_talking.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-405422244557633109.post-1243886077276114698</id><published>2007-07-23T11:05:00.000+02:00</published><updated>2007-07-23T11:21:34.732+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><title type='text'>En route to Valencia</title><content type='html'>Finally on my way to &lt;a href="http://www.campus-party.org/"&gt;Campus Party 2007&lt;/a&gt;. I really need to get my talk for thursday done, hopefully I'll be able to finish it before my plane touches down in Valencia. (I'm currently waiting for my first flight to depart, not blogging from a plane.)

Originally I was planning to take care of my talk last weekend, but some nice virus decided that I'd rather spend all weekend in bed, sick. Oh well, this won't be the first just-in-time presentation. I'm just hoping my stomach will settle down a bit so I can actually enjoy all the nice Spanish food.

I'm looking forward to a nice week in Spain, even though I will have to spend my time working on my GSoC project, as well as my &lt;a href="http://www.linuxconf.eu/"&gt;LinuxConf.EU&lt;/a&gt; talk. I will be blogging from the event, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-1243886077276114698?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/1243886077276114698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=1243886077276114698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1243886077276114698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/1243886077276114698'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2007/07/tripping-to-valencia.html' title='En route to Valencia'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-7369174104476244034</id><published>2007-07-12T10:23:00.000+02:00</published><updated>2007-07-13T17:26:00.495+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wine'/><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><title type='text'>LinuxConf.EU</title><content type='html'>The talk I proposed for &lt;a href="http://www.linuxconf.eu/2007/"&gt;LinuxConf.EU&lt;/a&gt; was accepted, so I'm going to Cambridge early September. Unfortunately this means that I actually have to write the talk I proposed to give. Also, as I need to hand in my talk by 30th of July, I'll probably need to write it while I'm at Campus Party in Valencia.
Oh well. I'm looking forward to another nice conference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-7369174104476244034?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/7369174104476244034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=7369174104476244034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7369174104476244034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/7369174104476244034'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2007/07/linuxconfeu.html' title='LinuxConf.EU'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-849201670763776841</id><published>2007-07-04T07:37:00.000+02:00</published><updated>2007-07-04T07:55:17.024+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><title type='text'>Traveling to Spain</title><content type='html'>Google invited me and three other students to join them for the 2007 version of &lt;a href="http://web7.campus-party.org//index.php3"&gt;Campus Party&lt;/a&gt;. This means that I will travel to one of Spain's largest technology events to meet some other GSoCers and give a presentation about my GSoC project and my experience with GSoC in general. It looks like this is going to be lots of fun.
Time to go and work on my presentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-849201670763776841?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/849201670763776841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=849201670763776841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/849201670763776841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/849201670763776841'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2007/07/traveling-to-spain.html' title='Traveling to Spain'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-3836658748696628982</id><published>2007-06-30T10:06:00.000+02:00</published><updated>2007-07-09T10:57:34.593+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plunger'/><category scheme='http://www.blogger.com/atom/ns#' term='WorldForge'/><title type='text'>plunger moves to Google project hosting.</title><content type='html'>So far, plunger has existed in the WorldForge cvs tree out of convenience. However, as there are quite some people interested in plunger from outside the WorldForge project, I've decided to provide more infrastructure than what WorldForge has right now. This includes an issue tracker to allow people to more easily create bug reports and give feedback.

After spending some hours to move the code from cvs to google's svn, plunger now lives at &lt;a href="http://code.google.com/p/plunger/"&gt;http://code.google.com/p/plunger/
&lt;/a&gt;
Expect some changes while I sort out the infrastructure I want to have set up at the new site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-3836658748696628982?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/3836658748696628982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=3836658748696628982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/3836658748696628982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/3836658748696628982'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2007/06/plunger-moves-to-google-project-hosting.html' title='plunger moves to Google project hosting.'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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-405422244557633109.post-173130047597170549</id><published>2007-06-30T09:51:00.000+02:00</published><updated>2007-06-30T10:01:40.245+02:00</updated><title type='text'>Hello World</title><content type='html'>This being the traditional first program for any programming language, I think it's a fitting title for the first post to a development blog.

Now, what is this blog all about? I'm not a big fan of blogging in general, but I have to admit that they are a good way to provide news and status updates for projects. I'm developing for a couple of different projects and I'd like to have a single place to write about this, instead of having to go to a different blog site for each.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/405422244557633109-173130047597170549?l=kblin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kblin.blogspot.com/feeds/173130047597170549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=405422244557633109&amp;postID=173130047597170549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/173130047597170549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/405422244557633109/posts/default/173130047597170549'/><link rel='alternate' type='text/html' href='http://kblin.blogspot.com/2007/06/hello-world.html' title='Hello World'/><author><name>Kai</name><uri>http://www.blogger.com/profile/13606545162348261048</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>
