<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>nomeata’s mind shares</title>
    <link>https://www.joachim-breitner.de/blog/</link>
    <description>Joachim Breitners Denkblogade</description>
    <dc:language>en</dc:language>
    <admin:errorReportsTo rdf:resource="mailto:mail@joachim-breitner.de" />
    <generator>Serendipity 1.5 - http://www.s9y.org/</generator>
    
    <image>
        <url>http://joachim-breitner.de/avatars/avatar_128.png</url>
        <title>RSS: nomeata’s mind shares - Joachim Breitners Denkblogade</title>
        <link>https://www.joachim-breitner.de/blog/</link>
        <width>128</width>
        <height>128</height>
    </image>

<item>
    <title>ipatch on hackage</title>
    <link>https://www.joachim-breitner.de/blog/archives/435-ipatch-on-hackage.html</link>
            <category>Darcs</category>
            <category>Haskell</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/435-ipatch-on-hackage.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=435</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=435</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;With the &lt;a href=&quot;http://hackage.haskell.org/package/darcs-beta-2.4.98.3&quot;&gt;Beta 3 release of Darcs 2.5&lt;/a&gt; on &lt;a href=&quot;http://hackage.haskell.org/&quot;&gt;Hackage&lt;/a&gt; (the Haskell library and program repository), &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/425-ipatch,-the-interactive-patch-editor.html&quot;&gt;the ipatch program I recently introduced&lt;/a&gt; could now be uploaded to hackage, too. If you use &lt;a href=&quot;http://haskell.org/cabal/download.html&quot;&gt;&lt;tt&gt;cabal-install&lt;/tt&gt;&lt;/a&gt;, you can now install and use it with a simple run of &amp;quot;&lt;tt&gt;cabal install ipatch&lt;/tt&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;I also made the program now handle patches that add or remove files, extended the help texts a bit and added a test suite. This means that you can actually make use of ipatch as of now, to split patches into several small patches and to apply a patch interactively. Of course it needs some more testing, and you might have feature wishes – in either case, let me know.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 22 Aug 2010 21:05:13 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/435-guid.html</guid>
    
</item>
<item>
    <title>ipatch, the interactive patch editor</title>
    <link>https://www.joachim-breitner.de/blog/archives/425-ipatch,-the-interactive-patch-editor.html</link>
            <category>Darcs</category>
            <category>English</category>
            <category>Haskell</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/425-ipatch,-the-interactive-patch-editor.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=425</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=425</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;h3&gt;The problem: Splitting patches&lt;/h3&gt; 
&lt;p&gt;As a Debian maintainer, I often work with patches (files listing changes to text files), for example when tracking the modification I make to some software before I upload the&amp;#160; package to Debian. To manage these patches, &lt;a href=&quot;https://savannah.nongnu.org/projects/quilt&quot;&gt;quilt&lt;/a&gt; is a nice tool: It helps you maintain a stack of patches on top of the original code and encourages you to keep your variously modifications separate.&lt;/p&gt; 
&lt;p&gt;One use case is not supported by quilt at all: Splitting patches. One often has a large patch containing several independent changes. This might happen after you fix a few problems in the upstream code and then run &lt;tt&gt;dpkg-buildpackage&lt;/tt&gt;, which will create one patch of your changes and put it in &lt;tt&gt;debian/patches&lt;/tt&gt;. Before, I had to manually edit the patch and write the hunks, which are the building blocks of patches, into separate file.&lt;/p&gt; 
&lt;h3&gt;Where it already works&lt;/h3&gt; 
&lt;p&gt;There is no such problem when using a version control system, such as &lt;a href=&quot;http://darcs.net/&quot;&gt;Darcs&lt;/a&gt;. Especially Darcs is rightly famous for its user-friendly interface and powerful hunk-selection features. You can even split a single hunk (which could be a change to one line) into two separate steps! Have a look at the &lt;a href=&quot;http://wiki.darcs.net/HunkEditor&quot;&gt;HunkEditor&lt;/a&gt; page on the Darcs wiki to see how that works. &lt;br /&gt;&lt;/p&gt; 
&lt;h3&gt;Let’s steal a feature&lt;/h3&gt; 
&lt;p&gt;Well, it is not stealing if it is Free Software... Darcs has these nice capabilities and provides them in the context of version control systems, while we need them in the context of patch files. But Darcs is providing an API to its code, so shoudn’t it be possible to create a program that uses the Darcs code to split patch files? As a matter of fact, it is possible: You can see that program in action on this &lt;a href=&quot;http://www.joachim-breitner.de.nyud.net/various/ipatch-demo.ogv&quot;&gt;3min Ogg Theora-Video&lt;/a&gt; or directly here if your browser supports HTML5:&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; &lt;video width=&quot;704&quot; height=&quot;448&quot; src=&quot;http://www.joachim-breitner.de.nyud.net/various/ipatch-demo.ogv&quot; controls=&quot;true&quot; tabindex=&quot;0&quot;&gt;Looks like your browser does not support HTML5&lt;/video&gt;&lt;/div&gt; 
&lt;h3&gt;Nice, can I use it?&lt;/h3&gt; 
&lt;p&gt;The code is a working proof of concept. What you see works. You do not see how it handles patches that create or delete files, patches that do not apply cleanly or are already applied or any kind of error handling. That does not work yet. If you still want to try it, you can grab the code from the Darcs repository at &lt;a href=&quot;http://darcs.nomeata.de/ipatch&quot;&gt;http://darcs.nomeata.de/ipatch&lt;/a&gt;, but you need to build the latest development state of the Darcs library first.&lt;/p&gt; 
&lt;p&gt;I think ipatch could become a very useful and powerful tool with applications in areas where nobody would think of using Darcs. I definitely want some integration into quilt, replacing the splitted patch in the series by the replacing patches automatically. Maybe even a git plugin could be created? But I don’t think I can push this project far enough on my own. So this is an invitation to join me and make ipatch a great tool. This invitation goes especially to the Darcs developers: Please have a look how the code uses the Darcs API and help to improve the collaboration here. I think we can use the &lt;a href=&quot;http://lists.osuosl.org/mailman/listinfo/darcs-users&quot;&gt;darcs-users&lt;/a&gt; mailing list until there is need for a dedicated mailing list.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 03 Aug 2010 22:42:17 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/425-guid.html</guid>
    
</item>
<item>
    <title>Protecting static content selectively by OpenID</title>
    <link>https://www.joachim-breitner.de/blog/archives/421-Protecting-static-content-selectively-by-OpenID.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/421-Protecting-static-content-selectively-by-OpenID.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=421</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=421</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;When I created my &lt;a href=&quot;http://www.joachim-breitner.de/bilder/years/&quot;&gt;on-line photo album&lt;/a&gt;, we had the year 2001 and there was nothing wrong with publishing ones photos in the Internet. It has been almost ten years now, and things have changed. Privacy is an issue, especially when it also affects your friends and family.&lt;/p&gt; 
&lt;h3&gt;The problem &lt;br /&gt;&lt;/h3&gt; 
&lt;p&gt;So I needed to find some protection. These were my requirements:&lt;/p&gt; 
&lt;ol&gt; 
&lt;li&gt;I only want to protect parts of the site, as there are some pictures that I intentionally share with the public. This selection should be possible down to the individual image.&lt;/li&gt; 
&lt;li&gt;The solution should work without any dynamic server component besides the web server itself. This rules out any self-written CGI scripts as well.&lt;/li&gt; 
&lt;li&gt;One password, given to all my friends etc., is not sufficient as it might leak to unintended audience.&lt;/li&gt; 
&lt;li&gt;I do not want my visitors to have to register and remember yet another username and password just for my site. I also do not want to manage this user database.&lt;/li&gt; 
&lt;li&gt;I do not want to have do large changes to the file structure of my photo album.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;This rules out most common options, e.g. protection by a &lt;a href=&quot;http://httpd.apache.org/docs/2.2/programs/htpasswd.html&quot;&gt;&lt;tt&gt;.htpasswd&lt;/tt&gt;&lt;/a&gt; file. Requirements 3 and 4 point to a solution based on &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenID&quot;&gt;OpenID&lt;/a&gt;. With OpenID, my visitors can authenticate against a service they already use (Google, Yahoo, etc.), relieving me from the burden of maintaining a user database and them from having to remember a password.&lt;/p&gt; 
&lt;p&gt;There is a &lt;a href=&quot;http://trac.butterfat.net/public/mod_auth_openid&quot;&gt;mod_auth_openid&lt;/a&gt; module for the Apache webserver, and it is even distributed with Debian in the &lt;a href=&quot;http://packages.debian.org/libapache2-mod-auth-openid&quot;&gt;libapache2-mod-auth-openid&lt;/a&gt; package. So requirement 2 is fulfilled. The tricky part is: How do we achieve OpenID protection for some images, and not for others.&lt;/p&gt; 
&lt;h3&gt;The solution&lt;/h3&gt; 
&lt;p&gt;I first played around with selectively enabling or disabling mod_auth_openid based on &lt;tt&gt;&amp;lt;FileMatch&amp;gt;&lt;/tt&gt; directives in the Apache configuration, but it was not elegant and would not scale well. I have more than 20.000 pictures to manage, and have already selected over 5000 pictures to be shown without protection. My solution is based on a partial copy of the whole directory tree that contains all public files. To save disk space, these are just symbolic links to the real file in the protected location. Some &lt;a href=&quot;http://httpd.apache.org/docs/current/mod/mod_rewrite.html&quot;&gt;mod_rewrite&lt;/a&gt; magic then takes care of giving the user the impression that all files are in the same location. I set up &lt;a href=&quot;http://nomeata.de/openid-test/&quot;&gt;a small example&lt;/a&gt; of my solution, which has this directory structure:&lt;/p&gt; 
&lt;pre&gt;.:
drwxr-xr-x 2 root root 4096  2. Aug 12:03 images
lrwxrwxrwx 1 root root   18  1. Aug 12:05 index.html -&amp;gt; private/index.html
lrwxrwxrwx 1 root root   18  1. Aug 12:05 login.html -&amp;gt; private/login.html
drwxr-xr-x 3 root root 4096  2. Aug 12:03 private

./images:
lrwxrwxrwx 1 root root 33  2. Aug 12:00 pleaselogin.png -&amp;gt; ../private/images/pleaselogin.png
lrwxrwxrwx 1 root root 28  2. Aug 12:03 public.png -&amp;gt; ../private/images/public.png

./private:
drwxr-xr-x 2 root root 4096  2. Aug 12:00 images
-rw-r--r-- 1 root root  267  2. Aug 12:03 index.html
-rw-r--r-- 1 root root   94  2. Aug 12:01 loggedin.html
-rw-r--r-- 1 root root 2091  2. Aug 12:03 login.html
-rw-r--r-- 1 root root   10 18. Nov 2009  protected.html

./private/images:
-rw-r--r-- 1 root root 4074  2. Aug 11:58 pleaselogin.png
-rw-r--r-- 1 root root 2670  2. Aug 11:58 private.png
-rw-r--r-- 1 root root 2043  2. Aug 11:58 public.png
&lt;/pre&gt; 
&lt;p&gt;As you can see, real files only reside in &lt;tt&gt;private/&lt;/tt&gt;, outside of that, only symbolic links exist.&lt;/p&gt; 
&lt;p&gt;The apache configuration protects the private directory and blends it into the main directory:&lt;/p&gt; 
&lt;pre&gt;   &amp;lt;directory /var/www/nomeata.de/openid-test&amp;gt;
        RewriteEngine On
        # Abuse the login page as an error image
        RewriteCond %{QUERY_STRING} \.(png|jpg)
        RewriteRule ^login.html$ /openid-test/images/pleaselogin.png
        # Ship private files, if they exist, unless public files exist
        RewriteCond  $1 !^private
        RewriteCond  /var/www/nomeata.de/openid-test/$1 !-f
        RewriteCond  /var/www/nomeata.de/openid-test/private/$1 -f
        RewriteRule  ^(.+)$ /openid-test/private/$1
   &amp;lt;/directory&amp;gt;
   &amp;lt;directory /var/www/nomeata.de/openid-test/private&amp;gt;
        AuthOpenIDEnabled        On
        AuthOpenIDDBLocation     /var/lib/apache2/mod_auth_openid/mod_auth_openid.db
        AuthOpenIDLoginPage      /openid-test/login.html
        AuthOpenIDTrustRoot      http://nomeata.de
        AuthOpenIDCookiePath     /
        AuthOpenIDCookieLifespan 2592000
    &amp;lt;/directory&amp;gt;
&lt;/pre&gt; 
&lt;p&gt;A special trick handles the “login page” for protected images: If the login page is requested and the referrer indicates that the user tried to access a &lt;tt&gt;.png&lt;/tt&gt; or &lt;tt&gt;.jpg&lt;/tt&gt; file, apache will instead ship an image containing an error message.&lt;/p&gt; 
&lt;p&gt;For my photo album I have a small Perl script that, given a directory with a &lt;tt&gt;private/&lt;/tt&gt; directory therein and a list of rules in form of &lt;a href=&quot;http://en.wikipedia.org/wiki/Glob_(programming)&quot;&gt;glob&lt;/a&gt; patterns, will symlink matching files and remove symlinks that are not allowed any more. &lt;br /&gt;&lt;/p&gt; 
&lt;h3&gt;What’s next?&lt;/h3&gt; 
&lt;p&gt;As you can see, this does not actually protect the content. It only requires the user to authenticate, then everything is visible. To select which OpenIDs are allowed to access which code, &lt;a href=&quot;http://trac.butterfat.net/public/mod_auth_openid/ticket/85&quot;&gt;some&lt;/a&gt; &lt;a href=&quot;http://trac.butterfat.net/public/mod_auth_openid/ticket/79&quot;&gt;bugs&lt;/a&gt; will have to be fixed in mod_auth_openid first. There was little activity there recently, I hope that the project is not dead.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 02 Aug 2010 12:02:40 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/421-guid.html</guid>
    
</item>
<item>
    <title>How forky may one maintain a Debian package?</title>
    <link>https://www.joachim-breitner.de/blog/archives/418-How-forky-may-one-maintain-a-Debian-package.html</link>
            <category>Debian</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/418-How-forky-may-one-maintain-a-Debian-package.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=418</wfw:comment>

    <slash:comments>11</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=418</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;I maintain most of &lt;a href=&quot;http://qa.debian.org/developer.php?login=nomeata@debian.org&quot;&gt;my Debian packages&lt;/a&gt; because I use them myself. Sometimes, I have some needs that go slightly beyond what is currently offered by the software. This is not a problem: Debian ships Free Software and I can program, therefore I can patch the software to also do what I want it to do. Trying to be a good member of the Free Software community, I then submit the patch to the upstream author. If he accepts the patch (which is usually the case), everything is fine. But what if he does not reply to the report or rejects it because he does not want this feature (although the patch is technically fine)? I see two options:&lt;/p&gt; 
&lt;ol&gt; 
&lt;li&gt;I could continue to use a privately patched and built version of the package, while separately building packages for Debian. This way, Debian ships the software as intended by the upstream maintainer while I can use the features I need. On the other hand, I would not be using the version that I upload to Debian, which is not good, and it causes double work when a a new version is released.&lt;/li&gt; 
&lt;li&gt;I could  upload a package to Debian that contains my patch. The technical infrastructure to add patch in Debian packages has always been there... I would actually use the package as it is in Debian and only manage one line of versions. But would I be abusing my powers as a Debian maintainer? If I were not the maintainer, I could not make this decision by myself (this &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=579001#12&quot;&gt;happend&lt;/a&gt; with &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/402-nagstamon-forklet-necessary.html&quot;&gt;my patch to nagstamon&lt;/a&gt;). Plus it could have a negative effect on the Debian-upstream relationship.&lt;/li&gt; 
&lt;/ol&gt;
&lt;p&gt;How do other Debian Developers handle such issues? The actual case I’m considering is a &lt;a href=&quot;https://bugs.launchpad.net/link-monitor-applet/+bug/591644&quot;&gt;feature enhancement for link-monitor-applet&lt;/a&gt; (but I only just wrote the patch, so it does not yet fall in the category “upstream does not reply”).&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 17 Jul 2010 21:59:47 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/418-guid.html</guid>
    
</item>
<item>
    <title>Kit-Card-Poster in der Mensa</title>
    <link>https://www.joachim-breitner.de/blog/archives/417-Kit-Card-Poster-in-der-Mensa.html</link>
            <category>Deutsch</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/417-Kit-Card-Poster-in-der-Mensa.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=417</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=417</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;&lt;em&gt;Jemand&lt;/em&gt; hat wohl wieder ein satirisches Poster &lt;a href=&quot;http://www.joachim-breitner.de/bilder/pages/201008_1.html&quot;&gt;in der Mensa aufgehängt&lt;/a&gt;:&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt;&lt;img width=&quot;700&quot; height=&quot;525&quot; src=&quot;http://www.joachim-breitner.de/bilder/previews/20100712124711_preview.jpg&quot; /&gt;&lt;/div&gt; 
&lt;p&gt;Für die externen: Bisher haben Studenten an der Uni-Karlsruhe eine „Fricard“. Da die Uni jetzt aber KIT heißt und schwer elite ist, muss natürlich eine neue Karte her, die KIT-Card. Dass die ähnlich eines Schokoriegels klingt, ist wohl nicht bedacht worden. Das erinnert an ein &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/294-Satirisches-Poster-in-der-Mensa.html&quot;&gt;ähnliches Poster vor zwei Jahren zum Thema Mensa-Nachtisch&lt;/a&gt;.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 13 Jul 2010 09:40:10 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/417-guid.html</guid>
    
</item>
<item>
    <title>Free Groups Formalized</title>
    <link>https://www.joachim-breitner.de/blog/archives/404-Free-Groups-Formalized.html</link>
            <category>English</category>
            <category>Mathe</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/404-Free-Groups-Formalized.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=404</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=404</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Since a few months, I have been playing around with &lt;a href=&quot;http://isabelle.in.tum.de/&quot;&gt;Isabelle&lt;/a&gt;, a theorem prover system. I find it very intriguing to have proofs of mathematical statements checked by something as pendantic and comprehensive as a machine. Mathematicians always claim that their statements are true in all eternity, but the proofs are just checked by error-prone human beings. Especially with complex, large proofs that are only read by a handful of people, I doubt that these are always fully correct. Note that this does not imply that I doubt that the results are correct. They probably are. But a bit of doubt remains. A computer-checked proof, in contrast, can not accidentially omit corner cases, leave out seemingly “trivial” assumtions of used theorems or be misled by slightly differing definition from different sources.&lt;/p&gt; 
&lt;p&gt;I was hoping to check at least parts of my &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/376-Diploma-Thesis-Finished.html&quot;&gt;diploma thesis&lt;/a&gt; using Isabelle, but it turns out that the &lt;a href=&quot;http://isabelle.in.tum.de/library/HOL/HOL-Algebra/index.html&quot;&gt;standard algebra library&lt;/a&gt; shipped with Isabelle is not complete enough. Even &lt;a href=&quot;http://en.wikipedia.org/wiki/Free_group&quot;&gt;free groups&lt;/a&gt; were missing. This was motivation enough to try to formalize them and prove the universal property and some isomorphisms (The free group over the empty set is the unit group, the free group over one generator is the additive group of integers and free groups over sets of same cardinality are isomophic). I submitted the resulting theory to the &lt;a href=&quot;http://afp.sourceforge.net/&quot;&gt;Archive of Formal Proofs&lt;/a&gt; and it was &lt;a href=&quot;http://afp.sourceforge.net/entries/Free-Groups.shtml&quot;&gt;accepted&lt;/a&gt;. You can view the &lt;a href=&quot;http://afp.sourceforge.net/browser_info/current/HOL/Free-Groups/document.pdf&quot;&gt;complete document&lt;/a&gt; or the &lt;a href=&quot;http://afp.sourceforge.net/browser_info/current/HOL/Free-Groups/outline.pdf&quot;&gt;document without proofs&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;I did not formalize the fact that isomorphic free groups have bases of same cardinality. As far as I know there is no simple argument that works directly with free groups. The proofs I have seen pass to the abelianization of the free group, i.e. the free module over ℤ and apply the well known proof from the analogous statement about vector spaces. But if someone knows an elementary proof of this fact, I’d like to hear about it.&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 03 Jul 2010 12:44:22 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/404-guid.html</guid>
    
</item>
<item>
    <title>nagstamon forklet necessary</title>
    <link>https://www.joachim-breitner.de/blog/archives/402-nagstamon-forklet-necessary.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/402-nagstamon-forklet-necessary.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=402</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=402</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;A while ago, I discovered &lt;a href=&quot;http://nagstamon.sourceforge.net/&quot;&gt;nagstamon&lt;/a&gt;, a very useful piece of software by Henri Wahl. This program sits in the notification area of your desktop and alerts you when your &lt;a href=&quot;http://www.nagios.org/&quot;&gt;nagios&lt;/a&gt;-monitored services have problems. Using nagstamon allows me to keep my servers under close surveillance, and it also adds another channel besides e-mail alerts, which will be helpful in case my mail server has problems.&lt;/p&gt; 
&lt;h3&gt;The wish&lt;/h3&gt; 
&lt;p&gt;I am not a full time sysadmin, I only monitor very few hosts and the services rarely have problems. Therefore, I do not want nagstamon to constantly sit in the notification area but only use it when there is something, well, to notify me about. It turned out that nagstamon did not support this mode of operation, so I created &lt;a href=&quot;http://sourceforge.net/tracker/?func=detail&amp;amp;atid=1101373&amp;amp;aid=2972096&amp;amp;group_id=236865&quot;&gt;a ticket&lt;/a&gt; and asked whether this feature could be added. The author raised two points, one being that then the user would not know when nagios crashed and the other being that you would not be able to configure nagstamon because you do not see it. He also indicated that he does not have the resources to work on it and asked if I could find the time.&lt;/p&gt; 
&lt;h3&gt;The patch&lt;/h3&gt; 
&lt;p&gt;Since I really liked nagstamon, but really want to keep my panel uncluttered, I found the time: I created a series of self-containing patches, adding an option for the feature, adding code to prevent more than one instance of nagstamon running in parallel and adding a &amp;quot;&lt;tt&gt;nagstamon --settings&lt;/tt&gt;&amp;quot; flag that would signal the running instance to show the settings – similar to how &lt;a href=&quot;http://www.nongnu.org/mailnotify/&quot;&gt;mail-notification&lt;/a&gt; is been behaving. The author then raised the valid point that some people run more than one instances in parallel, with different configuration options. I then extended the patch to cater for that.&lt;/p&gt; 
&lt;h3&gt;The rebuff&lt;/h3&gt; 
&lt;p&gt;The author remained reserved, did not answer my last commend on the ticket and then, six weeks later, closed the bug without explanation and turned off the possibility to add comments. I can understand when people are reluctant to add contributed features to their code, I often feel the same way. But completely blocking more comments is not a nice way of communicating with possible contributors.&lt;/p&gt; 
&lt;h3&gt;The fork(let)&lt;/h3&gt; 
&lt;p&gt;So I’m left with no option but patching each released version with my changes and building my own package. As I have to do this work anyways, I’d like to share it. You can find my branch in my &lt;a href=&quot;http://git.nomeata.de/?p=nagstamon.git;a=summary&quot;&gt;git repository&lt;/a&gt;. If you happen to want this feature as well and are using a Debian-based distribution, please let me know: I am building modified Debian packages anyways and can publish them as well. As I don’t &lt;em&gt;want&lt;/em&gt; to maintain this fork of nagstamon I don’t plan to diverge any more from Henri’s code, so if you have other feature requests, please talk to him first.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 24 Jun 2010 19:46:40 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/402-guid.html</guid>
    
</item>
<item>
    <title>bluetile in Debian</title>
    <link>https://www.joachim-breitner.de/blog/archives/401-bluetile-in-Debian.html</link>
            <category>Debian</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/401-bluetile-in-Debian.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=401</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=401</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://bluetile.org/images/bluetile_screenshot2.png&quot;&gt;&lt;img width=&quot;320&quot; height=&quot;240&quot; border=&quot;0&quot; src=&quot;http://bluetile.org/images/bluetile_screenshot2_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt; 
&lt;p&gt;I just packaged and uploaded Jan Vornberger’s window manager &lt;a href=&quot;http://bluetile.org/&quot;&gt;bluetile&lt;/a&gt; to Debian. This very nice piece of software brings the benefits of a tiling window manager to users who prefer to use the mouse and who don’t want to learn a new programing language to configure their window manager. Bluetile uses the &lt;a href=&quot;http://xmonad.org&quot;&gt;xmonad&lt;/a&gt; libraries and extends them with an easy to use and discoverable user interface.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 12 Jun 2010 20:44:10 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/401-guid.html</guid>
    
</item>
<item>
    <title>Making dictionary passing explicit in Haskell</title>
    <link>https://www.joachim-breitner.de/blog/archives/398-Making-dictionary-passing-explicit-in-Haskell.html</link>
            <category>English</category>
            <category>Haskell</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/398-Making-dictionary-passing-explicit-in-Haskell.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=398</wfw:comment>

    <slash:comments>7</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=398</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Haskell provides type classes to support polymorphism. A type class defines a few methods, which can then be implemented for a concrete type in the type class instance. This is a powerful system, but it also has it drawbacks. Most notably, each type can have at most one implementation of the type class. But sometimes you need to use a different implementation.&lt;/p&gt; 
&lt;p&gt;If, for example, you used the &lt;a href=&quot;http://hackage.haskell.org/package/binary&quot;&gt;Binary&lt;/a&gt; class to store data on disk. Now you changed your data type and the binary instance, and you can not read the old data any more. One solution is to re-name your type using “&lt;a href=&quot;http://www.haskell.org/onlinereport/decls.html#sect4.2.3&quot;&gt;newtype&lt;/a&gt;” and implement another type instance for that. Often, this is enough. But still, instances are not first-class-citizens. You can not pass them around or modify them, as you can pass around and modify data and functions.&lt;/p&gt; 
&lt;p&gt;Under the hood of the compiler, things look different. The ghc puts the methods of the instance in a dictionary and passes that implicitly to any functions having a &lt;tt&gt;(Class a)&lt;/tt&gt; constraint. (Other implementations exist though)&amp;#160; If one could make that behavior explicit, one could easily modify the instance before passing it to the function. But this is unfortunately not possible.&lt;/p&gt; 
&lt;p&gt;But it is possible to pass an explicit dictionary along the data. I use the &lt;a href=&quot;http://www.haskell.org/ghc/docs/6.10.2/html/libraries/base/Data-Monoid.html&quot;&gt;&lt;tt&gt;Monoid&lt;/tt&gt;&lt;/a&gt; class as an example, and define a representation of the dictionary to-be-passed, as well as the dictionary of the default instance:&lt;/p&gt; 
&lt;pre&gt;data MonoidDict a = MonoidDict
&amp;#160; { ed_mempty :: a
&amp;#160; , ed_mappend :: a -&amp;gt; a -&amp;gt; a
&amp;#160; }

monoidDict :: Monoid a =&amp;gt; MonoidDict a
monoidDict = MonoidDict mempty mappend&lt;/pre&gt; 
&lt;p&gt;(For conciseness, I ignore the &lt;tt&gt;mconcat&lt;/tt&gt; method.) My first idea was to pass this instance along with data: &lt;tt&gt;(MonoidDict a, a)&lt;/tt&gt;. But this would not work because there are methods, such as &lt;tt&gt;mempty&lt;/tt&gt;, who need the dictionary without getting passed a value to use. Therefore, I need to put the dictionary both in the covariant and the contravariant position:&lt;/p&gt; 
&lt;pre&gt;newtype WithMonoidDict a = WithMonoidDict (MonoidDict a -&amp;gt; (MonoidDict a, a))&lt;/pre&gt; 
&lt;p&gt;We need functions to clamp a dictionary to a value, and to extract it again:&lt;/p&gt; 
&lt;pre&gt;wrapWithCustomMonoidDict :: MonoidDict a -&amp;gt; a -&amp;gt; WithMonoidDict a
wrapWithCustomMonoidDict dict val = WithMonoidDict $ const (dict, val)

extractFromCustomMonoidDict :: MonoidDict a -&amp;gt; WithMonoidDict a -&amp;gt; a
extractFromCustomMonoidDict dict (WithMonoidDict f) = snd (f dict)&lt;/pre&gt; 
&lt;p&gt;Note that both expect the dictionary, so that it can be fed into &lt;tt&gt;WithMonoidDict&lt;/tt&gt; from “both sides”. For convenience, we can define variants that use the standard instance:&lt;/p&gt; 
&lt;pre&gt;wrapWithMonoidDict :: Monoid a =&amp;gt; a -&amp;gt; WithMonoidDict a
wrapWithMonoidDict = wrapWithCustomMonoidDict monoidDict

extractFromMonoidDict :: Monoid a =&amp;gt; WithMonoidDict a -&amp;gt; a
extractFromMonoidDict = extractFromCustomMonoidDict monoidDict&lt;/pre&gt; 
&lt;p&gt;We want to be able to pass the wrapped values as any other value with a Monoid instance, so we need to declare that:&lt;/p&gt; 
&lt;pre&gt;instance Monoid (WithMonoidDict a) where
&amp;#160;&amp;#160;&amp;#160; mempty = WithMonoidDict (\d -&amp;gt; (d, ed_mempty d))
&amp;#160;&amp;#160;&amp;#160; mappend (WithMonoidDict f1) (WithMonoidDict f2) = WithMonoidDict $ \d -&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; let (d1,v1) = f1 d
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (d2,v2) = f2 d
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; in&amp;#160; (d1, ed_mappend d1 v1 v2)&lt;/pre&gt; 
&lt;p&gt;Note that mappend has the choice between three dictionaries This is not a good sign, but let’s hope that they are all the same.&lt;/p&gt; 
&lt;p&gt;Does it work? Let’s see:&lt;/p&gt; 
&lt;pre&gt;listInstance :: MonoidDict [a]
listInstance = monoidDict

reverseInstance :: MonoidDict [a]
reverseInstance = monoidDict { ed_mappend = \l1 l2 -&amp;gt; l2 ++ l1 }

examples = do
&amp;#160;&amp;#160;&amp;#160; let l1 = [1,2,3]
&amp;#160;&amp;#160;&amp;#160; let l2 = [4,5,6]
&amp;#160;&amp;#160;&amp;#160; putStrLn $ &quot;Example lists: &quot; ++ show l1 ++ &quot; &quot; ++ show l2
&amp;#160;&amp;#160;&amp;#160; putStrLn $ &quot;l1 ++ l2: &quot; ++ show (l1 ++ l2) 
&amp;#160;&amp;#160;&amp;#160; putStrLn $ &quot;l1 `mappend` l2: &quot; ++ show (l1 `mappend` l2) 
&amp;#160;&amp;#160;&amp;#160; putStrLn $ &quot;Wrapped with default instance:&quot;
&amp;#160;&amp;#160;&amp;#160; putStrLn $ &quot;l1 `mappend` l2: &quot; ++ show (
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; extractFromMonoidDict $ wrapWithMonoidDict l1 `mappend` wrapWithMonoidDict l2)
&amp;#160;&amp;#160;&amp;#160; putStrLn $ &quot;Same with reversed monoid instance:&quot;
&amp;#160;&amp;#160;&amp;#160; putStrLn $ &quot;l1 `mappend` l2: &quot; ++ show (
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; extractFromCustomMonoidDict reverseInstance $
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wrapWithCustomMonoidDict reverseInstance l1 `mappend`
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wrapWithCustomMonoidDict reverseInstance l2)&lt;/pre&gt; 
&lt;p&gt;Running examples gives this output:&lt;/p&gt; 
&lt;pre&gt;Example lists: [1,2,3] [4,5,6]
l1 ++ l2: [1,2,3,4,5,6]
l1 `mappend` l2: [1,2,3,4,5,6]
Wrapped with default instance:
l1 `mappend` l2: [1,2,3,4,5,6]
Same with reversed monoid instance:
l1 `mappend` l2: [4,5,6,1,2,3]&lt;/pre&gt; 
&lt;p&gt;Indeed it works.&lt;/p&gt; 
&lt;p&gt;Unfortunately, this approach is not sufficient for all cases. It is perfectly valid to have a function with signature (&lt;tt&gt;Monoid a =&amp;gt; Maybe a -&amp;gt; Maybe a&lt;/tt&gt;), whose behavior depends on the instance of a, even when being passed Nothing and returning Nothing. Such a function woul&lt;monoid a&amp;#160;=&quot;&amp;gt;&quot;&gt;d have a problem here, because the dictionary would not be passed to the function.&lt;br /&gt;&lt;/monoid&gt;&lt;/p&gt; 
&lt;p&gt;I wonder if it would be possible to extend the Haskell language somehow to be able to properly pass an alternative dictionary to such functions. But given that not all compilers use dictionary passing, my hopes are low.&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 23 Apr 2010 14:56:55 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/398-guid.html</guid>
    
</item>
<item>
    <title>A mathematician’s status symbol</title>
    <link>https://www.joachim-breitner.de/blog/archives/395-A-mathematicians-status-symbol.html</link>
            <category>English</category>
            <category>Mathe</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/395-A-mathematicians-status-symbol.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=395</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=395</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;While writing my diploma thesis, I often wished I had a blackboard in my room: A place to quickly scribble some ideas on, somewhere where I can easily erease and replace stuff. Also, somewhere where you can literally (and not just &lt;a href=&quot;http://xkcd.com/725/&quot;&gt;figuratively&lt;/a&gt;) step back from and look at from the distance.&lt;/p&gt; 
&lt;p&gt;For my 25&lt;sup&gt;th&lt;/sup&gt; birthday, my parents organized a discharged part of a blackboard from my old scool, and yesterday, we installed it in my room in Karlsruhe:&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt;&lt;img width=&quot;1000&quot; height=&quot;750&quot; src=&quot;http://www.joachim-breitner.de/various/blackboard.jpg&quot; alt=&quot;A blackboard in my room&quot; /&gt;&lt;/div&gt; 
&lt;p&gt;Although my &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/376-Diploma-Thesis-Finished.html&quot;&gt;diploma thesis is finished&lt;/a&gt;, I’m sure it will be a nice and useful piece of furniture, and if only to draw funny things on (as my girlfriend did on this picture).&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 15 Apr 2010 12:16:30 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/395-guid.html</guid>
    
</item>
<item>
    <title>zpub article in “Linux-Magazin”</title>
    <link>https://www.joachim-breitner.de/blog/archives/394-zpub-article-in-Linux-Magazin.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/394-zpub-article-in-Linux-Magazin.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=394</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=394</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;The 05/2010 issue of the German “&lt;a href=&quot;http://www.linux-magazin.de/Heft-Abo/Ausgaben/2010/05&quot;&gt;Linux-Magazin&lt;/a&gt;“ contains an article of mine about &lt;a href=&quot;http://en.wikipedia.org/wiki/DocBook&quot;&gt;DocBook&lt;/a&gt;, &lt;a href=&quot;http://subversion.tigris.org/&quot;&gt;Subversion&lt;/a&gt; and &lt;a href=&quot;http://www.zpub.de/&quot;&gt;zpub&lt;/a&gt;. I was quite surprised to find it there – I submitted it in January and did not receive any feedback. But of course it is a nice surprise to find out it was accepted!&lt;/p&gt;
&lt;p&gt;The article, the zpub website and zpub itself is only available in German so far, but there is an &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/346-Releasing-zpub-as-Free-Software.html&quot;&gt;English blog post describing zpub&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 15 Apr 2010 11:32:50 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/394-guid.html</guid>
    
</item>
<item>
    <title>Ein Kulanz-Geschenk...</title>
    <link>https://www.joachim-breitner.de/blog/archives/393-Ein-Kulanz-Geschenk....html</link>
            <category>Deutsch</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/393-Ein-Kulanz-Geschenk....html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=393</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=393</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Ich bin seit einigen Jahren Abonnent der Wochenzeitung „&lt;a href=&quot;http://www.zeit.de/&quot;&gt;Die Zeit&lt;/a&gt;“. Da gerade wieder die Abo-Verlängerung anstand, habe ich mich auf &lt;a href=&quot;http://www.zeitabo.de/&quot;&gt;zeitabo.de&lt;/a&gt; umgesehen und ein paar nette Geschenke für Neu-Abonnenten entdeckt. Insbesondere den USB-Stick aus Echtholz fand ich ästhetisch interessant (auch wenn 4GB nicht mehr der Stand der Technik bei USB-Sticks ist).&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;&lt;img width=&quot;282&quot; height=&quot;200&quot; src=&quot;http://www.joachim-breitner.de/various/zeit-usbstick-1.png&quot; /&gt;&lt;/div&gt; 
&lt;p&gt;Ich schrieb also eine e-Mail an die Abo-Verwaltung (was wegen der Studienbescheinigung eh nötig war) und fragte, ob man auch als Weiter-Abonnent an ein solches Geschenk kommen könne. Dies wurde erst verneint, dann aber in einer zweiten e-Mail „aus Kulanz“ ermöglicht und ich solle doch meinen Geschenkwunsch äußern. Ich antwortete: „Vielen Dank für das Entgegenkommen. Ich würde mich freuen, den Holz-USB-Stick zu erhalten.“&lt;/p&gt; 
&lt;p&gt;Heute lag ein Päkchen vor meiner Tür mit einem USB-Stick. Allerdings musste ich sehr zu meiner Enttäuschung feststellen, dass es keinen edlen Holz-USB-Stick, sondern einen nicht besonders schicken Plastik-USB-Stick enthielt:&lt;br /&gt;&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt;&lt;img width=&quot;282&quot; height=&quot;200&quot; src=&quot;http://www.joachim-breitner.de/various/zeit-usbstick-2.jpg&quot; /&gt;&lt;/div&gt; 
&lt;p&gt;Dazu auch noch, wie man auf dem Bild sieht, ein mit 256MB fast unbrauchbar Kleiner. Da es ja nur ein „Kulanz-Geschenk“ ist, kann ich micht eigentlich nicht beschweren. Aber irgenwie habe ich schon den Eindruck, dass das kein Zufall ist... vorlaute Weiter-Abonnenten sind wohl nicht erwünscht.&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 07 Apr 2010 00:15:55 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/393-guid.html</guid>
    
</item>
<item>
    <title>libnss-gw-name: A stable name for your gateway</title>
    <link>https://www.joachim-breitner.de/blog/archives/390-libnss-gw-name-A-stable-name-for-your-gateway.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/390-libnss-gw-name-A-stable-name-for-your-gateway.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=390</wfw:comment>

    <slash:comments>7</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=390</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;I often find myself running &lt;tt&gt;/sbin/route&lt;/tt&gt; to get the IP address of the current gateway, especially when using a wireless LAN while traveling. For example, if the “Internet does not work” I usually ping the local gateway to see where the connectivity problem lies. I also need the IP if I want to access the routers configuration web interface. This is somewhat tedious, so I wrote &lt;a href=&quot;http://www.joachim-breitner.de/projects#libnss-gw-name&quot;&gt;libnss-gw-name&lt;/a&gt;, and now:&lt;/p&gt; 
&lt;pre&gt;$ sudo apt-get install libnss-gw-name
[...]
$ ping gateway.current
PING gateway.current (172.20.239.1) 56(84) bytes of data.
64 bytes from hhicalvin.stud.uni-karlsruhe.de (172.20.239.1): icmp_seq=1 ttl=64 time=2.16 ms
64 bytes from hhicalvin.stud.uni-karlsruhe.de (172.20.239.1): icmp_seq=2 ttl=64 time=1.48 ms
64 bytes from hhicalvin.stud.uni-karlsruhe.de (172.20.239.1): icmp_seq=3 ttl=64 time=2.73 ms
^C
--- gateway.current ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.482/2.129/2.739/0.513 ms&lt;/pre&gt; 
&lt;p&gt;Once libnss-gw-name is installed, it hooks into the system’s &lt;a href=&quot;http://en.wikipedia.org/wiki/Name_Service_Switch&quot;&gt;Name Service Switch&lt;/a&gt;, which is, among other things, responsible for resolving hostnames to ip addresses. It will only react on the name “gateway.current”, checking the system’s routing table and returning the IP address of the current default gateway.&lt;/p&gt; 
&lt;p&gt;It’s a pretty simple and small tool, but it could well prove very handy to the power user. I uploaded &lt;a href=&quot;http://packages.debian.org/sid/libnss-gw-name&quot;&gt;libnss-gw-name to Debian sid&lt;/a&gt;, you can &lt;a href=&quot;http://www.joachim-breitner.de/archive/libnss-gw-name/&quot;&gt;download the source code&lt;/a&gt; or access the &lt;a href=&quot;http://git.nomeata.de/?p=libnss-gw-name.git&quot;&gt;git repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Changed the name to gateway.localhost, as that is within a reserved top-level-domain.&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 18 Mar 2010 21:40:21 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/390-guid.html</guid>
    
</item>
<item>
    <title>Video of my CeBIT talk online</title>
    <link>https://www.joachim-breitner.de/blog/archives/389-Video-of-my-CeBIT-talk-online.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/389-Video-of-my-CeBIT-talk-online.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=389</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=389</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;As &lt;a href=&quot;http://blog.schmehl.info/Debian/events/cebit-2010/video-online&quot;&gt;tolimar already said&lt;/a&gt;, videos of talks at the Linux New Media booth at CeBIT are &lt;a href=&quot;http://www.techcast.com/events/cebit10/&quot;&gt;online&lt;/a&gt; now, including &lt;a href=&quot;http://www.techcast.com/events/cebit10/mi07-breitner/&quot;&gt;mine about how to submit patches&lt;/a&gt;. It is in German, though.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 18 Mar 2010 17:18:32 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/389-guid.html</guid>
    
</item>
<item>
    <title>kexec saved my day</title>
    <link>https://www.joachim-breitner.de/blog/archives/386-kexec-saved-my-day.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/386-kexec-saved-my-day.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=386</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://www.joachim-breitner.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=386</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Yesterday evening, when returning from a two-day trip with no connectivity, I found my server to be broken. I still reacted on ping, but no service would respond. I tried to restart it using my hoster’s web interface, but it would not come back up.&lt;/p&gt; 
&lt;p&gt;I booted into the recovery system and checked the hard disk, but could not find any issues. File system checks went through without a hitch. But it would still not boot. Unfortunately, my hoster does not provide access to the system console, so I had no idea what was going wrong.&lt;/p&gt; 
&lt;p&gt;I never did anything with &lt;a href=&quot;http://en.wikipedia.org/wiki/Kexec&quot;&gt;kexec&lt;/a&gt;, (a relatively new feature of the Linux kernel to act as a bootloader to load another system) and I was very positively surprised to find that it works out-of-the-box and flawlessly: I was able to load my system’s kernel and initrd from the recovery system and successfully booted it. I then ran lilo and rebooted right again, which now worked. I’m not sure if running lilo fixed it, or the clean shut-down, nor do I know what caused the problem in the first place, but kexec saved my day here.&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 16 Mar 2010 11:38:28 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/386-guid.html</guid>
    
</item>

</channel>
</rss>