<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="/blog/templates/default/atom.css" type="text/css" ?>

<feed 
   xmlns="http://www.w3.org/2005/Atom"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <link href="http://shadowm.rewound.net/blog/feeds/atom.xml" rel="self" title="The Lair of the Shadow Master" type="application/atom+xml" />
    <link href="http://shadowm.rewound.net/blog/"                        rel="alternate"    title="The Lair of the Shadow Master" type="text/html" />
    <link href="http://shadowm.rewound.net/blog/rss.php?version=2.0"     rel="alternate"    title="The Lair of the Shadow Master" type="application/rss+xml" />
    <title type="html">The Lair of the Shadow Master</title>
    <subtitle type="html">Shadow Master's refuge and personal web log.</subtitle>
    <icon>http://shadowm.rewound.net/blog/templates/dorset3/img/s9y_banner_small.png</icon>
    <id>http://shadowm.rewound.net/blog/</id>
    <updated>2010-03-09T00:30:54Z</updated>
    <generator uri="http://www.s9y.org/" version="1.5.2">Serendipity 1.5.2 - http://www.s9y.org/</generator>
    <dc:language>en</dc:language>

    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/53-ATI-mayhem,-Part-IX.html" rel="alternate" title="ATI mayhem, Part IX" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-03-08T23:15:36Z</published>
        <updated>2010-03-09T00:30:54Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=53</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=53</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/1-Hardware" label="Hardware" term="Hardware" />
            <category scheme="http://shadowm.rewound.net/blog/categories/2-Software" label="Software" term="Software" />
    
        <id>http://shadowm.rewound.net/blog/archives/53-guid.html</id>
        <title type="html">ATI mayhem, Part IX</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>The <a href="http://shadowm.rewound.net/blog/archives/52-ATI-mayhem,-Part-VIII.html">last post</a> (minus the hard disk driver crash during preparation for S3 issue) turns out to be a rather embarrassing case of <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/DidNotDoTheResearch">not doing the research</a>, so I deserve a punch from a <tt>drm/radeon</tt> dev for that. <img src="/dorset3/img/smilies/wink.gif" alt=";)" style="display: inline; vertical-align: bottom;" class="emoticon" /></p>

<p>What I should've done if I were connected to the Internet at the time I decided to start to experiment with <acronym title="Kernel Mode-setting">KMS</acronym> again, is reading <a href="http://wiki.x.org/wiki/radeonBuildHowTo#Kernel-basedModeSetting.28short.3AKMS.29">the instructions from the X.org wiki</a> for properly setting up the drivers with KMS support. It wasn't as trivial as I had expected because of the missing firmware blobs I mentioned the last time.</p> <br /><a href="http://shadowm.rewound.net/blog/archives/53-ATI-mayhem,-Part-IX.html#extended">Continue reading "ATI mayhem, Part IX"</a>
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/52-ATI-mayhem,-Part-VIII.html" rel="alternate" title="ATI mayhem, Part VIII" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-03-08T19:27:42Z</published>
        <updated>2010-03-08T19:27:42Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=52</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=52</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/1-Hardware" label="Hardware" term="Hardware" />
            <category scheme="http://shadowm.rewound.net/blog/categories/2-Software" label="Software" term="Software" />
    
        <id>http://shadowm.rewound.net/blog/archives/52-guid.html</id>
        <title type="html">ATI mayhem, Part VIII</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>I was hoping to not have any more problems with Linux and my HP Pavilion dv5-1132la laptop since the last installment of this series of posts. However, with the release of Linux 2.6.33 and the improvements on <acronym title="Kernel Mode-setting">KMS</acronym> and general direct rendering support for the ATI R6xx and R7xx chipsets, I wanted to give KMS a try — this kernel version also improves support for some HDMI thing that I don't understand exactly what it is about, apparently related to digital audio devices or something.</p>

<p>(In other words, I shouldn't be complaining. Most of what comes in this post is the result of a voluntary experiment, and not some unfortunate incompatibility...probably.)</p>
 <br /><a href="http://shadowm.rewound.net/blog/archives/52-ATI-mayhem,-Part-VIII.html#extended">Continue reading "ATI mayhem, Part VIII"</a>
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/51-Wesnoth-TC-meets-gd.html" rel="alternate" title="Wesnoth-TC meets gd" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-03-07T22:39:16Z</published>
        <updated>2010-03-07T22:39:16Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=51</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=51</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/2-Software" label="Software" term="Software" />
            <category scheme="http://shadowm.rewound.net/blog/categories/5-Wesnoth" label="Wesnoth" term="Wesnoth" />
    
        <id>http://shadowm.rewound.net/blog/archives/51-guid.html</id>
        <title type="html">Wesnoth-TC meets gd</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p><a href="http://shadowm.rewound.net/blog/archives/50-libpngs-complexity,-Part-II.html">Since I'm fed up with libpng's complexity</a> (which borders on obscurity), I asked for recommendations on libraries for reading, editing and writing PNG files in <tt>#defocus</tt>, <a href="http://freenode.net/">freenode's</a> social channel. Someone mentioned <a href="http://www.libgd.org/">gd</a>, which I mostly knew for being a dependency of PHP-based software that deals with graphics, so I decided to give it a try.</p>

<p>It turns out to be incredibly easy to learn and use — I quickly started the <tt>gd_writer</tt> branch for the Wesnoth Team Colorizer tool and nuked hundreds of convoluted lines of libpng calls to replace them with short, concise and clean code.</p>

<p>However, I then noticed something in the (thorough and easy to read) documentation that spelled trouble for my usage:</p>

<blockquote>gd retains only 8 bits of resolution for each of the red, green and blue channels, and only 7 bits of resolution for the alpha channel. The former restriction affects only a handful of very rare 48-bit color and 16-bit grayscale PNG images. The second restriction affects all semitransparent PNG images, but the difference is essentially invisible to the eye. 7 bits of alpha channel resolution is, in practice, quite a lot.</blockquote>

<p>No justification is provided in the documentation as far as I could find. However, the main header file (<tt>gd.h</tt>, which is perfectly readable unlike libpng's <tt>png.h</tt>) has this precious missing bit explaining the reasoning here:</p>

<blockquote>If '<tt>truecolor</tt>' [<em>in a gdImage struct</em>] is set <tt>true</tt>, the image is truecolor; pixels are represented by integers, which must be 32 bits wide or more.<br />
<br />
True colors are repsented [<em>sic</em>] as follows:<br />
<br />
ARGB<br />
<br />
Where 'A' (alpha channel) occupies only the LOWER 7 BITS of the MSB. This very small loss of alpha channel resolution allows gd 2.x to keep backwards compatibility by allowing signed integers to be used to represent colors, and negative numbers to represent special cases, just as in gd 1.x.</blockquote>

<p>Ah, good old backwards compatibility, always biting the programmer in the ass after a while — Windows 9x being a major commercial example of backwards compatibility gone mad.</p>

<p>While I agree that the difference might not be noticeable for the human eye, this still means that <tt>wesnoth-tc/gd</tt> produces output that differs from the original images in more than just team colors. It'd be often silly to use team-colored semi-transparent in Wesnoth unit sprites, but team color and palette switches can, thanks to the flexibility of the image path functions mechanism, be applied on virtually any kind of image that SDL_image can read into a surface pixmap, including things such as transparent haloes for visual effects.</p>

<p>Experimenting with <tt>wesnoth-tc/gd</tt>, a linear sequence of pixels with these alpha channel values:</p>

<pre>255, 254, 253, 252, 251, 250, 249, 258 [...]</pre>

<p>...turns into this in the application's output:</p>

<pre>255, 255, 253, 253, 251, 251, 249, 249 [...]</pre>

<p>What happens here is that values below 0x7F — which is 127 in base 10 and 1111111 in base 2, and as you can see, the maximum positive integer that can be represented with 7 bits — can only be even, and values above are odd. There's no 0x7F.</p>

<p>I could just ignore this issue and merge the <tt>gd_writer</tt> branch, but no, I think I'll just try yet another library. It's a pity because this experiment had created the possibility of making a <em>web interface</em> for recoloring/team-coloring Wesnoth artwork, but I believe this kind of loss of information isn't any good for our purposes, even if it should be virtually unnoticeable at the standard 72x72 sprite scale. At least unit shadows shouldn't be affected by this limitation since their alpha value is supposed to be 153, which would remain unchanged under this scheme.</p>

<p>And so, Wesnoth-TC 1.5 stays in Development Hell for now, and the search for a simple enough libpng wrapper continues.</p>
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/50-libpngs-complexity,-Part-II.html" rel="alternate" title="libpng's complexity, Part II" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-03-06T02:37:17Z</published>
        <updated>2010-03-06T02:53:08Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=50</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=50</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/2-Software" label="Software" term="Software" />
            <category scheme="http://shadowm.rewound.net/blog/categories/5-Wesnoth" label="Wesnoth" term="Wesnoth" />
    
        <id>http://shadowm.rewound.net/blog/archives/50-guid.html</id>
        <title type="html">libpng's complexity, Part II</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>I've been working on cleaning up the code for <a href="/projects/wesnoth-tc.php">Wesnoth-TC's</a> PNG reader/writer functionality and so far I've only partially succeeded. I cleaned the code up, sure, but I also messed up somewhere and mixed up something breaking Wesnoth-TC.</p>

<p>The <tt>new_writer</tt> branch is already in the <a href="http://gitorious.org/wesnoth-tc">Git repository</a> but users will definitely want to use <tt>master</tt> instead. I haven't yet decided if <tt>new_writer</tt> will ever be merged back into <tt>master</tt> or I'll just throw it away.</p>

<p>But at this point I'm tempted to give up and try a different library for reading and writing PNG files — if I keep <a href="http://shadowm.rewound.net/blog/archives/23-libpngs-complexity.html">trying to understand</a> how to use libpng correctly (if that's even possible), Wesnoth-TC 1.5 will never be finished.</p> 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/49-Shocking.html" rel="alternate" title="Shocking" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-03-02T02:06:05Z</published>
        <updated>2010-03-02T02:06:05Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=49</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=49</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/7-Miscellaneous" label="Miscellaneous" term="Miscellaneous" />
            <category scheme="http://shadowm.rewound.net/blog/categories/6-Personal" label="Personal" term="Personal" />
    
        <id>http://shadowm.rewound.net/blog/archives/49-guid.html</id>
        <title type="html">Shocking</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>It's been almost 3 days since the <a href="http://shadowm.rewound.net/blog/archives/46-Earthquake-in-Chile.html">earthquake in Chile</a> which affected many regions of the central-south areas, including the region of Santiago. While things are <em>mostly</em> normal here — besides the many closed stores, the many damaged buildings, unusable highway infrastructure in some places, some fallen buildings, zones without electric power, unstable mobile phone networks and a bit more than 30 dead in the region, the disaster here pales in comparison to what can be seen following the coastal line to the south near the region of Maule and Bío-Bío. There's no way I could properly summarize what happened there, so you'd better use Google if you are curious. Many locations look like ruined, flooded, destroyed battlefields.</p>

<p>And yet, opportunists have pillaged around 16 supermarkets in our region so far; some succeeded, but most failed. There was not enough damage on this region to justify such vandalism. Naturally, Concepción and many other locations in the south are also being constantly vandalized, enough to justify passing the control of two regions over to the army to try to keep the order. They haven't completely succeeded, and the vandals have started fires, given false alarms of tsunamis and destroyed or damaged private and public property.</p>

<p>The <a href="http://shadowm.rewound.net/blog/archives/47-Stop-the-planet-Earth,-I-want-to-get-off!.html">aftershocks</a> have been scarce today and they've mostly faded out from our point of view in the Santiago region — that is to say, they haven't stopped in Maule and Bío-Bío and it doesn't let those people rest or sleep for much time. A few stronger aftershocks have reached us as well. Fortunately, they are not anything like the original earthquake.</p>

<p>However, they seem not to stop for me. I've been feeling dizzy since the moment I got out of the house during the earthquake and, no matter if I'm on my bed or sitting on a chair or on the toilet, everything feels the same as in the aftershocks, like a big boat on the sea that never stays still. It's very annoying but I still work on stuff and chat on IRC despite of this.</p>

<p>As sad as this is, and as grim as everything may seem, Santiago is <em>mostly</em> alright and we must move on and continue our lives and help however it is possible. But an earthquake with epicenter near our city isn't a terribly far-fetched possibility since we live next to several (relatively inactive) volcanoes, so let's not relax too much either.</p>
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/48-Subversion-blows.html" rel="alternate" title="Subversion blows" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-03-01T02:28:26Z</published>
        <updated>2010-03-03T23:51:54Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=48</wfw:comment>
    
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=48</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/2-Software" label="Software" term="Software" />
            <category scheme="http://shadowm.rewound.net/blog/categories/5-Wesnoth" label="Wesnoth" term="Wesnoth" />
    
        <id>http://shadowm.rewound.net/blog/archives/48-guid.html</id>
        <title type="html">Subversion blows</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>More than one year ago I commented on <a href="http://shadowm.rewound.net/blog/archives/2-Half-assed-commits.html">the consequences of interrupted commit transactions</a> with the <a href="http://en.wikipedia.org/wiki/Subversion_%28software%29">Subversion</a> version control system. Back then, SVN was the only VCS I was familiarized with, but nowadays I also have a basic grasp of <a href="http://en.wikipedia.org/wiki/Git_%28software%29">Git</a> for local and remote repository management.</p>

<p>The thing is, SVN is pretty simple and easy to learn for novice users — which is one of the reasons I haven't decided yet, as the founder admin of the <a href="http://wesnoth-umc-dev.sourceforge.net/">Wesnoth-UMC-Dev</a> Project, to switch to Git. A distributed version control system such as Git or Mercurial are not “better” than SVN, just like Linux cannot be “better” than Windows — they are completely different models for both users and site admins, and switching your version control system isn't as easy as switching from KDE to GNOME as your desktop environment or buying a new printer, especially when you have lots of users and the model conversion isn't easily reversible.</p>

<p>But let's not forget that there's more to SVN, or any other revision tracking system than just the philosophy and the model behind. There is an <a href="http://subversion.apache.org/">official client</a> which ships in major Linux distributions such as Debian GNU/Linux, Ubuntu and openSUSE, and which also has shared library code used by third-party GUI front-ends such as kdesvn, or other SVN clients such as the <a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html"><tt>git-svn</tt></a> infrastructure.</p>

<p>I have not seen the code, and I believe I do not want to see it with my eyes, but SVN's network code seems to be crap.</p>

<p>The issue mentioned in my second blog post remains the same after several versions of the vanilla SVN client. Then there are other issues that have been here for a long time, and an issue I only discovered some days ago:</p>

<ul>
    <li>It is possible in middle of a networked transaction (commit, update) for the Subversion client process to get stuck if a network error occurs. Subversion normally traps SIGTERMs (and apparently SIGHUPs and SIGINTs too) to perform cleanup routines after such interruptions. However, when it gets stuck, the SIGTERM handler becomes useless and the client ignores the signal forever. This means that SVN can get stuck and sit idle on the terminal (most likely waiting for data from the remote host) until it a SIGKILL is sent to force the destruction of its process. Since SIGHUPs are also trapped, killing the terminal leaves a hidden, waiting SVN process. In other words, you can get a dead SVN client running for months if your power source is stable enough. Wonderful.</li>
   <li>Clients that terminate abnormally (SIGKILL and such) may leave random crap hidden in your SVN checkout's control directories that are normally cleaned up by the SIGTERM handler. While this is often inoffensive and <tt>svn cleanup</tt> or <tt>svn cleanup ..</tt> can handle it all, there are times when this is not enough and SVN gets confused for missing/extra files or directory metadata and refuses to update or cleanup a path. In such cases, removing the path and its contents and re-checking it out with <tt>svn update</tt> (or, if it was the whole working dir, <tt>svn checkout</tt>) is necessary.</li>
   <li>There seems to be a lot of overhead in the SVN subprotocol on any transport class, be it http, https, svn or svn+ssh. Commits containing simple changes to file/dir object properties can take as long as a regular commit diff when they should probably contain less data (if they contain as much data, then...?!). This is very noticeable on low-bandwidth connections for me. In comparison, a SVN commit of about 20 property changes can take longer than a Git push through SSH of about 10 large commits introducing whole new files.</li>
</ul>

<p>Then there are some odd things with the SVN client library (<tt>libsvn</tt>), specifically the Perl bindings, namely <a href="http://shadowm.rewound.net/blog/archives/44-Rewriting-the-past,-and-the-woes-of-SVN.html">the issues I mentioned at the start of this month</a>, that leave me very disappointed at this version control system, rumored to be better than CVS (which I haven't ever used...imagine!). The Debian version in Squeeze, and possibly Lenny or upstream too, has a really <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=520963">nasty bug</a> which caused a massive memory leak with Wesnoth-UMC-Dev's <a href="http://wesnoth-umc-dev.svn.sourceforge.net/viewvc/wesnoth-umc-dev/branches/maintenance-toolchain/umcpropfix?view=markup"><tt>umcpropfix</tt></a> tool when I ran it to set properties on a version of Extended Era for Wesnoth, manipulating over 1300 files on multiple dirs. The parent Perl interpreter process allocated over 2 GB of overall virtual memory, making Linux page most memory out to swap, thus hurting performance.</p>

<p>The cause? Pool management. <tt>libsvn</tt>'s Perl bindings are supposed to do automatic memory management unless the client wants to do their own pool management with the library's facilities, but that somehow causes the aforementioned leak instead. The solution turns out to be doing custom pool management by allocating a new pool for every <tt>libsvn</tt> call, and forgetting the old one. <a href="http://wesnoth-umc-dev.svn.sourceforge.net/viewvc/wesnoth-umc-dev/branches/maintenance-toolchain/umcpropfix?revision=6567&amp;view=markup">r6567</a> in the Wesnoth-UMC-Dev repository applies this workaround for our SVN property setting tool.</p>

<p>Honestly, I'm tired of SVN. I use <tt>git-svn</tt> wherever I can but this isn't a magic solution for the crappy design of SVN's innards. <tt>git-svn</tt> can skip upstream commits if the connection interrupts during a fetch operation, and it forgets about local commits during pushes (<tt>git svn dcommit</tt>) after it has sent the first commit and fetched missing ones, which can cause loss of commits and history if the connection to the remote host breaks at that point or git-svn exits in any other fashion.</p>

<p><tt>git-svn</tt> doesn't replace SVN's network code either (it uses it instead), so it's still subject to the perceived overhead, but at least it doesn't get stuck forever ignoring SIGTERMs.</p>

<p>What Wesnoth-UMC-Dev needs at the moment is a distributed (yes) version control system that's <span class="strike">as</span> more user-friendly <span class="strike">as</span> than SVN and has a nice, well documented Windows front-end that's easy to setup, learn and understand. If we can't find that, I'll continue complaining about SVN at any time and on every place where I see fit, here or in IRC.</p> 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/47-Stop-the-planet-Earth,-I-want-to-get-off!.html" rel="alternate" title="Stop the planet Earth, I want to get off!" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-02-28T16:55:37Z</published>
        <updated>2010-02-28T18:21:25Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=47</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=47</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/7-Miscellaneous" label="Miscellaneous" term="Miscellaneous" />
            <category scheme="http://shadowm.rewound.net/blog/categories/6-Personal" label="Personal" term="Personal" />
    
        <id>http://shadowm.rewound.net/blog/archives/47-guid.html</id>
        <title type="html">Stop the planet Earth, I want to get off!</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>The Wi-Fi WLAN router I use for connecting to the Internet stopped working last night (that dreaded “No route to host”). It's back now, but I'd have liked to post an update yesterday. Anyway, no news is good news, no? Er, well, assuming that the communication systems work, that is...which sadly seems not to be the case for the location of the epicenter, Cobquecura.</p>

<p>It's been more than 30 hours after the <a href="http://shadowm.rewound.net/blog/archives/46-Earthquake-in-Chile.html">earthquake</a> that caught me in the bathroom some minutes after 3:30 am yesterday. The aftershocks, while generally small, continue every 5-90 minutes, and at this point it just feels like one long ride on a bus through a badly deteriorated road — and it's getting fucking annoying.</p>

<p>I'd said that we were okay before. First I was scared when all this happened, and then I was sad after the news. Next, I was worried about the aftershocks. Now I'm just annoyed. Really annoyed.</p>

<p>Nonetheless, I'm not letting an earthquake and a never-ending sequence of aftershocks stop me. There's some <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/IncrediblyLamePun">groundbreaking</a> work going on here — which you can't see, but I can, and I must say it looks really nice.</p>

<p>Now, could we just stop this madness and allow the rescue groups do something in the most affected locations near the epicenter without having the ruins of the buildings shaken every few minutes by a whimsical force of nature? That's not nice, really. Not nice at all. And you've got our dogs and cats panicking for <span class="strike">too many hours</span> a day and a half already. Stop it! I mean it!</p>
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/46-Earthquake-in-Chile.html" rel="alternate" title="Earthquake in Chile" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-02-27T22:41:44Z</published>
        <updated>2010-03-10T03:20:49Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=46</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=46</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/7-Miscellaneous" label="Miscellaneous" term="Miscellaneous" />
            <category scheme="http://shadowm.rewound.net/blog/categories/6-Personal" label="Personal" term="Personal" />
    
        <id>http://shadowm.rewound.net/blog/archives/46-guid.html</id>
        <title type="html">Earthquake in Chile</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>As you probably know (if not, Google “earthquake in Chile”), Chile's been struck by an earthquake approx. 8.8 in the Richter scale in the region near Concepción. I live in Santiago, and we have also been affected by this unfortunate event.</p>

<p>(Following comes from this <a href="http://forums.wesnoth.org/viewtopic.php?p=412419#p412419">Wesnoth.org forum post</a>)</p>

<p>I am OK right now, but I got trapped in the house during the earthquake (I was in the bathroom and some _really_ heavy objects were in the way to the kitchen, which is the closest way to exit from my bedroom) and thought I wouldn't be able to get out in time. I did (about right at the end of the earthquake, not knowing at the moment if its intensity would continue increasing...), but we are not sure whether the house deteriorated further* or not and do not really believe it'd resist a real earthquake with epicenter near Santiago.</p>

<p>There's a good distance between Concepción and Santiago, so it was about 7 in the Richter scale in Santiago according to the authorities last time I checked — about 10 am via FM radio on the car, we didn't have electricity, tap water or Internet at all until around 2 pm and I fell asleep around 1:16 pm after being unable to sleep the whole night with the strong and continuous tremors that followed. I originally posted this around 6:40 pm.</p>

<p>While everything's fine for us here right now, sadly, other areas of this same region didn't have this luck. Including areas where some of our family lives.</p>

<p>Naturally, everything to the south is chaos according to the news and there are still isolated people in coastal areas closer to the epicenter.</p>

<p>* (To elaborate, this wood house was built on 2000-2001. However, we know that the concrete floor structure wasn't properly finished or secured, there are cracks everywhere that have appeared over time since we moved here; heck, I've even seen grass grow in the middle of my bedroom in 2002. The wood structure of the second floor isn't finished and there are heavy materials left above since a few days ago that made me worry that the house would fall on me when I was walking into the approximate center of gravity in middle of the earthquake, hearing them dancing on the floor (huh) above. All the animals are nervous after the earthquake but everyone's okay and I'm thankful for that.)</p>

<p>***</p>

<p>There are still tremors as of this writing. There was a small one which cut the power lines for 1 second some minutes ago, followed by a stronger one with lots of underground noise. The movement pattern continues being the same as the original earthquake. Internet is flaky.</p>

<p><span class="strike">If anyone's really interested in speaking to me, I've temporarily opened ##shadowm on irc.freenode.net.</span></p> 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/45-Dorset3.html" rel="alternate" title="Dorset3" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-02-27T04:02:58Z</published>
        <updated>2010-03-03T20:43:44Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=45</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=45</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/7-Miscellaneous" label="Miscellaneous" term="Miscellaneous" />
            <category scheme="http://shadowm.rewound.net/blog/categories/6-Personal" label="Personal" term="Personal" />
            <category scheme="http://shadowm.rewound.net/blog/categories/9-Web-design" label="Web design" term="Web design" />
    
        <id>http://shadowm.rewound.net/blog/archives/45-guid.html</id>
        <title type="html">Dorset3</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Almost two months after the completion of the “Dorset2” template, the website's appearance has changed again! This time it's “Dorset3”, with soft borders and shadows!</p>

<p>A couple of screenshots for comparison:</p>

<ul>
    <li><a href="http://i144.photobucket.com/albums/r176/shadowm2006/screenshots/dorset2r1.png">Dorset2 r1</a></li>
    <li><a href="http://i144.photobucket.com/albums/r176/shadowm2006/screenshots/dorset3.png">Dorset3</a></li>
</ul>

<p>There's not much new besides the aforementioned (or is there?). IE 6 support was surprisingly easier to provide this time — except for a few template glitches in the blog which I haven't yet solved. Anyway, it's 2010 and you don't really want to use a 8-years old browser, do you? <img src="/dorset3/img/smilies/smile.gif" alt=":)" style="display: inline; vertical-align: bottom;" class="emoticon" /></p>
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/44-Rewriting-the-past,-and-the-woes-of-SVN.html" rel="alternate" title="Rewriting the past, and the woes of SVN" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-02-10T20:50:21Z</published>
        <updated>2010-02-10T20:50:21Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=44</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=44</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/2-Software" label="Software" term="Software" />
            <category scheme="http://shadowm.rewound.net/blog/categories/5-Wesnoth" label="Wesnoth" term="Wesnoth" />
    
        <id>http://shadowm.rewound.net/blog/archives/44-guid.html</id>
        <title type="html">Rewriting the past, and the woes of SVN</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Long ago, I wrote a little Bash script — <tt>set-properties</tt> — for the Wesnoth-<acronym title="User Made Content">UMC</acronym>-Dev project, to ensure the correctness of <abbr title="Subversion, a version control system">SVN</abbr> properties such as <tt>svn:keywords</tt> and <tt>svn:executable</tt> on files. It was pretty simple:</p>

<pre>#! /bin/sh

# Set properties on PNG files
for f in $(find -iname *.png); do
    svn propdel svn:executable $f
    svn propset svn:mime-type image/png $f
done

# Set properties on Ogg files
for f in $(find -iname *.ogg); do
    svn propdel svn:executable $f
    svn propset svn:mime-type audio/x-vorbis
done

# Set properties on PCM files
for f in $(find -iname *.wav); do
    svn propdel svn:executable $f
    svn propset svn:mime-type audio/x-wav
done

# Set properties on JPEG files
for f in $(find -iname *.jpg); do
    svn propdel svn:executable $f
    svn propset svn:mime-type image/jpeg $f
done
for f in $(find -iname *.jpe); do
    svn propdel svn:executable $f
    svn propset svn:mime-type image/jpeg $f
done
for f in $(find -iname *.jpeg); do
    svn propdel svn:executable $f
    svn propset svn:mime-type image/jpeg $f
done

# Set properties on CFG file
for f in $(find -iname *.cfg); do
    svn propdel svn:executable $f
done

# Set properties on scripts
for f in $(find -iname *.sh); do
    svn propset svn:executable '*' $f
done
for f in $(find -iname *.cmd); do
    svn propset svn:executable '*' $f
done
for f in $(find -iname *.bat); do
    svn propset svn:executable '*' $f
done
for f in $(find -iname *.py); do
    svn propset svn:executable '*' $f
done
</pre>

<p>Some time after I learned Perl with my work on <a href="/projects/shikadibot.php">Shikadibot 0314</a>, I rewrote that script in Perl to arrange the “ideal” property values in a neat table (hash), check current properties instead of blindly overwriting them in the working copy, and cover plenty of other file types. It also gained a blinking progress bar to display the search progress for some reason.</p>

<p>To have an idea of how known file types are defined in the source, let's take a look at these bits:</p>

<pre>#
# proptab:
#   extension => [svn:executable, svn:mime-type, svn:eol-style, svn:keywords]
#   properties set to the empty string '' (except svn:executable) are left unchanged;
#
my %proptab = (
    cfg     => [FALSE, '', 'native', ''],
    ign     => [FALSE, '', 'native', ''],
   "map"    => [FALSE, '', 'native', ''],
# [...]
    pl      => [TRUE,  '', 'native', 'Author Date Id Revision'],
# [...]
    gif     => [FALSE, 'image/gif', '', ''],
    png     => [FALSE, 'image/png', '', ''],
# [...]
    xcf     => [FALSE, '', '', ''],
# [...]
);
</pre>

<p>The table we have used since then (around Sept. 2008) has always contained more than 10 extensions with their minimum required property sets. As of this writing, it covers approximately 57 file types. Keep this on mind.</p>

<p>It would be <em>overkill</em> to fork-exec <tt>find</tt> processes to discover paths that could require SVN property changes, right? So, instead, I used <tt>find2perl</tt> to generate <tt>File::Find</tt> client code to embed it into <tt>set-properties</tt>. So far, so good. But how about running that code <code>(scalar keys %proptab)</code> times (e.g. number-of-extensions-times) anyway? Overkill?</p>

<p>No! It's plain stupid. But definitely less stupid than what you are about to read.</p>

<p>I apparently decided, for some reason, that any matching paths in each cycle should be added to a plain scalar (a text string to be exact) separating individual paths with <em>newlines</em>, of all things. Then, another cycle is performed at the end, <code>(scalar keys %proptab)</code> times again, <strong>to put each array of paths matching a certain extension</strong> into another <strong>hash</strong>, then iterating over the newly inserted hash element (array of paths) checking and fixing SVN properties <strong>in the same cycle</strong>.</p>

<p><strong>Very roughly</strong> summarized as the following pseudocode:</p>

<pre class="noframe">FOREACH extension FROM file_extensions
    FIND IN ./ AS file
        ; all while displaying a cute blinking bar!
        IF file MATCHES extension
            APPEND file TO file_list_string
        END IF
    END FIND
END FOREACH

FOREACH extension FROM file_extensions
    ; split 'file_list_string' every newline
    FOREACH path FROM (SPLIT /\n/ file_list_string)
        INSERT path IN file_index[extension]
    END FOREACH

    FOREACH path FROM file_index[extension]
        fix_properties( extension, path )
    END FOREACH
END FOREACH
</pre>

<p>Careful readers will quickly realize that something is horribly wrong with this pseudocode. I wish I was making it up. This algorithm has actually been in use by the Wesnoth-UMC-Dev <tt>set-properties</tt> script for <strong>one year and 4 months</strong>! I must have been on <strong>something</strong> when I wrote this shit. I've honestly <strong>never</strong> seen any program so awful as this in my life. Not even <tt>build-external-archive.sh</tt> (a.k.a. “Scrappy”) can compete with this abomination.</p>

<p>So, yesterday, I took a look at <tt>set-properties</tt> after noticing how much CPU time it ate working with very scarcely populated directories of the project — and I was blaming the usage of backticks (<code>`svn propset foo bar baz`</code> and such) as a possible cause of overhead. Then I slowly realized what I had written. There isn't any emoticon here for the expression in my face at that moment.</p>

<p>Thusly, <tt>set-properties</tt> got rewritten with a much cleaner and simpler algorithm:</p>

<pre class="noframe">FOREACH file FROM (FIND IN ./)
    ; no more useless cute blinking bar!
    FOREACH extension FROM file_extensions
        IF file MATCHES extension
            fix_properties( extension, path )
        END IF
    END FOREACH
END FOREACH
</pre>

<p>So yeah. <img src="/dorset3/img/smilies/sad.gif" alt=":(" style="display: inline; vertical-align: bottom;" class="emoticon" /></p>

<p><a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/ButWaitTheresMore">But wait, there's more!</a> While <span class="strike">optimizing</span> replacing the script I also replaced <code>`svn foobar`</code> backtick code with invocations of <tt>libsvn</tt>, via the <tt>SVN::Client</tt> module. This worked very well at the end, but I discovered a few things in the process:</p>

<ul>
    <li>Those <tt>SVN::Client</tt> methods I used choke on non-absolute path specifications for some reason, causing an assertion failure in <tt>libsvn</tt>'s C back-end and terminating the execution of Perl and the script with a SIGABRT.</li>
    <li>Despite the documentation's claims for <tt>SVN::Client::url_from_path()</tt> returning <tt>undef</tt> if the specified path is not under version control, it actually causes the module to invoke <tt>die</tt> and get the client script terminated. Which means that I cannot even check if a file is versioned or not safely (e.g. without resorting to <tt>.svn/text-base/FileName.svn-base</tt> existence checks). What the hell?</li>
</ul>

<pre>$ set-properties
perl: /tmp/buildd/subversion-1.6.9dfsg/subversion/libsvn_subr/path.c:114: svn_path_join: Assertion `svn_path_is_canonical(base, pool)' failed.
Aborted
</pre>

<p>Turns out the solution is to wrap <tt>SVN::Client</tt> method calls in <tt>eval</tt> blocks and handle whatever crap SVN comes up with. Oh, and make sure all paths are absolute using <tt>Cwd::realpath</tt> so that <tt>libsvn</tt> doesn't hit an assertion failure killing us, <tt>eval</tt> or no <tt>eval</tt>. How nice.</p>

<pre># No point in working with unversioned files.
my $svn_ret = undef;
eval { $svn_ret = $svn->url_from_path($path) };
if($@) {
    # fucking libsvn dies if $path isn't under version control;
    # the documentation says it should return undef above instead!
    return;
}
</pre>

<p>With this, I have absolutely lost my faith in Subversion's excellence as a version control system not only as a normal user, but also as a programmer integrating it into my own client applications. And I know I lost my faith as a user after seeing <tt>svn</tt> sit for <strong>two days</strong> doing <em>fucking nothing</em> because the damned connection <strong>died after 1 minute of running time</strong> — and then <tt>svn</tt> spent the next days ignoring SIGTERMs all the time, no less. It's been like this for so many versions that I'm almost convinced it's intentional.</p>

<p>(Ah, that was relaxing. I should do this more often.)</p>

<p>Wesnoth-UMC-Dev has to continue using SVN because we have several add-on authors using Windows and the few alternatives for using <tt>git</tt> (I love <tt>git</tt>, I don't think I could try anything else at the moment) on Windows seem to be rather awkward to install and/or use for the average Nonc O'mputer Person. That's a pity. It's really a pity.</p>

<p>Finally, <tt>set-properties</tt> got renamed to <tt>umcpropfix</tt> for a change, to mark its rebirth after I solved the algorithmic mess above last night. It doesn't have a nifty codename like the rest, though, but the new <tt>umc</tt>-prefixed name is still something to be celebrated now that we are going to have <tt>umcdist</tt>, <tt>umcstat</tt>, <tt>umcreg</tt> and <tt>umcbotd</tt>. Yes, I know I'm crazy, thank you.</p> 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/43-Throwaway-code.html" rel="alternate" title="Throwaway code" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-02-09T02:03:09Z</published>
        <updated>2010-02-10T00:59:14Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=43</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=43</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/6-Personal" label="Personal" term="Personal" />
            <category scheme="http://shadowm.rewound.net/blog/categories/2-Software" label="Software" term="Software" />
            <category scheme="http://shadowm.rewound.net/blog/categories/5-Wesnoth" label="Wesnoth" term="Wesnoth" />
    
        <id>http://shadowm.rewound.net/blog/archives/43-guid.html</id>
        <title type="html">Throwaway code</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>It has become increasingly common for me to come up with a program for an amazing task one day, to rewrite it the next day.</p>

<p><tt>umcdist</tt>, the Wesnoth-UMC-Dev Distribution Tool, has been in development hell for a year mostly for this reason; the other reason is that it seems like it will perform worse than <tt>build-external-archive.sh</tt> a.k.a. “Scrappy” due to an excessive usage of Perl's <code>system</code> function. I cannot make up my mind and choose between performance and maintainability; Espreon knows that <tt>build-external-archive.sh</tt> is broken, but I can't be bothered to try to understand that <span class="strike">awful piece of Bash</span> <strong>unholy abomination</strong> again to fix it.</p>

<p>Meanwhile, <tt>umcstat</tt> (Wesnoth-UMC-Dev Statistics Service) is still a work in progress, but with more emphasis in <em>progress</em>; there's actual code written already, and I've been using <a href="http://freenode.net/">freenode's</a> <a href="http://dev.freenode.net/eir">Eir</a> bot framework to test it.</p>

<p>While Eir could possibly be a nice way to get rid of <tt>umcreg</tt>'s <tt>Net::IRC</tt> dependency and code, it's actually a C++ program that can be compiled only with GCC 4.4 at minimum, due to at least one C++0x feature used throughout the code: <tt>auto</tt>. The target machine runs Debian lenny, unlike my laptop (Squeeze), and therefore doesn't have GCC 4.4!</p>

<p>Instead of sticking with Eir, I'm refactoring <tt>umcreg</tt>'s IRC code into a custom Perl-only framework, <tt>umcbotd</tt>, and <span class="strike">making creative use of <code>eval</code></span> writing an abomination code-named “Naia”, which I'm rewriting again because the first version I wrote, which worked, was very badly designed and ugly. I know it's a problem when I have three classes or modules all depending upon each other's <em>internals</em>.</p>

<p>The goal of <tt>umcbotd</tt>/<tt>Naia</tt> is producing a <tt>Net::IRC</tt>-based abstraction layer for our bots that treats them as “services” with multiple “modules” (not in the Perl sense, though) that can be easily inserted and removed from the system by adding/removing their files. <tt>umcreg</tt> already runs with a prototype implementation of this mechanism, but it needs to be generalized further before it can be usable with <tt>Naia</tt>.</p>

<p>Writing our bots could be this simple, if <tt>Naia</tt> gets completed:</p>

<pre>#!/bin/true
CO_SERVICE_COMPONENT('umcreg');

sub ctcp_version_reply () { "Wesnoth-UMC-Dev Registry Service, using " . Naia::version_string() }

sub eh_ctcp_version
{
    my ($self, $event) = @_;
    $self->ctcp_reply($event->nick, 'VERSION ' . ctcp_version_reply());
}

# ...

my $bot = Naia::get_bot('umcreg');
my %eh = (
    'cversion'      => \&amp;eh_ctcp_version,
    'msg'           => \&amp;eh_msg_private,
    '330'           => \&amp;eh_whoisloggedin,
    '318'           => \&amp;eh_endofwhois,
    '331'           => \&amp;eh_notopic,
    '332'           => \&amp;eh_topic,
    '403'           => \&amp;eh_nosuchchannel,
);

$bot->connect();
$bot->register_event_handlers(%eh);
</pre>

<p>And their modules would be like this, more or less the same as <tt>umcreg</tt>'s modules already are:</p>

<pre>#!/bin/true
# token, subroutine, privilege level (A: admin, H: half-admin, U: user)
CO_MODULE('RAW', \&amp;co_raw, 'A');

sub co_raw
{
    my ($parent, $nick, $hostmask, $svaname) = (shift, shift, shift, shift);

    if(!@_) {
        $parent->notice($nick, "Not enough arguments for \002RAW\002.");
        return;
    }

    $parent->sl(join(' ', @_));

    broadcast_to_log("RAW [$hostmask]");
}
</pre>

<p>... And of course it would still involve lots of ugly stuff under the hood (<code>eval</code> magic), but if done right I shouldn't have to touch it whenever I wanted to add or remove a feature from any of our two services.</p>
 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://shadowm.rewound.net/blog/archives/42-umcreg.html" rel="alternate" title="umcreg" />
        <author>
            <name>shadowmaster</name>
                    </author>
    
        <published>2010-01-30T19:54:40Z</published>
        <updated>2010-01-30T19:54:40Z</updated>
        <wfw:comment>http://shadowm.rewound.net/blog/wfwcomment.php?cid=42</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://shadowm.rewound.net/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=42</wfw:commentRss>
    
            <category scheme="http://shadowm.rewound.net/blog/categories/2-Software" label="Software" term="Software" />
            <category scheme="http://shadowm.rewound.net/blog/categories/9-Web-design" label="Web design" term="Web design" />
            <category scheme="http://shadowm.rewound.net/blog/categories/5-Wesnoth" label="Wesnoth" term="Wesnoth" />
    
        <id>http://shadowm.rewound.net/blog/archives/42-guid.html</id>
        <title type="html">umcreg</title>
        <content type="xhtml" xml:base="http://shadowm.rewound.net/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>At last, <tt>umcreg</tt>, <a href="http://wesnoth-umc-dev.sourceforge.net/">Wesnoth-<acronym title="User Made Content">UMC</acronym>-Dev's</a> Registry Service, is finished, deployed and <a href="http://forums.wesnoth.org/viewtopic.php?p=406537#p406537">announced</a> in the forums, thus completing the first part of introducing the <a href="http://shadowm.rewound.net/blog/archives/40-Robots!.html">Registry</a> system to the project.</p>

<p>There were some changes from its original incarnation, but everything turned out pretty well for a bot written from scratch in approximately 6 days by a Perl fanatic with no knowledge of object-oriented Perl — I actually learned some object-oriented Perl while at this and I feel like I can do anything with it now. <img src="/dorset3/img/smilies/biggrin.gif" alt=":D" style="display: inline; vertical-align: bottom;" class="emoticon" /></p>

<p>I was in a hurry to get this done right before <a href="http://freenode.net/">freenode</a> deployed <a href="http://blog.freenode.net/2010/01/migration-to-new-ircd/">ircd-seven</a> today (yays!), for no particular reason; this resulted in a security feature not working with hyperion-ircd until I introduced a quickie hack that I'll be retiring later today.</p>

<p>We are using a private git repository for managing the source code, but since I wrote it with an open-source licensing model in mind as usual, here's <tt>umcreg</tt> version 0.1.1 for the curious, released under the terms of the GNU GPL version 3.</p>

<ul>
  <li><a href="/src/umcreg-0.1.1.tar.gz">umcreg 0.1.1</a> (gzip tarball, 35.7 KiB; MD5 sum: <tt>7877c82082d42c45d45f68647c223459</tt>)</li>
</ul>

<p>I have already registered our current members using some basic, known information about them — even including their join date. Old projects' registration will be a little slow as I need to research the current structure of the repository, of which I lost track a year ago, and retrieve original timestamps. The registry's web interface, provided by the <tt>umcreg::Web</tt> and <tt>Thoria::Web</tt> packages, can be found <a href="http://wesnoth-umc-dev.sourceforge.net/umcreg/">here</a>.</p>

<p><tt>umcreg</tt> is already working at the project's admin channel on freenode too. It only obeys the project staff's orders, though, so there's no point in trying to send messages to it.</p>

<p>The next step in implementing the Registry model is writing the Statistics service, codenamed “Listra”, and most likely going to be named <tt>umcstat</tt>. That will definitively take much longer than <tt>umcreg</tt>'s development. Meanwhile, Espreon is trying to convince me to take care of <tt>umcdist</tt> (codename “Blackmore”) first.</p>
 
            </div>
        </content>
        
    </entry>

</feed>