<?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 - English</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 - English - Joachim Breitners Denkblogade</title>
        <link>https://www.joachim-breitner.de/blog/</link>
        <width>128</width>
        <height>128</height>
    </image>

<item>
    <title>10 years of using Debian</title>
    <link>https://www.joachim-breitner.de/blog/archives/550-10-years-of-using-Debian.html</link>
            <category>Debian</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/550-10-years-of-using-Debian.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=550</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=550</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Today, it must have been exactly 10 years that I started using &lt;a href=&quot;http://debian.org/&quot;&gt;Debian&lt;/a&gt;. The story of how I came to Debian shows some of its strengths, so I’ll use this occasion to share it.&lt;/p&gt; 
&lt;p&gt;I spent the first half of 2002 as an high-school exchange student in Wenatchee, USA. I was already a user of Linux at that time: I made my first contact roughly in 1996 and did my first installation at home two years later, but all that time I was dual-booting and my main system was a well-arranged Windows 98. The machine was a regular tower PC, but nevertheless I put the computer into my trunk when I flew to the US. It took away most of the space, and I had to put some of my cloths inside the case.&lt;/p&gt; 
&lt;p&gt;So I was there, happily using my Windows and my manually set up “&lt;a href=&quot;http://www.linuxfromscratch.org/&quot;&gt;Linux From Scratch&lt;/a&gt;” until one day the inevitable happened; inevitable at least until you start doing backups: On April 30th, my hard drive crashed, and took the two systems together with 4 years of personal data with it.&lt;/p&gt; 
&lt;p&gt;Two weeks later I had a new hard drive and was pondering my options. I did plan to install Windows again; at that time Windows XP was just released. But I wanted a German version of Windows, which would be hard to get there. Also, I did not want to use Linux from Scratch any more, and wanted to make a well-founded choice of a distribution. On the other hand, I really wanted to get my machine up and running quickly, to be able to read my mail more comfortably. I had heard that Debian had good support for network installations (downloading a full 700MB CD was something to avoid at that time), so I grabbed some netinst images, burned a CD, and quickly installed Debian.&lt;/p&gt; 
&lt;p&gt;I was planning to use the system for about two weeks. I did not pay any particular attention to the setup. Heck, I even picked from my Simpsons sidekick machine naming scheme one that I would not miss being used up (“&lt;a href=&quot;http://en.wikipedia.org/wiki/Barney_Gumble&quot;&gt;barney&lt;/a&gt;”). Nevertheless, I was using this installation for many years (and many upgrades), until I eventually switched to using laptops. In fact, that very installation is still on the machine somewhere and works. I did install Windows XP a few weeks later as well, but hardly used it. So May 12th of 2002 was when I turned into a full-time Linux and Debian user.&lt;/p&gt; 
&lt;p&gt;I soon became interested in Debian  the project and started to contribute. But that is another story for another ten year anniversary blog post, most likely on &lt;a href=&quot;https://nm.debian.org/public/process/mail@joachim-breitner.de&quot;&gt;October 21, 2013&lt;/a&gt;...&lt;br /&gt;&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F550-10-years-of-using-Debian.html&amp;amp;title=10+years+of+using+Debian&amp;amp;description=Today%2C+it+must+have+been+exactly+10+years+that+I+started+using+Debian.+The+story+of+how+I+came+to+Debian+shows+some+of+its+strengths%2C+so+I%E2%80%99ll+use+this+occasion+to+share+it.+++I+spent+the+first+half+of+2002+as+an+high-school+exchange+student+in+Wenatchee%2C+USA.+I+was+already+a+user+of+Linux+at+that+time%3A+I+made+my+first+contact+roughly+in+1996+and+did+my+first+installation+at+home+two+years+later%2C+but+all+that+time+I+was+dual-booting+and+my+main+system+was+a+well-arranged+Windows+98.+The+machine+was+a+regular+tower+PC%2C+but+nevertheless+I+put+the+computer+into+my+trunk+when+I+flew+to+the+US.+It+took+away+most+of+the+space%2C+and+I+had+to+put+some+of+my+cloths+inside+the+case.+++So+I+was+there%2C+happily+using+my+Windows+and+my+manually+set+up+%E2%80%9CLinux+From+Scratch%E2%80%9D+until+one+day+the+inevitable+happened%3B+inevitable+at+least+until+you+start+doing+backups%3A+On+April+30th%2C+my+hard+drive+crashed%2C+and+took+the+two+systems+together+with+4+years+of+personal+data+with+it.+++Two+weeks+later+I+had+a+&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Sat, 12 May 2012 12:00:00 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/550-guid.html</guid>
    
</item>
<item>
    <title>Free Groups in Agda</title>
    <link>https://www.joachim-breitner.de/blog/archives/552-Free-Groups-in-Agda.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/552-Free-Groups-in-Agda.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=552</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=552</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;I must say that I do like &lt;a href=&quot;http://en.wikipedia.org/wiki/Free_group&quot;&gt;free groups&lt;/a&gt;. At least whenever I play around with some theorem provers, I find myself formalizing free groups in them. For &lt;a href=&quot;http://isabelle.in.tum.de/&quot;&gt;Isabelle&lt;/a&gt;, &lt;a href=&quot;http://afp.sourceforge.net/entries/Free-Groups.shtml&quot;&gt;my development of free groups&lt;/a&gt; is already part of the Archive of Formal Proofs. Now I became interested in the theorem prover/programming language &lt;a href=&quot;http://wiki.portal.chalmers.se/agda/&quot;&gt;Agda&lt;/a&gt;,so I did it there as well. I was curious how well Agda is suited for doing math, and how comfortable with intuitionalistic logic I’d be.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;At first I wanted to follow the same path again and tried to define the free group on the set of fully reduced words. This is the natural way in Isabelle, where the &lt;a href=&quot;http://afp.sourceforge.net/browser_info/current/HOL/Free-Groups/Group.html&quot;&gt;existing setup for groups&lt;/a&gt; expects you to define the carrier as a subset of an existing type (the type here being lists of generators and their inverses). But I did not get far, and also I had to start using stuff like &lt;a href=&quot;http://www.cse.chalmers.se/~nad/listings/lib-0.6/Relation.Binary.html#2921&quot;&gt;DecidableEquivalence&lt;/a&gt;, an indication that this might not go well with the intuitionalistic logic. So I changed my approach and defined the free group on &lt;em&gt;all&lt;/em&gt; words as elements of the group, with a suitable equivalence relation. This allowed me define the free group construction and show its group properties without any smell of classical logic.&lt;/p&gt; 
&lt;p&gt;The agda files can be found in my &lt;a href=&quot;http://darcs.nomeata.de/agda-free-groups/&quot;&gt;darcs repository&lt;/a&gt;, and the  HTML export can be browsed: &lt;a href=&quot;http://darcs.nomeata.de/agda-free-groups/html/Generators.html&quot;&gt;Generators.agda&lt;/a&gt; defines the sets-of-generators-and-inverses and &lt;a href=&quot;http://darcs.nomeata.de/agda-free-groups/html/FreeGroups.html&quot;&gt;FreeGroups.agda&lt;/a&gt; (parametrized by the Setoid it is defined over) the reduction relation and the group axioms. Here are some observations I (disclaimer: Agda-beginer) made:&lt;/p&gt; 
&lt;ul&gt; 
&lt;li&gt;Fun fact: Free groups exist not only in classical logic. &lt;br /&gt;&lt;/li&gt; 
&lt;li&gt;Without any automation as in Isabelle, even simple things get quite complicated. A simple substitution of an equality with &lt;a href=&quot;http://www.cse.chalmers.se/~nad/listings/lib-0.6/Relation.Binary.PropositionalEquality.Core.html#705&quot;&gt;subst&lt;/a&gt; requires me to specify not only the equality and the term I want it to apply, but also to repeat the common part of the terms. Or when using the associativity of list concatenation, I have to pass all three sublists to the lemma. Maybe I am a bit spoiled by Isabelle, but I’d be worried that this would prevent large proofs.&lt;/li&gt; 
&lt;li&gt;The &lt;a href=&quot;http://www.cse.chalmers.se/~nad/listings/lib-0.6/Level.html#1&quot;&gt;levels&lt;/a&gt; are also annoying. Although my theory stays within one level, I have to annotate it everywhere. I’d expect the type inference to figure this out for me.&lt;/li&gt; 
&lt;li&gt;Equality reasoning with &lt;a href=&quot;file:///usr/share/doc/agda-stdlib-doc/html/Relation.Binary.PreorderReasoning.html&quot;&gt;begin ... ∎&lt;/a&gt; is quite nice and surprisingly well readable.&lt;/li&gt; 
&lt;li&gt;Besides the additional work, it is nice to be able to do the proof in almost all detail. There is a  limitation, though, as some steps are done automatically (if they happen to occur when evaluating/normalizing a term) and the others, even if similar-looking, are  not.&lt;br /&gt;&lt;/li&gt; 
&lt;li&gt;It’d be great if one would be free in the choice of editor, but vim users generally have a hard time in the field of theorem provers.&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;If I were to extend this theory, there are two important facts to be shown: That there is a unique reduced word in every equivalence class (&lt;a href=&quot;http://afp.sourceforge.net/browser_info/current/HOL/Free-Groups/Cancelation.html&quot;&gt;&lt;span class=&quot;command_span&quot;&gt;norm_form_uniq&lt;/span&gt;&lt;/a&gt;), and the universal property of the free group. For the former (started in &lt;a href=&quot;http://darcs.nomeata.de/agda-free-groups/html/NormalForm.html&quot;&gt;NormalForm.agda&lt;/a&gt;) I’m missing some general lemmas about relations (e.g. that local confluence implies global confluence, and even the reflexive, symmetric, transitive hull is missing in the standard library). For the latter, some general notions such as a group homomorphism need to be developed first.&lt;/p&gt; 
&lt;p&gt;I planned to compare the two developments, Isabelle and Agda. But as they turned out to show quite  things in different orders, this is not really possible any more. One motivation to look at Agda was to see if a dependently typed language frees me from doing lots of set-element-checking (see the “mems” lemma in the Isabelle proof of the &lt;a href=&quot;http://afp.sourceforge.net/browser_info/devel/HOL/Free-Groups/PingPongLemma.html&quot;&gt;Ping-Pong-Lemma&lt;/a&gt;). So far I had no such problems, but I did not get far enough yet to actually tell.&lt;/p&gt; 
&lt;p&gt;Thanks to Helmut Grohne for an educating evening of Agda hacking!&lt;br /&gt;&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F552-Free-Groups-in-Agda.html&amp;amp;title=Free+Groups+in+Agda&amp;amp;description=I+must+say+that+I+do+like+free+groups.+At+least+whenever+I+play+around+with+some+theorem+provers%2C+I+find+myself+formalizing+free+groups+in+them.+For+Isabelle%2C+my+development+of+free+groups+is+already+part+of+the+Archive+of+Formal+Proofs.+Now+I+became+interested+in+the+theorem+prover%2Fprogramming+language+Agda%2Cso+I+did+it+there+as+well.+I+was+curious+how+well+Agda+is+suited+for+doing+math%2C+and+how+comfortable+with+intuitionalistic+logic+I%E2%80%99d+be.+++At+first+I+wanted+to+follow+the+same+path+again+and+tried+to+define+the+free+group+on+the+set+of+fully+reduced+words.+This+is+the+natural+way+in+Isabelle%2C+where+the+existing+setup+for+groups+expects+you+to+define+the+carrier+as+a+subset+of+an+existing+type+%28the+type+here+being+lists+of+generators+and+their+inverses%29.+But+I+did+not+get+far%2C+and+also+I+had+to+start+using+stuff+like+DecidableEquivalence%2C+an+indication+that+this+might+not+go+well+with+the+intuitionalistic+logic.+So+I+changed+my+approach+and+defined+the+free+group+on+all+words+as+e&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Mon, 07 May 2012 15:24:33 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/552-guid.html</guid>
    
</item>
<item>
    <title>ghc-heap-view: Complete referential opacity</title>
    <link>https://www.joachim-breitner.de/blog/archives/548-ghc-heap-view-Complete-referential-opacity.html</link>
            <category>English</category>
            <category>Haskell</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/548-ghc-heap-view-Complete-referential-opacity.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=548</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=548</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;During the last week, I created &lt;a href=&quot;http://hackage.haskell.org/package/ghc-heap-view&quot;&gt;ghc-heap-view&lt;/a&gt;, a library to investigate the actual memory representation of Haskell values. It is inspired by &lt;a href=&quot;http://hackage.haskell.org/package/vacuum&quot;&gt;vacuum&lt;/a&gt; and the &lt;a href=&quot;http://www.haskell.org/ghc/docs/latest/html/users_guide/ghci-debugger.html&quot;&gt;GHCi debugger&lt;/a&gt;, but goes beyond them by allowing the user to look inside thunks and functions and see what other values they refer to. Let me demonstrate it by running the &lt;a href=&quot;http://darcs.nomeata.de/ghc-heap-view/Demo.hs&quot;&gt;included demo&lt;/a&gt;:&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt; 
&lt;h3&gt;ghc-heap-view-demo&lt;/h3&gt; 
&lt;p&gt;Here are a four different lists, where the first three are already evaluated.&lt;br /&gt;The first one, &lt;tt&gt;l&lt;/tt&gt;, was defined as a top level constant as&lt;/p&gt; 
&lt;pre&gt;&amp;gt; l = [1,2,3]&lt;/pre&gt; 
&lt;p&gt;and is now found at 0x00000000006d1750/2 (where the /2 is the pointer tag information) and fully evaluated:&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; ConsClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = CONSTR_STATIC, srtlen = 1}, 
                 ptrArgs = [0x00000000006d16e0/1,0x00000000006d1730/2],
                 dataArgs = [], descr = &quot;ghc-prim:GHC.Types.:&quot;}&lt;/pre&gt; 
&lt;p&gt;The second one, &lt;tt&gt;l2&lt;/tt&gt;, is locally defined&lt;/p&gt; 
&lt;pre&gt;&amp;gt; let l2 = 4:l&lt;/pre&gt; 
&lt;p&gt;and now found at 0x00007fdce19fe4b0/2. See how the cons-cell references &lt;tt&gt;l&lt;/tt&gt;!&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; ConsClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = CONSTR_2_0, srtlen = 1},
                 ptrArgs = [0x00000000006dca50/1,0x00000000006d1750/2],
                 dataArgs = [],
                 descr = &quot;ghc-prim:GHC.Types.:&quot;}&lt;/pre&gt; 
&lt;p&gt;And the binding&lt;/p&gt; 
&lt;pre&gt;&amp;gt; args &amp;lt;- map length `fmap` getArgs&lt;/pre&gt; 
&lt;p&gt;evaluates to the “one”, global empty list at 0x00000000006db640/1:&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; ConsClosure {info = StgInfoTable {ptrs = 0, nptrs = 0, tipe = CONSTR_NOCAF_STATIC, srtlen = 0},
                 ptrArgs = [],
                 dataArgs = [],
                 descr = &quot;ghc-prim:GHC.Types.[]&quot;}&lt;/pre&gt; 
&lt;p&gt;And now we have, at 0x00007fdce19fe4c8, the concatenation of them, but unevaluated:&lt;/p&gt; 
&lt;pre&gt;&amp;gt; let x = l ++ l2 ++ args&lt;/pre&gt; 
&lt;p&gt;The thunk keeps a reference to &lt;tt&gt;l2&lt;/tt&gt; and &lt;tt&gt;args&lt;/tt&gt;, but not &lt;tt&gt;l&lt;/tt&gt;, as that is at a static address, unless you are running this in GHCi:&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; ThunkClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = THUNK_2_0, srtlen = 1},
                  ptrArgs = [0x00007fdce19fe4b0/2,0x00000000006db640/1],
                  dataArgs = []}&lt;/pre&gt; 
&lt;p&gt;Now to some more closure types. &lt;tt&gt;m&lt;/tt&gt; and &lt;tt&gt;m&#039;&lt;/tt&gt; locally bound of type the unboxed type &lt;a href=&quot;http://hackage.haskell.org/packages/archive/ghc-prim/0.2.0.0/doc/html/GHC-Prim.html#3&quot;&gt;&lt;tt&gt;Int#&lt;/tt&gt;&lt;/a&gt;, with values 42 resp. 23.&lt;/p&gt; 
&lt;pre&gt;&amp;gt; let f = \x n -&amp;gt; take (I# m + I# x) n ++ args
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; t = f m&#039; l2&lt;/pre&gt; 
&lt;p&gt;So here is (0x00007fdce1937d50/2), referencing its free variables &lt;tt&gt;args&lt;/tt&gt; and 42:&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; FunClosure {info = StgInfoTable {ptrs = 1, nptrs = 1, tipe = FUN_1_1, srtlen = 65553},
                ptrArgs = [0x00000000006db640/1],
                dataArgs = [42]}&lt;/pre&gt; 
&lt;p&gt;And &lt;tt&gt;t&lt;/tt&gt; is a thunk that applies &lt;tt&gt;f &lt;/tt&gt;(also referenced here) to an unboxed value (23) and &lt;tt&gt;l2&lt;/tt&gt;:&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; ThunkClosure {info = StgInfoTable {ptrs = 2, nptrs = 1, tipe = THUNK, srtlen = 0},
                  ptrArgs = [0x00007fdce19fe4b0/2,0x00007fdce1937d50/2],
                  dataArgs = [23]}&lt;/pre&gt; 
&lt;p&gt;Lastly, here is the standard example for self reference:&lt;/p&gt; 
&lt;pre&gt;&amp;gt; let x = id (:) () x&lt;/pre&gt; 
&lt;p&gt;This is what &lt;tt&gt;x&lt;/tt&gt; (0x00007fdce1947940) looks like, at least without -O:&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; ThunkClosure {info = StgInfoTable {ptrs = 0, nptrs = 0, tipe = THUNK, srtlen = 1},
                  ptrArgs = [],
                  dataArgs = []}&lt;/pre&gt; 
&lt;p&gt;So it is unevaluated. Let us evaluate it using &lt;tt&gt;seq&lt;/tt&gt;. Now we have, still at 0x00007fdce1947940:&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; IndClosure {info = StgInfoTable {ptrs = 1, nptrs = 0, tipe = BLACKHOLE, srtlen = 0},
                indirectee = 0x00007fdce194cc98/2}&lt;/pre&gt; 
&lt;p&gt;The thunk was replaced by an indirection. If we look at the target, 0x00007fdce194cc98/2, we see that it is a newly created cons-cell referencing the original location of &lt;tt&gt;x&lt;/tt&gt;:&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; ConsClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = CONSTR_2_0, srtlen = 1},
                 ptrArgs = [0x00000000006db620/1,0x00007fdce1947940],
                 dataArgs = [],
                 descr = &quot;ghc-prim:GHC.Types.:&quot;}&lt;/pre&gt; 
&lt;p&gt;After running the garbage collector (&lt;a href=&quot;http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-Mem.html#v:performGC&quot;&gt;&lt;tt&gt;performGC&lt;/tt&gt;&lt;/a&gt;), we find that the address of &lt;tt&gt;x&lt;/tt&gt; is now 0x00007fdce19f30d0/2 and that the self-reference is without indirections:&lt;/p&gt; 
&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; ConsClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = CONSTR_2_0, srtlen = 1},
                 ptrArgs = [0x00000000006db620/1,0x00007fdce19f30d0/2],
                 dataArgs = [],
                 descr = &quot;ghc-prim:GHC.Types.:&quot;}&lt;/pre&gt; 
&lt;h3&gt;Future plans&lt;/h3&gt; 
&lt;p&gt;The output of ghc-heap-view is not really pretty yet; even the indentation in this blog post was added manually by me, so this really needs a pretty printer providing a nicer, possibly more compact representation, including something like what vacuum provides. Maybe vacuum can be ported to use this library, and also include the thunk’s and function’s references in the output. Maybe also the GHCi debugger can be extended to show more information about unevaluated expressions using this. Internally, the library is not very polished yet either. It only handles those closures types that I have seen so far, and is likely to break horribly if run in a threaded or debugging enabled runtime.&lt;/p&gt; 
&lt;h3&gt;How it works&lt;/h3&gt; 
&lt;p&gt;Obviously, this is not standard Haskell 98 code, but rather deep trickery involving the GHC API and some C code. Initially I tried to use the API that vacuum and the GHCi debugger rely on, which is an operation&lt;/p&gt; 
&lt;pre&gt;&lt;a title=&quot;&quot; target=&quot;&quot; href=&quot;http://hackage.haskell.org/packages/archive/ghc-prim/0.2.0.0/doc/html/GHC-Prim.html#v%3AunpackClosure%23&quot;&gt;unpackClosure#&lt;/a&gt; :: a -&amp;gt; (# Addr#, Array# b, ByteArray# #)&lt;/pre&gt; 
&lt;p&gt;which takes any Haskell value and returns the address to its info table, the pointers and the non-pointer-data in the closure. Unfortunately, it was not complete in that it was meant only for data closures and will for other closure types, e.g. thunks, return no data and no pointers (as can be seen &lt;a href=&quot;http://hackage.haskell.org/trac/ghc/browser/rts/PrimOps.cmm?rev=c6a2bbdbd3d701653d7e2ee22e2dea73316b49d8#L1680&quot;&gt;in the code&lt;/a&gt;). So I implemented my own version of this operation:&lt;/p&gt; 
&lt;pre&gt;foreign import prim &quot;slurpClosurezh&quot; slurpClosure# :: Any -&amp;gt; (# Addr#, ByteArray#, Array# b #)&lt;/pre&gt; 
&lt;p&gt;where the returned &lt;tt&gt;ByteArray#&lt;/tt&gt; contains the &lt;em&gt;complete&lt;/em&gt; closure, including extra information fields such as the arity of a function. The &lt;tt&gt;Array#&lt;/tt&gt; is again the list of pointers in the closure. At first glance, this is a duplication, as the pointers are of course also contained in the &lt;tt&gt;ByteArray#&lt;/tt&gt;. But as soon as the GHC runtime reigns again, a garbage collector run can happen, the referenced values will move somewhere else, and the words that once were pointers in the &lt;tt&gt;ByteArray#&lt;/tt&gt; become useless. But the corresponding entries in the &lt;tt&gt;Array#&lt;/tt&gt; are updated by the garbage collector, as it knows that these are pointers, and not just words. This way, we get both a faithful copy of the closure on the heap and useful references to the contained data. Here is a demonstration of this effect: &lt;br /&gt;&lt;/p&gt; 
&lt;pre&gt;$ ghci -XMagicHash -package ghc-heap-view
GHCi, version 7.4.1: http://www.haskell.org/ghc/&amp;#160; :? for help
Loading package ghc-prim ... linking ... done.
&lt;em&gt;[..]&lt;/em&gt;
Loading package ghc-7.4.1 ... linking ... done.
Loading package ghc-heap-view-0.1 ... linking ... done.
Prelude&amp;gt; let {a = [1,2,3,4]; b = 5:a}
Prelude&amp;gt; :m + GHC.HeapView 
Prelude GHC.HeapView&amp;gt; rawHeapData &amp;lt;- getClosureRaw b
Prelude GHC.HeapView&amp;gt; rawHeapData 
(0x000000004080d658,[1082185320,140040739366568,140040739365928],[0x00007f5dc68626a8,0x00007f5dc6862428])
Prelude GHC.HeapView&amp;gt; System.Mem.performGC
Prelude GHC.HeapView&amp;gt; rawHeapData 
(0x000000004080d658,[1082185320,140040739366568,140040739365928],[0x00007f5dc41b3ad8,0x00007f5dc41b3b28]) 
&lt;/pre&gt; 
&lt;p&gt;The function &lt;tt&gt;rawHeapData&lt;/tt&gt; is a thin wrapper around &lt;tt&gt;slurpClosure#&lt;/tt&gt; which turns the primitive array in normal lists. Note that the second component of the triple is unchanged, but the third is updated by the garbage collector. Of course this means that the &lt;tt&gt;Show&lt;/tt&gt; instance for the data type that ghc-heap-view uses to reference values is not referential transparent either.&lt;/p&gt; 
&lt;p&gt;The foreign function import above is of type “&lt;a href=&quot;http://hackage.haskell.org/trac/ghc/wiki/Commentary/PrimOps#Foreignout-of-linePrimOps&quot;&gt;&lt;tt&gt;prim&lt;/tt&gt;&lt;/a&gt;”, i.e. does not call a C function but rather a Cmm function. &lt;a href=&quot;http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/CmmType&quot;&gt;Cmm&lt;/a&gt; is a reduced C that GHC uses internally to compile the Haskell code to, and most primitive operations are implemented in this language – although I do quickly call regular C from &lt;a href=&quot;http://darcs.nomeata.de/ghc-heap-view/cbits/HeapViewPrim.cmm&quot;&gt;my Cmm&lt;/a&gt;&lt;a href=&quot;http://darcs.nomeata.de/ghc-heap-view/cbits/HeapViewPrim.cmm&quot;&gt; code&lt;/a&gt; to do &lt;a href=&quot;http://darcs.nomeata.de/ghc-heap-view/cbits/HeapView.c&quot;&gt;the more complicated stuff&lt;/a&gt;, mainly figuring out what words of the closure are pointers.&lt;/p&gt; 
&lt;p&gt;The knowledgeable reader might notice that I am passing a boxed value of type &lt;a href=&quot;http://hackage.haskell.org/packages/archive/ghc-prim/0.2.0.0/doc/html/GHC-Prim.html#t%3AAny&quot;&gt;&lt;tt&gt;Any&lt;/tt&gt;&lt;/a&gt; to the foreign function. This is currently not possible with foreign prim functions, and to actually use that code, you need the patch in &lt;a href=&quot;http://hackage.haskell.org/trac/ghc/ticket/5931&quot;&gt;GHC ticket #5931&lt;/a&gt;. But you can use ghc-heap-view without that as well (and the Cabal package will by default use that path), using the following hack to obtain the pointer to a Haskell value on the Heap as an unboxed type that can pass to the primitive operation:&lt;/p&gt; 
&lt;pre&gt;foreign import prim &quot;slurpClosurezh&quot; slurpClosure&#039;# :: Word#  -&amp;gt; (# Addr#, ByteArray#, Array# b #)
data Ptr&#039; a = Ptr&#039; a
aToWord# :: Any -&amp;gt; Word#
aToWord# a = case Ptr&#039; a of mb@(Ptr&#039; _) -&amp;gt; case unsafeCoerce# mb :: Word of W# addr -&amp;gt; addr
slurpClosure# :: Any -&amp;gt; (# Addr#, ByteArray#, Array# b #)
slurpClosure# a = slurpClosure&#039;# (aToWord# a)
&lt;/pre&gt; 
&lt;p&gt;This works because a &lt;a href=&quot;http://hackage.haskell.org/packages/archive/base/latest/doc/html/GHC-Exts.html#t:Word&quot;&gt;&lt;tt&gt;Word&lt;/tt&gt;&lt;/a&gt; and a &lt;tt&gt;Ptr&#039;&lt;/tt&gt; have the same closure layout, only differing in the fact that one stores an &lt;tt&gt;a&lt;/tt&gt;, and the other stores a &lt;tt&gt;Word#&lt;/tt&gt;.&lt;/p&gt; 
&lt;p&gt;Once we obtained the raw representation of the closure, we do the parsing in Haskell. Using the info table and the raw closure, we have enough information to tell which words have to be replaced by the appropriate pointer (which might already have been updated by the garbage collector) in the pointers list.&lt;/p&gt; 
&lt;p&gt;This work was supported by a scholarship from the &lt;a href=&quot;http://telekom-stiftung.de/&quot;&gt;Deutsche Telekom Stiftung&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F548-ghc-heap-view-Complete-referential-opacity.html&amp;amp;title=ghc-heap-view%3A+Complete+referential+opacity&amp;amp;description=During+the+last+week%2C+I+created+ghc-heap-view%2C+a+library+to+investigate+the+actual+memory+representation+of+Haskell+values.+It+is+inspired+by+vacuum+and+the+GHCi+debugger%2C+but+goes+beyond+them+by+allowing+the+user+to+look+inside+thunks+and+functions+and+see+what+other+values+they+refer+to.+Let+me+demonstrate+it+by+running+the+included+demo%3A+++++++ghc-heap-view-demo+++Here+are+a+four+different+lists%2C+where+the+first+three+are+already+evaluated.The+first+one%2C+l%2C+was+defined+as+a+top+level+constant+as+++%26gt%3B+l+%3D+%5B1%2C2%2C3%5D+++and+is+now+found+at+0x00000000006d1750%2F2+%28where+the+%2F2+is+the+pointer+tag+information%29+and+fully+evaluated%3A+++%26nbsp%3B%26nbsp%3B%26nbsp%3B+ConsClosure+%7Binfo+%3D+StgInfoTable+%7Bptrs+%3D+2%2C+nptrs+%3D+0%2C+tipe+%3D+CONSTR_STATIC%2C+srtlen+%3D+1%7D%2C++++++++++++++++++++ptrArgs+%3D+%5B0x00000000006d16e0%2F1%2C0x00000000006d1730%2F2%5D%2C+++++++++++++++++++dataArgs+%3D+%5B%5D%2C+descr+%3D+%5C%22ghc-prim%3AGHC.Types.%3A%5C%22%7D+++The+second+one%2C+l2%2C+is+locally+defined+++%26gt%3B+let+l2+%3D+4%3Al+++and+now+found+at+0x00007fdce19fe4b0%2F2.+See+how+the+c&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Tue, 13 Mar 2012 10:52:00 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/548-guid.html</guid>
    
</item>
<item>
    <title>GHC 7.4.1 speeds up arbtt by a factor of 22</title>
    <link>https://www.joachim-breitner.de/blog/archives/546-GHC-7.4.1-speeds-up-arbtt-by-a-factor-of-22.html</link>
            <category>English</category>
            <category>Haskell</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/546-GHC-7.4.1-speeds-up-arbtt-by-a-factor-of-22.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=546</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=546</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;More than two years ago I wrote &lt;a href=&quot;http://www.joachim-breitner.de/projects#arbtt&quot;&gt;arbtt&lt;/a&gt;, a tool that silently records what programs you are using and allows you to do statistics on that data later, based on rules that you define &lt;em&gt;afterwards&lt;/em&gt;, hence the name &lt;strong&gt;a&lt;/strong&gt;utomatic &lt;strong&gt;r&lt;/strong&gt;ule &lt;strong&gt;b&lt;/strong&gt;ased &lt;strong&gt;t&lt;/strong&gt;ime &lt;strong&gt;t&lt;/strong&gt;racker. I wasn’t doing much with it recently (the last release has been half a year ago), but it nevertheless was running on my machine and by now has tracked a total time span of 248 days in 350000 records.&lt;/p&gt; 
&lt;p&gt;Yesterday, I had a use for it again: measuring the time spent creating a certain document with LaTeX. So I added a rule to my &lt;a href=&quot;http://darcs.nomeata.de/arbtt/categorize.cfg&quot;&gt;categorize.cfg&lt;/a&gt; and ran &lt;a href=&quot;http://darcs.nomeata.de/arbtt/doc/users_guide/arbtt-stats.html&quot;&gt;arbtt-stats&lt;/a&gt;. I knew that it was not very fast, and that my data set has grown considerably since I last used it. And indeed, it took more than 6 minutes to process the data and spit out the result.&lt;/p&gt; 
&lt;p&gt;Since I’m currently working on the GHC 7.4.1 transition in Debian anyways, I decided to check what happens if I compile the code with that version of the Haskell compiler, instead of the previous version 7.0.4. And behold: The whole process took merely 17.3 seconds to complete! At first I did not believe it, but the result was identical, both binaries were built with the same option, i.e. no profiling enabled or anything like that. Wouldn’t you also like to have such speed ups for free, just by waiting for someone else to improve their work?&lt;/p&gt; 
&lt;p class=&quot;caption&quot;&gt;I tried to find out the reason for the speed up and created profiling output from both the &lt;a href=&quot;http://darcs.nomeata.de/arbtt/doc/profdata/arbtt-stats-7.0.4.prof&quot;&gt;old&lt;/a&gt; and the &lt;a href=&quot;http://darcs.nomeata.de/arbtt/doc/profdata/arbtt-stats-7.4.1.prof&quot;&gt;new&lt;/a&gt; binary. The old binary spends 83% of the time in Categorize.checkRegex, which basically just call &lt;a href=&quot;http://hackage.haskell.org/packages/archive/pcre-light/0.4/doc/html/Text-Regex-PCRE-Light.html#v:match&quot;&gt;Text.Regex.PCRE.Light.match&lt;/a&gt;. Since the version of &lt;a href=&quot;http://hackage.haskell.org/package/pcre-light&quot;&gt;pcre-light&lt;/a&gt; is the same in both binaries, I conclude that the Foreign Function Interface that GHC provides to interact with C libraries (&lt;a href=&quot;http://www.pcre.org/&quot;&gt;libpcre&lt;/a&gt; in this case) is much faster now, although I do not find any mention in the &lt;a href=&quot;http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/release-7-4-1.html&quot;&gt;release notes&lt;/a&gt;. And even if I do not count the 83% time spent in checkRegex, the code from the new compiler is still 2.7 times faster. Thanks, GHC devs, great work!&lt;br /&gt;&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F546-GHC-7.4.1-speeds-up-arbtt-by-a-factor-of-22.html&amp;amp;title=GHC+7.4.1+speeds+up+arbtt+by+a+factor+of+22&amp;amp;description=More+than+two+years+ago+I+wrote+arbtt%2C+a+tool+that+silently+records+what+programs+you+are+using+and+allows+you+to+do+statistics+on+that+data+later%2C+based+on+rules+that+you+define+afterwards%2C+hence+the+name+automatic+rule+based+time+tracker.+I+wasn%E2%80%99t+doing+much+with+it+recently+%28the+last+release+has+been+half+a+year+ago%29%2C+but+it+nevertheless+was+running+on+my+machine+and+by+now+has+tracked+a+total+time+span+of+248+days+in+350000+records.+++Yesterday%2C+I+had+a+use+for+it+again%3A+measuring+the+time+spent+creating+a+certain+document+with+LaTeX.+So+I+added+a+rule+to+my+categorize.cfg+and+ran+arbtt-stats.+I+knew+that+it+was+not+very+fast%2C+and+that+my+data+set+has+grown+considerably+since+I+last+used+it.+And+indeed%2C+it+took+more+than+6+minutes+to+process+the+data+and+spit+out+the+result.+++Since+I%E2%80%99m+currently+working+on+the+GHC+7.4.1+transition+in+Debian+anyways%2C+I+decided+to+check+what+happens+if+I+compile+the+code+with+that+version+of+the+Haskell+compiler%2C+instead+of+the+previous+version+&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Sun, 26 Feb 2012 17:25:00 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/546-guid.html</guid>
    
</item>
<item>
    <title>Including full LaTeX documents in another LaTeX document</title>
    <link>https://www.joachim-breitner.de/blog/archives/544-Including-full-LaTeX-documents-in-another-LaTeX-document.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/544-Including-full-LaTeX-documents-in-another-LaTeX-document.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=544</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=544</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Assume the following situation: You set problem sheets for a class, and at the end of the semester, you have 13 individual LaTeX files, including the preamble (the stuff from &lt;tt&gt;\documentclass&lt;/tt&gt; to &lt;tt&gt;\begin{document}&lt;/tt&gt;). Now you want to provide a file that contains all problems, followed by all problems with solutions. You could just concatenate the resulting PDFs, but that would waste quite a bit of paper, as most problem sheets do not fill the whole page. You could just copy’n’paste the LaTeX code, but that is not neat either.&lt;/p&gt; 
&lt;p&gt;So you want to include the 13 individual documents in one LaTeX document. LaTeX provides &lt;tt&gt;\include&lt;/tt&gt; and &lt;tt&gt;\input&lt;/tt&gt; commands, but these would require that the content of the individual files, i.e. the stuff between &lt;tt&gt;\begin{document}&lt;/tt&gt; and &lt;tt&gt;\end{document}&lt;/tt&gt;, is put in a file of its own. You cannot just &lt;tt&gt;\input&lt;/tt&gt; the full problem sheet document, as there must be only one &lt;tt&gt;\documentclass&lt;/tt&gt; command, and a few preamble commands are invalid within the document.&lt;/p&gt; 
&lt;p&gt;There are various solutions suggested, e.g. on &lt;a href=&quot;http://en.wikibooks.org/wiki/LaTeX/Multiple_files&quot;&gt;Wikibooks&lt;/a&gt; and &lt;a href=&quot;http://stackoverflow.com/questions/797648/including-full-latex-documents-within-others&quot;&gt;StackOverflow&lt;/a&gt;, and there are packages helping with that functionality, such as &lt;a href=&quot;http://ctan.org/pkg/combine&quot;&gt;combine&lt;/a&gt; or &lt;a href=&quot;http://ctan.org/pkg/subfiles&quot;&gt;subfiles&lt;/a&gt;. I chose a rather rough, hands-on solution that worked great in my case: The idea is to simply re-define all commands that you have in your preamble to do nothing, including the document environment, before including the other files and constraint to a group. In my case, the preambles were relatively small, as the common definitions of the problem sheets were in a file of their own. I am also using the &lt;tt&gt;\foreach&lt;/tt&gt; command provided by the &lt;a href=&quot;http://www.ctan.org/pkg/pgf&quot;&gt;TikZ&lt;/a&gt; package for a convenient loop over all problem sheets:&lt;/p&gt; 
&lt;pre&gt;\foreach \x in {0,...,13} {
  {
    \excludecomment{solution}
    
    \DeclareDocumentCommand{\documentclass}{om}{}
    \DeclareDocumentCommand{\usepackage}{om}{}
    \newcommand{\Blattnummer}[1]{}
    \DeclareDocumentCommand{\FirstDueDate}{mmm}{}
    \DeclareDocumentCommand{\ThisDueDate}{mmm}{}
    \newcommand{\SkippedWeeks}[1]{}
    \renewenvironment{document}{}{}
    \section*{Problem Sheet \x}
    \setcounter{problem}{0}
    \input{GraphTheoryProblems\x}
  }
}
\clearpage
\label{sols}
\foreach \x in {0,...,13} {
  {
    \newenvironment{solution}{
      \par\addvspace{1em}
    }{
    }
    \DeclareDocumentCommand{\documentclass}{om}{}
    \DeclareDocumentCommand{\usepackage}{om}{}
    \newcommand{\Blattnummer}[1]{}
    \DeclareDocumentCommand{\FirstDueDate}{mmm}{}
    \DeclareDocumentCommand{\ThisDueDate}{mmm}{}
    \newcommand{\SkippedWeeks}[1]{}
    \renewenvironment{document}{}{}
    \section*{Solution Sheet \x}
    \setcounter{problem}{0}
    \input{GraphTheoryProblems\x}
  }
}
&lt;/pre&gt; 
&lt;p&gt;To redefine commands taking optional arguments, using the &lt;a href=&quot;http://ctan.org/pkg/xparse&quot;&gt;xparse&lt;/a&gt; package is convenient. You can see how I include every file twice, first with the solution environment turned into a &lt;a href=&quot;http://ctan.org/pkg/comment&quot;&gt;comment&lt;/a&gt; and then again with the solution environment actually showing its content. I create a section header based on the counter of the foreach loop, but I could have easily redefined &lt;tt&gt;\title&lt;/tt&gt; and use that for a header, if my problem sheets had used that command (They don’t, as they calculate the problem sheet number and the due date based on the number in the filename – very convenient, and maybe worth a blog post of its own). The problem counter is reset for each file, so that the problems are numbered individually. I could have left this out, then the problems would be numbered consecutively across all included problem sheets.&lt;/p&gt; 
&lt;p&gt;The individual and resulting files can be found on the &lt;a href=&quot;http://www.math.kit.edu/iag/lehre/graphtheo2011w/&quot;&gt;Graph Theory course&lt;/a&gt; website.&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F544-Including-full-LaTeX-documents-in-another-LaTeX-document.html&amp;amp;title=Including+full+LaTeX+documents+in+another+LaTeX+document&amp;amp;description=Assume+the+following+situation%3A+You+set+problem+sheets+for+a+class%2C+and+at+the+end+of+the+semester%2C+you+have+13+individual+LaTeX+files%2C+including+the+preamble+%28the+stuff+from+%5C%5Cdocumentclass+to+%5C%5Cbegin%7Bdocument%7D%29.+Now+you+want+to+provide+a+file+that+contains+all+problems%2C+followed+by+all+problems+with+solutions.+You+could+just+concatenate+the+resulting+PDFs%2C+but+that+would+waste+quite+a+bit+of+paper%2C+as+most+problem+sheets+do+not+fill+the+whole+page.+You+could+just+copy%E2%80%99n%E2%80%99paste+the+LaTeX+code%2C+but+that+is+not+neat+either.+++So+you+want+to+include+the+13+individual+documents+in+one+LaTeX+document.+LaTeX+provides+%5C%5Cinclude+and+%5C%5Cinput+commands%2C+but+these+would+require+that+the+content+of+the+individual+files%2C+i.e.+the+stuff+between+%5C%5Cbegin%7Bdocument%7D+and+%5C%5Cend%7Bdocument%7D%2C+is+put+in+a+file+of+its+own.+You+cannot+just+%5C%5Cinput+the+full+problem+sheet+document%2C+as+there+must+be+only+one+%5C%5Cdocumentclass+command%2C+and+a+few+preamble+commands+are+invalid+within+the+document.+++There+are+various&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Wed, 15 Feb 2012 14:45:30 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/544-guid.html</guid>
    
</item>
<item>
    <title>c't features heisse-news</title>
    <link>https://www.joachim-breitner.de/blog/archives/543-ct-features-heisse-news.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/543-ct-features-heisse-news.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=543</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=543</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Several years ago, I created a computer news parody page called “&lt;a href=&quot;http://www.joachim-breitner.de/heisse-news&quot;&gt;heisse news&lt;/a&gt;”, emulating the look-and-feel of the German “&lt;a href=&quot;http://www.heise.de/newsticker/classic/&quot;&gt;heise news&lt;/a&gt;”, an online newsticker run by the most important German computer magazin publisher. Although my page did not see an updated since almost four years, it&#039;s featured in the latest issue of the publisher’s main print magzine, &lt;a href=&quot;http://www.heise.de/ct/&quot;&gt;c&#039;t&lt;/a&gt;, in the section &lt;a href=&quot;http://www.heise.de/ct/artikel/Websites-aktuell-1406546.html&quot;&gt;“Websites aktuell” on page 168&lt;/a&gt;, which I find very cool. As it is only fair to give and take, I posted a new entry on heisse news, &lt;a href=&quot;http://www.joachim-breitner.de/heisse-news/news_26.xml&quot;&gt;featuring their website in the same manner&lt;/a&gt;as they featured mine...&lt;br /&gt;&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F543-ct-features-heisse-news.html&amp;amp;title=c%5C%27t+features+heisse-news&amp;amp;description=Several+years+ago%2C+I+created+a+computer+news+parody+page+called+%E2%80%9Cheisse+news%E2%80%9D%2C+emulating+the+look-and-feel+of+the+German+%E2%80%9Cheise+news%E2%80%9D%2C+an+online+newsticker+run+by+the+most+important+German+computer+magazin+publisher.+Although+my+page+did+not+see+an+updated+since+almost+four+years%2C+it%5C%27s+featured+in+the+latest+issue+of+the+publisher%E2%80%99s+main+print+magzine%2C+c%5C%27t%2C+in+the+section+%E2%80%9CWebsites+aktuell%E2%80%9D+on+page+168%2C+which+I+find+very+cool.+As+it+is+only+fair+to+give+and+take%2C+I+posted+a+new+entry+on+heisse+news%2C+featuring+their+website+in+the+same+manneras+they+featured+mine...&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Sun, 15 Jan 2012 11:13:02 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/543-guid.html</guid>
    
</item>
<item>
    <title>First (academic) publication</title>
    <link>https://www.joachim-breitner.de/blog/archives/542-First-academic-publication.html</link>
            <category>English</category>
            <category>Mathe</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/542-First-academic-publication.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=542</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=542</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Nice christmas present: I just got message that the paper “Loop subgroups of F&lt;sub&gt;r&lt;/sub&gt; and the image of their stabilizer subgroups in GL&lt;sub&gt;r&lt;/sub&gt;(ℤ)” that I extracted from my &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/376-Diploma-Thesis-Finished.html&quot;&gt;Diploma thesis&lt;/a&gt; in Mathematics, and which I submitted to the &lt;a href=&quot;http://www.ma.huji.ac.il/~ijmath/&quot;&gt;Israel Journal of Mathematics&lt;/a&gt; in November 2010 was finally published today, in “Online First“ form and under the doi &lt;a href=&quot;http://dx.doi.org/10.1007/s11856-011-0213-3&quot;&gt;10.1007/s11856-011-0213-3&lt;/a&gt;.&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F542-First-academic-publication.html&amp;amp;title=First+%28academic%29+publication&amp;amp;description=Nice+christmas+present%3A+I+just+got+message+that+the+paper+%E2%80%9CLoop+subgroups+of+Fr+and+the+image+of+their+stabilizer+subgroups+in+GLr%28%E2%84%A4%29%E2%80%9D+that+I+extracted+from+my+Diploma+thesis+in+Mathematics%2C+and+which+I+submitted+to+the+Israel+Journal+of+Mathematics+in+November+2010+was+finally+published+today%2C+in+%E2%80%9COnline+First%E2%80%9C+form+and+under+the+doi+10.1007%2Fs11856-011-0213-3.&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Sat, 24 Dec 2011 11:47:23 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/542-guid.html</guid>
    
</item>
<item>
    <title>Guest lecture on Haskell performance</title>
    <link>https://www.joachim-breitner.de/blog/archives/539-Guest-lecture-on-Haskell-performance.html</link>
            <category>English</category>
            <category>Haskell</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/539-Guest-lecture-on-Haskell-performance.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=539</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=539</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Today, I had some business in Bonn, so &lt;a href=&quot;http://www.iai.uni-bonn.de/~jv/&quot;&gt;Janis Voigtländer&lt;/a&gt; invited me to hold a guest lecture in his &lt;a href=&quot;http://www.iai.uni-bonn.de/~jv/teaching/ffp/&quot;&gt;advanced functional programming course&lt;/a&gt;, maybe telling the students more about “real world” use of Haskell, given that he teaches mostly the theoretical foundations. I chose to discuss an experience I made while implementing &lt;a href=&quot;http://lists.debian.org/debian-release/2011/07/msg00370.html&quot;&gt;SAT-Britney&lt;/a&gt;, namely that for the sake of good runtime and memory performance, it may be neither ideal to evaluate a list fully lazily, nor fully strict, but to have something in between. For the talk, I demonstrated this by a small example, showed how to use the GHCi debugger to get some insight in the evaluation order of things, how to benchmark the program and read the ghc statistics and a profiling chart, and finally how to get the most out of GHC’s &lt;a href=&quot;http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/rewrite-rules.html#id641682&quot;&gt;List Fusion&lt;/a&gt;. I wanted to also touch on QuickCheck, but skipped it to finish in time. The &lt;a href=&quot;http://www.joachim-breitner.de/publications/haskell_performance_bonn_2011-12-06.pdf&quot;&gt;full text of my talk&lt;/a&gt; (including graphs) is available, but in German; if you want an English version convince your prof to invite me for a guest lecture as well.&lt;/p&gt; 
&lt;p&gt;Afterwards I sat down with one of the students of the course, Helmut Grohne, who happened to take part in the &lt;a href=&quot;http://blog.schmehl.info/Debian/events/bsp-hi-2011-3&quot;&gt;Debian bug squashing party&lt;/a&gt; last weekend and had filed a &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=650808&quot;&gt;release critical&lt;/a&gt; bug against the Haskell grammar generator &lt;a href=&quot;http://www.cs.ox.ac.uk/people/ralf.hinze/talks/Frown.pdf&quot;&gt;frown&lt;/a&gt; (no better link available, homepage seems to be down) to debug the problem. It quickly became clear that the bug &lt;a href=&quot;http://patch-tracker.debian.org/patch/series/view/frown/0.6.1-11/07_no-n-plus-k-pattern&quot;&gt;was introduced by me&lt;/a&gt; (can you spot it?) when trying to make it compile with a modern GHC – slightly embarrassing for me.&lt;br /&gt; &lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F539-Guest-lecture-on-Haskell-performance.html&amp;amp;title=Guest+lecture+on+Haskell+performance&amp;amp;description=Today%2C+I+had+some+business+in+Bonn%2C+so+Janis+Voigtl%C3%A4nder+invited+me+to+hold+a+guest+lecture+in+his+advanced+functional+programming+course%2C+maybe+telling+the+students+more+about+%E2%80%9Creal+world%E2%80%9D+use+of+Haskell%2C+given+that+he+teaches+mostly+the+theoretical+foundations.+I+chose+to+discuss+an+experience+I+made+while+implementing+SAT-Britney%2C+namely+that+for+the+sake+of+good+runtime+and+memory+performance%2C+it+may+be+neither+ideal+to+evaluate+a+list+fully+lazily%2C+nor+fully+strict%2C+but+to+have+something+in+between.+For+the+talk%2C+I+demonstrated+this+by+a+small+example%2C+showed+how+to+use+the+GHCi+debugger+to+get+some+insight+in+the+evaluation+order+of+things%2C+how+to+benchmark+the+program+and+read+the+ghc+statistics+and+a+profiling+chart%2C+and+finally+how+to+get+the+most+out+of+GHC%E2%80%99s+List+Fusion.+I+wanted+to+also+touch+on+QuickCheck%2C+but+skipped+it+to+finish+in+time.+The+full+text+of+my+talk+%28including+graphs%29+is+available%2C+but+in+German%3B+if+you+want+an+English+version+convince+your+prof+to+in&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Tue, 06 Dec 2011 22:16:28 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/539-guid.html</guid>
    
</item>
<item>
    <title>Some late recognition of metainit</title>
    <link>https://www.joachim-breitner.de/blog/archives/538-Some-late-recognition-of-metainit.html</link>
            <category>Debian</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/538-Some-late-recognition-of-metainit.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=538</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=538</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Four years ago, during &lt;a href=&quot;http://debconf7.debconf.org/&quot;&gt;DebConf 7&lt;/a&gt; in Edinburgh, I had the idea of creating init scripts not by hand, but rather describe them in a declarative way that handles most common cases and generate the real init scripts from them. Back than, this was partly motivated by the varying quality of init scripts and the advent of an alternative init system, upstart, for which proper service files could be generated as well.&lt;/p&gt; 
&lt;p&gt;I implemented the idea and uploaded it as &lt;a href=&quot;http://wiki.debian.org/MetaInit&quot;&gt;metainit&lt;/a&gt; to Debian, but it did not take off. Only &lt;a href=&quot;http://packages.debian.org/sid/infon-server&quot;&gt;one package&lt;/a&gt; uses it, and this package is not used much either. The project basically fell dormant.&lt;/p&gt; 
&lt;p&gt;Yesterday, I got this mail:&lt;/p&gt; 
&lt;blockquote&gt; 
&lt;p&gt;Hi Joachim,&lt;/p&gt; 
&lt;p&gt;I&#039;m not very familiar with Debian ecosystem, however our company has 
recently switched to exclusively using Debian based servers, please
forgive me if there exists a better channel for sending patches.&lt;/p&gt; 
&lt;p&gt;We need (in house) to create a lot of trivial services and the sysv init
system seems an ideal way to manage them, and metainit an great way to
keep the config simple. &lt;/p&gt; 
&lt;p&gt;However all our scripts require a heartbeat, the way we normally do this
is with a bunch of checkers launched from cron. Metainit was ideal, but
lacked the simple &#039;status&#039; task found in most init scripts. &lt;/p&gt; 
&lt;p&gt;This small patch adds that task, I hope you and others find it usefull.&lt;/p&gt; 
&lt;p&gt;Regards,&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;together with the mentioned patch. So it turned out that the idea was a useful one after all, although it found its use on our user’s machines, and not within the Debian packages, as I originally anticipated. Nice!&lt;/p&gt; 
&lt;p&gt;During the recent discussions about the latest init system, systemd, there were more thoughts about generating init scripts/upstart service descriptions/systemd units from a declarative description, and if metainit had taken off back then, things would be easier now. So if anyone feels like reviving the project: Please do.&lt;br /&gt;&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F538-Some-late-recognition-of-metainit.html&amp;amp;title=Some+late+recognition+of+metainit&amp;amp;description=Four+years+ago%2C+during+DebConf+7+in+Edinburgh%2C+I+had+the+idea+of+creating+init+scripts+not+by+hand%2C+but+rather+describe+them+in+a+declarative+way+that+handles+most+common+cases+and+generate+the+real+init+scripts+from+them.+Back+than%2C+this+was+partly+motivated+by+the+varying+quality+of+init+scripts+and+the+advent+of+an+alternative+init+system%2C+upstart%2C+for+which+proper+service+files+could+be+generated+as+well.+++I+implemented+the+idea+and+uploaded+it+as+metainit+to+Debian%2C+but+it+did+not+take+off.+Only+one+package+uses+it%2C+and+this+package+is+not+used+much+either.+The+project+basically+fell+dormant.+++Yesterday%2C+I+got+this+mail%3A++++++Hi+Joachim%2C+++I%5C%27m+not+very+familiar+with+Debian+ecosystem%2C+however+our+company+has+++recently+switched+to+exclusively+using+Debian+based+servers%2C+please++forgive+me+if+there+exists+a+better+channel+for+sending+patches.+++We+need+%28in+house%29+to+create+a+lot+of+trivial+services+and+the+sysv+init++system+seems+an+ideal+way+to+manage+them%2C+and+metainit+an+great&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Sat, 03 Dec 2011 22:19:11 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/538-guid.html</guid>
    
</item>
<item>
    <title>Poetry in the problem class</title>
    <link>https://www.joachim-breitner.de/blog/archives/535-Poetry-in-the-problem-class.html</link>
            <category>English</category>
            <category>Mathe</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/535-Poetry-in-the-problem-class.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=535</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=535</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;I’m currently running the problem class for the &lt;a href=&quot;http://www.math.kit.edu/iag/lehre/graphtheo2011w/&quot;&gt;graph theory course at the Karlsruhe Institute of Technology&lt;/a&gt;, held by Prof. Maria Axenovich. On one problem sheet, I felt like setting the question in verse, and indeed, two students submitted their solution is in verse form as well. I have assembled &lt;a href=&quot;http://www.math.kit.edu/iag/lehre/graphtheo2011w/media/graph_theory_poem.pdf&quot;&gt;the problem and both solution&lt;/a&gt; – enjoy!&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F535-Poetry-in-the-problem-class.html&amp;amp;title=Poetry+in+the+problem+class&amp;amp;description=I%E2%80%99m+currently+running+the+problem+class+for+the+graph+theory+course+at+the+Karlsruhe+Institute+of+Technology%2C+held+by+Prof.+Maria+Axenovich.+On+one+problem+sheet%2C+I+felt+like+setting+the+question+in+verse%2C+and+indeed%2C+two+students+submitted+their+solution+is+in+verse+form+as+well.+I+have+assembled+the+problem+and+both+solution+%E2%80%93+enjoy%21&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Thu, 01 Dec 2011 18:11:30 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/535-guid.html</guid>
    
</item>
<item>
    <title>First contribution to a basic Haskell library</title>
    <link>https://www.joachim-breitner.de/blog/archives/534-First-contribution-to-a-basic-Haskell-library.html</link>
            <category>English</category>
            <category>Haskell</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/534-First-contribution-to-a-basic-Haskell-library.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=534</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=534</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;While working on &lt;a href=&quot;http://lists.debian.org/debian-release/2011/07/msg00370.html&quot;&gt;SAT-Britney&lt;/a&gt;, I made heavy use of the &lt;a href=&quot;http://hackage.haskell.org/packages/archive/containers/latest/doc/html/Data-IntSet.html#t:IntSet&quot;&gt;IntSet&lt;/a&gt; data type provided by the basic Haskell library “&lt;a href=&quot;http://hackage.haskell.org/package/containers&quot;&gt;containers&lt;/a&gt;”. Since memory consumption was a problem, I looked at its implementation, which is a binary tree, and &lt;a href=&quot;http://www.haskell.org/pipermail/libraries/2011-September/016752.html&quot;&gt;wondered&lt;/a&gt; whether this could be improved for dense sets by using a machine sized word as a bit map to represent a continuous part of the integers, so I started to implement it. The effect on my program was not as strong as I had hoped for, but nevertheless, the code &lt;a href=&quot;https://github.com/haskell/containers/pull/3&quot;&gt;made its way&lt;/a&gt; back into containers – after a thorough review and a &lt;a href=&quot;https://github.com/haskell/containers/commit/4ba5d5717ab05ed73ead4009a5e1a1c24e6899b5&quot;&gt;considerable&lt;/a&gt; &lt;a href=&quot;https://github.com/haskell/containers/commit/92d55cc509c9b44ce7d536a00ba4994aa1aeea9c&quot;&gt;amount&lt;/a&gt; &lt;a href=&quot;https://github.com/haskell/containers/commit/a7d29bd7f934c30f5c089fe6a34b63cfdc292880&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;https://github.com/haskell/containers/commit/e076b33f4cee3f657b5bdc5bf6f5a4c9e249d00c&quot;&gt;further&lt;/a&gt; &lt;a href=&quot;https://github.com/haskell/containers/commit/4ee739a52a68a7b4397b5d2ed1cd3e8d4f98fe1a&quot;&gt;improvements&lt;/a&gt; by &lt;a href=&quot;https://github.com/foxik&quot;&gt;Milan Straka&lt;/a&gt;. I’m getting sucked deeper and deeper into the Haskell community... (which means that the Haskell community does not suck, of course.)&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F534-First-contribution-to-a-basic-Haskell-library.html&amp;amp;title=First+contribution+to+a+basic+Haskell+library&amp;amp;description=While+working+on+SAT-Britney%2C+I+made+heavy+use+of+the+IntSet+data+type+provided+by+the+basic+Haskell+library+%E2%80%9Ccontainers%E2%80%9D.+Since+memory+consumption+was+a+problem%2C+I+looked+at+its+implementation%2C+which+is+a+binary+tree%2C+and+wondered+whether+this+could+be+improved+for+dense+sets+by+using+a+machine+sized+word+as+a+bit+map+to+represent+a+continuous+part+of+the+integers%2C+so+I+started+to+implement+it.+The+effect+on+my+program+was+not+as+strong+as+I+had+hoped+for%2C+but+nevertheless%2C+the+code+made+its+way+back+into+containers+%E2%80%93+after+a+thorough+review+and+a+considerable+amount+of+further+improvements+by+Milan+Straka.+I%E2%80%99m+getting+sucked+deeper+and+deeper+into+the+Haskell+community...+%28which+means+that+the+Haskell+community+does+not+suck%2C+of+course.%29&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Tue, 22 Nov 2011 21:15:36 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/534-guid.html</guid>
    
</item>
<item>
    <title>Running GNOME 3 and noone will notice</title>
    <link>https://www.joachim-breitner.de/blog/archives/533-Running-GNOME-3-and-noone-will-notice.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/533-Running-GNOME-3-and-noone-will-notice.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=533</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=533</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Two days ago, I finally brought my system up-to-date with regard to the GNOME packages that I use. I was very reluctant because I am using a heavily customized gnome-panel and I waited until &lt;a href=&quot;http://packages.qa.debian.org/l/link-monitor-applet/news/20111023T170316Z.html&quot;&gt;all&lt;/a&gt; &lt;a href=&quot;http://packages.qa.debian.org/s/sensors-applet/news/20111105T183259Z.html&quot;&gt;the&lt;/a&gt; &lt;a href=&quot;http://packages.qa.debian.org/g/gnote/news/20111030T153212Z.html&quot;&gt;applets&lt;/a&gt; that I use have been ported to gtk3 and the libgnome-applet library. I am the Debian maintainer of one of these applets, link-notification-daemon, and I have made the changes and tested them in a chroot before, but now that I am actually using it, I found and &lt;a href=&quot;http://git.nomeata.de/?p=link-monitor-applet.git;a=shortlog;h=refs/heads/gnome3&quot;&gt;fixed&lt;/a&gt; more visual glitches. I think by now it is as usable as it was before on GNOME 2. I am still looking for someone to &lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/525-Help-wanted-maintaining-link-monitor-applet.html&quot;&gt;step up as the new upstream maintainer&lt;/a&gt; for it!&lt;/p&gt; 
&lt;p&gt;I had some trouble with gnome-session and notification-daemon, thought I found the cause and &lt;a href=&quot;http://bugs.debian.org/648474&quot;&gt;reported it&lt;/a&gt;, but a day later I could not reproduce it anymore. Weird. Other problems, such as the “busy cursor” not disappearing after the session start, or evolution going into a freeze also have stopped occurring by themselves.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;Other problems I found and fixed, for example the battery status applet was &lt;a href=&quot;https://bugzilla.gnome.org/attachment.cgi?id=201305&quot;&gt;not visible&lt;/a&gt; until a major state change, or panel applets were &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=654843&quot;&gt;not loaded&lt;/a&gt; due to a race condition, or &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=645284&quot;&gt;tooltips not working&lt;/a&gt; (which called for a &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=516130&quot;&gt;fix in gtk+ itself&lt;/a&gt;). I also added to the &lt;a href=&quot;http://packages.debian.org/sid/xmonad&quot;&gt;xmonad package&lt;/a&gt; the files required to allow the user to select “GNOME with Xmonad” in GDM, and found out &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=648614&quot;&gt;how to have Galeon appear&lt;/a&gt; in the list of possible default browsers.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;I don’t really have to say much about GNOME3 itself. I disliked the default font, Cantarell, mostly because of the extra spacing that reduced the number of folders and mail I can see in evolution. (Also see &lt;a href=&quot;http://jeff.ecchi.ca/blog/2011/04/13/on-cantarell/&quot;&gt;what nekohayo has to say&lt;/a&gt; about that.) I also was under the impression that the font is much lighter, and I started to adjust the position of my laptop monitor to increase the contrast. So I switch back to DejaVu Sans.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;I also disabled the sleep-on-lid-close feature – I often run backups, or download stuff, or compile stuff, or calculate stuff, so I want better control over this.&lt;/p&gt; 
&lt;p&gt;So, I guess, now that everything is almost as it was in GNOME2, I can say I like it...&lt;br /&gt;&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F533-Running-GNOME-3-and-noone-will-notice.html&amp;amp;title=Running+GNOME+3+and+noone+will+notice&amp;amp;description=Two+days+ago%2C+I+finally+brought+my+system+up-to-date+with+regard+to+the+GNOME+packages+that+I+use.+I+was+very+reluctant+because+I+am+using+a+heavily+customized+gnome-panel+and+I+waited+until+all+the+applets+that+I+use+have+been+ported+to+gtk3+and+the+libgnome-applet+library.+I+am+the+Debian+maintainer+of+one+of+these+applets%2C+link-notification-daemon%2C+and+I+have+made+the+changes+and+tested+them+in+a+chroot+before%2C+but+now+that+I+am+actually+using+it%2C+I+found+and+fixed+more+visual+glitches.+I+think+by+now+it+is+as+usable+as+it+was+before+on+GNOME+2.+I+am+still+looking+for+someone+to+step+up+as+the+new+upstream+maintainer+for+it%21+++I+had+some+trouble+with+gnome-session+and+notification-daemon%2C+thought+I+found+the+cause+and+reported+it%2C+but+a+day+later+I+could+not+reproduce+it+anymore.+Weird.+Other+problems%2C+such+as+the+%E2%80%9Cbusy+cursor%E2%80%9D+not+disappearing+after+the+session+start%2C+or+evolution+going+into+a+freeze+also+have+stopped+occurring+by+themselves.+++Other+problems+I+found+and+fixed%2C&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Sun, 13 Nov 2011 20:32:41 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/533-guid.html</guid>
    
</item>
<item>
    <title>gtk-vector-screenshot featured in freiesMagazin</title>
    <link>https://www.joachim-breitner.de/blog/archives/531-gtk-vector-screenshot-featured-in-freiesMagazin.html</link>
            <category>Digital World</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/531-gtk-vector-screenshot-featured-in-freiesMagazin.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=531</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=531</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;I have published a small article in the &lt;a href=&quot;http://www.freiesmagazin.de/20111106-novemberausgabe-erschienen&quot;&gt;November edition&lt;/a&gt; of the German electronic magazine “&lt;a href=&quot;http://www.freiesmagazin.de/&quot;&gt;freiesMagazin&lt;/a&gt;” on &lt;a href=&quot;http://www.joachim-breitner.de/projects#gtk-vector-screenshot&quot;&gt;gtk-vector-screenshot&lt;/a&gt;. Their format is especially nice for that, given that the vector screenshots are embedded as such in the PDF version of the magazine, so the reader can zoom in and check for herself that it is indeed a vector screenshot. &lt;br /&gt;&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F531-gtk-vector-screenshot-featured-in-freiesMagazin.html&amp;amp;title=gtk-vector-screenshot+featured+in+freiesMagazin&amp;amp;description=I+have+published+a+small+article+in+the+November+edition+of+the+German+electronic+magazine+%E2%80%9CfreiesMagazin%E2%80%9D+on+gtk-vector-screenshot.+Their+format+is+especially+nice+for+that%2C+given+that+the+vector+screenshots+are+embedded+as+such+in+the+PDF+version+of+the+magazine%2C+so+the+reader+can+zoom+in+and+check+for+herself+that+it+is+indeed+a+vector+screenshot.+&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Sun, 06 Nov 2011 22:38:29 +0100</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/531-guid.html</guid>
    
</item>
<item>
    <title>Help wanted maintaining link-monitor-applet</title>
    <link>https://www.joachim-breitner.de/blog/archives/525-Help-wanted-maintaining-link-monitor-applet.html</link>
            <category>Debian</category>
            <category>English</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/525-Help-wanted-maintaining-link-monitor-applet.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=525</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=525</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;Jean-Yves Lefort’s &lt;a href=&quot;http://www.nongnu.org/link-monitor/&quot;&gt;link-monitor-applet&lt;/a&gt;, an applet for the GNOME panel, is a great tool for those with often-changing and possibly unreliable network connection. It allows me to see, at one glance, whether I can reach the router, the internet and/or my VPN. Furthermore, the latency display tells me whether there is a point in working over SSH right now. I often observe other people, e.g. on conferences, to stare for a while at a non-loading web page, then fire up a terminal window and run random ping commands, while I immediately see that the network is down and can relax.&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt;&lt;img src=&quot;https://launchpadlibrarian.net/52090195/link-monitor-logarithmic.png&quot; /&gt;&lt;/div&gt; 
&lt;p&gt;Unfortunately, Jean-Yves seems to have stopped working on link-monitor-applet and does not reply to &lt;a href=&quot;https://bugs.launchpad.net/link-monitor-applet&quot;&gt;bug reports&lt;/a&gt;. This was not a big deal as long as I could use the last released version with &lt;a href=&quot;http://patch-tracker.debian.org/package/link-monitor-applet/&quot;&gt;minor patches of mine&lt;/a&gt;, but now gnome-panel 3 is coming up and all applets need &lt;a href=&quot;http://developer.gnome.org/gtk3/stable/migrating.html&quot;&gt;porting to GTK3&lt;/a&gt;. Yesterday and today I worked on that, and got it so far that the applet is fully functional, although the visual styling is not perfect yet, because I’m not sure how to do what Jean-Yves did with GtkStyle and GdkGC now with GtkStyleContext and Cairo. The code is in the &lt;a href=&quot;http://git.nomeata.de/?p=link-monitor-applet.git;a=shortlog;h=refs/heads/gnome3&quot;&gt;gnome3 branch&lt;/a&gt; of my git repository.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;For this issue, and any further maintenance work, I’m looking for someone who is willing to take upstream responsibility for link-monitor-applet, e.g. making sure it works with the latest GNOME (well, GNOME in fallback mode) and that bug reports are handled. The code base is not too big, and both the non-standard build system and the gob-enhanced C code are fine to work with. I’ll still be happy to serve as the maintainer of the &lt;a href=&quot;http://packages.debian.org/sid/link-monitor-applet&quot;&gt;Debian package of link-monitor-applet&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F525-Help-wanted-maintaining-link-monitor-applet.html&amp;amp;title=Help+wanted+maintaining+link-monitor-applet&amp;amp;description=Jean-Yves+Lefort%E2%80%99s+link-monitor-applet%2C+an+applet+for+the+GNOME+panel%2C+is+a+great+tool+for+those+with+often-changing+and+possibly+unreliable+network+connection.+It+allows+me+to+see%2C+at+one+glance%2C+whether+I+can+reach+the+router%2C+the+internet+and%2For+my+VPN.+Furthermore%2C+the+latency+display+tells+me+whether+there+is+a+point+in+working+over+SSH+right+now.+I+often+observe+other+people%2C+e.g.+on+conferences%2C+to+stare+for+a+while+at+a+non-loading+web+page%2C+then+fire+up+a+terminal+window+and+run+random+ping+commands%2C+while+I+immediately+see+that+the+network+is+down+and+can+relax.++++++Unfortunately%2C+Jean-Yves+seems+to+have+stopped+working+on+link-monitor-applet+and+does+not+reply+to+bug+reports.+This+was+not+a+big+deal+as+long+as+I+could+use+the+last+released+version+with+minor+patches+of+mine%2C+but+now+gnome-panel+3+is+coming+up+and+all+applets+need+porting+to+GTK3.+Yesterday+and+today+I+worked+on+that%2C+and+got+it+so+far+that+the+applet+is+fully+functional%2C+although+the+visual+styling+is+not&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Sat, 15 Oct 2011 16:16:47 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/525-guid.html</guid>
    
</item>
<item>
    <title>stm-stats published for factis research</title>
    <link>https://www.joachim-breitner.de/blog/archives/524-stm-stats-published-for-factis-research.html</link>
            <category>English</category>
            <category>Haskell</category>
    
    <comments>https://www.joachim-breitner.de/blog/archives/524-stm-stats-published-for-factis-research.html#comments</comments>
    <wfw:comment>https://www.joachim-breitner.de/blog/wfwcomment.php?cid=524</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=524</wfw:commentRss>
    

    <author>mail@joachim-breitner.de (nomeata)</author>
    <content:encoded>
    &lt;p&gt;&lt;a href=&quot;http://www.factisresearch.com/&quot;&gt;Factis research&lt;/a&gt; has hired me to make sure their code gets contributed back to the Haskell community. As a first step, I have followed a request of someone in the audience of &lt;a href=&quot;http://factisresearch.blogspot.com/2011/10/yesterday-i-gave-talk-at-haskell-in.html&quot;&gt;Stefan Wehr’s talk&lt;/a&gt; at &lt;a href=&quot;https://portal.imn.htwk-leipzig.de/events/hal6-haskell-workshop&quot;&gt;HaL 6&lt;/a&gt; and prepared &lt;a href=&quot;http://hackage.haskell.org/package/stm-stats&quot;&gt;stm-stats&lt;/a&gt; – seem &lt;a href=&quot;http://factisresearch.blogspot.com/2011/10/stm-stats-retry-statistics-for-stm.html&quot;&gt;my post at the factis research blog&lt;/a&gt; about that.&lt;/p&gt; &lt;br/&gt;&lt;a href=&quot;https://flattr.com/submit/auto?user_id=nomeata&amp;amp;url=https%3A%2F%2Fwww.joachim-breitner.de%2Fblog%2Farchives%2F524-stm-stats-published-for-factis-research.html&amp;amp;title=stm-stats+published+for+factis+research&amp;amp;description=Factis+research+has+hired+me+to+make+sure+their+code+gets+contributed+back+to+the+Haskell+community.+As+a+first+step%2C+I+have+followed+a+request+of+someone+in+the+audience+of+Stefan+Wehr%E2%80%99s+talk+at+HaL+6+and+prepared+stm-stats+%E2%80%93+seem+my+post+at+the+factis+research+blog+about+that.&amp;amp;category=text&amp;amp;language=en_GB&quot;&gt;Flattr this post&lt;/a&gt;
    </content:encoded>

    <pubDate>Sun, 09 Oct 2011 22:28:56 +0200</pubDate>
    <guid isPermaLink="false">https://www.joachim-breitner.de/blog/archives/524-guid.html</guid>
    
</item>

</channel>
</rss>
