<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-21123659</id><updated>2011-11-25T08:36:30.565+01:00</updated><category term='gtd'/><category term='mail'/><category term='idea'/><category term='learning haskell'/><category term='tutorial'/><category term='example'/><category term='haskell wikibook'/><category term='oops'/><category term='wxhaskell'/><category term='cabal'/><category term='monads'/><category term='quickcheck'/><category term='français'/><category term='gui'/><category term='library'/><category term='yaht'/><category term='checkquick'/><category term='french'/><category term='wishlist'/><category term='revctrl'/><category term='nlp'/><category term='haskell.fr'/><category term='mutt'/><category term='parallels'/><category term='btsg'/><category term='darcs'/><category term='tips'/><category term='haskell'/><category term='mac'/><category term='house'/><category term='irc'/><category term='vim'/><category term='gitit'/><category term='pandoc'/><category term='mercurial'/><category term='learning'/><category term='newbie'/><category term='chinese'/><category term='teaching'/><category term='maybench'/><title type='text'>koweycode</title><subtitle type='html'>Hobby-hacking Eric</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default?start-index=101&amp;max-results=100'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>170</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-21123659.post-6433791826330702587</id><published>2011-05-03T00:44:00.000+02:00</published><updated>2011-05-03T00:44:13.249+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cabal'/><title type='text'>untangling a cabal install problem</title><content type='html'>&lt;i&gt;I sometimes have trouble translating abstract general explanations to my particular concrete cases. &amp;nbsp;I hope that by sharing a very concrete situation I experienced, other users may recognise themselves and get unstuck on their own problems.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I finally untangled out a cabal install problem that's been bugging me for some time, almost driving me to use cabal-dev on all my packages (which seems like it might be a bit inconvenient)&lt;br /&gt;&lt;br /&gt;So I have a fairly standard setup (at least, it was standard when I wrote this post), GHC 6.12.3 with the latest released Haskell Platform. &amp;nbsp;I'm working on two packages, GenI and nltg-hillwalking simultaneously. &amp;nbsp;Switching from one to the other is painful. &amp;nbsp;When I try to install GenI typing "cabal install" results in this horribly disheartening sequence, where it installs random, haskell98, cpphs, haskell-src-exts, derive and finally GenI. &amp;nbsp;If I then switch back to working on hillwalking, I then get this another discouraging sequence involving&amp;nbsp;random (again!), QuickCheck, test-framework, ntlg-hillwalking. &amp;nbsp;And going back to working on GenI,&amp;nbsp;I go through the same pain again.&lt;br /&gt;&lt;br /&gt;It took me a while to work out that the problem was just the interaction between these two packages. &amp;nbsp;Having had a chance to chat about this with Duncan and Ian, I got a bit of a clue about what the problem might be. &amp;nbsp;Indeed, when I ran &amp;nbsp;"cabal install --dry-run -v2", this little bit of output caught my eye:&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;In order, the following would be installed:&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre&gt;random-1.0.0.3 (reinstall) changes: time-1.1.4 -&amp;gt; 1.1.2.4&lt;br /&gt;haskell98-1.0.1.1 (reinstall)&lt;br /&gt;cpphs-1.11 (new package)&lt;br /&gt;haskell-src-exts-1.10.2 (new package)&lt;br /&gt;derive-2.4.2 (new package)&lt;br /&gt;GenI-0.21 (new package)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;See that little arrow? &amp;nbsp;It says that the reason &lt;i&gt;random&lt;/i&gt;, the cause of all my heartache, is being reinstalled because of it wants to depend on an older version of &lt;i&gt;time&lt;/i&gt;. &amp;nbsp;Why on earth would it want to do that? &amp;nbsp;...&amp;nbsp;Oh, because I told it to. &amp;nbsp;Apparently, some past version of myself decided to put this dependency in GenI.cabal: &lt;code&gt;time == 1.1.2.4&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oops!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think the problem looks like this. &amp;nbsp;GenI uses the derive package, which triggers a chain of dependencies all the way down to &lt;i&gt;random&lt;/i&gt; and &lt;i&gt;time&lt;/i&gt;. &amp;nbsp;Unfortunately, GenI also directly depends on &lt;i&gt;time&lt;/i&gt;&amp;nbsp;but now we have an issue. &amp;nbsp;I'm not entirely clear on why this causes a recompile as opposed to the more usual "this will likely cause an error" output (maybe the latter is only appropriate for direct dependencies, ie. if derive depended on time itself?). &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-LNxf7FoamMo/TW0Inz5YrZI/AAAAAAAAAc8/3LyI63ZFlv0/s1600/dep-pain.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://lh5.googleusercontent.com/-LNxf7FoamMo/TW0Inz5YrZI/AAAAAAAAAc8/3LyI63ZFlv0/s320/dep-pain.png" width="172" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;By forcing GenI to use this old version of &lt;i&gt;time&lt;/i&gt;, I was indirectly forcing it to install a version of &amp;nbsp;the &lt;i&gt;random&lt;/i&gt; package that depends on this old version. &amp;nbsp;In doing so, I would clobber the version of the random package that QuickCheck uses. &lt;br /&gt;&lt;br /&gt;Fixing the issue in GenI was relatively straightforward. &amp;nbsp;Did I really need to be using such a constrained version of time? &amp;nbsp;It turns out that &lt;code&gt;time == 1.1.*&lt;/code&gt; works perfectly fine (taking advantage of the PVP promise of backwards compatibility in all A.B.* versions of a package). &amp;nbsp;Just one little dependency and everything works a lot more smoothly.&lt;br /&gt;&lt;br /&gt;So what did I learn from this?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;take a deep breath - I think when I'm faced with these issues, I'm feeling really impatient to get on with my work. &amp;nbsp;But solving the issue involves recognising just some silly little problem, which can be hard to do when I'm being impatient. &amp;nbsp;So part of the trick is to defocus somehow and shift to poking mode.&lt;/li&gt;&lt;li&gt;use &lt;code&gt;cabal install --dry-run -v2&lt;/code&gt; and study the end part : what packages are we trying to install and why? &amp;nbsp;The -v2 is important because it tells you why packages are being installed.&lt;/li&gt;&lt;li&gt;??? &amp;nbsp;hunt for the offending dependency - for me this was a simple case of staring at GenI.cabal. &amp;nbsp;What if GenI depended on some library which in turn depended on time-1.1.2.4? &amp;nbsp;I guess the answer would lie in the list of packages that cabal-install says it would install. &amp;nbsp;The dependency must lie *somewhere* in the chain.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;If I understand correctly, this may actually an improvement over the pre GHC 6.12 days before the ABI hash was introduced. &amp;nbsp;I don't actually know, but I could imagine there's something that'd make one random not-quite-compatible with the other, even if they're both version 1.0.0.3 and silently swapping one out for the other would cause subtle breakage. &amp;nbsp;At least now, we know if something is wrong and we can fix it relatively easily by just reinstalling the missing package.&lt;br /&gt;&lt;br /&gt;This dependency stuff must be really tricky! &amp;nbsp;It looks like there may be some work that could make life better, for example, a Nix-like approach where both versions of random 1.0.0.3 could co-exist. &amp;nbsp;But we should be glad in the meantime that Duncan et al have not torn their hair out yet. &amp;nbsp;(Just think of the pre-Cabal-install days if it helps, life's much better now, isn't it?)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6433791826330702587?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6433791826330702587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6433791826330702587' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6433791826330702587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6433791826330702587'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2011/05/untangling-cabal-install-problem.html' title='untangling a cabal install problem'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-LNxf7FoamMo/TW0Inz5YrZI/AAAAAAAAAc8/3LyI63ZFlv0/s72-c/dep-pain.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3501167867880608203</id><published>2011-04-19T18:42:00.008+02:00</published><updated>2011-04-20T01:55:55.758+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>why darcs users care about consistency</title><content type='html'>In the Darcs community, we've been discussing the recent blog posts saying that &lt;a href="http://r6.ca/blog/20110416T204742Z.html"&gt;Git is inconsistent&lt;/a&gt;, that it &lt;a href="http://bramcohen.livejournal.com/74462.html"&gt;cannot be made to be consistent&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;With Darcs being the foil to Git for the purposes of this discussion, I thought it would be useful if I cleared up a few points, particularly this first one:&lt;br /&gt;&lt;h4&gt;consistency is a usability issue&lt;/h4&gt;When people say they like Darcs, they don't generally talk about it having a beautiful or elegant theory. Instead, they talk about how easy and simple it is to use, about how they never really had to grapple with a learning curve or feel stupid for doing something wrong.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;What makes Darcs so simple to use? Did it hit the right notes by accident or through David Roundy's good taste? Or is usability merely in the eye of the beholder? Some of these explanations may be true, but I think what lies at the heart of Darcs' usability is that it supports a very simple way of understanding a repository:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;a darcs repository is a set of patches&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;This mental model may not be suitable for everybody, and in the long run Darcs may need to improve its support for history tracking. &amp;nbsp;But if you want to understand why, for all its current shortcomings, people continue to use and develop Darcs, you must appreciate how refreshingly simple the set-of-patches mental model can be. &amp;nbsp;As a Darcs user you are freed from a lot of the artefacts of worrying about commit order. &amp;nbsp;Collaborating with people is just question of shuffling patches around, with no merge states, no rebases, way fewer spurious dependencies to worry about.&lt;br /&gt;&lt;br /&gt;But simplicity is hard. &amp;nbsp;In order to make this simple world view possible, Darcs has to guarantee a property that any ordering of patches allowed by Darcs commutation rules is equivalent. If Darcs gives you the option of skipping a patch, it has to work hard to make sure that if you include the patch later on, that the repository you get is equivalent.  That's what the patch theory fuss is about. &amp;nbsp;While it's useful that Darcs tends to attract purists and &lt;a href="http://math.ucla.edu/~jjacobson/patch-theory"&gt;math geeks&lt;/a&gt;, we're really not engaged in the pursuit of some sort of ivory tower theoretical elegance for its own sake. &amp;nbsp;Ultimately what we're after is usability. &lt;br /&gt;&lt;br /&gt;A good user interface minimises work for the user, be it cognitive, memory or physical work. The joy of Darcs is being able to focus cognitive work on our real jobs, and not on babysitting version control systems. &amp;nbsp;So when Russell O'Connor says that merges ought to be associative, he's not saying this to tick some sort of mathematical box, what I think he's really saying is as a Darcs user, he doesn't want to worry about the difference between pushing patches one at a time vs all in one go.&amp;nbsp;Consistency is a usability issue.&lt;/div&gt;&lt;div&gt;&lt;h4&gt;darcs is imperfect&lt;/h4&gt;Darcs is very much a work in progress. &amp;nbsp;Some users have felt let down by Darcs: whenever performance grew to be unacceptable for their repositories, when they hit one exponential merge too many, or when Darcs just plain did something wrong. Even our much vaunted usability has cracks at the edges, a confirmation prompt too many, an inconsistent flag set, a non-reversible operation or two.&lt;br /&gt;&lt;br /&gt;I particularly want to make sure I'm very clear about this point:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;darcs patch theory is incomplete&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;We still don't know how to cope with complicated conflicts. Moreover the implementation of our first two theories is somewhat buggy.  Darcs copes well enough with most every day conflicts, but if a conflict gets hairy enough, Darcs will crash and emit a nasty message. &amp;nbsp;This is one of the reasons why we don't recommend Darcs for large repositories.&lt;br /&gt;&lt;br /&gt;Our version of "don't do that" is not to maintain long term feature branches without merging back to the trunk on a regular basis.  This is not acceptable for bigger projects, but for smaller projects like Darcs itself, the trade-off between a simple user interface in the general case, and the occasional hairy conflict can be worth it.  In the long run, we have to fix this.  We are revising our patch theory again, this time taking a much more rigorous and systematic approach to the problem.&lt;br /&gt;&lt;br /&gt;In the interim, we will be gaining some powerful new tools to help work around the problem, namely a new "darcs rebase" feature that will allow users to smooth away conflicts rather than letting them get out of hand.  This will be a crucial bridging tool while we continue to attack the patch theory problem.&lt;/div&gt;&lt;h4&gt;patch theory is simple at heart&lt;/h4&gt;I am in the awkward position of being a non-expert maintainer, having to defer a lot of thinking about software engineering and patch theory to the rest of the Darcs team. In a way, this is healthy for Darcs, because we have long suffered from an excess concentration of expertise. &lt;a href="http://en.wikipedia.org/wiki/Tarte_Tatin"&gt;Inverting the pie&lt;/a&gt; so that you basically have the number one Darcs Fan as the maintainer is useful because it forces everybody else to break things down into words an Eric can understand.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;The good news is that &lt;a href="http://irclog.perlgeek.de/darcs/2009-08-12#i_1387741"&gt;basic patch theory&lt;/a&gt; is one of these things an Eric can understand: patches have inverses and may sometimes be commuted. &amp;nbsp;Just learning the core theory teaches you how merging and cherry picking works, why you can trust the set-of-patches abstraction and most importantly, how simple Darcs is. So we're not after some kind of magical AI here, nor are we trying to guess user intention. The things we do with patches are much more&amp;nbsp;mechanical, systematically adjusting patches to context, one at a time, click-clack on the abacus until the merge is complete.&lt;br /&gt;&lt;h4&gt;patch vs snapshot is not so important&lt;/h4&gt;We think it's important to continue working on Darcs because we are exploring territory that no other version control system is looking at - patch-based version control.  That said, patches and snapshots are duals of each other.  We think that things that Darcs can do are possible in snapshot based version control and we would be very interested to see work in that direction.&lt;br /&gt;&lt;br /&gt;The secret to Darcs merging is that it replaces guesswork (fuzz factor) with history.  A darcs patch only exists in the context of its predecessors, and if we want to apply a patch to a different context, we mechanically transform the patch to fit.  We think this sort of history-aware merging could be implemented in Git.  In fact, we would be excited to see somebody taking up the challenge.  Git fans! How about stealing history-aware merging from us?&lt;/div&gt;&lt;div&gt;&lt;h4&gt;exponential merges still exist but there are fewer of them&lt;/h4&gt;We have developed two versions of patch theory. The second version avoids a lot of the common causes of exponential merge blowups, but it is still possible to trigger them. Recent Darcs repositories are created using version 2 of the theory. For compatibility's sake, repositories created before Darcs 2 came along tend to still be using version 1 of the theory (we only recommend converting if conflicts become a problem).&lt;br /&gt;&lt;br /&gt;The most well-known remaining cause of blowups in theory 2 is the problem of "conflict fights" where one side of the conflict resolves the conflict and gets on with their life without propagating the resolution back to the other side. What tends to happen there is that we not only encounter the conflict again in the future, but we also conflict with the resolution!  &lt;br /&gt;&lt;br /&gt;So life is definitely better with Darcs 2. We've given the exponential merge problem a good knock on the head, but it's still staggering around and we're working our way to the finishing blow.&lt;/div&gt;&lt;h4&gt;performance is improving&lt;/h4&gt;I think that when people complain about Darcs being slow, they're not talking about the exponential merge problem.  They're mostly referring to day-to-day issues like the time it takes to check out a repository.  Our recent focus has been to solve a lot of these pedestrian performance issues.  For example, the upcoming Darcs 2.8 is like to use a new "packs" feature which makes it possible to fetch a repository in the form of two larger tarballs rather than thousands of little patch files.  This makes a big difference!&lt;br /&gt;&lt;br /&gt;Another improvement we hope to bring to Darcs 2.8 is the performance of the darcs annotate command (cf. git blame). &amp;nbsp;Annotate has neglected for a while, and to make things better, we've basically reimplemented the command from scratch with more readable output to boot. &amp;nbsp;As an example of something fixed along the way, one misfeature of the old annotate is that would work by applying all the patches relevant to a given file, building it up from the very beginning. &amp;nbsp;But if you think about it, annotating a file is really about annotating its current state; we don't care about ancient history!  So one of the Darcs hackers had the sort of idea that’s obvious in hindsight: rather than applying patches forwards from the beginning of history, we simply unapply them from the end. &amp;nbsp;Much faster.  &lt;br /&gt;&lt;br /&gt;We're not yet trying to compete with Git when working on these performance issues.  We admire the performance that Git can deliver and we agree that getting speed right is a usability issue (too slow and your user loses their train of thought). &amp;nbsp;But we've been picking a lot of low hanging fruit lately, solving problems that make Darcs faster with very little cost. We hope you'll like the results!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3501167867880608203?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3501167867880608203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3501167867880608203' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3501167867880608203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3501167867880608203'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2011/04/why-darcs-users-care-about-consistency.html' title='why darcs users care about consistency'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-2486897122588806407</id><published>2011-02-18T12:27:00.003+01:00</published><updated>2011-02-18T12:35:52.856+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quickcheck'/><title type='text'>practical QuickCheck revisited - separate testing hierarchy</title><content type='html'>I'll begin this post with a quote from 2009-Eric:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px;"&gt;This may go down as the kind of bad advice that "seemed like a good idea at the the time".&lt;/span&gt;&lt;/blockquote&gt;The &lt;a href="http://koweycode.blogspot.com/2009/07/some-ideas-for-practical-quickcheck.html"&gt;advice in question&lt;/a&gt; was to "bake unit tests in". &amp;nbsp;The basic idea was that whatever module you write should have its own testSuite function exposing unit tests for that particular module. &amp;nbsp;The advantages were simplicity (no parallel test hierarchy), the ability to ship a binary with self-tests, and the ability to non-exported functions, helper code with a granularity that lends itself more to testing (easier to think of tests for them).&lt;br /&gt;&lt;br /&gt;I was unconvinced by the counterargument that it was &lt;a href="http://xunitpatterns.com/Test%20Logic%20in%20Production.html"&gt;not a good idea to mix testing and business logic&lt;/a&gt;. &amp;nbsp;To be clear, I did agree with the spirit of the advice -- I'm not about go around questioning the kind of wisdom a community gains by watching rockets blow up -- but I felt that I was not advocating any such mixing. &amp;nbsp;All I wanted was to put my testing code in the same file as the business code, cordoned off in a testing section at the end of the file if you want without any sort of if-testing-mode-do-X logic. &amp;nbsp;So I thought that the counterargument was right, but that it didn't apply to this particular context. &amp;nbsp;(I'd be interested to see when/if I change my mind on this, maybe it leads to temptation to mix logic, which is bad.)&lt;br /&gt;&lt;br /&gt;In any case, I don't need to change my mind on that particular point. Being the kind of person that only learns the hard way, I've found myself forced to divorce my test code from the business code after all.&amp;nbsp;It's mainly a practical problem of&amp;nbsp;dependencies (this was pointed out by Echo Nolan and Ivan Miljenovic). Forcing users to install QuickCheck and test-framework, when they probably don't care about testing, when they just see your module as yet another dependency on the the road to some other more pressing goal, is really a bit anti-social. &lt;br /&gt;&lt;br /&gt;The problem isn't installing the package &lt;i&gt;per se&lt;/i&gt; (it all happens automatically with cabal install), but dealing with package &lt;i&gt;version&lt;/i&gt; dependencies. &amp;nbsp;So GenI depends on test-framework 2.x and QuickCheck 1.2. &amp;nbsp;What if I go away for a few years, stop hacking on GenI and in the meantime the rest of the world moves on to using QuickCheck 2.x and test-framework 3? &amp;nbsp;What happens when they try to install GenI and cabal install needs to rebuild the random package, which then breaks QuickCheck-2.4 because it depends on random too. &amp;nbsp;Headaches all around.&lt;br /&gt;&lt;br /&gt;I think I can live with a separate hierarchy. Arguing with past-Eric a bit:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;All the extra modules and what not are not that big a deal (and I could probably let myself go wrt imports, etc).&lt;/li&gt;&lt;li&gt;Who cares if there's an extra geni-test binary, which only gets enable with -ftest anyway?&lt;/li&gt;&lt;li&gt;Self tests, shmelf tests. &amp;nbsp;Seriously, who is going to run that geni --test function anyway?&lt;/li&gt;&lt;li&gt;If I forget to cabal configure -ftest, I can always cabal configure again and build&lt;/li&gt;&lt;li&gt;If I'm really desperate to test some internal function, I could always export an alias like testingFoo for every foo I want to test, applying a sort of Pythonesque we're-all-grownups-here principle.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Also maybe forcing yourself to test only the exported functions, enforces a kind of general black-box thinking which is healthy if you're writing a library.&lt;/li&gt;&lt;/ol&gt;So, with&amp;nbsp;apologies to Ivan for not understanding his rants 2 years ago; and also anyone that may have listened to 2009-Eric for any messes I got you and your users in, I'm retracting that particular bit of advice and separating my test hierarchies like a good boy. &amp;nbsp; Let's see if 2013-Eric decides to post some kind of retraction retraction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-2486897122588806407?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/2486897122588806407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=2486897122588806407' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2486897122588806407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2486897122588806407'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2011/02/practical-quickcheck-revisited-separate.html' title='practical QuickCheck revisited - separate testing hierarchy'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8560769574633037763</id><published>2010-12-02T19:54:00.005+01:00</published><updated>2010-12-04T07:58:49.693+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='gitit'/><title type='text'>personal gitit wiki on MacOS X</title><content type='html'>&lt;div&gt;Here's a quick little recipe for using gitit as a personal wiki on MacOS X.  I assume here you already have the wiki itself set up, and now you just want it to run automatically in the background whenever you log in.  You can do this by using launchd.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Download net.johnmacfarlane.gitit.plist from this &lt;a href="https://gist.github.com/725809"&gt;Gist&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Replace the WorkingDirectory with the path to your personal wiki&lt;/li&gt;&lt;li&gt;Replace the last part of the PATH to include your cabal directory, and possibly something like /usr/local/bin or /opt/local/bin if you're using Git instead of Darcs&lt;/li&gt;&lt;li&gt;Save the file in ~/Library/LaunchAgents&lt;/li&gt;&lt;li&gt;Test it with &lt;code&gt;launchctl load ~/Library/LaunchAgents,&lt;/code&gt; maybe using the Console application to search for logs should something go wrong.&lt;/li&gt;&lt;li&gt;Log out and log back in (or maybe even restart your computer if you want to be sure)&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Helpful bits and pieces:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;This &lt;a href="http://www.macgeekery.com/tips/all_about_launchd_items_and_how_to_make_one_yourself"&gt;MacGeekery article&lt;/a&gt;&lt;/li&gt;&lt;li&gt;launchd.plist man page&lt;/li&gt;&lt;li&gt;Property List Editor in Developer Tools (beats looking at XML)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Edit 2010-12-04&lt;/b&gt;: Fixed broken link&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8560769574633037763?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8560769574633037763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8560769574633037763' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8560769574633037763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8560769574633037763'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2010/12/personal-gitit-wiki-on-macos-x.html' title='personal gitit wiki on MacOS X'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5531362719243723465</id><published>2010-09-22T10:34:00.006+02:00</published><updated>2010-09-22T11:42:25.200+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>Early Career Researcher: the computer game</title><content type='html'>&lt;div&gt;&lt;div&gt;Here's an idea for a computer game called  Early Career Researcher. The simple version being a fairly mindless turn-based RPG-esque deal.  Nothing earth shattering in terms of game mechanics, but perhaps an amusing toy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You have&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;personal attributes (eg. writing, social skills, initiative)&lt;/li&gt;&lt;li&gt;inputs (eg. ideas, papers to review)&lt;/li&gt;&lt;li&gt;daily resources (eg. time, energy)&lt;/li&gt;&lt;li&gt;actions (eg. check email, write paper, write grant proposal, lab work [or some generic term for "actual" research leg work], take nap, go to pub)&lt;/li&gt;&lt;li&gt;outcomes (eg. paper accepted, grant awarded, contract extension)&lt;/li&gt;&lt;li&gt;light bulbs (XP)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The goal of the game is just to maximise light bulbs.  The basic model is that every turn consists of a "day" (a day should take about 5-10 minutes to play).  In each day, you can do any number of actions, but the kinds of actions are limited by the inputs and daily resources you have.  For example, you could do write a paper, but in order to do so, you'd need a paper-topic resource to consume, not to mention time.  Likewise, you could check your email and it may only take a few minutes, but it could also use up a lot of your energy.  Actions may result in outcomes, but whether or not they do so depends on a combination of personal attributes and luck.  For example, writing a paper may result in paper accepted, depending on writing skills, research-fu and the dice roll.  Going to the pub (presumably chatting with colleagues) may result in Ideas depending on social skills and creativity and the dice roll.  Outcomes generate inputs (eg. ideas) and Lightbulbs (XP).  If you get enough XP to level up, you can use your lightbulbs to purchase personal attributes.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As the game develops it should become clearer that it's important to choose your actions wisely, and also to pay attention to the notion of balance.  Spending all your time doing lab work or writing grant proposals may seem like a good idea, but if you fail to spend enough time in the pub or take sufficient naps, you may not generate sufficient idea resources to make very much progress.  Or maybe if you're too lazy and spending all your time just trying to be inspired, you just don't make sufficient practical progress to get anywhere.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So if anybody wants to code this up as a little exercise...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5531362719243723465?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5531362719243723465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5531362719243723465' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5531362719243723465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5531362719243723465'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2010/09/early-career-researcher-computer-game.html' title='Early Career Researcher: the computer game'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5482935820270674395</id><published>2010-03-28T17:50:00.015+02:00</published><updated>2010-03-28T21:08:22.917+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mutt'/><category scheme='http://www.blogger.com/atom/ns#' term='gtd'/><title type='text'>hsgtd and friends 1: mutt inbox and actions</title><content type='html'>I've been practising the methodology of Getting Things Done for over 4 years now, but I'm still not very good at it.&lt;br /&gt;&lt;br /&gt;I hope to write a small serious of postings showing my current GTD state of the art.  I hope it will be useful to somebody out there and that I will get some ideas on fine-tuning my approach.&lt;br /&gt;&lt;br /&gt;Another hope I have is to reach out to technical people who are resisting "becoming more organised" because of the apparent overhead involved.  I hope to demonstrate that you can actually get a lot of mileage out of a handful of shell scripts and simple practices (keeping all your mail in a single folder).&lt;br /&gt;&lt;h3&gt;Ingredients&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;mutt - The appeal here is to have a mail client that is malleable and which can talk to 3rd-party software.  So it doesn't necessarily have to be as old school as mutt, just scriptable and capable of playing with others.&lt;/li&gt;&lt;li&gt;hsgtd - a command line GTD tracker written in 351 lines of Haskell.  Everything is stored in a simple text file&lt;/li&gt;&lt;/ul&gt;I also use mairix, xmonad and Unison, but these will likely only be relevant in future postings.&lt;br /&gt;&lt;h3&gt;Background&lt;br /&gt;&lt;/h3&gt;In this first instalment, I would like to talk about how I deal with inbox triage.  It's useful to know a little bit of GTD terminology for this.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Inbox - things which are not yet triaged.  Practicing GTD is like using an issue tracker; you decouple triage from actions.  One priority in GTD is to empty out the inbox by performing triage on all items.  Working this way is efficient because you avoid looking at the same item or having the same thought about it (gee, I oughta...) twice.  Things go in stages.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Next actions - One of the results from the triage process is a set of "next actions", concrete physical actions like, eg. call Bob 398-0811 to see if he wants that spare external disk drive&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I use two different programs: mutt to view my inbox, and hsgtd to view my list of next actions.  In this series of posts, I'll be exploring how mutt and hsgtd might talk to each other.&lt;br /&gt;&lt;h3&gt;Inbox triage : from email to next actions&lt;/h3&gt;The most common source of next actions for me is my email, so it is very important for me to good integration between my hsgtd list and my email.    In particular, one thing I like to be able to do is to read an email, figure out what "next action" to do with it, record that next action, and pin that email to the next action for reference.&lt;br /&gt;&lt;br /&gt;To this end, I have a simple shell script and muttrc macro that you can copy from the &lt;a href="http://patch-tag.com/r/mlesniak/hsgtd/snapshot/current/content/pretty/contrib"&gt;hsgtd contrib directory&lt;/a&gt;.  The shell script greps an email from stdin for its message id and reads the command line parameters for the next action text.  It combines the two by adding an hsgtd action using the message ID as a project name.  Here's the script to show you how simple and stupid it is:&lt;pre&gt;#!/bin/bash&lt;br /&gt;MSGID=$(grep -i '^message-id' | head -n 1 | sed 's/Message-I[Dd]: /:/')&lt;br /&gt;hsgtd add "$@" "$MSGID"&lt;br /&gt;&lt;/pre&gt;To make this work with mutt, I also have a small macro that lets me call the shell script whenever I'm viewing a message:&lt;br /&gt;&lt;pre&gt;macro pager \Ca "|email-add-action"&lt;br /&gt;macro index \Ca "|email-add-action"&lt;/pre&gt;&lt;h3&gt;Triage example&lt;/h3&gt;So how does this get used in practice?  Let's say my inbox has a patch to Darcs from Guillaume.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_c6WmXt2id8U/S6-ZaVSz7QI/AAAAAAAAAYQ/i9c3jVYk100/s1600/Screen+shot+2010-03-28+at+18.56.59.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 172px;" src="http://2.bp.blogspot.com/_c6WmXt2id8U/S6-ZaVSz7QI/AAAAAAAAAYQ/i9c3jVYk100/s320/Screen+shot+2010-03-28+at+18.56.59.png" alt="" id="BLOGGER_PHOTO_ID_5453746351440653570" border="0" /&gt;&lt;/a&gt;If you saw Merlin Mann's Inbox Zero talk, there are 5 "verbs" you can apply to an inbox item.  Let's run through these.  Clearly this is not a mail I want to [i] delete, and for a variety of reasons, it's not something I want to [ii] delegate, or to [iii] defer.    Let's look at the email in mutt:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_c6WmXt2id8U/S6-Ze4a_T0I/AAAAAAAAAYY/vvebUAs_Ryg/s1600/Screen+shot+2010-03-28+at+18.57.11.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 172px;" src="http://4.bp.blogspot.com/_c6WmXt2id8U/S6-Ze4a_T0I/AAAAAAAAAYY/vvebUAs_Ryg/s320/Screen+shot+2010-03-28+at+18.57.11.png" alt="" id="BLOGGER_PHOTO_ID_5453746429589671746" border="0" /&gt;&lt;/a&gt;I can't [iv] respond yet because I need take some time out to review the patch so I need [v] track an action for this to do later.  I hit Control-a in mutt, and type in "@darcs review this".  This creates an action in hsgtd.  If I later visit hsgtd and type "list" to see the actions available, I will see the email from Guillaume:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_c6WmXt2id8U/S6-bajJtm1I/AAAAAAAAAYw/Tr-PPzfTZY4/s1600/Screen+shot+2010-03-28+at+19.08.52.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 137px;" src="http://1.bp.blogspot.com/_c6WmXt2id8U/S6-bajJtm1I/AAAAAAAAAYw/Tr-PPzfTZY4/s320/Screen+shot+2010-03-28+at+19.08.52.png" alt="" id="BLOGGER_PHOTO_ID_5453748554183842642" border="0" /&gt;&lt;/a&gt;By the way, if you're wondering about the "@darcs", the use of an at-sign before a word is an hsgtd convention for contexts.  Contexts are a useful way of dividing up actions because they signify certain constraints on where you can perform the actions (typical contexts might be @home, @work).  I use @darcs because working on darcs is sometimes something I'll do in one block at a time.  If I type "list @darcs" in hsgtd, it will show me only the actions for that context:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_c6WmXt2id8U/S6-cqUGoCaI/AAAAAAAAAY4/lKYqMSWuY74/s1600/Screen+shot+2010-03-28+at+19.14.48.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 137px;" src="http://3.bp.blogspot.com/_c6WmXt2id8U/S6-cqUGoCaI/AAAAAAAAAY4/lKYqMSWuY74/s320/Screen+shot+2010-03-28+at+19.14.48.png" alt="" id="BLOGGER_PHOTO_ID_5453749924533897634" border="0" /&gt;&lt;/a&gt;Back to main story.  We've now added Guillaume's message to hsgtd.  Let's take a closer look at the entry that was created.  You see the original action text that we typed in "&lt;span style="color: rgb(153, 153, 0);"&gt;@darcs&lt;/span&gt; review this".  Notice how the context @darcs was helpfully highlighted in yellow.  In green you will also see a strange suffix like ":&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;lt;4ba5fc74.0e0db80a.261d.ffff8b51@mx.google.com&amp;gt;&lt;/span&gt;".  This is useful for three reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;  It creates a GTD "project" for that email.  Sometimes dealing with an email requires more than one action.  In the GTD world, any set of &gt;1 action is considered a project.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[most important] It gives you a means for retrieving the email that goes with this action when you are actually predisposed to do that action.&lt;/li&gt;&lt;li&gt;It allows you to be fairly oblique in your next action texts, you can type in any short string which seems to be meaningful without having to be super-precise about it.&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Next up: waiting and review&lt;/h3&gt;In this posting, we saw a way of extracting "next actions" from your mutt inbox and storing them in an hsgtd list.  In a future posting, I hope to expand on this by exploring delegation (asking somebody else to act) and review (going over your actions and delegated items).  Actually, the review was what initially motivated this blog posting.  I'd finally worked out how to create a virtual mailbox of my hsgtd-tracked items and wanted to show it off.  But that will have to wait as this post is long enough as it is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5482935820270674395?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5482935820270674395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5482935820270674395' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5482935820270674395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5482935820270674395'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2010/03/hsgtd-and-friends-1-mutt-inbox-and.html' title='hsgtd and friends 1: mutt inbox and actions'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_c6WmXt2id8U/S6-ZaVSz7QI/AAAAAAAAAYQ/i9c3jVYk100/s72-c/Screen+shot+2010-03-28+at+18.56.59.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8893200938536930189</id><published>2010-03-20T16:15:00.004+01:00</published><updated>2010-03-20T16:19:45.982+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs team at ZuriHac</title><content type='html'>Just a quick photo showing what happens when you give a bunch of Darcs hackers a flipchart and a marker pen...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_c6WmXt2id8U/S6Tm6Q5MzzI/AAAAAAAAAXk/7S9T4jsjRzo/s1600-h/IMG_1360.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_c6WmXt2id8U/S6Tm6Q5MzzI/AAAAAAAAAXk/7S9T4jsjRzo/s320/IMG_1360.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5450735337666826034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(With thanks to David Anderson for gamely taking this photo for our collective memory)&lt;br /&gt;&lt;br /&gt;This was the result of a lively discussion on the future &lt;a href="http://wiki.darcs.net/Ideas/RebaseDesign"&gt;darcs rebase&lt;/a&gt; feature, which will make maintaining long-term branches in Darcs a lot easier.  Perhaps it'll be ready in early 2011.  We'll be sure to take our time to get this right...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8893200938536930189?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8893200938536930189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8893200938536930189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8893200938536930189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8893200938536930189'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2010/03/darcs-team-at-zurihac.html' title='darcs team at ZuriHac'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_c6WmXt2id8U/S6Tm6Q5MzzI/AAAAAAAAAXk/7S9T4jsjRzo/s72-c/IMG_1360.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-7745364752631328508</id><published>2010-01-21T18:15:00.013+01:00</published><updated>2010-01-21T22:36:53.649+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><title type='text'>heapgraph tool</title><content type='html'>&lt;a href="http://gist.github.com/282873"&gt;Here&lt;/a&gt; is a small program to help draw diagrams of heap graphs.&lt;br /&gt;&lt;br /&gt;You feed it (via stdin) a text file written a silly little language, for example:&lt;br /&gt;&lt;pre&gt;graph g0&lt;br /&gt;node n0 (closure "double" (closure "(*)" "5" "4"))&lt;br /&gt; &lt;br /&gt;graph g1&lt;br /&gt;node n0 (closure "(+)" n1 n1)&lt;br /&gt;node n1 (closure "(*)" "5" "4")&lt;br /&gt; &lt;br /&gt;graph g2&lt;br /&gt;node n0 (closure "(+)" n1 n1)&lt;br /&gt;node n1 "20"&lt;br /&gt; &lt;br /&gt;graph g3&lt;br /&gt;node n0 "40"&lt;/pre&gt;&lt;br /&gt;...pipe the results through Graphviz&lt;pre&gt;./heapgraph &amp;lt; example | dot -T pdf -o example.pdf&lt;/pre&gt;&lt;br /&gt;...and what you get back is a little series of graphs like the following:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_c6WmXt2id8U/S1iM59xFxFI/AAAAAAAAAXM/xYMNr82cyqo/s1600-h/ex.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 102px;" src="http://3.bp.blogspot.com/_c6WmXt2id8U/S1iM59xFxFI/AAAAAAAAAXM/xYMNr82cyqo/s320/ex.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5429244278256026706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I never worked out how to tell graphviz to draw the subgraphs from top to bottom instead of left to right. Help would be appreciated :-)&lt;br /&gt;&lt;br /&gt;The context is that I'm in the process of reading Rabhi and Lapalme's &lt;i&gt;Algorithms: A Functional Programming Approach&lt;/i&gt;.  One of its introductory chapters has an explanation of graph reduction.  It occured to me that I  ought to write lots of little graphs and just walk through them.  The general idea is that maybe one of the impediments to my understanding Haskell laziness/strictness was sheer impatience, that I was being far too motivated to make my programs go faster.  I'm hoping that a slower and more methodical approach will work, for example, starting by making sure I understand basic ideas like a heap first.&lt;br /&gt;&lt;br /&gt;Perhaps such a tool will be useful for you if you are in a similar position, or if you happen to be teaching this sort of stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-7745364752631328508?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/7745364752631328508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=7745364752631328508' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7745364752631328508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7745364752631328508'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2010/01/heapgraph-tool.html' title='heapgraph tool'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_c6WmXt2id8U/S1iM59xFxFI/AAAAAAAAAXM/xYMNr82cyqo/s72-c/ex.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-9087798580733835413</id><published>2009-10-08T18:44:00.002+02:00</published><updated>2009-10-08T18:47:59.527+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs hashed-storage work merged (woo!)</title><content type='html'>&lt;p&gt;&lt;span style="font-style: italic;"&gt;The following is a copy of my recent post to the darcs-users mailing list.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Hi everybody,&lt;/p&gt;&lt;p&gt;So you may have noticed me saying this in a couple of recent threads. Petr Ročkai's hashed-storage work from his 2009 Google Summer of Code project has been merged!&lt;/p&gt;&lt;p&gt;I thought I would take a few moments to give everybody an overview of how this work benefits us, and where we'll be going in the future.&lt;/p&gt;&lt;div id="in-a-nutshell"&gt;&lt;h4&gt;In a nutshell&lt;/h4&gt;&lt;p&gt;What does this mean for you? Faster repository-local operations.&lt;/p&gt;&lt;p&gt;Hashed format repositories (with darcs-1 and darcs-2 patches alike) should now be faster to use on a daily basis. We saw the very beginnings of this work in Darcs 2.3.0 with a faster darcs whatsnew. Now these speed improvements cover &lt;em&gt;all&lt;/em&gt; repository-local operations.&lt;/p&gt;&lt;p&gt;The next Darcs beta is a couple of months away, but before that, I would like to encourage you to try this out for yourself:&lt;/p&gt;&lt;pre&gt;darcs get --lazy http://darcs.net&lt;br /&gt;cd darcs.net&lt;br /&gt;cabal install&lt;/pre&gt;&lt;p&gt;For best results, please run &lt;tt&gt;darcs optimize --upgrade&lt;/tt&gt; followed by &lt;tt&gt;darcs optimize --pristine&lt;/tt&gt;. Pay attention over the next couple of weeks when you try a record, amend, revert, unrecord. If we've done our work right, there should be nothing to see. Darcs should be less noticeable, with fewer "Synchronizing pristine" messages and a faster return to the command prompt. We think you'll like it. But please get back to us. Is Darcs faster for you?&lt;/p&gt;&lt;p&gt;If you're particularly interested, I will step through these changes in greater detail at the end of this message. Meanwhile, I would like to step back a little and take stock of how these improvements fit in to the bigger picture.&lt;/p&gt;&lt;/div&gt;&lt;div id="the-road-ahead"&gt;&lt;h4&gt;The road ahead&lt;/h4&gt;&lt;p&gt;The hashed storage work is a big step forward and definitely a cause for celebration. I think it is useful to reflect on this progress and consider how it fits in with our progress since darcs 1.0.9:&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;ssh connection sharing (darcs transfer mode)&lt;/li&gt;&lt;li&gt;HTTP pipelining&lt;/li&gt;&lt;li&gt;lazy repositories&lt;/li&gt;&lt;li&gt;the global cache&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;and now&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;index-based diffing&lt;/li&gt;&lt;li&gt;hashed-storage efficiency&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;We cannot promise that Darcs will magically become fast overnight. But what we can and will do is continue chipping away at it, solving problems one at a time; release by release, a little bit better, a little bit faster every time until one day we can look back and marvel at all the progress we've made.&lt;/p&gt;&lt;p&gt;So Petr's work makes Darcs easier to live with on a day-to-day basis. But that's not enough. Now we need to turn our attention to that crucial first impression; what happens when people try Darcs out for the first time is that they darcs get a repository they want and... then... they... wait...&lt;/p&gt;&lt;p&gt;This is embarrassing, but we can fix it. In fact, we already have started working on the problem. The next version of hashed-storage will likely introduce a notion of "packs" in which the many often very small files that Darcs keeps track of will be concatenated into more substantial "packs" that compress better and reduce the ill effects of latency. My hope is that we will be able to complete the packs work by Darcs 2.5.&lt;/p&gt;&lt;p&gt;There's a lot more progress to be made: smarter patch representations, tuning for large patches, file-to-patch caching for long histories. And that's just performance! For more details about our performance work, please have a look at&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://tinyurl.com/darcs-performance2"&gt;http://tinyurl.com/darcs-performance2&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If you could do anything to help, benchmark, profile, anything at all, please let us know :-)&lt;/p&gt;&lt;p&gt;The fight continues.&lt;/p&gt;&lt;/div&gt;&lt;div id="thank-you"&gt;&lt;h4&gt;Thank-you!&lt;/h4&gt;&lt;p&gt;Petr and Ganesh deserve a huge round of applause. Petr, thanks for thinking up this work, getting it done and pushing it through. Ganesh, thanks for an extremely thorough and thoughtful review. The two of you, thanks for holding on, for tenacious cooperation in the face of adversity.&lt;/p&gt;&lt;p&gt;Thanks also to all the wider Darcs community for all your support, comments, patch reviews.&lt;/p&gt;&lt;p&gt;I'm looking forward to seeing you at the upcoming Darcs hacking sprint. The sprint will take place in Vienna, Austria on the weekend of 14-15 November. Everybody, especially Darcs and Haskell newbies, is welcome to join in. Details on &lt;a href="http://wiki.darcs.net/Sprints/2009-11"&gt;http://wiki.darcs.net/Sprints/2009-11&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And if I may take a paragraph to mention this, Darcs needs your support. Every little counts, if you can send patches, review patches, tweak documentation, profile, benchmark, submit bug reports. Barring that, you could also make a contribution to our travel fund via the Software Freedom Conservancy. See &lt;a href="http://darcs.net/donations.html"&gt;http://darcs.net/donations.html&lt;/a&gt; for details.&lt;/p&gt;&lt;p&gt;Thanks everybody and enjoy!&lt;/p&gt;&lt;p&gt;Eric&lt;/p&gt;&lt;/div&gt;&lt;div id="changes-in-detail"&gt;&lt;h4&gt;Changes in detail&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Darcs uses an "index" file to compute working directory and pristine cache diffs. This avoids timestamps going out of synch when you have multiple local branches, which saves a huge and needless slowdown.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hashed storage is more efficient in general. Even if you already have perfect timestamps, the new optimisations should make Darcs faster in general.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The new 'darcs optimize --pristine' reduces spurious mismatches on directories.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Darcs no longer requires a one second sleep after applying patches.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-9087798580733835413?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/9087798580733835413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=9087798580733835413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/9087798580733835413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/9087798580733835413'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/10/darcs-hashed-storage-work-merged-woo.html' title='darcs hashed-storage work merged (woo!)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8567427712930207666</id><published>2009-09-11T17:10:00.006+02:00</published><updated>2009-09-11T17:40:08.280+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='wxhaskell'/><title type='text'>cabal installing  graphical apps on MacOS X</title><content type='html'>I have a graphical command line tool written in wxHaskell.  For the longest time, my tool was relatively easy to install on Linux but a pain on MacOS X because my users had to jump through extra post-installation hoops like creating application bundles.  &lt;br /&gt;&lt;br /&gt;Thanks to some very patient help from Beelsebob,  quicksilver, dcoutts on #haskell I was finally able to cobble together a Setup.hs file that lets me do just this.  Now when I write install instructions for my program, I no longer need to add extra bullet points telling people to turn knobs and twiggle blops just to run the GUI.   It just works.&lt;br /&gt;&lt;br /&gt;Note that this was written with wxHaskell in mind.  I hope that folks using gtk2hs and qtHaskell either do not have this problem or can make use of a similar solution.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;desiderata&lt;/h4&gt;What I wanted was for the 'cabal install' command to work as well on MacOS X as it did under Linux.  My core desiderata were:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Ability to call my application from the command line the same way you would under Linux with command line arguments correctly recognised&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No need for the user to add extra junk to the path (besides &lt;code&gt;$HOME/.cabal/bin&lt;/code&gt; which they'll already have added)  &lt;/li&gt;&lt;li&gt;No manual intervention after cabal install (eg calling scripts to create application bundles)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No need to be super-user.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;basic ideas&lt;/h4&gt;The basic ideas behind this solution are&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Replace "foo" with a shell script that calls "foo.app/MacOS/Contents/foo"&lt;br /&gt;MacOS X Leopard seems to want graphical applications to live in application bundles.  At least for wxHaskell if you invoke "foo" you get a GUI that does not respond to input.  On the other hand, if you invoke "foo.app/MacOS/Contents/foo" you get something that works.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use a Cabal postInst to create the application bundle in the bin dir.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;basic solution&lt;/h4&gt;Here is the solution.  (I'll send it as a mail to the wxhaskell-users mailing list too)&lt;pre&gt;&lt;font color=Blue&gt;-- --------------- BEGIN Setup.hs EXAMPLE ------------------------------&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Control&lt;font color=Cyan&gt;.&lt;/font&gt;Monad &lt;font color=Cyan&gt;(&lt;/font&gt;foldM_&lt;font color=Cyan&gt;,&lt;/font&gt; forM_&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Data&lt;font color=Cyan&gt;.&lt;/font&gt;Maybe &lt;font color=Cyan&gt;(&lt;/font&gt; fromMaybe &lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;Cmd&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;Exit&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;Info &lt;font color=Cyan&gt;(&lt;/font&gt;os&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;FilePath&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;Directory &lt;font color=Cyan&gt;(&lt;/font&gt; doesFileExist&lt;font color=Cyan&gt;,&lt;/font&gt; copyFile&lt;font color=Cyan&gt;,&lt;/font&gt; removeFile&lt;font color=Cyan&gt;,&lt;/font&gt; createDirectoryIfMissing &lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Distribution&lt;font color=Cyan&gt;.&lt;/font&gt;PackageDescription&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Distribution&lt;font color=Cyan&gt;.&lt;/font&gt;Simple&lt;font color=Cyan&gt;.&lt;/font&gt;Setup&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Distribution&lt;font color=Cyan&gt;.&lt;/font&gt;Simple&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Distribution&lt;font color=Cyan&gt;.&lt;/font&gt;Simple&lt;font color=Cyan&gt;.&lt;/font&gt;LocalBuildInfo&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;main&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; IO ()&lt;br /&gt;&lt;font color=Blue&gt;main&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt; defaultMainWithHooks &lt;font color=Cyan&gt;$&lt;/font&gt; addMacHook simpleUserHooks&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;  addMacHook h &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt;   &lt;font color=Green&gt;&lt;u&gt;case&lt;/u&gt;&lt;/font&gt; os &lt;font color=Green&gt;&lt;u&gt;of&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;    &lt;font color=Magenta&gt;"darwin"&lt;/font&gt; &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; h &lt;font color=Cyan&gt;{&lt;/font&gt; postInst &lt;font color=Red&gt;=&lt;/font&gt; appBundleHook &lt;font color=Cyan&gt;}&lt;/font&gt; &lt;font color=Blue&gt;-- is it OK to treat darwin as synonymous with MacOS X?&lt;/font&gt;&lt;br /&gt;    &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt;        &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; h&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;appBundleHook&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; Args &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; InstallFlags &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; PackageDescription &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; LocalBuildInfo &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; IO ()&lt;br /&gt;&lt;font color=Blue&gt;appBundleHook&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; pkg localb &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt; forM_ exes &lt;font color=Cyan&gt;$&lt;/font&gt; &lt;font color=Red&gt;\&lt;/font&gt;app &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt;&lt;br /&gt;   &lt;font color=Green&gt;&lt;u&gt;do&lt;/u&gt;&lt;/font&gt; createAppBundle theBindir &lt;font color=Cyan&gt;(&lt;/font&gt;buildDir localb &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; app &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; app&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;      customiseAppBundle &lt;font color=Cyan&gt;(&lt;/font&gt;appBundlePath theBindir app&lt;font color=Cyan&gt;)&lt;/font&gt; app&lt;br /&gt;        &lt;font color=Cyan&gt;`catch`&lt;/font&gt; &lt;font color=Red&gt;\&lt;/font&gt;err &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; putStrLn &lt;font color=Cyan&gt;$&lt;/font&gt; &lt;font color=Magenta&gt;"Warning: could not customise bundle for "&lt;/font&gt; &lt;font color=Cyan&gt;++&lt;/font&gt; app &lt;font color=Cyan&gt;++&lt;/font&gt; &lt;font color=Magenta&gt;": "&lt;/font&gt; &lt;font color=Cyan&gt;++&lt;/font&gt; show err&lt;br /&gt;      removeFile &lt;font color=Cyan&gt;(&lt;/font&gt;theBindir &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; app&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;      createAppBundleWrapper theBindir app&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;  theBindir &lt;font color=Red&gt;=&lt;/font&gt; bindir &lt;font color=Cyan&gt;$&lt;/font&gt; absoluteInstallDirs pkg localb NoCopyDest&lt;br /&gt;  exes &lt;font color=Red&gt;=&lt;/font&gt; fromMaybe &lt;font color=Cyan&gt;(&lt;/font&gt;map exeName &lt;font color=Cyan&gt;$&lt;/font&gt; executables pkg&lt;font color=Cyan&gt;)&lt;/font&gt; mRestrictTo&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- ----------------------------------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- helper code for application bundles&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- ----------------------------------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- | 'createAppBundle' @d p@ - creates an application bundle in @d@&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;--   for program @p@, assuming that @d@ already exists and is a directory.&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;--   Note that only the filename part of @p@ is used.&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;createAppBundle&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; FilePath &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; FilePath &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; IO ()&lt;br /&gt;&lt;font color=Blue&gt;createAppBundle&lt;/font&gt; dir p &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;do&lt;/u&gt;&lt;/font&gt; createDirectoryIfMissing False &lt;font color=Cyan&gt;$&lt;/font&gt; bundle&lt;br /&gt;    createDirectoryIfMissing True  &lt;font color=Cyan&gt;$&lt;/font&gt; bundleBin&lt;br /&gt;    createDirectoryIfMissing True  &lt;font color=Cyan&gt;$&lt;/font&gt; bundleRsrc&lt;br /&gt;    copyFile p &lt;font color=Cyan&gt;(&lt;/font&gt;bundleBin &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; takeFileName p&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;  bundle     &lt;font color=Red&gt;=&lt;/font&gt; appBundlePath dir p&lt;br /&gt;  bundleBin  &lt;font color=Red&gt;=&lt;/font&gt; bundle &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"Contents/MacOS"&lt;/font&gt;&lt;br /&gt;  bundleRsrc &lt;font color=Red&gt;=&lt;/font&gt; bundle &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"Contents/Resources"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- | 'createAppBundleWrapper' @d p@ - creates a script in @d@ that calls&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;--   @p@ from the application bundle @d &amp;lt;/&amp;gt; takeFileName p &amp;lt;.&amp;gt; "app"@&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;createAppBundleWrapper&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; FilePath &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; FilePath &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; IO ()&lt;br /&gt;&lt;font color=Blue&gt;createAppBundleWrapper&lt;/font&gt; bindir p &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt;  writeFile &lt;font color=Cyan&gt;(&lt;/font&gt;bindir &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; takeFileName p&lt;font color=Cyan&gt;)&lt;/font&gt; scriptTxt&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;  scriptTxt &lt;font color=Red&gt;=&lt;/font&gt; &lt;font color=Magenta&gt;"`dirname $0`"&lt;/font&gt; &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; appBundlePath &lt;font color=Magenta&gt;"."&lt;/font&gt; p &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"Contents/MacOS"&lt;/font&gt; &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; takeFileName p &lt;font color=Cyan&gt;++&lt;/font&gt; &lt;font color=Magenta&gt;" \"$@\""&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;appBundlePath&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; FilePath &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; FilePath &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; FilePath&lt;br /&gt;&lt;font color=Blue&gt;appBundlePath&lt;/font&gt; dir p &lt;font color=Red&gt;=&lt;/font&gt; dir &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; takeFileName p &lt;font color=Cyan&gt;&amp;lt;.&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"app"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- optional stupff: to be discussed later&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;mRestrictTo&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt; Nothing&lt;br /&gt;&lt;font color=Blue&gt;customiseAppBundle&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt; return ()&lt;br /&gt;&lt;font color=Blue&gt;-- --------------- END Setup.hs EXAMPLE ---------------------------------&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;fancier solution&lt;/h4&gt;&lt;br /&gt;I also have some extra wishlist items.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Possibility of installing in --global&lt;/li&gt;&lt;li&gt;Fancy custom app bundles with custom icons and what not&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Global installation might already be working with this basic script, but I haven't tested it yet.  Fancy app bundles sort of work (if I double-click it in Finder, I get a customised icon, but running it from the command line does not give me one).&lt;br /&gt;&lt;br /&gt;Here are extra hooks I created for this:&lt;br /&gt;&lt;pre&gt;&lt;font color=Blue&gt;-- ------------- BEGIN FANCY Setup.hs ADDENDUM ------------------------&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- | Put here IO actions needed to add any fancy things (eg icons)&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;--   you want to your application bundle.&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;customiseAppBundle&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; FilePath &lt;font color=Blue&gt;-- ^ app bundle path&lt;/font&gt;&lt;br /&gt;                   &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; FilePath &lt;font color=Blue&gt;-- ^ full path to original binary&lt;/font&gt;&lt;br /&gt;                   &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; IO ()&lt;br /&gt;&lt;font color=Blue&gt;customiseAppBundle&lt;/font&gt; bundleDir p &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;case&lt;/u&gt;&lt;/font&gt; takeFileName p &lt;font color=Green&gt;&lt;u&gt;of&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;  &lt;font color=Magenta&gt;"geni"&lt;/font&gt; &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt;&lt;br /&gt;    &lt;font color=Green&gt;&lt;u&gt;do&lt;/u&gt;&lt;/font&gt; hasRez &lt;font color=Red&gt;&amp;lt;-&lt;/font&gt; doesFileExist &lt;font color=Magenta&gt;"/Developer/Tools/Rez"&lt;/font&gt;&lt;br /&gt;       &lt;font color=Green&gt;&lt;u&gt;if&lt;/u&gt;&lt;/font&gt; hasRez&lt;br /&gt;          &lt;font color=Green&gt;&lt;u&gt;then&lt;/u&gt;&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;do&lt;/u&gt;&lt;/font&gt; &lt;font color=Blue&gt;-- set the icon&lt;/font&gt;&lt;br /&gt;                  copyFile &lt;font color=Magenta&gt;"etc/macstuff/Info.plist"&lt;/font&gt; &lt;font color=Cyan&gt;(&lt;/font&gt;bundleDir &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"Contents/Info.plist"&lt;/font&gt;&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;                  copyFile &lt;font color=Magenta&gt;"etc/macstuff/wxmac.icns"&lt;/font&gt; &lt;font color=Cyan&gt;(&lt;/font&gt;bundleDir &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"Contents/Resources/wxmac.icns"&lt;/font&gt;&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;                  &lt;font color=Blue&gt;-- no idea what this does&lt;/font&gt;&lt;br /&gt;                  system &lt;font color=Cyan&gt;(&lt;/font&gt;&lt;font color=Magenta&gt;"/Developer/Tools/Rez -t APPL Carbon.r -o "&lt;/font&gt; &lt;font color=Cyan&gt;++&lt;/font&gt; bundleDir &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"Contents/MacOS/geni"&lt;/font&gt;&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;                  writeFile &lt;font color=Cyan&gt;(&lt;/font&gt;bundleDir &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"PkgInfo"&lt;/font&gt;&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Magenta&gt;"APPL????"&lt;/font&gt;&lt;br /&gt;                  &lt;font color=Blue&gt;-- tell Finder about the icon&lt;/font&gt;&lt;br /&gt;                  system &lt;font color=Cyan&gt;(&lt;/font&gt;&lt;font color=Magenta&gt;"/Developer/Tools/SetFile -a C "&lt;/font&gt; &lt;font color=Cyan&gt;++&lt;/font&gt; bundleDir &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"Contents"&lt;/font&gt;&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;                  return ()&lt;br /&gt;          &lt;font color=Green&gt;&lt;u&gt;else&lt;/u&gt;&lt;/font&gt; putStrLn &lt;font color=Magenta&gt;"Developer Tools not found.  Too bad; no fancy icons for you."&lt;/font&gt;&lt;br /&gt;  &lt;font color=Magenta&gt;""&lt;/font&gt;     &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; return ()&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- | Put here the list of executables which contain a GUI.  If they all&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;--   contain a GUI (or you don't really care that much), just put Nothing&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;mRestrictTo&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; Maybe &lt;font color=Red&gt;[&lt;/font&gt;String&lt;font color=Red&gt;]&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;mRestrictTo&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt; Just &lt;font color=Red&gt;[&lt;/font&gt;&lt;font color=Magenta&gt;"geni"&lt;/font&gt;&lt;font color=Red&gt;]&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- ------------- END FANCY Setup.hs ADDENDUM ---------------------------&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8567427712930207666?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8567427712930207666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8567427712930207666' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8567427712930207666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8567427712930207666'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/09/cabal-installing-graphical-apps-on.html' title='cabal installing  graphical apps on MacOS X'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6310609928686156211</id><published>2009-07-29T13:56:00.006+02:00</published><updated>2009-07-29T14:24:04.813+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='cabal'/><title type='text'>vim and building with cabal</title><content type='html'>I don't know about you, but I've got &lt;code&gt;map ,m :make&amp;lt;Enter&amp;gt;&lt;/code&gt; in my .vimrc to bind comma-m to my build program.  This could be "ant" for Java files (for example) and "make" otherwise.&lt;br /&gt;&lt;br /&gt;Now here is a snippet to set it to "cabal build" as needed&lt;pre&gt;"-----------------------8&lt;--------------------------&lt;br /&gt;function! SetToCabalBuild()&lt;br /&gt;  if glob("*.cabal") != ''&lt;br /&gt;    set makeprg=cabal\ build&lt;br /&gt;  endif&lt;br /&gt;endfunction&lt;br /&gt;&lt;br /&gt;autocmd BufEnter *.hs,*.lhs :call SetToCabalBuild()&lt;br /&gt;"-----------------------8&lt;--------------------------&lt;/pre&gt;Apologies for making noise in case this is already redundant with a piece of Claus Reinke's very interesting and modular-looking &lt;a href="http://projects.haskell.org/haskellmode-vim/"&gt;Haskell mode for Vim&lt;/a&gt; (which I've been promising myself to install some day).  Perhaps the above will be useful anyway for those of us still limping along with configuration files cobbled together from bits and bobs on the web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6310609928686156211?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6310609928686156211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6310609928686156211' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6310609928686156211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6310609928686156211'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/07/vim-and-building-with-cabal.html' title='vim and building with cabal'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-605944240072195439</id><published>2009-07-28T09:18:00.012+02:00</published><updated>2009-07-28T11:03:52.492+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quickcheck'/><title type='text'>some ideas for practical QuickCheck</title><content type='html'>I think I've found some answers to my &lt;a href="http://koweycode.blogspot.com/2009/02/practical-quickcheck-wanted.html"&gt;practical QuickCheck&lt;/a&gt; questions.   This post may be fairly long as I'm trying to make it concrete and explicit enough to overcome the kind of inertia I had when I was still resisting testing.&lt;br /&gt;&lt;h4&gt;How do I make my tests easy to run?&lt;/h4&gt;&lt;h5&gt;1. Use &lt;a href="http://batterseapower.github.com/test-framework/"&gt;test-framework&lt;/a&gt;&lt;/h5&gt;The key thing to know about test-framework is that it is very easy to get started.  Just visit the friendly web page and copy the example.&lt;br /&gt;&lt;br /&gt;Note: An earlier post suggested the testrunner package developed for Darcs, but at the time we didn't realise that test-framework already had all the features needed.&lt;br /&gt;&lt;h5&gt;2. Support cabal test&lt;/h5&gt;Here's a Setup.hs recipe I copied.  It has the handy property of the code is that it runs your tests straight from your dist/build directory.&lt;pre&gt;&lt;font color=Blue&gt;-- EXAMPLE Setup.hs FILE 1 -----------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;FilePath&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;main&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt; defaultMainWithHooks hooks&lt;br /&gt;  &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt; hooks &lt;font color=Red&gt;=&lt;/font&gt; simpleUserHooks &lt;font color=Cyan&gt;{&lt;/font&gt; runTests &lt;font color=Red&gt;=&lt;/font&gt; runTests' &lt;font color=Cyan&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;runTests'&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; Args &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; Bool &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; PackageDescription &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; LocalBuildInfo &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; IO ()&lt;br /&gt;&lt;font color=Blue&gt;runTests'&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; lbi &lt;font color=Red&gt;=&lt;/font&gt; system testprog &lt;font color=Cyan&gt;&amp;gt;&amp;gt;&lt;/font&gt; return ()&lt;br /&gt;  &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt; testprog &lt;font color=Red&gt;=&lt;/font&gt; &lt;font color=Cyan&gt;(&lt;/font&gt;buildDir lbi&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"test"&lt;/font&gt; &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"test"&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- -----------------------------------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;The code snippet for your Setup.hs file comes from Greg Bacon's &lt;a href="http://gbacon.blogspot.com/2009/06/setting-up-simple-test-with-cabal.html"&gt;Setting up a Simple Test with Cabal&lt;/a&gt; (I tacked on an import).  As you can see, the recipe assumes you're building an executable called "test" (see Greg's post on how to do this)&lt;br /&gt;&lt;h5&gt;3. Bake your unit tests in&lt;/h5&gt;This may go down as the kind of bad advice that "seemed like a good idea at the the time".   For now, I can justify this by saying that it may be reassuring to users to be able to just run the same tests that I'm running and see for themselves that their program thinks it's working.&lt;br /&gt;&lt;br /&gt;I've been working on a program called GenI.  To help people test this program, I've added a simple "--tests" switch.   Now people can run &lt;code&gt;geni --tests&lt;/code&gt; for a self check.  If they want, they can also "cabal test", using this slight modification to Greg's setup file (to call geni itself and to pass the --tests flag in).&lt;br /&gt;&lt;pre&gt;&lt;font color=Blue&gt;-- EXAMPLE Setup.hs FILE 2 -----------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;FilePath&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;main&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt; defaultMainWithHooks hooks&lt;br /&gt;  &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt; hooks &lt;font color=Red&gt;=&lt;/font&gt; simpleUserHooks &lt;font color=Cyan&gt;{&lt;/font&gt; runTests &lt;font color=Red&gt;=&lt;/font&gt; runTests' &lt;font color=Cyan&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;runTests'&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; Args &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; Bool &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; PackageDescription &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; LocalBuildInfo &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; IO ()&lt;br /&gt;&lt;font color=Blue&gt;runTests'&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; lbi &lt;font color=Red&gt;=&lt;/font&gt; system testprog &lt;font color=Cyan&gt;&amp;gt;&amp;gt;&lt;/font&gt; return ()&lt;br /&gt;  &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt; testprog &lt;font color=Red&gt;=&lt;/font&gt; &lt;font color=Cyan&gt;(&lt;/font&gt;buildDir lbi&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"geni"&lt;/font&gt; &lt;font color=Cyan&gt;&amp;lt;/&amp;gt;&lt;/font&gt; &lt;font color=Magenta&gt;"geni --tests"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- -----------------------------------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;As for GenI, whenever I see --tests in my arguments (for example &lt;code&gt;"--tests" `elem` args&lt;/code&gt;), I just pass control to another module, which in turn strips the switch out and passes the rest of the arguments to test-framework.&lt;pre&gt;&lt;font color=Blue&gt;-- EXAMPLE TEST-FRAMEWORK WRAPPER ------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;module&lt;/u&gt;&lt;/font&gt; NLP&lt;font color=Cyan&gt;.&lt;/font&gt;GenI&lt;font color=Cyan&gt;.&lt;/font&gt;Test &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;Environment &lt;font color=Cyan&gt;(&lt;/font&gt; getArgs &lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Test&lt;font color=Cyan&gt;.&lt;/font&gt;Framework&lt;br /&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; NLP&lt;font color=Cyan&gt;.&lt;/font&gt;GenI&lt;font color=Cyan&gt;.&lt;/font&gt;GeniVal &lt;font color=Cyan&gt;(&lt;/font&gt; testSuite &lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; NLP&lt;font color=Cyan&gt;.&lt;/font&gt;GenI&lt;font color=Cyan&gt;.&lt;/font&gt;Tags &lt;font color=Cyan&gt;(&lt;/font&gt; testSuite &lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; NLP&lt;font color=Cyan&gt;.&lt;/font&gt;GenI&lt;font color=Cyan&gt;.&lt;/font&gt;Simple&lt;font color=Cyan&gt;.&lt;/font&gt;SimpleBuilder &lt;font color=Cyan&gt;(&lt;/font&gt; testSuite &lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;runTests&lt;/font&gt; &lt;font color=Red&gt;::&lt;/font&gt; IO ()&lt;br /&gt;&lt;font color=Blue&gt;runTests&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;do&lt;/u&gt;&lt;/font&gt; args &lt;font color=Red&gt;&amp;lt;-&lt;/font&gt; filter &lt;font color=Cyan&gt;(&lt;/font&gt;&lt;font color=Cyan&gt;/=&lt;/font&gt; &lt;font color=Magenta&gt;"--tests"&lt;/font&gt;&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Cyan&gt;`fmap`&lt;/font&gt; getArgs&lt;br /&gt;    flip defaultMainWithArgs args&lt;br /&gt;     &lt;font color=Red&gt;[&lt;/font&gt; NLP&lt;font color=Cyan&gt;.&lt;/font&gt;GenI&lt;font color=Cyan&gt;.&lt;/font&gt;GeniVal&lt;font color=Cyan&gt;.&lt;/font&gt;testSuite&lt;br /&gt;     &lt;font color=Cyan&gt;,&lt;/font&gt; NLP&lt;font color=Cyan&gt;.&lt;/font&gt;GenI&lt;font color=Cyan&gt;.&lt;/font&gt;Tags&lt;font color=Cyan&gt;.&lt;/font&gt;testSuite&lt;br /&gt;     &lt;font color=Cyan&gt;,&lt;/font&gt; NLP&lt;font color=Cyan&gt;.&lt;/font&gt;GenI&lt;font color=Cyan&gt;.&lt;/font&gt;Simple&lt;font color=Cyan&gt;.&lt;/font&gt;SimpleBuilder&lt;font color=Cyan&gt;.&lt;/font&gt;testSuite&lt;br /&gt;     &lt;font color=Red&gt;]&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- -----------------------------------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;There's some other things going on in this file, notably the organisation of test suites.  More on that later.&lt;br /&gt;&lt;h4&gt;Where should I put my properties?&lt;/h4&gt;&lt;h5&gt;4. Put tests in the same module (where relevant)&lt;/h5&gt;If a test is specific to one module, I tend to put them in that same source file.  I do this because&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It lets me test functions that I don't want to export&lt;/li&gt;&lt;li&gt;The tests serve as documentation&lt;/li&gt;&lt;li&gt;It forces me to update my tests along with my code&lt;/li&gt;&lt;/ol&gt;This approach is in contrast to (a) having one big tests module and (b) having a separate test hierarchy.  It may turn out to be useful to have a single big tests module as well, for example, for tests that cross the boundary from one module to the next.  That need has not arisen for me yet.  Likewise,  I don't particularly believe in a separation between tests and code, although on the other hand some very experienced hackers seem to do so, so I'll just have to let experience teach me why.&lt;br /&gt;&lt;h4&gt;How do I avoid repeating myself?&lt;/h4&gt;&lt;h5&gt;5. Provide a testSuite function for each module&lt;/h5&gt;Commenting on my last post, Josef kindly pointed out that the book-keeping I feared isn't so bad in practice.  He's right.  Nevertheless, I want to avoid it.  To do this, I make each of my modules export a &lt;code&gt;testSuite&lt;/code&gt; function.  Here is what one of my modules looks like, just focusing on the test suite&lt;br /&gt;&lt;pre&gt;&lt;font color=Blue&gt;-- EXAMPLE MODULE --------------------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;module&lt;/u&gt;&lt;/font&gt; NLP&lt;font color=Cyan&gt;.&lt;/font&gt;GenI&lt;font color=Cyan&gt;.&lt;/font&gt;GeniVal &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- SKIPPED MAIN IMPORTS ...&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Test&lt;font color=Cyan&gt;.&lt;/font&gt;Framework&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Test&lt;font color=Cyan&gt;.&lt;/font&gt;Framework&lt;font color=Cyan&gt;.&lt;/font&gt;Providers&lt;font color=Cyan&gt;.&lt;/font&gt;HUnit&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Test&lt;font color=Cyan&gt;.&lt;/font&gt;Framework&lt;font color=Cyan&gt;.&lt;/font&gt;Providers&lt;font color=Cyan&gt;.&lt;/font&gt;QuickCheck&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Test&lt;font color=Cyan&gt;.&lt;/font&gt;QuickCheck&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Test&lt;font color=Cyan&gt;.&lt;/font&gt;HUnit&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- SKIPPED MAIN CODE&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;testSuite&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt; testGroup &lt;font color=Magenta&gt;"unification"&lt;/font&gt;&lt;br /&gt; &lt;font color=Red&gt;[&lt;/font&gt; testProperty &lt;font color=Magenta&gt;"self"&lt;/font&gt; prop_unify_sym&lt;br /&gt; &lt;font color=Cyan&gt;,&lt;/font&gt; testProperty &lt;font color=Magenta&gt;"anonymous variables"&lt;/font&gt; prop_unify_anon&lt;br /&gt; &lt;font color=Cyan&gt;,&lt;/font&gt; testProperty &lt;font color=Magenta&gt;"symmetry"&lt;/font&gt; prop_unify_sym&lt;br /&gt; &lt;font color=Cyan&gt;,&lt;/font&gt; testCase &lt;font color=Magenta&gt;"evil unification"&lt;/font&gt; test_evil&lt;br /&gt; &lt;font color=Red&gt;]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- SKIPPED THE TESTS THEMSELVES&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;-- -----------------------------------------------------------------------&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;If you'll scroll up to the example that's marked TEST-FRAMEWORK WRAPPER, you'll see how these test suites are used in practice.  Note the small trick of using the qualified module name to identify the test suite.&lt;br /&gt;&lt;br /&gt;Anyway, the general principle of having a per-module test suite comes from Aidan Delaney's &lt;a href="http://blogs.linux.ie/balor/2009/07/05/organising-unit-tests-in-haskell/"&gt;Organising Unit Tests in Haskell&lt;/a&gt;.  The main difference between his approach and my approach are that I mix tests and code rather liberally.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;I hope that some of these hints will make testing easier for you, or perhaps even get you started.  If you still find yourself putting testing off, let me know. I'll be curious to see what else makes us resist. One thing that would probably be helpful is an extra guide to writing Arbitrary instances for QuickCheck, and also writing good properties that control the space well. Maybe even getting started with SmallCheck.&lt;br /&gt;&lt;br /&gt;Note that I am still somewhat new to testing and  have only recently started these practices.  So take these ideas with the usual salt.  Thanks to Greg, Reinier, Aidan, and also folks who commented on my previous posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-605944240072195439?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/605944240072195439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=605944240072195439' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/605944240072195439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/605944240072195439'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/07/some-ideas-for-practical-quickcheck.html' title='some ideas for practical QuickCheck'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5375239473955886313</id><published>2009-06-24T09:32:00.003+02:00</published><updated>2009-06-24T09:38:31.294+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>Haskell syntax highlighting on Wikipedia and Wikibooks</title><content type='html'>If you edit the &lt;a href="http://en.wikibooks.org/wiki/Haskell"&gt;Haskell Wikibook&lt;/a&gt; and Wikipedia entries with Haskell in them, you may be interested to note that &lt;a href="https://bugzilla.wikimedia.org/show_bug.cgi?id=10967"&gt;Haskell syntax highlighting&lt;/a&gt; is now available on all Wikimedia projects.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikibooks.org/wiki/User:Kowey/Haskell"&gt;Example&lt;/a&gt;:&lt;pre&gt;&amp;lt;source lang="haskell"&amp;gt;&lt;br /&gt;-- foo&lt;br /&gt;let x = foo&lt;br /&gt;&amp;lt;/source&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5375239473955886313?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5375239473955886313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5375239473955886313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5375239473955886313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5375239473955886313'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/06/haskell-syntax-highlighting-on.html' title='Haskell syntax highlighting on Wikipedia and Wikibooks'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6961537846812817456</id><published>2009-06-08T12:38:00.004+02:00</published><updated>2009-06-08T18:16:38.108+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><category scheme='http://www.blogger.com/atom/ns#' term='quickcheck'/><title type='text'>testrunner for practical quickcheck</title><content type='html'>I had mentioned in a &lt;a href="http://koweycode.blogspot.com/2009/02/practical-quickcheck-wanted.html"&gt;previous post&lt;/a&gt; three practical problems I had getting started with QuickCheck.  My third question in this post was:&lt;blockquote&gt;How do I make my tests easy to run? Do I have to write my own RunTests module? Should I just use something like quickcheck-script?&lt;/blockquote&gt;And one of the replies I got:&lt;blockquote&gt;I'm sure people are writing tests, but we all hack up harnesses in our own idiosyncratic ways.... -- blackdog&lt;br /&gt;&lt;/blockquote&gt;Maybe we can do better.  Instead of everybody hacking up their own harness, how about having one test harness that everybody wants to use?  We may even have a candidate for such a harness.  Reinier Lamers has recently released a "testrunner" package which supports some rather nice features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It can run unit tests in parallel.&lt;/li&gt;&lt;li&gt;It can run QuickCheck and HUnit tests as well as simple boolean expressions.&lt;/li&gt;&lt;li&gt;It comes with a ready-made main function for your unit test executable.&lt;/li&gt;&lt;li&gt;This main function recognizes command-line arguments to select tests by name and replay QuickCheck tests.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That's all really good stuff, but I think the number one best feature for me would be the little &lt;a href="http://projects.haskell.org/testrunner/using-testrunner.html"&gt;tutorial&lt;/a&gt; on its homepage.&lt;br /&gt;&lt;br /&gt;Testrunner is work that Reinier started in the context of the darcs project.  We were trying to make our own custom test suite faster and more useful.   Seeing ahead, Reinier did it not just by tweaking and tuning the harness we have, but by writing a more general purpose harness that did the things we wanted it to do and hopefully which other projects would want to do as well.  So do you have a Haskell project that needs testing?  Or maybe you already are doing some tests, but you just wish you could squeeze a little more out of your tests?  Give testrunner a try!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit 2009-06-08 17:15&lt;/b&gt;&lt;br /&gt;It turns out there is a second candidate, or rather a first candidate since &lt;a href="http://wiki.github.com/batterseapower/test-framework/readme"&gt;test-framework&lt;/a&gt; has been around for months.  Embarrassingly enough, I had started to use test-framework for my own stuff, but I never realised how feature complete it was.   Maybe it'll be time to merge projects?  I'll see what Reinier thinks.  Apologies to Max...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6961537846812817456?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6961537846812817456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6961537846812817456' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6961537846812817456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6961537846812817456'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/06/testrunner-for-practical-quickcheck.html' title='testrunner for practical quickcheck'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3400690550502650541</id><published>2009-02-26T11:41:00.011+01:00</published><updated>2009-02-26T12:13:23.923+01:00</updated><title type='text'>inkscape layers</title><content type='html'>Here's a small program that I wrote to extract a subset of layers from an Inkscape file.  It may be handy if you have to give a talk and you want to include some "animated" overlays in your slides.&lt;br /&gt;&lt;br /&gt;I'm writing this post because I'm pleased to be able to automate this process at last.  Also, I want to demonstrate that you don't have to be particularly clever or ambitious to get some good practical use out of Haskell.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;usage&lt;/h3&gt;&lt;br /&gt;So I've got my Inkscape file with a "base" layer and several steps of my animation "zero", "one", "two", "three".&lt;br /&gt;&lt;br /&gt;If I do &lt;code&gt;inkscape-layers myfile.svg base &amp;gt; /tmp/foo.svg &amp;&amp; inkscape --export-pdf=/tmp/foo.pdf"&lt;/code&gt;, I get just the base layer which isn't very interesting:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_c6WmXt2id8U/SaZ0EFlrKII/AAAAAAAAAS4/ywSR2lrWTsw/s1600-h/foo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 72px;" src="http://4.bp.blogspot.com/_c6WmXt2id8U/SaZ0EFlrKII/AAAAAAAAAS4/ywSR2lrWTsw/s200/foo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5307056824471201922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now if I do &lt;code&gt;inkscape-layers myfile.svg base zero&lt;/code&gt; (and convert the resulting SVG into a PDF as above), I get the zeroth layer:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_c6WmXt2id8U/SaZzyCWgYJI/AAAAAAAAASw/9zNzx7eOGiI/s1600-h/foo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 72px;" src="http://1.bp.blogspot.com/_c6WmXt2id8U/SaZzyCWgYJI/AAAAAAAAASw/9zNzx7eOGiI/s200/foo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5307056514364629138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Likewise, to build the rest of my animation, &lt;code&gt;inkscape-layers myfile.svg base one&lt;/code&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_c6WmXt2id8U/SaZ0gPW30gI/AAAAAAAAATA/7ckJ-fZnrGw/s1600-h/foo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 72px;" src="http://4.bp.blogspot.com/_c6WmXt2id8U/SaZ0gPW30gI/AAAAAAAAATA/7ckJ-fZnrGw/s200/foo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5307057308129808898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;inkscape-layers myfile.svg base two&lt;/code&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_c6WmXt2id8U/SaZ0t5rpxTI/AAAAAAAAATI/PePg8eSf6Rw/s1600-h/foo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 72px;" src="http://1.bp.blogspot.com/_c6WmXt2id8U/SaZ0t5rpxTI/AAAAAAAAATI/PePg8eSf6Rw/s200/foo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5307057542829557042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now instead of going clickity-click all over the place, I just dump this in my Makefile.  If I every have to change something about my animation (for example, in the base layer), I just run "make" and rebuild it automatically.   &lt;br /&gt;&lt;br /&gt;Yay, Haskell!  Well, I'm sure you could just as easily have written this in your favourite programming language; I just like to randomly credit Haskell for making my life easier :-D&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;the code&lt;/h3&gt;&lt;br /&gt;I may upload this to Hackage if I could maybe get some other useful inkscape tools with it:&lt;br /&gt;&lt;pre&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Data&lt;font color=Cyan&gt;.&lt;/font&gt;Maybe &lt;font color=Cyan&gt;(&lt;/font&gt;fromMaybe&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;Environment &lt;font color=Cyan&gt;(&lt;/font&gt;getArgs&lt;font color=Cyan&gt;,&lt;/font&gt; getProgName&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; System&lt;font color=Cyan&gt;.&lt;/font&gt;IO &lt;font color=Cyan&gt;(&lt;/font&gt;hPutStrLn&lt;font color=Cyan&gt;,&lt;/font&gt; stdout&lt;font color=Cyan&gt;,&lt;/font&gt; stderr&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=Green&gt;&lt;u&gt;import&lt;/u&gt;&lt;/font&gt; Text&lt;font color=Cyan&gt;.&lt;/font&gt;XML&lt;font color=Cyan&gt;.&lt;/font&gt;Light&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;main&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;do&lt;/u&gt;&lt;/font&gt; args  &lt;font color=Red&gt;&amp;lt;-&lt;/font&gt; getArgs&lt;br /&gt;    pname &lt;font color=Red&gt;&amp;lt;-&lt;/font&gt; getProgName&lt;br /&gt;    &lt;font color=Green&gt;&lt;u&gt;case&lt;/u&gt;&lt;/font&gt; args &lt;font color=Green&gt;&lt;u&gt;of&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;      &lt;font color=Cyan&gt;(&lt;/font&gt;f&lt;font color=Red&gt;&lt;b&gt;:&lt;/b&gt;&lt;/font&gt;ls&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; go f ls&lt;br /&gt;      &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt;      &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; hPutStrLn stderr &lt;font color=Cyan&gt;$&lt;/font&gt; unwords &lt;font color=Red&gt;[&lt;/font&gt; &lt;font color=Magenta&gt;"Usage:"&lt;/font&gt;&lt;font color=Cyan&gt;,&lt;/font&gt; pname&lt;font color=Cyan&gt;,&lt;/font&gt; &lt;font color=Magenta&gt;"filename"&lt;/font&gt;&lt;font color=Cyan&gt;,&lt;/font&gt; &lt;font color=Magenta&gt;"layer1"&lt;/font&gt;&lt;font color=Cyan&gt;,&lt;/font&gt; &lt;font color=Magenta&gt;"[layer2 [.. layer N]]"&lt;/font&gt; &lt;font color=Red&gt;]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;go&lt;/font&gt; f ls &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;do&lt;/u&gt;&lt;/font&gt; d &lt;font color=Red&gt;&amp;lt;-&lt;/font&gt; goodXML &lt;font color=Cyan&gt;=&amp;lt;&amp;lt;&lt;/font&gt; parseXMLDoc &lt;font color=Cyan&gt;`fmap`&lt;/font&gt; readFile f&lt;br /&gt;    &lt;font color=Green&gt;&lt;u&gt;let&lt;/u&gt;&lt;/font&gt; o &lt;font color=Red&gt;=&lt;/font&gt; stdout &lt;font color=Blue&gt;-- we may want to make this more flexible later&lt;/font&gt;&lt;br /&gt;    hPutStrLn o &lt;font color=Cyan&gt;.&lt;/font&gt; showTopElement &lt;font color=Cyan&gt;.&lt;/font&gt; wrapTop walk &lt;font color=Cyan&gt;$&lt;/font&gt; d&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;where&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;  goodXML &lt;font color=Red&gt;=&lt;/font&gt; maybe &lt;font color=Cyan&gt;(&lt;/font&gt;fail &lt;font color=Magenta&gt;"bad XML"&lt;/font&gt;&lt;font color=Cyan&gt;)&lt;/font&gt; return&lt;br /&gt;  &lt;font color=Blue&gt;--&lt;/font&gt;&lt;br /&gt;  walk x&lt;font color=Red&gt;@&lt;/font&gt;&lt;font color=Cyan&gt;(&lt;/font&gt;Elem el&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt;   &lt;font color=Green&gt;&lt;u&gt;let&lt;/u&gt;&lt;/font&gt; lbl &lt;font color=Red&gt;=&lt;/font&gt; fromMaybe &lt;font color=Magenta&gt;""&lt;/font&gt; &lt;font color=Cyan&gt;(&lt;/font&gt;findAttr qLABEL el&lt;font color=Cyan&gt;)&lt;/font&gt;&lt;br /&gt;       x2  &lt;font color=Red&gt;=&lt;/font&gt; Elem &lt;font color=Cyan&gt;$&lt;/font&gt; el &lt;font color=Cyan&gt;{&lt;/font&gt; elContent &lt;font color=Red&gt;=&lt;/font&gt; map walk &lt;font color=Cyan&gt;(&lt;/font&gt;elContent el&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Cyan&gt;}&lt;/font&gt;&lt;br /&gt;   &lt;font color=Green&gt;&lt;u&gt;in&lt;/u&gt;&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;case&lt;/u&gt;&lt;/font&gt; () &lt;font color=Green&gt;&lt;u&gt;of&lt;/u&gt;&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; &lt;font color=Red&gt;|&lt;/font&gt; not &lt;font color=Cyan&gt;(&lt;/font&gt;isLayer el&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; x2&lt;br /&gt;                   &lt;font color=Red&gt;|&lt;/font&gt; lbl &lt;font color=Cyan&gt;`elem`&lt;/font&gt; ls    &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; x2&lt;br /&gt;                   &lt;font color=Red&gt;|&lt;/font&gt; otherwise        &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; Text blank_cdata&lt;br /&gt;  walk x &lt;font color=Red&gt;=&lt;/font&gt; x&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;isLayer&lt;/font&gt; el &lt;font color=Red&gt;=&lt;/font&gt; elName el &lt;font color=Cyan&gt;==&lt;/font&gt; qSVG &lt;font color=Magenta&gt;"g"&lt;/font&gt; &lt;font color=Cyan&gt;&amp;amp;&amp;amp;&lt;/font&gt; findAttr qGROUP_MODE el &lt;font color=Cyan&gt;==&lt;/font&gt; Just &lt;font color=Magenta&gt;"layer"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;qLABEL&lt;/font&gt;      &lt;font color=Red&gt;=&lt;/font&gt; qInkscape &lt;font color=Magenta&gt;"label"&lt;/font&gt;&lt;br /&gt;&lt;font color=Blue&gt;qGROUP_MODE&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt; qInkscape &lt;font color=Magenta&gt;"groupmode"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;qSVG&lt;/font&gt; l &lt;font color=Red&gt;=&lt;/font&gt; QName l &lt;font color=Cyan&gt;(&lt;/font&gt;Just nsSVG&lt;font color=Cyan&gt;)&lt;/font&gt; Nothing&lt;br /&gt;&lt;font color=Blue&gt;nsSVG&lt;/font&gt; &lt;font color=Red&gt;=&lt;/font&gt; &lt;font color=Magenta&gt;"http://www.w3.org/2000/svg"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;qInkscape&lt;/font&gt; l &lt;font color=Red&gt;=&lt;/font&gt; QName l &lt;font color=Cyan&gt;(&lt;/font&gt;Just nsINKSCAPE&lt;font color=Cyan&gt;)&lt;/font&gt; Nothing&lt;br /&gt;&lt;font color=Blue&gt;nsINKSCAPE&lt;/font&gt;&lt;font color=Red&gt;=&lt;/font&gt;&lt;font color=Magenta&gt;"http://www.inkscape.org/namespaces/inkscape"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=Blue&gt;wrapTop&lt;/font&gt; f e &lt;font color=Red&gt;=&lt;/font&gt;&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;case&lt;/u&gt;&lt;/font&gt; f &lt;font color=Cyan&gt;(&lt;/font&gt;Elem e&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Green&gt;&lt;u&gt;of&lt;/u&gt;&lt;/font&gt;&lt;br /&gt; &lt;font color=Cyan&gt;(&lt;/font&gt;Elem e&lt;font color=Cyan&gt;)&lt;/font&gt; &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; e&lt;br /&gt; &lt;font color=Green&gt;&lt;u&gt;_&lt;/u&gt;&lt;/font&gt; &lt;font color=Red&gt;-&amp;gt;&lt;/font&gt; error &lt;font color=Magenta&gt;"programmer error: top content is not an element"&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: as an exercise: modify the attributes of all exported layers so that they are visible.  In Inkscape, I tend to make layers invisible so I don't get confused by them.  But then Inkscape does not export them, which is annoying.  This seems to be a simple matter of replacing "display:none" with "display:inline" in the style attribute (watch out, there could be more than one!).  The 'split' library on Hackage could be handy for that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3400690550502650541?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3400690550502650541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3400690550502650541' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3400690550502650541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3400690550502650541'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/02/inkscape-layers.html' title='inkscape layers'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_c6WmXt2id8U/SaZ0EFlrKII/AAAAAAAAAS4/ywSR2lrWTsw/s72-c/foo.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-4736713935107396434</id><published>2009-02-21T19:30:00.007+01:00</published><updated>2009-02-21T20:27:21.931+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monads'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><title type='text'>implementing join in terms of (&gt;&gt;=)</title><content type='html'>One of the things I got out of the Typeclassopedia is a somewhat more mature understand of monads (at last!).  As a bonus side-effect it has also given me a slightly better understanding of myself.  Specifically, I learned I often have trouble learning things because I suffer from a sort of "failure to unify".  I thought I might make a note of it for the benefit of anybody else who is interested in how they learn... or not, as the case may be.&lt;br /&gt;&lt;br /&gt;So,&lt;ul&gt;&lt;li&gt;we have &lt;code&gt;(&amp;gt;&amp;gt;=) :: m a -&amp;gt; (a -&amp;gt; m b) -&amp;gt; m b&lt;/code&gt;&lt;li&gt;we want  &lt;code&gt;join :: m (m x) -&amp;gt; m x&lt;/code&gt;&lt;/ul&gt;My mind drew a complete blank.  So I went with something "direct" via do notation:&lt;pre&gt;join mmx =&lt;br /&gt; do mx &amp;lt;- mmx&lt;br /&gt;    x  &amp;lt;- mx&lt;br /&gt;    return x&lt;/pre&gt;Those last two lines are redundant:&lt;pre&gt;join mmx =&lt;br /&gt; do mx &amp;lt;- mmx&lt;br /&gt;    mx&lt;/pre&gt;&lt;br /&gt;Hang on, Eric, surely you don't need the crutch of do notation...&lt;pre&gt;join mmx = mmx &amp;gt;&amp;gt;= (\mx -&amp;gt; mx)&lt;/pre&gt;That's just &lt;code&gt;id&lt;/code&gt;:&lt;pre&gt;join mmx = mmx &amp;gt;&amp;gt;= id&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;But wait!&lt;/span&gt;  Surely that can't be right!  Doesn't &lt;code&gt;(&amp;gt;&amp;gt;=)&lt;/code&gt; require something of type &lt;code&gt;a -&amp;gt; m b&lt;/code&gt;?  And isn't &lt;code&gt;id&lt;/code&gt; giving me &lt;code&gt;m x -&amp;gt; m x&lt;/code&gt;?  I stared at that for a while, almost panicking.  What did I do wrong?  And then it clicked.  Of course, the &lt;code&gt;a&lt;/code&gt; in &lt;code&gt;a -&amp;gt; m b&lt;/code&gt; could stand in for any type, including &lt;code&gt;m x&lt;/code&gt;.  Just because it doesn't have a little &lt;code&gt;m&lt;/code&gt; in it, doesn't mean that it's constrained not to have one.  &lt;br /&gt;&lt;br /&gt;A simpler version of this kind of error, although one that didn't get me this time: just because we have &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; doesn't mean we actually have to have two different types.  They &lt;em&gt;can&lt;/em&gt;, but don't &lt;em&gt;need&lt;/em&gt; to.  And that, is my "failure to unify", inventing completely illusory constraints and not seeing through them.&lt;br /&gt;&lt;br /&gt;And so &lt;code&gt;join&lt;/code&gt; is just &lt;code&gt;(&amp;gt;&amp;gt;= id)&lt;/code&gt;.  It took a little struggle, but it was well worth it!&lt;br /&gt;&lt;br /&gt;(PS, in my original attempt, I used the more conventional &lt;code&gt;m (m a)&lt;/code&gt; when thinking of the types instead of what I reported here, &lt;code&gt;m (m x)&lt;/code&gt;.  The reason I reported the later is because I didn't want to confuse the discussion with another stumbling block I have, which is a "failure to rename", i.e. forgetting that two things called &lt;code&gt;a&lt;/code&gt; in different contexts are actually two separate things.  It's like speaking a foreign language.  Just because you are aware that you have to do something, doesn't mean you will always do it automatically.  Anyway, the "failure to rename" may very likely have conspired with the "failure to unify" in making me confused for a while)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-4736713935107396434?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/4736713935107396434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=4736713935107396434' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4736713935107396434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4736713935107396434'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/02/implementing-join-in-terms-of.html' title='implementing join in terms of (&amp;gt;&amp;gt;=)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8702531753974017336</id><published>2009-02-16T16:45:00.005+01:00</published><updated>2009-02-16T16:56:40.206+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monads'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='btsg'/><title type='text'>announcing: burrito tutorial support group</title><content type='html'>It's really for the best if you leave these sorts of things out in the open.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_c6WmXt2id8U/SZmL05mWf8I/AAAAAAAAASQ/m0kin0xJqD4/s1600-h/burrito_support_group.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 178px;" src="http://1.bp.blogspot.com/_c6WmXt2id8U/SZmL05mWf8I/AAAAAAAAASQ/m0kin0xJqD4/s320/burrito_support_group.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5303423777136607170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first step is to ask for forgiveness, right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8702531753974017336?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8702531753974017336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8702531753974017336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8702531753974017336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8702531753974017336'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/02/announcing-burrito-tutorial-support.html' title='announcing: burrito tutorial support group'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_c6WmXt2id8U/SZmL05mWf8I/AAAAAAAAASQ/m0kin0xJqD4/s72-c/burrito_support_group.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-48783029780432694</id><published>2009-02-04T11:33:00.004+01:00</published><updated>2009-02-04T11:43:58.694+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quickcheck'/><title type='text'>practical quickcheck (wanted)</title><content type='html'>Despite all the glowing reports on how useful QuickCheck is, I find that I still have a lot of resistance to using it.  A lot of resistance comes from uncertainty, so in this post, I'm going to write down some of my half-formulated questions about using QuickCheck.&lt;br /&gt;&lt;br /&gt;Now, there may not be any right answer to these questions, but I'm writing them down anyway so that other people in my shoes know that they are not alone.  Later on, as I find the answers that work for me, I'll hopefully put together some notes on 'Practical QuickCheck'.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Where should I put my properties?  Xmonad and darcs seem to put them in a single properties module, but it would seem more natural to me to stick them in the same module as the functions I'm quickchecking.  That said, I imagine that some properties can be thought of as being cross-module, so maybe a properties module would make sense.&lt;/li&gt;&lt;li&gt;How do I avoid redundancy, and generally repeating myself?  Ideally, I would just write a property and be done with it.  It would annoy me to have to keep updating some list of properties somewhere else (duplication).  That said, maybe it's not really duplication if the list serves a secondary purpose of grouping the properties into some sensible hierarchy.  Maybe the real question is "how do I make sure I don't forget to run all my properties?"&lt;/li&gt;&lt;li&gt;How do I make my tests easy to run?  Do I have to write my own RunTests module?  Should I just use something like &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/quickcheck-script"&gt;quickcheck-script&lt;/a&gt;?&lt;/li&gt;&lt;/ol&gt;I might update this list later as I think of more "best practices" questions.  Hopefully I can follow this up with a short article teaching myself and others that really getting started with QuickCheck is easy easy easy (or maybe a link to a pre-existing article of the sort).  The Real World Haskell chapter on it seems helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-48783029780432694?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/48783029780432694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=48783029780432694' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/48783029780432694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/48783029780432694'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/02/practical-quickcheck-wanted.html' title='practical quickcheck (wanted)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3442265424802352158</id><published>2009-01-30T11:16:00.011+01:00</published><updated>2009-01-30T11:48:44.595+01:00</updated><title type='text'>haskell-ji</title><content type='html'>As a programmer, I find myself struggling with a lot of really mundane and stupid-looking issues like "how should I name my variables", or "should acronyms be kept upper case (XML), or smooshed down for easier CamelCasing (Xml)?" and finally "what order should my code go in?"&lt;br /&gt;&lt;br /&gt;These questions do not so much keep me up and night, but cause me an inordinate amount of flip-flopping in my code.  Not &lt;em&gt;remembering&lt;/em&gt; my preference du jour, I'll sometimes do things four different ways in code and later on suffer because I forgot that in one bit of code, I had named something &lt;code&gt;parseXML&lt;/code&gt; and in the other bit, I had named it &lt;code&gt;xmlParse&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;The good news is that things are settling down on at least one front.  It seems that all the versions of Eric past and present are settling on a consensus on How To Lay Code Out.  The result is a set of directional tips, akin to the kind of thing you learn when you are writing Chinese Hanzi (Japanese Kanji):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Types before code&lt;/li&gt;&lt;li&gt;High-level before low-level -- For example, generally using &lt;code&gt;where&lt;/code&gt; instead of &lt;code&gt;let...in&lt;/code&gt;, but also "higher-level" functions first, "detail" functions later&lt;/li&gt;&lt;li&gt;Input before output -- It's not that this was ever up for debate, it's just that sometimes, I'll write it the other way without realising that I'm doing it.&lt;/li&gt;&lt;li&gt;Odds and ends last -- At the very end of my code: an odds-and-ends section for all those little snippets of code you copy around but are that too small to justify making a library, e.g. &lt;pre&gt;buckets :: Ord b =&gt; (a -&gt; b) -&gt; [a] -&gt; [ (b,[a]) ]&lt;br /&gt;buckets f = map (\xs -&gt; (f (head xs), xs))&lt;br /&gt;        . groupBy ((==) `on` f)&lt;br /&gt;        . sortBy (compare `on` f)&lt;/pre&gt;Do you have an odds-and-ends.hs file on your computer?&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Notice that the tips are not always compatible with each other, but they do sort of point in the same general direction.&lt;br /&gt;&lt;br /&gt;Phew, I'm glad I'm starting to get at least this bit sorted.  I really hope it reduces the amount of pointless erician flip-flopping.  It's no big deal -- civilisation does not collapse because of inconsistent case conventions -- but it is a nuisance.   This kind of thing is on the order of silly American-style dates vs. European-style dates causing confusion, where we could all just be using International yyyy-mm-dd dates, and while we're at it, 24 hour time, the metric system and A4 paper...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3442265424802352158?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3442265424802352158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3442265424802352158' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3442265424802352158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3442265424802352158'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/01/haskell-ji.html' title='haskell-ji'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-1832816107388192201</id><published>2009-01-08T10:11:00.002+01:00</published><updated>2009-01-08T10:20:29.320+01:00</updated><title type='text'>fold diagram revisited?</title><content type='html'>&lt;pre&gt;z&lt;br /&gt;|&lt;br /&gt;f----1----f&lt;br /&gt;|    :    |&lt;br /&gt;f----2----f&lt;br /&gt;|    :    |&lt;br /&gt;f----3----f&lt;br /&gt;|    :    |&lt;br /&gt;f----4----f&lt;br /&gt;|    :    |&lt;br /&gt;f----5----f&lt;br /&gt;     :    |&lt;br /&gt;     []   z&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-1832816107388192201?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/1832816107388192201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=1832816107388192201' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1832816107388192201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1832816107388192201'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2009/01/fold-diagram-revisited.html' title='fold diagram revisited?'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5916046075952279381</id><published>2008-12-30T11:17:00.004+01:00</published><updated>2008-12-30T11:20:48.318+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>riot is almost a Haskell mail client</title><content type='html'>In case anybody wanted to write a mail client in Haskell, I should point out that Tuomov's &lt;a href="http://modeemi.fi/%7Etuomov/riot/"&gt;riot&lt;/a&gt; (Riot is an Information Organisation Tool) outliner&lt;br /&gt;&lt;ul&gt;&lt;li&gt;provides a sort of mutt-like user interface and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;stores its outlines as mailboxes (using in-reply-to to treat outline ancestry as thread ancestry).&lt;/ul&gt;&lt;br /&gt;So that's some of the work done for you :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5916046075952279381?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5916046075952279381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5916046075952279381' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5916046075952279381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5916046075952279381'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/12/riot-is-almost-haskell-mail-client.html' title='riot is almost a Haskell mail client'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5655956962978386431</id><published>2008-11-19T21:16:00.010+01:00</published><updated>2008-11-20T00:05:33.503+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>iterative committing</title><content type='html'>A few weeks ago, I saw this &lt;a href="http://www.reddit.com/r/programming/comments/79h2k/subversion_sucks_get_over_it/c061aj6"&gt;interesting complaint&lt;/a&gt; about distributed revision control advocacy:&lt;br /&gt;&lt;blockquote&gt;But really, to read some of these articles, you'd think 99.9% of OSS contributions come from people who live on planes, only get 10% uptime on their broadband at home, and are incapable of spending the five minutes required to install something like Subversion locally for use with side projects.&lt;/blockquote&gt; This particular complaint resonated with me because I've always had a slight feeling that all this talk of airplanes and intermittent online access is missing the point.&lt;br /&gt;&lt;br /&gt;I think what would help these discussions is to introduce the idea that there are really two ways to be disconnected: the involuntary way that most people talk about, and the voluntary way which is the really interesting one.&lt;br /&gt;&lt;br /&gt;To be involuntarily disconnected is to be literally or technically offline.  The universe prevents you from phoning home because it broke your wifi card or  plunked you deep in an Amazonian rain forest.  True, a distributed revision control system lets you continue hacking in the face of such adversity; but this fact isn't very convincing to some folks who are used to centralised revision control.   How often in today's world are you really involuntarily offline?  The trick is that sometimes your disconnectedness is entirely&lt;em&gt; voluntarily&lt;/em&gt;.  I don't really mean that in the sense of unplugging your cable modem and calling a moratorium on network access for the day.  The minute you want to commit to a server and can't because of missing network access, you are offline involuntarily, even if this came as the result of a voluntary decision.&lt;br /&gt;&lt;br /&gt;What I mean is that distributed revision control allows you to have pockets of&lt;em&gt; deliberate&lt;/em&gt; disconnectedness from your peers.  You want to work on something in little bits and pieces, you want to version control your work in progress, but you don't want to inflict your uncompleted work on your friends.  A distributed VCS gives you a chance to step back for a moment and continue working with the benefit of version control.  There are two alternatives to stepping back, neither of which are really acceptable.  The first is to go ahead and commit your stuff with wild abandon, the consequences of which being that you pollute the change history with unfinished work and make life potentially difficult for your friends.  The second alternative is NOT to commit your stuff at all, the consequences of which being that you lose the ability to track and log your your work as you go along.&lt;br /&gt;&lt;br /&gt;A distributed revision control system gives you the choice of &lt;i&gt;iterative committing&lt;/i&gt;.  It doesn't really matter if you are online or offline actually.  Sometimes you just want to commit something for your own sake and only later decide if the commits should be shared with the main repository or not.  In the meantime you can choose to go back, undo a commit, redo a commit, undo all your intermediary commits and lump them all into one big commit, update from the main repository and then rework your commit in the new context.  These are the choices that a distributed revision control system offers.&lt;br /&gt;&lt;br /&gt;It's heartening to see that the idea of using a distributed VCS is catching on, that people are starting to adopt the likes of darcs, git, mercurial and bzr for their work.  It means that the joy of iterative committing is spreading.  Of course, I am partial to one of these systems in particular.  Perhaps in a future article, I can describe what I think is the essential difference between darcs and our estimable competitors. I think I will call it&lt;i&gt; iterative merging&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Happy committing in the meantime!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5655956962978386431?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5655956962978386431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5655956962978386431' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5655956962978386431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5655956962978386431'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/11/iterative-commiting.html' title='iterative committing'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3027599009219162284</id><published>2008-11-07T19:01:00.005+01:00</published><updated>2008-11-07T19:24:51.778+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>timesheet helper</title><content type='html'>I wish there was a simple, no-fuss command line timesheet helper in the spirit of cabal-install and &lt;a href="http://software.complete.org/software/wiki/twidge/"&gt;twidge&lt;/a&gt;.  The kind of interactions I imagine are:&lt;pre&gt;&lt;br /&gt;09:00 # timesheet start work draft 3 of the paper&lt;br /&gt;10:00 # timesheet start darcs dwn&lt;br /&gt;10:45 # timesheet start work regression test for ppack&lt;br /&gt;12:00 # timesheet stop&lt;br /&gt;12:30 # timesheet start darcs roadmap&lt;br /&gt;13:15 # timesheet start work regression test for ppack&lt;br /&gt;16:30 # timesheet start darcs patch review&lt;br /&gt;17:00 # timesheet start work meeting&lt;br /&gt;18:30 # timesheet stop&lt;br /&gt;&lt;br /&gt;18:30 # timesheet summary&lt;br /&gt;Today 2008-11-07&lt;br /&gt;-------------------&lt;br /&gt;darcs: 2h&lt;br /&gt;work: 6h 30m&lt;br /&gt;&lt;br /&gt;18:30 # timesheet details&lt;br /&gt;Today 2008-11-07&lt;br /&gt;-------------------&lt;br /&gt;darcs: 2h&lt;br /&gt;* dwn: 30 m&lt;br /&gt;* roadmap: 45m&lt;br /&gt;* patch review: 45m&lt;br /&gt;work: 6h 30m&lt;br /&gt;* draft 3 of the paper: 1h&lt;br /&gt;* regression test for ppack: 4h&lt;br /&gt;* meeting: 1h 30m&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(Note the assumption here that you are never working on two tasks at the same time; clocking in to a new task automatically clocks you out of an old one).  The key to this application is simplicity.  In its present state, &lt;a href="http://gpe.linuxtogo.org/projects/gpe-timesheet.shtml"&gt;gpe-timesheet&lt;/a&gt; (0.32) uses too many confirmation dialogues to be really useful.  &lt;a href="http://loggr.co.uk/"&gt;Loggr&lt;/a&gt; is nice and simple, but if I close my browser window, I lose track of things.  Another property I would like to have is for the application to be forgiving to mistakes.  If it stored timesheets in a simple text format, for example, I could just edit out my mistakes in a text-editor.&lt;br /&gt;&lt;br /&gt;For Haskellers, I also wish that we had a common library for writing command line applications with subcommands and switches.  This would be useful for darcs, cabal-install, twidge, this timesheet application, and more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3027599009219162284?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3027599009219162284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3027599009219162284' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3027599009219162284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3027599009219162284'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/11/timesheet-wishlist.html' title='timesheet helper'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6388905947384833861</id><published>2008-10-30T15:35:00.003+01:00</published><updated>2008-10-30T15:37:05.977+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>official darcs blog!</title><content type='html'>Darcs weekly news has moved!  It will now be hosted on the official darcs blog at &lt;a href="http://blog.darcs.net"&gt;http://blog.darcs.net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The latest entry, &lt;a href="http://blog.darcs.net/2008/10/darcs-weekly-news-10.html"&gt;darcs weekly news #10&lt;/a&gt; has been posted on the new blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6388905947384833861?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6388905947384833861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6388905947384833861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6388905947384833861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6388905947384833861'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/10/official-darcs-blog.html' title='official darcs blog!'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-4901380370775001590</id><published>2008-10-26T18:29:00.005+01:00</published><updated>2008-10-26T18:42:38.058+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs hacking sprint - Team Brighton Day 2</title><content type='html'>Ganesh and Ian, slurpies and curl&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_c6WmXt2id8U/SQSpMxV0FbI/AAAAAAAAAKM/ca1y5lHQxMY/s1600-h/HPIM0855.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://2.bp.blogspot.com/_c6WmXt2id8U/SQSpMxV0FbI/AAAAAAAAAKM/ca1y5lHQxMY/s320/HPIM0855.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5261516301543937458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More Important Looking Things for the whiteboard (faster slurpies, courtesy of Ganesh)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_c6WmXt2id8U/SQSp6NCBHgI/AAAAAAAAAKc/h8LVO8LymCI/s1600-h/HPIM0853.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://4.bp.blogspot.com/_c6WmXt2id8U/SQSp6NCBHgI/AAAAAAAAAKc/h8LVO8LymCI/s320/HPIM0853.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5261517082071211522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Team Brighton. (having worked out the auto-timer on Eric's camera)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_c6WmXt2id8U/SQSpgl9kB7I/AAAAAAAAAKU/y-cC981eGHY/s1600-h/HPIM0856.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://1.bp.blogspot.com/_c6WmXt2id8U/SQSpgl9kB7I/AAAAAAAAAKU/y-cC981eGHY/s320/HPIM0856.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5261516642086815666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sprint on!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_c6WmXt2id8U/SQSrUJiTjyI/AAAAAAAAAKk/P6o26R1u2eY/s1600-h/HPIM0858.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://2.bp.blogspot.com/_c6WmXt2id8U/SQSrUJiTjyI/AAAAAAAAAKk/P6o26R1u2eY/s320/HPIM0858.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5261518627321122594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sprint wrap-up later...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-4901380370775001590?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/4901380370775001590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=4901380370775001590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4901380370775001590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4901380370775001590'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/10/darcs-hacking-sprint-team-brighton-day.html' title='darcs hacking sprint - Team Brighton Day 2'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_c6WmXt2id8U/SQSpMxV0FbI/AAAAAAAAAKM/ca1y5lHQxMY/s72-c/HPIM0855.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3891686442751555926</id><published>2008-10-25T18:21:00.009+02:00</published><updated>2008-10-25T18:37:56.468+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs hacking sprints - some pictures from Team Brighton</title><content type='html'>Just a little update from day 1.  Who's doing what?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_c6WmXt2id8U/SQNII3j9moI/AAAAAAAAAJ8/gzPjig87WRA/s1600-h/HPIM0851.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://2.bp.blogspot.com/_c6WmXt2id8U/SQNII3j9moI/AAAAAAAAAJ8/gzPjig87WRA/s320/HPIM0851.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5261128106889812610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ganesh (Heffalump) profiling away and drinking coffee from a University of Brighton mug!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_c6WmXt2id8U/SQNH4O6KUFI/AAAAAAAAAJs/rkSOh1u9NPQ/s1600-h/HPIM0850.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://4.bp.blogspot.com/_c6WmXt2id8U/SQNH4O6KUFI/AAAAAAAAAJs/rkSOh1u9NPQ/s320/HPIM0850.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5261127821099159634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ian (Igloo) looking serious and &lt;a href="http://projects.haskell.org/camp"&gt;Campy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_c6WmXt2id8U/SQNHui5Bc0I/AAAAAAAAAJk/Nde56IHLGPE/s1600-h/HPIM0847.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_c6WmXt2id8U/SQNHui5Bc0I/AAAAAAAAAJk/Nde56IHLGPE/s320/HPIM0847.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5261127654664401730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Eric (kowey) unscattering his brain&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_c6WmXt2id8U/SQNIBqh04tI/AAAAAAAAAJ0/DTttvppBHgY/s1600-h/HPIM0846.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://4.bp.blogspot.com/_c6WmXt2id8U/SQNIBqh04tI/AAAAAAAAAJ0/DTttvppBHgY/s320/HPIM0846.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5261127983132107474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Healthy hacking (malteasers conveniently obscured by kettle)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_c6WmXt2id8U/SQNIZjVWzfI/AAAAAAAAAKE/Y057-xzvyHQ/s1600-h/HPIM0852.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://2.bp.blogspot.com/_c6WmXt2id8U/SQNIZjVWzfI/AAAAAAAAAKE/Y057-xzvyHQ/s320/HPIM0852.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5261128393517616626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope to have a report up after the sprint!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3891686442751555926?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3891686442751555926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3891686442751555926' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3891686442751555926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3891686442751555926'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/10/darcs-hacking-sprints-some-pictures.html' title='darcs hacking sprints - some pictures from Team Brighton'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_c6WmXt2id8U/SQNII3j9moI/AAAAAAAAAJ8/gzPjig87WRA/s72-c/HPIM0851.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5680506507056020699</id><published>2008-10-23T12:34:00.004+02:00</published><updated>2008-10-23T13:18:45.282+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs weekly news #9</title><content type='html'>&lt;h3 id="news-and-discussions"&gt;News and discussions&lt;/h3&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;Enfranchising darcs! An update on the build systems question&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-October/014849.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-October/014849.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Darcs hacking sprint in 2 days!&lt;ul&gt;&lt;li&gt;&lt;a href="http://wiki.darcs.net/index.html/Sprints"&gt;http://wiki.darcs.net/index.html/Sprints&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;What does it mean to commute? Darcs hackers like to talk about 'commuting' patches all the time. But what does that mean? Jason explains and provides a tiny bit of code for us to play with&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-October/014779.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-October/014779.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;darcsweb 1.1-rc1 Alberto Bertogli reports a release candidate for darcsweb 1.1, with support for darcs 2 repositories, and syntax highlight support if the pygments module is available&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-October/014784.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-October/014784.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;First impressions of darcs. A Pythonista named Benjamin tries darcs out for the first time. Here are his likes and dislikes.&lt;ul&gt;&lt;li&gt;&lt;a href="http://pybites.blogspot.com/2008/10/first-impressions-of-darcs.html"&gt;http://pybites.blogspot.com/2008/10/first-impressions-of-darcs.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Choosing a revision control system. Daniel Carrera compares darcs with Monotone, Mercurial and Bazaar. Daniel finds our "brilliant patch management" to be unique, but what can we learn from the others?&lt;ul&gt;&lt;li&gt;&lt;a href="http://daniel.carrera.name/2008/10/14/choosing-a-revision-control-system"&gt;http://daniel.carrera.name/2008/10/14/choosing-a-revision-control-system/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id="reviewers"&gt;Reviewers&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Jason Dagit&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="new-contributors"&gt;New contributors&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Christian Kellermann&lt;/li&gt;&lt;li&gt;Salvatore Insalaco&lt;/li&gt;&lt;li&gt;J. Garrett Morris&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="issues-resolved-in-the-last-week-1"&gt;Issues resolved in the last week (1)&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;issue784 Salvatore Insalaco&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;fix file handle leak and check for exceptions on process running.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue784"&gt;http://bugs.darcs.net/issue784&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h3 id="patches-applied-in-the-last-week-66"&gt;Patches applied in the last week (66)&lt;/h3&gt;&lt;br /&gt;See &lt;a href="http://code.haskell.org/darcs/darcs-news/entries/2008-10-23"&gt;text entry&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5680506507056020699?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5680506507056020699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5680506507056020699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5680506507056020699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5680506507056020699'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/10/darcs-weekly-news-9.html' title='darcs weekly news #9'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-2652639506582003250</id><published>2008-10-17T00:13:00.001+02:00</published><updated>2008-10-17T00:15:31.839+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs weekly news #8</title><content type='html'>&lt;h3 id="news-and-discussions"&gt;News and discussions&lt;/h3&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;Improving the darcs build system? David Roundy is doing some interesting work on building darcs with his franchise build system. There are also attempts by other folks to Cabalise darcs. Discussions are underway about the future of building darcs.&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-October/014642.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-October/014642.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.darcs.net/index.html/CabalWishlist"&gt;http://wiki.darcs.net/index.html/CabalWishlist&lt;/a&gt;&lt;/li&gt;&lt;li&gt;darcs get &lt;a href="http://code.haskell.org/darcs/cabalised"&gt;http://code.haskell.org/darcs/cabalised&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Type Correct Changes: A Safe Approach to Version Control Implementation. Jason Dagit gave a Galois tech talk on the use of Haskell GADTs to make darcs code more transparent, robust and approachable.&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.galois.com/blog/2008/10/09/type-correct-changes-a-safe-approach-to-version-control-implementation/"&gt;http://www.galois.com/blog/2008/10/09/type-correct-changes-a-safe-approach-to-version-control-implementation/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.galois.com/%7Edons/slides/08-10-dagit.pdf"&gt;http://www.galois.com/~dons/slides/08-10-dagit.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Haskell, static typing, type witnesses and darcs. David Roundy gave a darcs talk at the ACM (5 October), presenting darcs and also explaining how the type witnesses are helping us to avoid errors in the code.&lt;ul&gt;&lt;li&gt;&lt;a href="http://files.codersbase.com/droundy-08.pdf"&gt;http://files.codersbase.com/droundy-08.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Darcs hacking sprint only 9 days away!&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-October/014541.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-October/014541.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id="reviewers"&gt;Reviewers&lt;/h3&gt;&lt;p&gt;Thanks to our patch reviewers for this week for giving David a hand!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Trent W. Buck&lt;/li&gt;&lt;li&gt;Jason Dagit&lt;/li&gt;&lt;li&gt;Nathan Gray&lt;/li&gt;&lt;li&gt;Simon Michael&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="issues-resolved-in-the-last-week-3"&gt;Issues resolved in the last week (3)&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;issue1062 Eric Kow&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;ignore setCooked and setEcho errors.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1062"&gt;http://bugs.darcs.net/issue1062&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1105 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;check if default options are valid.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1105"&gt;http://bugs.darcs.net/issue1105&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1139 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;make special cases handle no arguments gracefully.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1139"&gt;http://bugs.darcs.net/issue1139&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h3 id="patches-applied-in-the-last-week-96"&gt;Patches applied in the last week (96)&lt;/h3&gt;&lt;br /&gt;See &lt;a href="http://code.haskell.org/darcs/darcs-news/entries/2008-10-16"&gt;text entry&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-2652639506582003250?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/2652639506582003250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=2652639506582003250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2652639506582003250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2652639506582003250'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/10/darcs-weekly-news-8.html' title='darcs weekly news #8'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-4568418173649639892</id><published>2008-10-10T03:15:00.002+02:00</published><updated>2008-10-10T03:20:37.362+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs 2.1.0 released!</title><content type='html'>&lt;p&gt;I am delighted to announce the release of darcs 2.1.0, available at&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://darcs.net/darcs-2.1.0.tar.gz"&gt;http://darcs.net/darcs-2.1.0.tar.gz&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id="what-has-changed"&gt;What has changed?&lt;/h3&gt;&lt;p&gt;This version provides over 20 bug fixes and 7 new features since darcs 2.0.2. The most notable changes are:&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Defaulting to darcs-2. The darcs initialize command now creates darcs-2 format repositories by default. This change will make the the improved conflict handling and merging semantics from darcs 2 available to more users. Note that no action is required on your part. Darcs will continue working with all pre-existing repositories. You can explicitly request an old-fashioned repository if needed.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Better HTTP support. Dmitry Kurochkin has refined our HTTP support and fixed several http-related bugs from darcs 2.0.2. There is also an experimental --http-pipelining feature you can enable on the command line (or in your defaults file) for faster downloading. Note: --http-pipelining is enabled by default for libwww, and also for libcurl 7.19.1 (not yet released at the time of this writing)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Repository correctness. David Roundy has resolved a longstanding 'pending patch' regression (originally reported on 2008-02). Needless to say the offending case has been moved to our regression testing suite&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;See the attached ChangeLog for more details.&lt;/p&gt;&lt;h3 id="what-should-i-do"&gt;What should I do?&lt;/h3&gt;&lt;p&gt;Upgrade! Binary versions should be available shortly, either from your favourite package distributor or by third party contributors.&lt;/p&gt;&lt;p&gt;Other than installing the new darcs, no action is required on your part to perform this upgrade. Darcs 2, including this particular version, is 100% compatible with your pre-existing repositories.&lt;/p&gt;&lt;p&gt;If you have not done so already, you should consider using the hashed repository format in place of your current old-fashioned repositories. This format offers greater protection against accidental corruption, better support for case insensitive file systems. It also provides some very nice performance features, including lazy fetching of patches and a global cache (both optional).&lt;/p&gt;&lt;p&gt;If darcs 1 compatibility is not a concern, you could also upgrade your repositories all the way to the darcs 2 format. In addition to the robustness and performance features above, this gives you the improved merging semantics and conflicts handling that give darcs 2 its name.&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;More details about upgrading to darcs 2 here:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&lt;a href="http://wiki.darcs.net/index.html/DarcsTwo"&gt;http://wiki.darcs.net/index.html/DarcsTwo&lt;/a&gt;&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h3 id="what-comes-next"&gt;What comes next?&lt;/h3&gt;&lt;p&gt;We will now be shifting to a time based release model, with the next darcs release planned for January 2009.&lt;/p&gt;&lt;p&gt;For the next release of darcs, we will be focusing on optimising darcs's day to day performance issues. We want darcs to fetch repositories as fast as it possibly can over a network, and we especially want to rehabilitate known slow commands like darcs annotate. We believe that a few simple and practical changes can really improve the darcs experience for most users.&lt;/p&gt;&lt;p&gt;Think you can help? We would love to hear from you. In fact, the first darcs hacking sprint (25-26 October) is fast approaching! We have three venues available: Brighton, Paris and Portland and everybody is invited to come hack. See &lt;a href="http://wiki.darcs.net/index.html/Sprints"&gt;http://wiki.darcs.net/index.html/Sprints&lt;/a&gt; for details.&lt;/p&gt;&lt;p&gt;Thanks everybody, and enjoy!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-4568418173649639892?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/4568418173649639892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=4568418173649639892' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4568418173649639892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4568418173649639892'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/10/darcs-210-released.html' title='darcs 2.1.0 released!'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8560135626186177713</id><published>2008-10-10T00:51:00.001+02:00</published><updated>2008-10-10T00:55:28.796+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs weekly news #7</title><content type='html'>&lt;h3 id="news-and-discussions"&gt;News and discussions&lt;/h3&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;Darcs 2.1.0 released! With 20 bug fixes and 7 new features. Notable changes: darcs-2 repositories by default, HTTP robustness and better pending patch handling.&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.darcs.net/darcs-2.1.0.tar.gz"&gt;http://www.darcs.net/darcs-2.1.0.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-October/014504.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-October/014504.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Optimising darcs annotate. Darcs annotate is too slow. Proposed solution: create a cache mapping filenames to patches. Stay tuned for fast annotate in the future...&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-October/014371.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-October/014371.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Eleven new contributors since darcs 2.0.2. Thanks, Alex, Florent, Gaetan, Judah, Matthias, Max, Nathaniel, Steve, Taylor, Thorkil, and Vlad!&lt;/li&gt;&lt;/ol&gt;&lt;h3 id="reviewers"&gt;Reviewers&lt;/h3&gt;&lt;p&gt;Thanks to our patch reviewers for this week for giving David a hand!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Trent Buck&lt;/li&gt;&lt;li&gt;Tommy Pettersson&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="issues-resolved-in-the-last-week-6"&gt;Issues resolved in the last week (6)&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;issue1104 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;stop progress reports in exec.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1104"&gt;http://bugs.darcs.net/issue1104&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1109 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;stop progress reports in exec_interactive.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1109"&gt;http://bugs.darcs.net/issue1109&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1111 Tommy Pettersson&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;patchset_intersection used wrong selection for partitionRL&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1111"&gt;http://bugs.darcs.net/issue1111&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1124 Thorkil Naur&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;Test pull.sh failed when run as root&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1124"&gt;http://bugs.darcs.net/issue1124&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1128 Benjamin Franksen&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;must call execSendmail inside body of withOpenTemp&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1128"&gt;http://bugs.darcs.net/issue1128&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1131 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;accept download requests for different files.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1131"&gt;http://bugs.darcs.net/issue1131&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h3 id="patches-applied-in-the-last-week-35"&gt;Patches applied in the last week (35)&lt;/h3&gt;&lt;br /&gt;See &lt;a href="http://code.haskell.org/darcs/darcs-news/entries/2008-10-09"&gt;text entry&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8560135626186177713?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8560135626186177713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8560135626186177713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8560135626186177713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8560135626186177713'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/10/darcs-weekly-news-7.html' title='darcs weekly news #7'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6694943938939354255</id><published>2008-10-02T18:32:00.000+02:00</published><updated>2008-10-02T18:33:20.241+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs weekly news #6</title><content type='html'>&lt;h3 id="news-and-discussions"&gt;News and discussions&lt;/h3&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;Third pre-release of darcs 2.1.0. Release pushed back to 17 October latest for more testing. We're getting very close to the finish line!&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.darcs.net/darcs-2.0.3pre3.tar.gz"&gt;http://www.darcs.net/darcs-2.0.3pre3.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-October/014218.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-October/014218.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Darcs ideas in other VCS. Kirill Smelkov has kind words for us on behalf of the NAVY project, which is moving away from darcs. Best of luck to Kirill with whatever revision control system NAVY choose! While we are delighted that "Good ideas behind [darcs] were adopted by youth", we still have a thing or two to show these whippersnappers.&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/014095.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/014095.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Haddock + Hoogle == Javadoc on steroids. Simon Michael has combined haddock and hoogle to give us a lovely darcs code browser. In the meantime, Florent Becker has been adding value to this browser by sending in lots of haddock patches. Many thanks to Simon and Florent!&lt;ul&gt;&lt;li&gt;&lt;a href="http://joyful.com/repos/darcs-sm/api-doc"&gt;http://joyful.com/repos/darcs-sm/api-doc&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/014084.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/014084.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Patch theory update. Ian gives us his latest progress on documenting, prototyping and improving darcs patch theory. "[S]ome proofs are finally starting to appear, albeit rather handwavey for now". Go Ian!&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/014168.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/014168.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id="reviewers"&gt;Reviewers&lt;/h3&gt;&lt;p&gt;Thanks to our patch reviewers for this week for giving David a hand!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Simon Michael&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="issues-resolved-in-the-last-week-5"&gt;Issues resolved in the last week (5)&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;issue1003 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;don't sever transfer-mode connection on IO error.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1003"&gt;http://bugs.darcs.net/issue1003&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1043 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;fix bug in mergeAfterConflicting.&lt;/li&gt;&lt;li&gt;NB. half-resolved, more to follow!&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1043"&gt;http://bugs.darcs.net/issue1043&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1078 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;make ioAbsolute work with symbolic links in file paths.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1078"&gt;http://bugs.darcs.net/issue1078&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1102 Eric Kow&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;recognise but do not generate patch log 'junk'.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1102"&gt;http://bugs.darcs.net/issue1102&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1110 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;fix get --hashed.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1110"&gt;http://bugs.darcs.net/issue1110&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h3 id="patches-applied-in-the-last-week-47"&gt;Patches applied in the last week (47)&lt;/h3&gt;See &lt;a href="http://code.haskell.org/darcs/darcs-news/entries/2008-10-02"&gt;text entry&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6694943938939354255?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6694943938939354255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6694943938939354255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6694943938939354255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6694943938939354255'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/10/darcs-weekly-news-6.html' title='darcs weekly news #6'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3360783296226256124</id><published>2008-09-25T12:28:00.001+02:00</published><updated>2008-09-25T12:30:48.589+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs weekly news #5</title><content type='html'>&lt;h3 id="news-and-discussions"&gt;News and discussions&lt;/h3&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;Second pre-release of darcs 2.1.0 (formerly known as 2.0.3) This version of darcs will produce darcs-2 format repositories by default&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.darcs.net/darcs-2.1.0pre2.tar.gz"&gt;http://www.darcs.net/darcs-2.1.0pre2.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013977.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013977.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;New issue manager - Thorkil Naur. The darcs team now has an official Issue Manager role. Thorkil will be ensuring that incoming reports are responded to in a timely manner, and that all bugs are eventually moved to a resolved state.&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013887.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013887.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013920.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013920.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Hoogling the darcs source?&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013976.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013976.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id="issues-resolved-in-the-last-week-5"&gt;Issues resolved in the last week (5)&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;issue27 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;add junk to patch identifiers.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue27"&gt;http://bugs.darcs.net/issue27&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue53 Eric Kow&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;check for windows filename validity in darcs add/mv.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue53"&gt;http://bugs.darcs.net/issue53&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue805 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;make darcs-2 format the default for new repositories.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue805"&gt;http://bugs.darcs.net/issue805&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1039 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;detect seemingly unrelated repositories when doing push, pull and send.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1039"&gt;http://bugs.darcs.net/issue1039&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1041 Vlad Dogaru&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;Get: if URL is invalid, direcotry is not created (#1041)&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1041"&gt;http://bugs.darcs.net/issue1041&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h3 id="patches-applied-in-the-last-week-54"&gt;Patches applied in the last week (54)&lt;/h3&gt;See &lt;a href="http://code.haskell.org/darcs/darcs-news/entries/2008-09-25"&gt;text entry&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3360783296226256124?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3360783296226256124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3360783296226256124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3360783296226256124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3360783296226256124'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/09/darcs-weekly-news-5.html' title='darcs weekly news #5'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-1797109551924832692</id><published>2008-09-18T13:18:00.003+02:00</published><updated>2008-09-18T13:23:06.606+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs weekly news #4</title><content type='html'>&lt;h3 id="news-and-discussions"&gt;News and discussions&lt;/h3&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;First pre-release of darcs 2.0.3. This version of darcs has some very nice bug fixes on offer. A few more user-friendliness tweaks are planned for the actual release.&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.darcs.net/darcs-2.0.3pre1.tar.gz"&gt;http://www.darcs.net/darcs-2.0.3pre1.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013839.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013839.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Third venue confirmed for darcs hacking sprint, 25-26 October. Brighton, Portland and now Paris are all CONFIRMED. Come hack with us!&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013710.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013710.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;code.haskell.org upgrades to darcs 2! /usr/bin/darcs is now darcs 2.0.2 on this server. No action is needed on the user's part.&lt;ul&gt;&lt;li&gt;&lt;a href="http://article.gmane.org/gmane.comp.lang.haskell.general/16419"&gt;http://article.gmane.org/gmane.comp.lang.haskell.general/16419&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Retiring GHC 6.4. Nobody seems to be using GHC 6.4 to compile darcs after all, so we shall be dropping support for it.&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013731.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013731.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id="reviewers"&gt;Reviewers&lt;/h3&gt;&lt;p&gt;Thanks to our patch reviewers for this week for giving David a hand!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Jason Dagit&lt;/li&gt;&lt;li&gt;Nathan Gray&lt;/li&gt;&lt;li&gt;Trent W. Buck&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="issues-resolved-in-the-last-week-6"&gt;Issues resolved in the last week (6)&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;issue691 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;distinguish between NoArg and ReqArg in defaults parser.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue691"&gt;http://bugs.darcs.net/issue691&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue709 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;avoid adding changes to pending in rmpend when possible.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue709"&gt;http://bugs.darcs.net/issue709&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue885 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;fix patchSetToRepository to work with hashed.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue885"&gt;http://bugs.darcs.net/issue885&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1012 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;it seems to be fixed by the fix for issue709.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1012"&gt;http://bugs.darcs.net/issue1012&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1054 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;--no-cache option to ignore patch caches.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1054"&gt;http://bugs.darcs.net/issue1054&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1057 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;this was fixed in the previous patch.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1057"&gt;http://bugs.darcs.net/issue1057&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h3 id="patches-applied-in-the-last-week-86"&gt;Patches applied in the last week (86)&lt;/h3&gt;See &lt;a href="http://code.haskell.org/darcs/darcs-news/entries/2008-09-17"&gt;2008-09-17 text entry&lt;/a&gt; for details&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-1797109551924832692?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/1797109551924832692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=1797109551924832692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1797109551924832692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1797109551924832692'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/09/darcs-weekly-news-4.html' title='darcs weekly news #4'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3264724299120624378</id><published>2008-09-10T11:50:00.001+02:00</published><updated>2008-09-10T11:53:12.210+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs weekly news #3</title><content type='html'>&lt;h3&gt;News and discussions&lt;/h3&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;Venues confirmed for the darcs hacking sprint, 25-26 October. Brighton and Portland are CONFIRMED; Paris is likely. Come hack with us!&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013575.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013575.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Planning darcs 2.0.3. We have started making steps towards a release for the end of September. Eric thinks we are only a buildbot and couple of bugfixes away from a prerelease.&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013516.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013516.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Darcs patch theory. Ian Lynagh continues his patch theory research. He has written up a nice explanation and a working prototype of a darcs-like patch theory.&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013611.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013611.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://urchin.earth.li/%7Eian/theory.pdf"&gt;http://urchin.earth.li/~ian/theory.pdf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;darcs get &lt;a href="http://code.haskell.org/darcs/minidarcs"&gt;http://code.haskell.org/darcs/minidarcs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;darcs get &lt;a href="http://urchin.earth.li/%7Eian/theory"&gt;http://urchin.earth.li/~ian/theory&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Retiring GHC 6.4. The darcs team would like to know if anybody is still using GHC 6.4 to compile darcs, so that we can focus on later versions (6.6 and 6.8).&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013659.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013659.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Reviewers&lt;/h3&gt;&lt;p&gt;Thanks to our patch reviewers for this week for giving David a hand!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Jason Dagit&lt;/li&gt;&lt;li&gt;Trent Buck&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Issues resolved in the last week (7)&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;issue844 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;darcs doesn't guarantee always to compress patches.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue844"&gt;http://bugs.darcs.net/issue844&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue924 Eric Kow&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;test for QuickCheck2 in disttest&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue924"&gt;http://bugs.darcs.net/issue924&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1015 Ganesh Sittampalam&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;workaround internal API change on Windows in GHC 6.8.3&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1015"&gt;http://bugs.darcs.net/issue1015&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1037 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;compile with -D_REENTRANT.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1037"&gt;http://bugs.darcs.net/issue1037&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1049 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;undo lazy patch bundle scanning.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1049"&gt;http://bugs.darcs.net/issue1049&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1050 Eric Kow&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;Disable haskeline by default.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1050"&gt;http://bugs.darcs.net/issue1050&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;issue1063 Eric Kow&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;Wrap pwd in cygpath in shell tests.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.darcs.net/issue1063"&gt;http://bugs.darcs.net/issue1063&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h3&gt;Patches applied in the last week (72)&lt;/h3&gt;See the &lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013668.html"&gt;darcs weekly news #3 email&lt;/a&gt; for the full list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3264724299120624378?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3264724299120624378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3264724299120624378' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3264724299120624378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3264724299120624378'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/09/darcs-weekly-news-3.html' title='darcs weekly news #3'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3646470675465904998</id><published>2008-09-06T10:52:00.002+02:00</published><updated>2008-09-06T12:23:09.512+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs hacking sprint (25-26 October 2008)</title><content type='html'>&lt;p&gt;Some news on the darcs hacking sprint.   We have at least two venues confirmed, hopefully three shortly.&lt;br /&gt;&lt;/p&gt;&lt;h3 id="venues"&gt;Venues&lt;/h3&gt;&lt;p&gt;We plan to host the sprint across three sites:&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;CONFIRMED: Brighton, UK (University of Brighton)&lt;/li&gt;&lt;li&gt;CONFIRMED: Portland, USA (Galois)&lt;/li&gt;&lt;li&gt;likely: Paris, France (Université Paris Diderot)&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;So if you were waiting to book tickets, this is the time!&lt;/p&gt;&lt;p&gt;For more details, please see &lt;a href="http://wiki.darcs.net/index.html/Sprints"&gt;http://wiki.darcs.net/index.html/Sprints&lt;/a&gt;&lt;/p&gt;&lt;h3 id="agenda"&gt;Agenda&lt;/h3&gt;&lt;p&gt;During this first sprint, we shall be focusing our attention on the day to day performance issues that darcs users commonly face.&lt;/p&gt;&lt;p&gt;This is what we are reaching for:&lt;/p&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;&lt;p&gt;Fast network operations. We want to make it very pleasant for users to darcs get a repository and pull some patches to it over http and ssh. Git does this very well, and we plan to learn from them.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Cutting memory consumption. We want to profile the heck out of operations like darcs record, darcs convert and darcs whatsnew. What's eating up all the memory? And how can we can cut it down to size?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Responsiveness. Sometimes basic darcs commands can take long enough for programmers to lose their train of thought. We want to track down these lost seconds and kill that dreaded context switch.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Of course, if you are interested in other areas, then you can work on those instead.&lt;/p&gt;&lt;p&gt;Note that if you are new to the darcs code or to Haskell, there will also be a lot interesting jobs for you to get started with. Everyone will have something to hack on, so come join us!&lt;/p&gt;&lt;p&gt;Thanks very much to the University of Brighton, Galois and University of Paris VII for their generous offers.&lt;/p&gt;&lt;p&gt;Hope to see you there, everyone! :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3646470675465904998?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3646470675465904998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3646470675465904998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3646470675465904998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3646470675465904998'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/09/darcs-hacking-sprint-25-26-october-2008.html' title='darcs hacking sprint (25-26 October 2008)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-1472638687693674304</id><published>2008-09-03T12:42:00.001+02:00</published><updated>2008-09-03T12:47:37.580+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs weekly news #2</title><content type='html'>&lt;h3 id="news-and-discussions"&gt;News and discussions&lt;/h3&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;Growing the darcs team: The darcs unstable repository is coming back, with David Roundy as its maintainer. Eric will be taking care of stable and keeping in closely in synch.&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.osuosl.org/pipermail/darcs-users/2008-September/013388.html"&gt;http://lists.osuosl.org/pipermail/darcs-users/2008-September/013388.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Shiny new IRC logs: Thanks to Moritz Lenz, the #darcs and #darcs-theory IRC channels are now being logged with fancy formatting and search capability&lt;ul&gt;&lt;li&gt;&lt;a href="http://irclog.perlgeek.de/darcs"&gt;http://irclog.perlgeek.de/darcs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://irclog.perlgeek.de/darcs-theory"&gt;http://irclog.perlgeek.de/darcs-theory&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Hacking darcs: Petr Ročkai shares his recent hopes and experiences as a darcs user turned developer. Come share the excitement!&lt;ul&gt;&lt;li&gt;&lt;a href="http://mornfall.net/blog/hacking_darcs.html"&gt;http://mornfall.net/blog/hacking_darcs.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id="reviewers"&gt;Reviewers&lt;/h3&gt;&lt;p&gt;Thanks to our patch reviewers for this week for giving David a hand!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Jason Dagit&lt;/li&gt;&lt;li&gt;Nathan Gray&lt;/li&gt;&lt;li&gt;Eric Kow&lt;/li&gt;&lt;li&gt;Petr Ročkai&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="issues-resolved-in-the-last-week-1"&gt;Issues resolved in the last week (1)&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;issue966 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;fix apply_inv_to_matcher_inclusive. &lt;a href="http://bugs.darcs.net/issue966"&gt;http://bugs.darcs.net/issue966&lt;/a&gt;&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h3 id="patches-applied-in-the-last-week-37"&gt;Patches applied in the last week (37)&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;2008-08-31 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;don't show ssh stderr output unless we're passed --debug.&lt;/li&gt;&lt;li&gt;fix bug in --list-options (tab completion).&lt;/li&gt;&lt;li&gt;fix bug in makeRelative.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-30 Ganesh Sittampalam&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;add warning to configure about Haskell zlib speed&lt;/li&gt;&lt;li&gt;make use of Haskell zlib dependent on bytestring&lt;/li&gt;&lt;li&gt;add option to use Haskell zlib package&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-22 Eric Kow&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;Remove unused FileSystem module.&lt;/li&gt;&lt;li&gt;Add a link to a repository browser for darcs's code.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-29 &lt;script type="text/javascript"&gt;&lt;br /&gt;&lt;!-- h='&amp;#x6f;&amp;#x75;&amp;#116;&amp;#98;&amp;#x61;&amp;#x63;&amp;#x6b;&amp;#46;&amp;#x65;&amp;#x73;&amp;#x63;&amp;#x61;&amp;#112;&amp;#x65;&amp;#46;&amp;#100;&amp;#x65;';a='&amp;#64;';n='&amp;#x6b;&amp;#x69;&amp;#108;&amp;#x69;';e=n+a+h; document.write('&lt;a&gt;'+'&lt;code&gt;'+e+'&lt;/code&gt;'+'&lt;\/'+'a'+'&gt;');&lt;br /&gt;// --&gt;&lt;br /&gt;&lt;/script&gt;&lt;noscript&gt;&amp;#x6b;&amp;#x69;&amp;#108;&amp;#x69;&amp;#32;&amp;#x61;&amp;#116;&amp;#32;&amp;#x6f;&amp;#x75;&amp;#116;&amp;#98;&amp;#x61;&amp;#x63;&amp;#x6b;&amp;#32;&amp;#100;&amp;#x6f;&amp;#116;&amp;#32;&amp;#x65;&amp;#x73;&amp;#x63;&amp;#x61;&amp;#112;&amp;#x65;&amp;#32;&amp;#100;&amp;#x6f;&amp;#116;&amp;#32;&amp;#100;&amp;#x65;&lt;/noscript&gt;&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;Replace grep invocation by perl code&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-24 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;clean up network/get.sh test.&lt;/li&gt;&lt;li&gt;fix type of withRepository and friends.&lt;/li&gt;&lt;li&gt;fix recent bug in --list-options.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-28 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;Check for package random on windows, used in Ssh module.&lt;/li&gt;&lt;li&gt;Debug messages in curl module.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-28 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;TAG working version.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-27 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;Use InclusiveOrExclusive instead of Bool in apply_inv_to_matcher.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-27 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;add more modules to make witnesses.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-27 Jason Dagit&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;updates to Darcs.Patch.Unit for type witnesses&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-27 Dmitry Kurochkin&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;Refactor get_matcher and apply_inv_to_matcher functions from Darcs.Match module.&lt;/li&gt;&lt;li&gt;Resolve issue966: fix apply_inv_to_matcher_inclusive.&lt;/li&gt;&lt;li&gt;Simplify withCurrentDirectory.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-27 Jason Dagit&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;updates to Sealed.lhs to support type witness refactor in commands&lt;/li&gt;&lt;li&gt;updates to Ordered.lhs to support type witness refactor in commands&lt;/li&gt;&lt;li&gt;make Annotate.lhs compile with type witnesses&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-27 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;fix type witnesses in Internal.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-27 Jason Dagit&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;updates to Repository.Internal to fix conflicts and support type witness refactor in commands&lt;/li&gt;&lt;li&gt;fix error in Properties due to new commuteFL&lt;/li&gt;&lt;li&gt;fix minor type witness compile error with new commuteFL&lt;/li&gt;&lt;li&gt;fix conflicts with get_extra changes&lt;/li&gt;&lt;li&gt;improve reporting for bug in get_extra&lt;/li&gt;&lt;li&gt;Finish refactor of Unrevert as well as making it pass double-unrevert.sh&lt;/li&gt;&lt;li&gt;add double-unrevert.sh test&lt;/li&gt;&lt;li&gt;partial type witnesses in Unrevert&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-26 Eric Kow&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;More ChangeLog entries since 2.0.2&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-27 David Roundy&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;fix bug in defaultrepo.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;2008-08-26 Jason Dagit&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;&lt;li&gt;fix accidental reversal in tentativelyAddToPending&lt;/li&gt;&lt;li&gt;minor refator to get_extra improve comments&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-1472638687693674304?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/1472638687693674304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=1472638687693674304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1472638687693674304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1472638687693674304'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/09/darcs-weekly-news-2.html' title='darcs weekly news #2'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-7643447207336752930</id><published>2008-07-30T14:03:00.018+02:00</published><updated>2008-07-30T16:22:58.689+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='newbie'/><title type='text'>simple random numbers in Haskell</title><content type='html'>Random numbers are the kind of thing I use rarely enough that by the time I want to use them, I have forgotten the relevant details, but frequently enough that I get annoyed whenever it happens.&lt;br /&gt;&lt;br /&gt;Hopefully these notes will be useful to somebody in a similar situation.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;two things to know&lt;/h2&gt;&lt;h3&gt;(1) import &lt;a href="http://www.haskell.org/ghc/docs/latest/html/libraries/random/System-Random.html"&gt;System.Random&lt;/a&gt;&lt;/h3&gt;&lt;h3&gt;(2) randomIO :: Random a =&gt; IO a&lt;/h3&gt;&lt;br /&gt;The one function you really need to know about is &lt;code&gt;randomIO&lt;/code&gt; (The type of this function is &lt;code&gt;Random a =&gt; IO a&lt;/code&gt;. Don't worry if you do not understand the type; it suffices to know that it involves IO).  In this example, we use and generate a random Int:&lt;br /&gt;&lt;pre&gt;import System.Random&lt;br /&gt;&lt;br /&gt;main =&lt;br /&gt; do r &amp;lt;- randomIO&lt;br /&gt;    print (r + 1 :: Int)&lt;br /&gt;    -- Note re the ':: Int' above: Haskell can't figure out from&lt;br /&gt;    -- the context exactly what type of number you want, so we&lt;br /&gt;    -- constrain it to Int&lt;/pre&gt;One neat feature is that you can randomly generate anything that implements the &lt;code&gt;Random&lt;/code&gt; typeclass.  In the example below, we generate a random Bool.  Notice how we do not do anything differently, except to treat the result as a bool (i.e. by applying &lt;code&gt;not&lt;/code&gt; to it)&lt;pre&gt;import System.Random&lt;br /&gt;&lt;br /&gt;main =&lt;br /&gt; do r &amp;lt;- randomIO&lt;br /&gt;    print (not r)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A useful exercise, if you know about typeclasses, is to implement &lt;code&gt;Random&lt;/code&gt; for one of your own types.  The &lt;code&gt;toEnum&lt;/code&gt; function may be useful.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;more advanced stuff&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;you can use &lt;code&gt;randomRIO :: Random a =&gt; (a,a) -&gt; IO a&lt;/code&gt; to generate random numbers constrained within a range&lt;/li&gt;&lt;li&gt;Instead of using the functions &lt;code&gt;randomIO&lt;/code&gt; and &lt;code&gt;randomRIO&lt;/code&gt;, you can separate &lt;em&gt;obtaining&lt;/em&gt; a random number generator, from &lt;em&gt;using&lt;/em&gt; the generator.  Doing so allows you to minimise your reliance on the IO monad.  It also makes your code easier to debug, because you can opt to always pass the same generator to it and make life much more predictable.  See the functions &lt;code&gt;random&lt;/code&gt; and &lt;code&gt;randomR&lt;/code&gt; for details.&lt;li&gt;a potentially handy trick is to generate an infinite list of random numbers, which you can then pass to a function.  See the &lt;code&gt;randoms&lt;/code&gt; function for details.&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit:&lt;/b&gt; fixed s/randomR/randomIO/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-7643447207336752930?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/7643447207336752930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=7643447207336752930' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7643447207336752930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7643447207336752930'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/07/simple-random-numbers-in-haskell.html' title='simple random numbers in Haskell'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-9189633077290785073</id><published>2008-07-27T07:02:00.002+02:00</published><updated>2008-07-27T07:18:31.528+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pandoc'/><title type='text'>pandoc gets mediawiki support</title><content type='html'>Pandoc is a universal document converter.  You feed it documents in one format (say, HTML) and it spits them out in another one (say, ODF).   Assuming it works correctly, Pandoc has the potential to replace all those little one-to-one convertors (e.g. latex2html) in my toolbox.  Just the one simple Pandoc.&lt;br /&gt;&lt;br /&gt;And now, thanks to fiddlosopher (John MacFarlane?), it knows how to &lt;a href="http://code.google.com/p/pandoc/issues/detail?id=58"&gt;write Mediawiki files&lt;/a&gt;!  Mediawiki?  That's the syntax/software that powers Wikipedia, Wikibooks, and a whole slew of organisational or community wikis (like HaskellWiki).&lt;br /&gt;&lt;br /&gt;Hey, Haskellers probably have a lot of LaTeX documents lying around.   Maybe this is their chance to get them on Haskell wiki?&lt;br /&gt;&lt;br /&gt;We're halfway to being able to do a roundtrip between LaTeX and Mediawiki!  All we need is for somebody [maybe John :-D] to  &lt;a href="http://koweycode.blogspot.com/2007/07/mediawiki-code-projects.html"&gt;implement a Mediawiki reader&lt;/a&gt; for Pandoc and things could get mighty interesting... Oh and yes, and if anybody is working on a wiki with direct LaTeX support, hats off to you!  Sometimes Mediawiki is a fact of life, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-9189633077290785073?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/9189633077290785073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=9189633077290785073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/9189633077290785073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/9189633077290785073'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/07/pandoc-gets-mediawiki-support.html' title='pandoc gets mediawiki support'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-2130779543739469563</id><published>2008-07-23T18:01:00.004+02:00</published><updated>2008-07-23T18:27:43.272+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><title type='text'>rose zipper on hackage</title><content type='html'>I guess this isn't big enough to go on the haskell@ mailing list: I have uploaded Krasimir Angelov and Iavor S. Diatchki's Data.Tree implementation of zippers onto hackage.  The package is called &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/rosezipper"&gt;rosezipper&lt;/a&gt; and it is available under the BSD3 license.&lt;br /&gt;&lt;br /&gt;For the interested, "The Zipper is an idiom that uses the idea of “context” to the means of manipulating locations in a data structure." (Haskell wiki).&lt;br /&gt;&lt;br /&gt;For me, zippers are just a very nice way to navigate and edit trees.   By "nice", I mean elegant, efficient and purely functional.  Before learning about zippers, I only knew how to navigate trees from top to bottom, but if I wanted to go back up a node, or visit a sibling node, I basically had to start over from the root.  Zippers allow me to walk the tree in any direction, visiting a node's parent, children and siblings without starting over from the top.  This kind of thing is especially handy for Natural Language Processing people, basically, anybody who eats trees for a living.&lt;br /&gt;&lt;br /&gt;If you would like to learn more, I would recommend Apfelmus's &lt;a href="http://en.wikibooks.org/wiki/Haskell/Zippers"&gt;very friendly tutorial&lt;/a&gt; (part of the Haskell wikibook).&lt;br /&gt;&lt;br /&gt;Thanks to Krasimir and Iavor for implementing this and for allowing me to package it up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-2130779543739469563?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/2130779543739469563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=2130779543739469563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2130779543739469563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2130779543739469563'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/07/rose-zipper-on-hackage.html' title='rose zipper on hackage'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-1166968400879152824</id><published>2008-07-22T12:10:00.007+02:00</published><updated>2008-07-22T15:28:08.889+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>encodings-aware hex editor</title><content type='html'>Here's another coding-project idea: I would like to see a hex editor that knows how to display characters in other encodings than ASCII (specifically: I want to debug messed up UTF-8 text files).&lt;br /&gt;&lt;br /&gt;Google and apt-cache search reveal no such editor, at least not in the free/open-source worlds, nowhere in Linux or MacOS X freeware land.  On Debian based systems, there are a couple that handle some Japanese encodings, but nothing that deals with UTF-8.&lt;br /&gt;&lt;br /&gt;Likely features:&lt;ul&gt;&lt;li&gt;toggle between an ASCII-only mode and a show-as-UTF-8 mode&lt;/li&gt;&lt;li&gt;good UI for the fact that UTF-8 characters have a variable length in bytes&lt;/li&gt;&lt;li&gt;graceful handling of encoding errors&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Haskellers could possibly do this as a part (plugin?) of &lt;a href="http://www.haskell.org/haskellwiki/Yi"&gt;Yi&lt;/a&gt;, or maybe just a completely standalone product.&lt;br /&gt;&lt;br /&gt;And if you want a slightly simpler project, a UTF-8 hex dumper would be good.  Hmmph... come to think of it, maybe it would have been more productive to just go write that instead of this blog post.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit&lt;/b&gt;: Well, I went ahead and made a stupid little dumper for my needs.  Here is the output on some sample corrupted UTF-8&lt;pre&gt;20 28 5b 47 65 6f 72 67 69 61 6e                     ([Georgian&lt;br /&gt;3a 20 e183a1 e183 3f e183a5 e183                    : ს&lt;span style="color: rgb(255, 0, 0);"&gt;«e1 83»&lt;/span&gt;?ქ&lt;span style="color: rgb(255, 0, 0);"&gt;«e1 83»&lt;/span&gt;&lt;br /&gt;3f e183 20 e18397 e18395 e18394 e1839a e183         ?&lt;span style="color: rgb(255, 0, 0);"&gt;«e1 83»&lt;/span&gt; თველ&lt;span style="color: rgb(255, 0, 0);"&gt;«e1 83»&lt;/span&gt;&lt;br /&gt;3f 5d 0a                                            ?]&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;20 28 5b 47 65 72 6d 61 6e 3a 20                     ([German:&lt;br /&gt;44 65 75 74 73 63 68 6c 61 6e 64                    Deutschland&lt;br /&gt;5d 20 5b 49 50 41 3a 20 cb88 64 c994                ] [IPA: ˈdɔ&lt;br /&gt;c9aa 74 ca83 6c 61 6e 74 5d 29 2c 20                ɪtʃlant]),&lt;br /&gt;6f 66 66 69 63 69 61 6c 6c 79 20                    officially&lt;br /&gt;74 68 65 20 46 65 64 65 72 61 6c                    the Federal&lt;br /&gt;20 52 65 70 75 62 6c 69 63 20 6f                     Republic o&lt;br /&gt;66 20 47 65 72 6d 61 6e 79 20 28                    f Germany (&lt;br /&gt;42 75 6e 64 65 73 72 65 70 75 62                    Bundesrepub&lt;br /&gt;6c 69 6b 20 44 65 75 74 73 63 68                    lik Deutsch&lt;br /&gt;6c 61 6e 64 2c 20 5b 49 50 41 3a                    land, [IPA:&lt;br /&gt;20 cb88 62 ca8a 6e 64 c999 73 72 65 70               ˈbʊndəsrep&lt;br /&gt;75 62 6c 69 cb 3f 6b 20 cb88 64                     ubli&lt;span style="color: rgb(255, 0, 0);"&gt;«cb»&lt;/span&gt;?k ˈd&lt;br /&gt;c994 c9aa 74 ca83 6c 61 6e 74 5d 29 2c              ɔɪtʃlant]),&lt;br /&gt;20 69 73 20 61 20 63 6f 75 6e 74                     is a count&lt;br /&gt;72 79 20 69 6e 20 43 65 6e 74 72                    ry in Centr&lt;br /&gt;61 6c 20 45 75 72 6f 70 65 2e 20                    al Europe.&lt;br /&gt;0a&lt;/pre&gt;Highlighting by hand.  I should probably go figure out how to colourise the corrupted characters.  Or maybe I should just go ahead and package this, put it up on hackage? Make it available via darcs?  I would need a decent name.  So far, I have hexy-xxy and hexdump-utf8 neither of which are that great :-/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-1166968400879152824?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/1166968400879152824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=1166968400879152824' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1166968400879152824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1166968400879152824'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/07/encodings-aware-hex-editor.html' title='encodings-aware hex editor'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-4810158025883034688</id><published>2008-07-21T11:43:00.009+02:00</published><updated>2008-07-21T12:21:39.042+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='newbie'/><title type='text'>simply reading and writing UTF-8 in Haskell</title><content type='html'>A year and a half ago, I posted what seemed to be the simplest recipe for &lt;a href="http://koweycode.blogspot.com/2007/02/reading-and-writing-utf-8-in-haskell.html"&gt;reading and writing UTF-8 in Haskell&lt;/a&gt;.   In this post, I will provide an even simpler recipe, made possible by Eric Mertens' utf8-string package.&lt;br /&gt;&lt;br /&gt;For those who are not familiar with Haskell, its internal representation for characters is Unicode, but for IO it effectively assumes that that it is reading and writing in the ISO8859-1 format.  This used to be annoying for those of us who wanted to work with the UTF-8 encoding, but now there is a very simple solution, perfect for those of us who don't want to think too much and just get the job done.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;the example&lt;/h3&gt;&lt;br /&gt;The sample problem from my last post was to take a UTF-8 encoded file as input, reverse all its lines, writing the results in the same file, with a ".rev" extension appended to its name.  The solution might be self-explanatory if you are used to Haskell, but I will make some minor comments below, just in case.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import System.IO.UTF8&lt;br /&gt;import Prelude hiding (readFile, writeFile)&lt;br /&gt;import System.Environment (getArgs)&lt;br /&gt;&lt;br /&gt;main =&lt;br /&gt; do args &lt;- getArgs&lt;br /&gt;    mapM_ reverseUTF8File args &lt;br /&gt;&lt;br /&gt;reverseUTF8File f =  &lt;br /&gt; do c &lt;- readFile f&lt;br /&gt;    writeFile (f ++ ".rev") $ reverseLines c&lt;br /&gt;&lt;br /&gt;reverseLines = unlines . map reverse . lines&lt;/pre&gt;&lt;br /&gt;In the above code, we use some drop-in replacements for some System.IO functions.  Some of these functions are also provided in the Prelude, so we must hide them so that they do not overlap with what we import.  (Alternatively, we could import the UTF-8 ones qualified, which could be handy in contexts where we want the option of reading and writing in UTF-8 without committing to it).  The rest is straightforward.  Notice that we do not jump through any hoops whatsoever.  In fact, you can pretty much take any pre-existing Haskell program that you have written and turn it into a UTF-8 version by changing the import statements.&lt;br /&gt;&lt;br /&gt;Here are the results of running this script on a UTF-8 sampler:&lt;pre&gt;)udrU( یتوہ ںیہن فیلکت ےھجم روا ںوہ اتکس اھک چناک ںیم &lt;br /&gt;)othsaP( يوږوخ هن ام هغه ،مش ېلړوخ هشيش هز &lt;br /&gt;)naeroK(요아않 지프아 도래그 .요어있 수 을먹 를리유 는나&lt;br /&gt;)keerG( .ατοπίτ ωθάπ αν ςίρωχ άιλαυγ ανέμσαπσ ωάφ αν ώροπΜ&lt;br /&gt;)cidnalecI / aksnelsÍ( .gim aðiem ða sseþ ná relg ðite teg  gÉ&lt;br /&gt;)hsiloP( .izdokzs ein im i ,ołkzs ćśej ęgoM&lt;br /&gt;)nainamoR( .etșenăr ăm un ae iș ălcits cnânăm ăs toP&lt;br /&gt;)nainiarkU( .ьтидокшоп ен інем онов й ,олкш итсї ужом Я&lt;br /&gt;)nainemrA( ։րենըչ տսիգնահնա իծնի և լետւո իկապա մանրԿ&lt;br /&gt;)naigroeG( .ავიკტმ არა ად მაჭვ სანიმ&lt;br /&gt;)idniH( .तह हन डप ईक स सउ झम ,ह तकस ख चक म&lt;br /&gt;)werbeH( .יל קיזמ אל הזו תיכוכז לוכאל לוכי ינא&lt;br /&gt;)hsiddiY( .ײװ טשינ רימ טוט סע ןוא זאלג ןסע ןעק ךיא&lt;br /&gt;)cibarA( .ينملؤي ل اذه و جاجزلا لكأ ىلع رداق انأ&lt;br /&gt;)esenapaJ( 。んせまけつ傷を私はれそ。すまれらべ食をスラ&lt;br /&gt;)iahT( บจเนฉหใำทมไนมตแ ดไกจะรกนกนฉ&lt;br /&gt;)slobmys ycnerruc( ₯·₮·₭·₫·₪·₩·₨·₧·₦·₥·₤·₣·₢·₡·¢·$·€·£·¥&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/utf8-string"&gt;utf8-string&lt;/a&gt; package is available on HackageDB. Thanks to Eric M. for providing this little wrapper!  It's a perfect example of the kind of thing which seems obvious... after somebody else has thought to do it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-4810158025883034688?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/4810158025883034688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=4810158025883034688' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4810158025883034688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4810158025883034688'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/07/simply-reading-and-writing-utf-8-in.html' title='simply reading and writing UTF-8 in Haskell'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6679697771787111752</id><published>2008-05-13T15:49:00.007+02:00</published><updated>2008-05-13T16:02:01.504+02:00</updated><title type='text'>recurring problem (boring text file merging)</title><content type='html'>I keep solving variations of this problem at work, whether I'm trying to merge some log files together, or identify token offsets with bits of parse tree.  I had better jot it down so that I don't forget there may be something more general hidden behind all this.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;mergeFoo :: [a] -&gt; [(Int,Int,b)] -&gt; [Either a ([a],b)]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_c6WmXt2id8U/SCmezjJixdI/AAAAAAAAAJE/irPZWIMtCrA/s1600-h/recurring.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_c6WmXt2id8U/SCmezjJixdI/AAAAAAAAAJE/irPZWIMtCrA/s320/recurring.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5199861853221733842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm not necessarily looking for a solution -- I could just boil one out from my previous solutions -- but I am at least officially and publicly reminding myself that I shouldn't keep solving the same thing over and over again (unless I'm engaged in some kind of lateral thinking exercise, which is a different story)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6679697771787111752?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6679697771787111752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6679697771787111752' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6679697771787111752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6679697771787111752'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/05/recurring-problem-boring-text-file.html' title='recurring problem (boring text file merging)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_c6WmXt2id8U/SCmezjJixdI/AAAAAAAAAJE/irPZWIMtCrA/s72-c/recurring.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5158333623891681971</id><published>2008-05-09T18:34:00.006+02:00</published><updated>2008-05-09T18:49:37.204+02:00</updated><title type='text'>lispparser on hackage</title><content type='html'>Ever wanted a LISP S-expressions parser?&lt;br /&gt;&lt;br /&gt;I have.  I do some natural language processing work, where some people like to output parse trees as S-expressions.  Very natural.   But then I always balk because I have to go whip up a little parser for it, which I know to be easy in principle, but... well, you know how that goes.&lt;br /&gt;&lt;br /&gt;Anyway, if you're at my level of programming mediocrity, the one where "write an S-expressions parser" makes you think "I know this is easy, but do I have to?", then perhaps the lispparser package is for you!  I guess this is too minor a package to warrant a mailing list announcement, but I've taken a bit of Jonathan Tang's tutorial code and put it on hackage as &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/lispparser-0.2.1"&gt;lispparser&lt;/a&gt;.  If you think it needs improvement, I might consider putting a darcs2 repository online somewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5158333623891681971?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5158333623891681971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5158333623891681971' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5158333623891681971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5158333623891681971'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/05/lispparser-on-hackage.html' title='lispparser on hackage'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3043513348397030455</id><published>2008-05-05T14:52:00.004+02:00</published><updated>2008-05-05T14:59:45.520+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nlp'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>lingscore</title><content type='html'>A little bit work-related.  In a mail that I'm about to send out to the Corpora mailing list:&lt;blockquote&gt;We're looking for implementations of scoring algorithms for coference resolution.  Specifically, the algorithms we are interested in are MUC-6 (Vilain et al., 1995), B-CUBED (Bagga and Baldwin, 1998), and CEAF (Luo, 2005).&lt;br /&gt;&lt;br /&gt;Our hope is to compare a few pieces of coference resolution software. Does anybody have preferably standalone software that we could use to calculate these scores?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I am sorely tempted to just sit down for a few moments and create these (scoring) tools myself.&lt;br /&gt;&lt;br /&gt;It'd be a small Haskell package called 'lingscore', probably a library and an executable.  I'd stick the scorers under the 'NLP.Evaluation' package.   The library would be dedicated to NLP evaluation algorithms.  No actual NLP, just the scoring algorithms for evaluation campaigns. Should not be difficult, and would very slightly advance the agenda of making Haskell a viable platform for NLP-hacking.&lt;br /&gt;&lt;br /&gt;I quite like the idea of using Haskell for the stupid reason that type signatures make it a bit clearer what kind of inputs we're expecting and what kind of outputs we can produce.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3043513348397030455?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3043513348397030455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3043513348397030455' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3043513348397030455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3043513348397030455'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/05/lingscore.html' title='lingscore'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-7926633043540608</id><published>2008-04-28T18:49:00.004+02:00</published><updated>2008-04-29T00:18:04.211+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oops'/><title type='text'>short day (reg 5h)</title><content type='html'>&lt;b&gt;Edit 23:16&lt;/b&gt; - Argh! This post was meant for koweynlg, my daily work diary.  Not so much for public consumption (like koweycode), but public to keep me honest.   Sorry for the noise (and the meta noise).&lt;br /&gt;&lt;br /&gt;Got here at 10h, leaving at 18h; various tea and cake breaks in between.  Almost done with the REG stuff.  Got my tri-text framework setup (more and more scripts, some of them throwaway).  I am very grateful for the automation, am thanking past-eric (of 1 week ago) for making the results file generator.  Trying to do this by hand [what was I thinking] would have suicide.&lt;br /&gt;&lt;br /&gt;Back to reading Grosz and Sidner.&lt;br /&gt;&lt;br /&gt;More REG stuff tomorrow.  Not done yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-7926633043540608?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/7926633043540608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=7926633043540608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7926633043540608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7926633043540608'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/04/short-day-reg-5h.html' title='short day (reg 5h)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-2573023163257787656</id><published>2008-04-28T11:55:00.003+02:00</published><updated>2008-04-28T12:02:19.990+02:00</updated><title type='text'>native speakers wanted</title><content type='html'>Sorry, this is a little off-topic for koweycode, but we would be interested to have some native speakers participating in a little experiment.&lt;br /&gt;&lt;br /&gt;All you have to do is to read some encyclopaedic texts and plug some stuff into drop-down-boxes along the way.  There are NO WRONG ANSWERS.  We want to see your answers and to learn from them.  It only takes a few minutes (but you can do as  much of it as you want).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;We are now running the second instalment of an experiment in which we ask people to select referential expressions (REs) that refer to the main subject in the context of a simple encyclopaedic text. The idea is to investigate to what extent people agree when choosing REs. The experiment is designed as a multiple choice task, where REs can be selected from a menu. The texts are short and can usually be done in under a minute.&lt;br /&gt;&lt;br /&gt;We would like to ask any native speakers of English who have a few minutes to spare to help us complete the experiment. It would be great if participants could do at least three texts, but you can do as many as you like.&lt;br /&gt;&lt;br /&gt;There is more information on the experiment website. To participate, simply read the instructions and then click on the 'start experiment' button at the bottom of the page:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nltg.brighton.ac.uk/home/Anja.Belz/CMSR"&gt;http://www.nltg.brighton.ac.uk/home/Anja.Belz/CMSR&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Any non-native speakers who would like to try out the experiment can do so at this alternative website:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nltg.brighton.ac.uk/home/Anja.Belz/TESTDRIVE"&gt;http://www.nltg.brighton.ac.uk/home/Anja.Belz/TESTDRIVE&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We would be very grateful for any feedback, comments and suggestions.&lt;br /&gt;Many thanks for your time,&lt;br /&gt;&lt;br /&gt;Anja Belz&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Regretfully, this has not been coded up in Haskell.  But surely that is forgivable :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-2573023163257787656?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/2573023163257787656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=2573023163257787656' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2573023163257787656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2573023163257787656'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/04/native-speakers-wanted.html' title='native speakers wanted'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-737614930474400956</id><published>2008-04-11T09:07:00.003+02:00</published><updated>2008-04-11T16:56:54.020+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs 2 at last!</title><content type='html'>I'm sure you've all seen David's &lt;a href="http://thread.gmane.org/gmane.comp.version-control.darcs.devel/7809"&gt;announcement&lt;/a&gt;: darcs 2.0.0 is out!&lt;br /&gt;&lt;h3&gt;what's good&lt;/h3&gt;In short, darcs 2.0 is safer and faster.&lt;br /&gt;&lt;br /&gt;Particularly, the dreaded exponential-time merge bug has now been largely resolved.  Let me say it more carefully: while it may still be possible to run into exponential time merges, our improvements to conflict-handling should make it considerably less common.  We hope that nobody ever runs into such a situation in practice.&lt;br /&gt;&lt;br /&gt;Other key points are improved the hashed inventory and pristine cache which darcs more robust (you no longer have to worry about third party tools like Eclipse or Unison messing things up by mucking around with darcs internals), the ssh-connection mode which speeds up SSH-issues a lot and kills the typing-your-password-ten-million-times issue dead (at most you'll have to type it in twice).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;what's bad&lt;/h3&gt;On the one hand, darcs 2.0.0 should be much smoother and faster for most users.  On the other hand, people with large repositories (e.g. GHC-sized) might find certain operations to be somewhat slower.  David does not (yet) have ideas on how to make things better for such users, and is even recommending them to switch to something else.  If you've got a repository of darcs' size (over 5000 patches, 6 years, 131 contributors) or smaller, you should continue using darcs, because we still think it works better: we're still the only ones around to offer &lt;em&gt;deep&lt;/em&gt; cherry picking... something which we think would be hard to do without radically changing the way other VCSes work.  If you would like to prove us wrong, please do so and we would be most grateful!&lt;br /&gt;&lt;br /&gt;Also, taking advantage of darcs 2 will require you to upgrade your repository to the &lt;code&gt;darcs-2&lt;/code&gt; format (see &lt;code&gt;darcs convert&lt;/code&gt;), which unfortunately, is not compatible with older versions of darcs.  People with new repositories should definitely start using this format.  People with old repositories should probably do so at the earliest convenient moment, although this means your users will have to upgrade.  Please switch to the new format.  It will make everybody's lives easier.&lt;br /&gt;&lt;br /&gt;The final piece of bad news: we're going to have to shift to a lighter weight development model,  something which puts less strain on David and the rest of the contributors.  The consequences are that patches might get less review [one maintainer and not two], and that you'll be seeing less of David on the mailing lists.  The good news in the bad news is that our lighter weight development model is now being supported by increased automation of the administrative stuff.  For example, our bug tracker is now integrated with the darcs repository so that it automatically knows when a ticket has been resolved by a patch.  This increased automation gives us extra rigour and more time to think about making darcs better.  The only thing we need is more of us.   If you want a place to hone your Haskell, Perl or C... or if you think you know a thing or two about user interfaces,  please spend some time with us.&lt;br /&gt;&lt;h3&gt;to sum up...&lt;/h3&gt;Have you been hesitating to try darcs out?  Well, now is a good time to do so, as our killer bugs have been fixed as well as the kind of minor nuisances that get most of us.  Or... are you looking for something to work on?  Uncle David needs you!&lt;br /&gt;&lt;br /&gt;[note: Thanks to David Roundy for comments on a draft of this post]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-737614930474400956?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/737614930474400956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=737614930474400956' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/737614930474400956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/737614930474400956'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/04/darcs-2-at-last.html' title='darcs 2 at last!'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-1304602829102046870</id><published>2008-04-02T21:04:00.005+02:00</published><updated>2008-04-02T21:16:35.006+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxhaskell'/><title type='text'>wxHaskell 0.10.3 is out!</title><content type='html'>As you may have noticed in Jeremy's &lt;a href="http://www.haskell.org/pipermail/haskell-cafe/2008-April/041210.html"&gt;announcement&lt;/a&gt;, wxHaskell 0.10.3 is now available for &lt;a href="http://wxhaskell.sourceforge.net/download.html"&gt;download&lt;/a&gt;.    This version offers the following key improvements over 0.9.4:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Support for Unicode builds of wxWidgets&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Support for wxWidgets 2.6.x (support for wxWidgets 2.4.2 retained if&lt;br /&gt;you compile from source)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Support for building with GHC 6.6.x and 6.8.x&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Parts of wxHaskell are now built with Cabal&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Profiling support&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Smaller generated binary sizes (using --split-objs)&lt;/li&gt;&lt;/ul&gt;At the moment, wxHaskell works with wxWidgets 2.6 (the previous stable release, still widely available).  But we're working to get you wxWidgets 2.8 support as soon as we can.&lt;br /&gt;&lt;br /&gt;In the meantime, here's a screenshot of the wxFruit paddle-ball example running on my Mac.  (Thanks to shelarcy for putting up the package!)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_c6WmXt2id8U/R_PbGHSwAuI/AAAAAAAAAIc/gRtwc8MuGAQ/s1600-h/paddle.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_c6WmXt2id8U/R_PbGHSwAuI/AAAAAAAAAIc/gRtwc8MuGAQ/s320/paddle.png" alt="" id="BLOGGER_PHOTO_ID_5184728494116963042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This was painlessly installed with the help of cabal-install.    You don't have to use cabal-install -- the wxHaskell sourceforge site includes &lt;a href="http://wxhaskell.sourceforge.net/download.html"&gt;binaries&lt;/a&gt; -- but it may make your life easier for dealing with dependencies.  The only caveat you might want to know about when using Cabal to install wxHaskell and its companion libraries are that wxcore should be installed as root, i.e. &lt;code&gt;sudo cabal install wxcore&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-1304602829102046870?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/1304602829102046870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=1304602829102046870' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1304602829102046870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1304602829102046870'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/04/wxhaskell-0103-is-out.html' title='wxHaskell 0.10.3 is out!'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_c6WmXt2id8U/R_PbGHSwAuI/AAAAAAAAAIc/gRtwc8MuGAQ/s72-c/paddle.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5567627060839063521</id><published>2008-03-15T19:58:00.013+01:00</published><updated>2008-03-15T20:41:31.047+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxhaskell'/><title type='text'>XTC on hackage</title><content type='html'>Just a quick note to say that XTC (XTC: eXtended &amp;amp; Typed Controls for wxHaskell) is &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/xtc-1.0"&gt;available on hackage&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;the haddock&lt;/h3&gt;&lt;br /&gt;The XTC library provides a typed interface to several wxHaskell controls.&lt;ul&gt;&lt;li&gt;radio view (typed radio box)&lt;/li&gt;&lt;li&gt;single-selection list view (typed single-selection list box)&lt;/li&gt;&lt;li&gt;multiple-selection list view (typed multiple-selection list box)&lt;/li&gt;&lt;li&gt;choice view (typed choice box)&lt;/li&gt;&lt;li&gt;value entry (typed text entry)&lt;/li&gt;&lt;/ul&gt;                                                                                   XTC controls keep track of typed values and items, rather than being string based. Selections in XTC controls consist of actual values instead of indices.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;my notes&lt;/h3&gt;XTC library was developed in Utrecht University, and has been used to develop Dazzle, a Bayesian Network toolbox, and very much a "real world" application.  You can read more about XTC and Dazzle in &lt;a href="http://www.cs.uu.nl/dazzle/f08-schrage.pdf"&gt;their Haskell Workshop paper&lt;/a&gt; from 2005.&lt;br /&gt;&lt;br /&gt;If you're using wxhaskell, XTC could make your code a bit cleaner, without imposing                                                a steep learning curve.  Here is a quick example of the library in action.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_c6WmXt2id8U/R9wjBNb302I/AAAAAAAAAIM/XxGNiUrLfgU/s1600-h/xtc-before.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_c6WmXt2id8U/R9wjBNb302I/AAAAAAAAAIM/XxGNiUrLfgU/s320/xtc-before.png" alt="" id="BLOGGER_PHOTO_ID_5178052175262634850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_c6WmXt2id8U/R9wi8Nb301I/AAAAAAAAAIE/BIfZsomjFEM/s1600-h/xtc-after.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_c6WmXt2id8U/R9wi8Nb301I/AAAAAAAAAIE/BIfZsomjFEM/s320/xtc-after.png" alt="" id="BLOGGER_PHOTO_ID_5178052089363288914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here is the source code.  Notice how we work directly with the Fruit type, eschewing any intermediary strings:&lt;pre&gt;import Graphics.UI.WX&lt;br /&gt;import Graphics.UI.XTC&lt;br /&gt;&lt;br /&gt;data Fruit = Apple | Banana | Orange deriving Show&lt;br /&gt;&lt;br /&gt;instance Labeled Fruit where&lt;br /&gt; toLabel = show&lt;br /&gt;&lt;br /&gt;main :: IO ()&lt;br /&gt;main = start $&lt;br /&gt;  do f &lt;- frame []&lt;br /&gt;     txt &lt;- staticText f [ text := "pick a fruit and I will give you a slogan" ]&lt;br /&gt;     radioV &lt;- mkRadioView f Vertical [Apple, Banana, Orange] []&lt;br /&gt;     --&lt;br /&gt;     set radioV [ on select :=&lt;br /&gt;      do mf &lt;- get radioV typedSelection&lt;br /&gt;         set txt [ text := slogan mf ]]&lt;br /&gt;     set f [ layout := margin 5 $ column 1&lt;br /&gt;         [ hfill $ widget txt, widget radioV ] ]&lt;br /&gt;&lt;br /&gt;slogan :: Fruit -&gt; String&lt;br /&gt;slogan Orange = "orange you glad I didn't say 'orange'?"&lt;br /&gt;slogan Apple  = "an apple a day keeps, well you know"&lt;br /&gt;slogan Banana = "buh-naaaaa-naaa"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you like this kind of thing, be sure to also check out &lt;a href="http://www.haskell.org/haskellwiki/AutoForms"&gt;AutoForms&lt;/a&gt; and &lt;a href="http://www.haskell.org/haskellwiki/Phooey"&gt;Phooey&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5567627060839063521?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5567627060839063521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5567627060839063521' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5567627060839063521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5567627060839063521'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/03/xtc-on-hackage.html' title='XTC on hackage'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_c6WmXt2id8U/R9wjBNb302I/AAAAAAAAAIM/XxGNiUrLfgU/s72-c/xtc-before.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-2281300585378355770</id><published>2008-03-12T10:55:00.004+01:00</published><updated>2008-03-12T12:14:22.711+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxhaskell'/><title type='text'>wxhaskell 0.10.3rc1</title><content type='html'>In case you missed &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=1205315421.15905.1241945927%40webmail.messagingengine.com&amp;forum_name=wxhaskell-users"&gt;Jeremy's announcement&lt;/a&gt;, the first release candidate for wxhaskell 0.10.3 is now ready for &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=73133"&gt;download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Highlights of 0.10.3 rc1 include:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Support for Unicode builds of wxWidgets&lt;br /&gt;&lt;li&gt;Support for wxWidgets 2.6.x (support for wxWidgets 2.4.2 retained if&lt;br /&gt;you compile from source)&lt;br /&gt;&lt;li&gt;Support for building with GHC 6.6.x and 6.8.x&lt;br /&gt;&lt;li&gt;Parts of wxHaskell are now built with Cabal&lt;br /&gt;&lt;li&gt;Profiling support&lt;br /&gt;&lt;li&gt;Smaller generated binary sizes (using --split-objs)&lt;/ul&gt;&lt;br /&gt;See Jeremy's message for a more complete list.&lt;br /&gt;&lt;br /&gt;Note that we have postponed the goal of supporting wxWidgets 2.8.  We are definitely making this a priority for wxhaskell 0.11.  In the meantime, we will focus on making wxhaskell 0.10.3 easy for everyone to install.  So please let us know if you run into any trouble.  (Many thanks to Neil Mitchell and other users who have helped in testing)&lt;br /&gt;&lt;br /&gt;Finally, users of MacOS X Leopard have reported difficulty building the older wxWidgets 2.6.  According to the &lt;a href="http://www.wxwidgets.org/wiki/index.php/Mac_OS_X_And_Xcode_For_Beginners#Configure"&gt;wxWidgets wiki page&lt;/a&gt; for more details), doing so is indeed possible, if you use the Tiger SDK.  We would love to hear from you if you have succeeded in doing this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-2281300585378355770?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/2281300585378355770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=2281300585378355770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2281300585378355770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2281300585378355770'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/03/wxhaskell-0103rc1.html' title='wxhaskell 0.10.3rc1'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3219906398206516559</id><published>2008-02-28T18:31:00.003+01:00</published><updated>2008-02-29T00:36:14.323+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>operation Roundy Tears</title><content type='html'>I have a very serious issue that I'd like to raise with the darcs and Haskell communities: you're not being evil enough.&lt;br /&gt;&lt;br /&gt;Darcs2 is getting closer and closer to completion (I am not saying this in any official capacity), but you've all been pretty complacent about making it hurt.  Sure, some of you have done performance testing, for which thanks, and yes, some of you have thrown in a couple of conflict related tests.  But the closest we have ever come is a &lt;pre&gt;darcs: src/Darcs/Patch/Real.lhs:422:21-50: Irrefutable pattern failed for&lt;br /&gt;pattern Data.Maybe.Just a2'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And that was fixed within a week.&lt;br /&gt;&lt;br /&gt;This isn't good enough.  Be more evil!  Submit tests to our bugs/ directory.  Think of devious conflicting ways to make darcs fall down.  &lt;br /&gt;&lt;br /&gt;Make... David... cry...&lt;br /&gt;&lt;br /&gt;Please.&lt;br /&gt;&lt;br /&gt;[note: the best way to participate in Operation Roundy Tears is to use the --darcs-2 format; you can get a darcs2 repository from a darcs1 repository by using darcs convert]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3219906398206516559?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3219906398206516559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3219906398206516559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3219906398206516559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3219906398206516559'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/02/operation-roundy-tears.html' title='operation Roundy Tears'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-850347607091979828</id><published>2008-02-24T19:57:00.005+01:00</published><updated>2008-02-24T20:18:01.868+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxhaskell'/><title type='text'>wxhaskell components and news</title><content type='html'>So, I made this little diagram showing the basic components of wxhaskell.  It might be not entirely correct, but I hope it will be useful for anybody who wants to help out.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_c6WmXt2id8U/R8HABBJjdjI/AAAAAAAAAHk/ZT_q6Ts53XY/s1600-h/components.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_c6WmXt2id8U/R8HABBJjdjI/AAAAAAAAAHk/ZT_q6Ts53XY/s320/components.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5170624970918950450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also, as you might have noticed, wxhaskell is now on hackage as an experimental pre-release.  Let me know if you have any trouble building it, or getting it to run sample applications.  There's still a few painful bits, (1) you still have to use wxWidgets 2.6 and not the newer 2.8 [we're working on it] (2) that it assumes your wxWidgets is compiled with --enable-mediactrl (this should be relatively easy for us to fix and (3) for Linux, wxcore 0.10.2 requires that you configure wxhaskell --with-opengl (the darcs version fixes this) and (4) for Windows... well I don't know; shelarcy can build it just fine using Visual Studio, I think and the darcs version of cabal should now be happier with our Cabal files.&lt;br /&gt;&lt;br /&gt;In other news, we're now much more disciplined about using the wiki to note problems &lt;a href="http://www.haskell.org/haskellwiki/WxHaskell/Install"&gt;installing wxhaskell &lt;/a&gt; and to propose solutions.  We're also now paying closer attention to the bug tracker (triaging them), and have made it much easier for users to submit bug demonstrators (see our bugs/ directory). I hope these new habits will make us more responsive.&lt;br /&gt;&lt;br /&gt;So we're not really ready for an official release, but we're getting closer.  I'm hoping we get there sooner rather than later.  I want to see more people playing with neat tools like &lt;a href="http://www.haskell.org/haskellwiki/Phooey"&gt;Phooey&lt;/a&gt; and &lt;a href="http://www.haskell.org/haskellwiki/AutoForms"&gt;Autoforms&lt;/a&gt;, both of which are on hackage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-850347607091979828?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/850347607091979828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=850347607091979828' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/850347607091979828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/850347607091979828'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/02/wxhaskell-components-and-news.html' title='wxhaskell components and news'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_c6WmXt2id8U/R8HABBJjdjI/AAAAAAAAAHk/ZT_q6Ts53XY/s72-c/components.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-7921155390868857014</id><published>2008-02-22T11:48:00.006+01:00</published><updated>2008-02-22T14:20:40.238+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maybench'/><title type='text'>maybench underway</title><content type='html'>The maybench project (formerly checkquick) is now underway.  Maybench is a tool for comparing the performance between two versions of the same program, on a series of benchmarks that you design.  Maybench aims to be easy to use, almost as easy as running &lt;code&gt;time your-program arg1..arg2&lt;/code&gt;. Ideally, it should be very straightforward for outsiders to write timing tests for your programming project and contribute them as part of your performance testing suite. &lt;br /&gt;&lt;br /&gt;We have a &lt;a href="http://code.google.com/p/maybench/"&gt;Google Code&lt;/a&gt; page, &lt;a href="http://groups.google.com/group/maybench-devel"&gt;a mailing list&lt;/a&gt; and a darcs repository:&lt;pre&gt;&lt;br /&gt;  darcs get http://code.haskell.org/maybench&lt;/pre&gt;&lt;br /&gt;The repository basically consists of the &lt;a href="http://tehgeekmeister.wordpress.com/2008/02/08/checkquick-and-hello-planet-haskell/"&gt;preliminary code&lt;/a&gt; written by the tehgeekmeister and also some new code by ertai (see darcs-benchmark).  I'm also hoping that some of the code written for nobench can be used, for example, to generate fancy reports.  Right now, running maybench looks like this:&lt;pre&gt;% dist/build/maybench/maybench 'sleep 5' 'sleep 3'&lt;br /&gt;"sleep 3" took 60.0% of the time "sleep 5" took.&lt;/pre&gt;&lt;br /&gt;As a first priority, we're going to get maybench useable for benchmarking darcs.  After that we'll start thinking of how to generalise it, so that it can be used for the Haskell benchmark suite, for example, or for your software.&lt;br /&gt;&lt;br /&gt;Interested?  Come join us!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-7921155390868857014?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/7921155390868857014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=7921155390868857014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7921155390868857014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7921155390868857014'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/02/maybench-underway.html' title='maybench underway'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6152034072426133158</id><published>2008-02-18T19:24:00.005+01:00</published><updated>2008-02-18T19:32:40.622+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs circa 2003</title><content type='html'>There's always room for improvement.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_c6WmXt2id8U/R7nNshJjdiI/AAAAAAAAAHc/rKeleVyZqec/s1600-h/old-darcs-log.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_c6WmXt2id8U/R7nNshJjdiI/AAAAAAAAAHc/rKeleVyZqec/s200/old-darcs-log.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5168388212080735778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Archaeological findings courtesy of Zooko on &lt;a href="http://bugs.darcs.net/issue687"&gt;issue687&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Darcs exercise: can you find the original patch in the darcs darcs repository where this logo was introduced?  My hope is that the darcs UI is friendly enough that you just say "duh, of course!"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6152034072426133158?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6152034072426133158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6152034072426133158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6152034072426133158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6152034072426133158'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/02/darcs-circa-2003.html' title='darcs circa 2003'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_c6WmXt2id8U/R7nNshJjdiI/AAAAAAAAAHc/rKeleVyZqec/s72-c/old-darcs-log.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8849373401383309055</id><published>2008-02-08T10:44:00.001+01:00</published><updated>2008-02-08T11:17:25.971+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><category scheme='http://www.blogger.com/atom/ns#' term='checkquick'/><title type='text'>checkquick</title><content type='html'>Darcs needs a &lt;a href="http://bugs.darcs.net/issue647"&gt;benchmarking tool&lt;/a&gt;.  After 'stopwatcH', this is the first name I came up with, horrible as it is.  I was thinking that surely, this is a general problem, so we should throw something up on hackage.  The basic wish is to be able to run a program N times (comparing it with a different version of the same program).  &lt;br /&gt;&lt;br /&gt;Can you help?  If you've got code to share, put it up!  If not, and you want to contribute to project, comment on this blog.  If nobody gets moving [and gives me a better name] I guess I'll create a 'checkquick' project, probably using code.google.com and code.haskell.org.  If nobody submits anything and I really do have to start this project (note: I do not want to), I am hoping for a liberal commit model, where we pretty much hand out push rights to anybody who wants them.&lt;br /&gt;&lt;br /&gt;I've already a little description written up, just in case:&lt;blockquote&gt;Checkquick is a tool for comparing the performance between two versions of the same program, on a series of benchmarks that you design.  &lt;br /&gt;&lt;br /&gt;Checkquick aims to be easy to use, almost as easy as running 'time your-program arg1..arg2'.  Ideally, it should be easy for outsiders to write timing tests for your programming project and contribute them as part of your performance testing suite.&lt;br /&gt;&lt;br /&gt;It is written in Haskell and named after the illustrious, though wholly unrelated, quickcheck.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8849373401383309055?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8849373401383309055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8849373401383309055' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8849373401383309055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8849373401383309055'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2008/02/checkquick.html' title='checkquick'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-379237093843588269</id><published>2007-12-23T09:41:00.000+01:00</published><updated>2007-12-23T09:44:02.855+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs at a glance</title><content type='html'>Check out Paul Bedaride's very handy &lt;a href="http://parmenioon.free.fr/darcs-cheat-sheet.pdf"&gt;darcs cheet sheat&lt;/a&gt;.  It gives you basically everything you need to know about darcs on a single sheet of A4 paper.  I'm sure Paul would appreciate any appropriate criticism you may have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-379237093843588269?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/379237093843588269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=379237093843588269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/379237093843588269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/379237093843588269'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/12/darcs-at-glance.html' title='darcs at a glance'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8415943586184271258</id><published>2007-12-18T18:32:00.001+01:00</published><updated>2007-12-18T18:32:22.983+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><title type='text'>mail?</title><content type='html'>So we have in Haskell quite a few consumer applications&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://darcs.net/"&gt;revision control system&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://haskell.org/haskellwiki/Yi"&gt;text editor&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://xmonad.org/"&gt;window manager&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;When's the mail client coming? I'm asking this in the random speculative sense, not in the "gimme a Haskell mail client now" sense. What would a Haskell mail client look like? I'm guessing that plugins will play a nice role, extensibility and all. Being able to handle really large mailboxes (a big "archive" folder) would be nice. Perhaps &lt;a href="http://sup.rubyforge.org/"&gt;Sup&lt;/a&gt; would be good inspiration.  Come to think of it, maybe the client should be implemented in Cat, just for the name...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8415943586184271258?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8415943586184271258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8415943586184271258' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8415943586184271258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8415943586184271258'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/12/mail.html' title='mail?'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-4918671699736841793</id><published>2007-12-06T15:51:00.000+01:00</published><updated>2007-12-06T16:02:34.479+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cabal'/><title type='text'>Setup.(l)hs</title><content type='html'>One minor annoyance when using Cabal to install stuff is that not every project agrees on whether the Setup script should be an .hs or an .lhs file.  The consequence is that when doing a bunch of installations, I'll hit the up arrow to re-run, say, &lt;tt&gt;runhaskell Setup.lhs configure&lt;/tt&gt; and it will complain that the file is not found, because this project uses .hs and the project just before uses .lhs.&lt;br /&gt;&lt;br /&gt;What I'm wondering, though is if it would be a good idea for projects to distribute &lt;em&gt;both&lt;/em&gt; files?  We could even use something like this to have the same file regardless of extension:&lt;pre&gt;&lt;br /&gt;#!/usr/bin/env runhaskell&lt;br /&gt;{-&lt;br /&gt;&lt;br /&gt;&gt; import Distribution.Simple&lt;br /&gt;&gt; main = defaultMain&lt;br /&gt;&lt;br /&gt;-}&lt;br /&gt;import Distribution.Simple&lt;br /&gt;main = defaultMain&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I guess that once cabal-install comes out, none of this would really matter since all that building-of-dependencies stuff would be taken care of automatically.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-4918671699736841793?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/4918671699736841793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=4918671699736841793' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4918671699736841793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4918671699736841793'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/12/setuplhs.html' title='Setup.(l)hs'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-48880875866058295</id><published>2007-12-06T15:07:00.001+01:00</published><updated>2007-12-06T15:09:25.900+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>David Roundy is the new darcs unstable maintainer</title><content type='html'>Just wanted to announce that I am ending my stint as unstable branch maintainer and transferring the responsibility back to David.  This will help me to keep up with my new life and job, and help David to usher in the new darcs-2.0. &lt;br /&gt;&lt;br /&gt;I hope I'll be able to continue participating, maybe submitting a patch or two when things settle down over here.  In the meantime, it's been fun and I've learned a lot.&lt;br /&gt;&lt;br /&gt;So thanks for everything and good luck with 2.0!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-48880875866058295?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/48880875866058295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=48880875866058295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/48880875866058295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/48880875866058295'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/12/david-roundy-is-new-darcs-unstable.html' title='David Roundy is the new darcs unstable maintainer'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8004291174902084540</id><published>2007-11-06T15:39:00.000+01:00</published><updated>2007-11-06T15:57:33.838+01:00</updated><title type='text'>PhD viva (defense)</title><content type='html'>I'll be presenting my thesis next Wednesday.  You are cordially invited to attend the defence  and to join us for drinks afterwards.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;hr /&gt;&lt;a href="http://www.loria.fr/~kow/kowthese-1.0.pdf.zip"&gt;Surface realisation: ambiguity and determinism&lt;/a&gt;&lt;br /&gt;Eric Kow&lt;br /&gt;&lt;br /&gt;14 November 2007&lt;br /&gt;Amphi C, &lt;a href="http://www.loria.fr/access/acceder"&gt;LORIA&lt;/a&gt;&lt;br /&gt;Nancy, France&lt;br /&gt;&lt;br /&gt;Surface realisation is a subtask of natural language generation.  It may be viewed as the inverse of parsing, that is, given a grammar and a representation of meaning, the surface realiser produces a natural language string that is associated by the grammar to the input meaning. This thesis presents three extensions to GenI, a realisation algorithm for Feature-Based Tree Adjoining Grammar (FB-LTAG).&lt;br /&gt;&lt;br /&gt;The first extension improves the efficiency of the realiser with respect to lexical ambiguity.  It is an adaptation from parsing of the "electrostatic tagging" optimisation, in which lexical items are associated with a set of polarities, and combinations of those items with non-neutral polarities are filtered out.&lt;br /&gt;&lt;br /&gt;The second extension deals with the number of outputs returned by the realiser.  Normally, the GenI algorithm returns all of the sentences associated with the input logical form.  Whilst these inputs can be seen as having the same core meaning, they often convey subtle distinctions in emphasis or style.  It is important for generation systems to be able to control these extra factors.  Here, we show how the input specification can be augmented with annotations that provide for the fine-grained control that is required.  The extension builds off the fact that the FB-LTAG grammar used by the generator was constructed from a "metagrammar", explicitly putting to use the linguistic generalisations that are encoded within.&lt;br /&gt;&lt;br /&gt;The final extension provides a means for the realiser to act as a metagrammar-debugging environment.  Mistakes in the metagrammar can have widespread consequences for the grammar.  Since the realiser can output all strings associated with a semantic input, it can be used to find out what these mistakes are, and crucially, their precise location in the metagrammar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8004291174902084540?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8004291174902084540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8004291174902084540' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8004291174902084540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8004291174902084540'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/11/phd-viva-defense.html' title='PhD viva (defense)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-119630442917248724</id><published>2007-10-29T15:38:00.001+01:00</published><updated>2007-10-29T16:16:51.883+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>darcs conflicts faq</title><content type='html'>Pekka Pessi and I have put together an FAQ on the &lt;a href="http://wiki.darcs.net/index.html/ConflictsFAQ"&gt;darcs conflict problem&lt;/a&gt;.  It has three major sections:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Everyday conflicts: what conflicts are and how you should deal with them in the general case.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The big conflicts bug: what it is, how you can avoid it, and what to do if you have run into trouble.&lt;/li&gt;&lt;li&gt;Darcs 2.0: from a user perspective, how it will change from darcs 1.x (not very much), and what resolving conflicts might look like (rollback will play a bigger role).  David has been making some great progress.  Nevertheless, our best estimates are that we will be ready for alpha testing only in Feb 2008, and release by the second quarter of that year.&lt;/li&gt;&lt;/ol&gt;There may be some mistakes or gaps in the FAQ,  but I hope that you will find it useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-119630442917248724?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/119630442917248724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=119630442917248724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/119630442917248724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/119630442917248724'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/10/darcs-conflicts-faq.html' title='darcs conflicts faq'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8058693192493464386</id><published>2007-10-24T20:42:00.000+02:00</published><updated>2007-10-25T12:58:30.819+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mutt'/><category scheme='http://www.blogger.com/atom/ns#' term='gtd'/><title type='text'>getting things done with mutt 3 (action counter)</title><content type='html'>Here's a short tip for putting a reminder on your desktop wallpaper of how many next-action and waiting-for messages you have.  The result looks like this:&lt;br /&gt;&lt;font color="red" size="+2"&gt;&lt;pre&gt;ACTION:  4&lt;br /&gt;WAITING: 1&lt;/pre&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;The approach is to combine a small shell script with the wonderful &lt;a href="http://projects.tynsoe.org/en/geektool/"&gt;GeekTool&lt;/a&gt; program for MacOS X (similar programs exist for Linux, I'm sure).  GeekTool lets you display arbitrary text, say console text on your Desktop.  One of my GeekTool windows is set to run the script and display its results with a big red font.&lt;br /&gt;&lt;br /&gt;The shell script is pretty dumb; it just counts the number of files in my Maildir directory.  I guess if you're using the mbox format, you'll have to find some other way to count messages.  Count the number of instances of '^From: ', maybe?&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;# $2 is just for padding&lt;br /&gt;function count_messages (){&lt;br /&gt;  echo -n "$1:$2"; ls -1 ${HOME}/Mail/current/$1/cur | wc -l&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;count_messages ACTION " "&lt;br /&gt;count_messages WAITING&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I'm not expecting this to have a huge impact on my productivity, but maybe this will be that extra little bit that counts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit 2007-10-25&lt;/b&gt;Fixed counting to account for empty boxes.  Zero.  We like that number.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8058693192493464386?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8058693192493464386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8058693192493464386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8058693192493464386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8058693192493464386'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/10/getting-things-done-with-mutt-3-action.html' title='getting things done with mutt 3 (action counter)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3647932684878758187</id><published>2007-09-21T17:10:00.000+02:00</published><updated>2007-09-21T17:19:19.229+02:00</updated><title type='text'>kowthese 1.0</title><content type='html'>I thought I might announce version 1.0 of my PhD thesis: &lt;a href="http://www.loria.fr/%7Ekow/kowthese-1.0.pdf.zip"&gt;Surface realisation: ambiguity and determinism&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the version that went out to the committee, so it is not definitive (you may prefer to wait for version 1.1 in December).  It's also not very Haskell-related, aside from the fact that the software inside is written in Haskell.   If you are interested, the overall topic area is computational linguistics (natural language processing), specifically, natural language generation.&lt;br /&gt;&lt;br /&gt;Oh, and the darcs repository for the thesis (LaTeX sources):&lt;pre&gt; darcs get http://www.loria.fr/~kow/kowthese&lt;/pre&gt;The viva/defense to be held on 2007-11-14.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3647932684878758187?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3647932684878758187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3647932684878758187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3647932684878758187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3647932684878758187'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/09/kowthese-10.html' title='kowthese 1.0'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8690468064606037538</id><published>2007-08-25T19:15:00.000+02:00</published><updated>2007-08-25T20:27:12.079+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mutt'/><category scheme='http://www.blogger.com/atom/ns#' term='gtd'/><title type='text'>getting things done with mutt 2 (auto-review)</title><content type='html'>Last year, I posted some ideas for applying &lt;a href="http://koweycode.blogspot.com/2006/10/getting-things-done-with-mutt.html"&gt;GTD to mutt&lt;/a&gt;.  As you may have heard, GTD is a simple methodology to help people stay on top of things. The basic idea in my post was to use an on-board X-Label editor to associate each message with a 'next action' or a 'waiting for' tag, and to store them in the respective mailboxes ACTION and WAITING.  This was accompanied by a small colour configuration to highlight the X-Label field of each message, thus making it clear at all times what the next action was.&lt;br /&gt;&lt;br /&gt;After one year of use, I can report that I am 95% happy with the system.  It is simple and effective... however, not entirely eric-proof.  In this post, I propose a small addition to tighten up the system and make it more resistant to my foolishness.  The problem is that GTD is a heavily review-oriented system.  Once you move tasks out of your head and onto some external device (e.g. a pad of paper), you must also consult that device from time to time or risk forgetting to do them.  For example, one thing that can easily happen to me is that I will move messages into ACTION and WAITING and simply forget they are there.&lt;br /&gt;&lt;br /&gt;This is where the idea of automated review comes in.  What I propose a simple method for reminding yourself that you have next actions to perform, or things that you are waiting on.  It consists of a shell script and a crontab entry.  First the script (I call it gtd-review): &lt;pre&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;# note: I am using the maildir format; if you are using mbox, &lt;br /&gt;# you should just replace the 'find $1 | xargs $1' with 'cat $1'&lt;br /&gt;function summarise () {&lt;br /&gt;  find $1 | xargs cat |\&lt;br /&gt;    sed -n -e '/^X-Label/G' -e '/^X-Label/p'\&lt;br /&gt;           -e '/^From/p'    -e '/^Subject/p' -e '/^Date/p' |\&lt;br /&gt;    sed -e 's/From: //' -e 's/Date: //' -e 's/Subject: //'&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo '======================================================================'&lt;br /&gt;echo 'ACTIONS'&lt;br /&gt;echo '======================================================================'&lt;br /&gt;echo&lt;br /&gt;summarise ${HOME}/Mail/ACTION&lt;br /&gt;&lt;br /&gt;echo '======================================================================'&lt;br /&gt;echo 'WAITING'&lt;br /&gt;echo '======================================================================'&lt;br /&gt;echo&lt;br /&gt;summarise ${HOME}/Mail/WAITING&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And now the crontab:&lt;pre&gt;@daily gtd-review 2&gt;&amp;1 /dev/null | mail -s "GTD review `date +%Y-%m-%d`" me@myaddress.com&lt;/pre&gt;I'm sure you could improve on this.  For example, I would rather the dates were presented in yyyy-mm-dd format and accompanied with a friendlier description like "3 weeks ago"... but working on that would probably count as fidgeting.&lt;br /&gt;&lt;br /&gt;Anyway, I hope others find this to be useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8690468064606037538?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8690468064606037538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8690468064606037538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8690468064606037538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8690468064606037538'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/08/getting-things-done-with-mutt-2-auto.html' title='getting things done with mutt 2 (auto-review)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5920591498778032210</id><published>2007-08-16T14:20:00.000+02:00</published><updated>2007-08-17T12:09:14.267+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monads'/><title type='text'>a history of monad tutorials</title><content type='html'>Here's a historical overview of monad tutorials since Phil Wadler's original observation that monads can be implemented in Haskell and become extremely useful.&lt;br /&gt;&lt;br /&gt;When I wrote this, I originally wanted to do a real history, with an analysis of how people have tried to teach monads over the years, but I guess this is about all I have time for.  Dates, authors and blurbs.  Corrections/additions always welcome! As you can tell, I have not read them all.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit 2007-08-17&lt;/b&gt;: I have updated and moved &lt;a href="http://www.haskell.org/haskellwiki/Monad_tutorials_timeline"&gt;this timeline&lt;/a&gt; to Haskellwiki.  This might be useful when some future Haskell archeologist tries to figure out the precise "ah-ha!" moment when every single programmer in the world 'got' monads.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5920591498778032210?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5920591498778032210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5920591498778032210' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5920591498778032210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5920591498778032210'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/08/history-of-monad-tutorials.html' title='a history of monad tutorials'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6557349625542936619</id><published>2007-08-14T16:35:00.000+02:00</published><updated>2007-08-14T16:47:44.821+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><category scheme='http://www.blogger.com/atom/ns#' term='chinese'/><title type='text'>Haskell 是一门函数式编程语言。</title><content type='html'>Looks like some wikibookian(s) have embarked upon a &lt;a href="http://zh.wikibooks.org/wiki/Haskell"&gt;Chinese translation&lt;/a&gt; of the Haskell wikibook.   Good luck to them!  Chinese speakers might be interested in jumping on board.  As for non Chinese speakers, the sentence above is "Haskell is a functional programming language."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6557349625542936619?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6557349625542936619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6557349625542936619' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6557349625542936619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6557349625542936619'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/08/haskell.html' title='Haskell 是一门函数式编程语言。'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6290150695372193467</id><published>2007-07-19T13:45:00.000+02:00</published><updated>2007-07-19T13:55:35.717+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>monomorphism redux</title><content type='html'>There may be errors in this, of course!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;the context from wikibooks&lt;/h3&gt;&lt;br /&gt;Following the previous example, you might be tempted to try storing a value for that radius. Let's see what happens:&lt;pre&gt;Prelude&gt; let r = 25&lt;br /&gt;Prelude&gt; 2 * pi * r&lt;br /&gt;&lt;br /&gt;&amp;lt;interactive&amp;gt;:1:9:&lt;br /&gt;    Couldn't match `Double' against `Integer'&lt;br /&gt;      Expected type: Double&lt;br /&gt;      Inferred type: Integer&lt;br /&gt;    In the second argument of `(*)', namely `r'&lt;br /&gt;    In the definition of `it': it = (2 * pi) * r&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Whoops! You've just run into a programming concept known as types. Types are a feature of many programming languages which are designed to catch some of your programming errors early on so that you find out about them before it's too late. We'll discuss types in more detail later on in the Type basics chapter, but for now it's useful to think in terms of plugs and connectors. For example, many of the plugs on the back of your computer are designed to have different shapes and sizes for a purpose. This is partly so that you don't inadvertently plug the wrong bits of your computer in together and blow something up. Types serve a similar purpose, but in this particular example, well, types aren't so helpful.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;the new monomorphism-based explanation&lt;/h3&gt;&lt;br /&gt;The quick solution to this problem is to specify a type for the number 25. For lack of other information, Haskell has "guessed" that 25 must be an &lt;code&gt;Integer&lt;/code&gt; (which cannot be multiplied with a &lt;code&gt;Double&lt;/code&gt;). To work around this, we simply insist that it is to be treated as a Double&lt;pre&gt;Prelude&gt; let r = 25 :: Double&lt;br /&gt;Prelude&gt; 2 * pi * r&lt;br /&gt;157.07963267948966&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Note&lt;/h4&gt;There is actually a little bit more subtlety behind this problem. It involves a language feature known as the &lt;strong&gt;monomorphism restriction&lt;/strong&gt;. You don't actually need to know about this for now, so you can skip over this note if you just want to keep a brisk pace. Instead of specifying the type &lt;code&gt;Double&lt;/code&gt;, you also have given it a &lt;strong&gt;polymorphic&lt;/strong&gt; type, like &lt;code&gt;Num a =&gt; a&lt;/code&gt;, which means "any type a which belongs in the class Num". The corresponding code looks like this and works just as seamlessly as before:&lt;pre&gt;Prelude&gt; let r = 25 :: Num a =&gt; a&lt;br /&gt;Prelude&gt; 2 * pi * r&lt;br /&gt;157.07963267948966&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Haskell could &lt;em&gt;in theory&lt;/em&gt; assign such polymorphic types systematically, instead of defaulting to some potentially incorrect guess, like Integer. But in the real world, this could lead to values being needlessly duplicated or recomputed.  To avoid this potential trap, the designers of the Haskell language opted for a more prudent "monomorphism restriction".  It means&lt;br /&gt;that values may only have a polymorphic type if it can be inferred from the context, or if you explicitly give it one. Otherwise, the compiler is forced to choose a default monomorphic (i.e. non-polymorphic) type. This feature is somewhat controversial. It can even be disabled with the GHC flag (-fno-monomorphism-restriction), but it comes with some risk for inefficiency. Besides, in most cases, it is just as easy to specify the type explicitly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6290150695372193467?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6290150695372193467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6290150695372193467' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6290150695372193467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6290150695372193467'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/07/monomorphism-redux.html' title='monomorphism redux'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-4225089615391451975</id><published>2007-07-17T14:43:00.000+02:00</published><updated>2007-07-17T14:48:38.118+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>Write Yourself a Scheme in 48 Hours (PDF)</title><content type='html'>One of the wikibookians has made a &lt;a href="http://upload.wikimedia.org/wikibooks/en/a/aa/Write_Yourself_a_Scheme_in_48_Hours.pdf"&gt;rather nice PDF&lt;/a&gt; out of Johnathan Tang's &lt;i&gt;Write Yourself a Scheme in 48 Hours&lt;/i&gt;.  The conversion was done semi-automatically from mediawiki syntax to LaTeX [in Java... tsk].  Many thanks to &lt;a href="http://en.wikibooks.org/wiki/User:Hagindaz"&gt;Hagindaz&lt;/a&gt; for the conversion!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-4225089615391451975?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/4225089615391451975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=4225089615391451975' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4225089615391451975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4225089615391451975'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/07/write-yourself-scheme-in-48-hours-pdf.html' title='Write Yourself a Scheme in 48 Hours (PDF)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3026224908973163127</id><published>2007-07-15T06:55:00.000+02:00</published><updated>2007-07-15T08:31:55.419+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>monomorphism and the unintentional fib</title><content type='html'>The &lt;a href="http://www.haskell.org/haskellwiki/Monomorphism_restriction"&gt;monomorphism restriction&lt;/a&gt; is a simple problem with a scary name.&lt;br /&gt;&lt;br /&gt;I think I've run into the first instance where I have actually been able to identify something as being the monomorphism restriction in action (*).  The good news is that if you don't understand what the restriction is, this might be your chance.  The bad news is that many Haskell newbies might have been hurt in the process, because it involves an unintentional fib that I told in near &lt;a href="http://en.wikibooks.org/wiki/Haskell/Variables_and_functions"&gt;the beginning&lt;/a&gt; of the Haskell wikibook.&lt;br /&gt;&lt;br /&gt;(*) I'd appreciate it if somebody could fact-check me on this.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;circles and half-truths&lt;/h3&gt;High school Geometry.  We've got a circle of radius 25 and we want to know its circumference (2 * pi * r).  Now let's see what happens when we type it into GHCi&lt;pre&gt;&lt;br /&gt;Prelude&gt; let r = 25&lt;br /&gt;Prelude&gt; 2 * pi * r&lt;br /&gt;&lt;br /&gt;&amp;lt;interactive&amp;gt;:1:4:&lt;br /&gt;    No instance for (Floating Integer)&lt;br /&gt;      arising from use of `pi' at &lt;interactive&gt;:1:4-5&lt;br /&gt;    Possible fix: add an instance declaration for (Floating Integer)&lt;br /&gt;    In the second argument of `(*)', namely `pi'&lt;br /&gt;    In the first argument of `(*)', namely `2 * pi'&lt;br /&gt;    In the expression: (2 * pi) * r&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Oops!  At this point, the reader runs into types for the very first time.  This morning, I realised to my horror that I might have given a very wrong explanation of the problem to the gentle Haskell newbie.  I said&lt;blockquote&gt;&lt;br /&gt;The main problem is that Haskell doesn't let you multiply Integers with real numbers. We'll explain why later, but for now, you can get around the issue by using a Double for r so that the pieces fit together:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Prelude&gt; let r = 25.0&lt;br /&gt;Prelude&gt; 2 * pi * r&lt;br /&gt;157.07963267948966&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Which is true, but is only sort of a half-truth.  The problem with my explanation is that it lets the reader walk away with the &lt;em&gt;mistaken&lt;/em&gt; belief that numbers without a decimal point, such as 25, can only be integers, when really they can be any &lt;code&gt;Num a&lt;/code&gt;.  It's as if somebody had taught OCaml too recently and forgotten that &lt;code&gt;haskell /= ocaml&lt;/code&gt;! (Coughs discretely)&lt;br /&gt;&lt;br /&gt;A concrete example of why it's important to get this right can be found further down the chapter.  Here, I want to show that we can use variables within other variables.  So here's what I have the reader type in &lt;code&gt;area = pi * 5^2&lt;/code&gt;:&lt;pre&gt;Prelude&gt; let area = pi * 5^2&lt;/pre&gt;&lt;br /&gt;And here everything works... except...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Except if you are a sharp-eyed reader, you remember from above that I had just said that types prevent you from multiplying integers with reals and I had unintentionally implied that numbers like &lt;code&gt;5&lt;/code&gt; are integers.  So if you are a sharp-eyed reader, you look at that thing and you say to yourself, "HUH? That shouldn't work!  You can't multiply an integer with a real!"&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;monomorphism, like polymorphism without the poly&lt;/h3&gt;The real problem is not that we had set &lt;code&gt;r&lt;/code&gt; to an integer. By right &lt;code&gt;r = 25&lt;/code&gt; &lt;em&gt;should&lt;/em&gt; give us any &lt;code&gt;Num a =&gt; a&lt;/code&gt;; however, since we do not give it a type signature, &lt;code&gt;r&lt;/code&gt; gets restricted to being an &lt;code&gt;Integer&lt;/code&gt;.  In fact, the example of &lt;code&gt;2 * pi * r&lt;/code&gt; would have worked if (a) we had given &lt;code&gt;r&lt;/code&gt; a polymorphic type signature or (b) we had run GHC with its 'no monomorphism restriction' extension.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;polymorphic type signature&lt;/h4&gt;Here we add an explicit type signature to &lt;code&gt;r&lt;/code&gt;.  Everything works:&lt;pre&gt;Prelude&gt; let  r :: Num a =&gt; a; r = 25&lt;br /&gt;Prelude&gt; 2 * pi * r&lt;br /&gt;157.07963267948966&lt;/pre&gt;(Thanks to shachaf on #haskell for reminding me that we can use &lt;code&gt;{}/;&lt;/code&gt; syntax and showing me how to apply it to write type signatures)&lt;br /&gt;&lt;h4&gt;-fno-monomorphism-restriction&lt;/h4&gt;And if you don't like type signatures, here's what it looks like running without the monomorphism restriction:&lt;pre&gt;dewdrop /tmp % ghci -fno-monomorphism-restriction&lt;br /&gt;   ___         ___ _&lt;br /&gt;  / _ \ /\  /\/ __(_)&lt;br /&gt; / /_\// /_/ / /  | |      GHC Interactive, version 6.6, for Haskell 98.&lt;br /&gt;/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/&lt;br /&gt;\____/\/ /_/\____/|_|      Type :? for help.&lt;br /&gt;&lt;br /&gt;Loading package base ... linking ... done.&lt;br /&gt;Prelude&gt; let r = 25&lt;br /&gt;Prelude&gt; 2 * pi * r&lt;br /&gt;157.07963267948966&lt;/pre&gt;No surprises.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;helping the newbies&lt;/h3&gt;Clearly, my explanation needs to be fixed.  I just need to figure out the right way to do it though.  I really don't want to get too technical (the reader doesn't even know about types yet!), but I'll need to avoid lying to the reader.  It's already bitten two users, and it took me one of my readers typing in this text for me to figure out what had happened:&lt;blockquote&gt;You might be thinking that this won't work--isn't 5 an integer, and therefore 5^2 also an integer? And didn't we just get an error trying to multiply pi by an integer?. What's going on is that when you "let r = 25", the "r" you get is more restricted than using the literal string "25" or 5^2. Try :t r and :t 5^2 and see the difference&lt;/blockquote&gt;&lt;br /&gt;I'm not entirely satisfied with this attempt (sorry), and want to deal with the situation more gracefully.  Just don't know how to go about it yet.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;knowing, Knowing and poly/mono&lt;/h3&gt;&lt;br /&gt;Oh a word about the scary name 'monomorphism restriction'.  I find it curious that I should have found that name scary for so long.  I mean, for the longest time, I've told myself that I liked 'polymorphism' right?  So how difficult would it have been to do a little etymology and notice that 'monomorphism' sounds exactly like 'polymorphism', except that you replace the 'poly-' (many) by 'mono-' (one).  By the right, the two words have equivalent scariness!  But for some reason, my brain somehow refused to recognise the fact.  Instead, it associated one word with warm fuzzies and the other word with huh-does-not-compute.&lt;br /&gt;&lt;br /&gt;Otherwise, one thing I found interesting about this is how you can simultaneously (a) hold a piece of knowledge and (b) not apply it consistently.  For example, when I had written that module, I knew that numbers could be any &lt;code&gt;Num a&lt;/code&gt; (and that you could do fun things making up crazy implementations of &lt;code&gt;Num&lt;/code&gt;), yet at the same time as I was using this knowledge (I told myself 'true, but let's not talk about that now, no point confusing the newbies'), I can completely &lt;em&gt;failed&lt;/em&gt; to apply that knowledge, because I went back and reflexively treated &lt;code&gt;25&lt;/code&gt; as an Integer, probably due to all that freshman OCaml teaching.  You know something, but you don't Know it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3026224908973163127?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3026224908973163127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3026224908973163127' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3026224908973163127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3026224908973163127'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/07/monomorphism-and-unintentional-fib.html' title='monomorphism and the unintentional fib'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8277570678135540572</id><published>2007-07-13T19:33:00.000+02:00</published><updated>2007-07-13T19:58:17.636+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>what's in season?</title><content type='html'>Another programming project for those of you who are just itching for something to code.  Basically, I want a website which can tell me, given my current location, what fruits and vegetables are in season right now.&lt;br /&gt;  &lt;br /&gt;Some thoughts, questions and requirements&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The site must be dead simple to and very pleasant to use.   This is not something you should have to read documentation to figure out.&lt;/li&gt;&lt;li&gt;This kind of thing could be easily international, so I want pictures.  Maybe you can grab them from the &lt;a href="http://commons.wikimedia.org"&gt;Wikimedia Commons&lt;/a&gt;.  I guess it would be fair to give you bonus points if you localise the thing, or maybe let me play with the language settings so I learn how to say 'rutabaga' in Arabic.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How does the user tell you where s/he lives?  As a default, it would be nice if you auto-detected it, but what might be nicer also is if I could play around and plug in different locations.  How would you pick a location?  By pointing at a map of the world?  Also, maybe you don't just want a single point in the map, but a region of N kilometers around me.  The question is basically, what grows N kilometers from where I live, where I get to specify&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Likewise, what do you do about the current date?  It would also be nice if I can play around with this, asking not just 'what's in season right now' but 'what's in season during wintertime?'&lt;/li&gt;&lt;li&gt;Where is all of your data coming from?  How are you going to store it and look it up?  What kind of data do you really need?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you want to get really really fancy, you can make the site adapt to current events.  Maybe parse newspaper texts to find out that it's really not a good year for mangoes.&lt;/li&gt;&lt;/ul&gt;This is not necessarily a Haskell project (although in my silly, silly eyes, everything is potentially a Haskell project), but this might be a fun way to learn how to do web stuff and maybe play around with databases.  In fact, such a project might also be useful for building a Haskell web tutorial, a kind of site that we can build together.  Simple objectives that everybody can understand, and actually useful for something.&lt;br /&gt;&lt;br /&gt;This project might also be a good way to learn about building user interfaces.  Or maybe if you're not interested in working on that stuff, it would be a good opportunity to partner up with somebody else.  They worry about the UI stuff and you worry about the code.  I don't know anything about UI, except that I think it's important to get it right.  If it helps, I greatly enjoyed Donald Norman's &lt;a href="http://books.google.com/books?id=cUYIAAAACAAJ&amp;dq=design+of+everyday+things"&gt;&lt;span style="font-style: italic;"&gt;The Design of Everyday Things&lt;/span&gt;&lt;/a&gt;, as well as Bret Victor's &lt;a href="http://worrydream.com/MagicInk/"&gt;Magic Ink&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8277570678135540572?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8277570678135540572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8277570678135540572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8277570678135540572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8277570678135540572'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/07/whats-in-season.html' title='what&apos;s in season?'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5044831627955683325</id><published>2007-07-05T13:31:00.000+02:00</published><updated>2007-07-05T13:53:24.492+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>mediawiki code projects</title><content type='html'>Three more projects to practice your Haskell with, and produce something useful while you're at it:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;a mediawiki writer for &lt;a href="http://sophos.berkeley.edu/macfarlane/pandoc/"&gt;Pandoc&lt;/a&gt; (should be a piece of cake)&lt;/li&gt;&lt;li&gt;a mediawiki reader for Pandoc (perhaps less easy, note that there is also some HTML to deal with)&lt;/li&gt;&lt;li&gt;a mediawiki template engine : given a set of mediawiki pages on the local filesystem, convert mediawiki input into mediawiki output, with all templates interpreted&lt;/li&gt;&lt;/ol&gt;&lt;!-- Sigh.  I guess I'm not a real hacker.  If I was, I'd look at number #3 and say "pffft! easy".  Yeah, I can certainly &lt;em&gt;conceive&lt;/em&gt; of things being easy -- just expand things recursively, right -- but something makes me balk, some lingering fear of getting sucked into something more "interesting" than I was bargaining for.   Or maybe that's what separates the real hackers from the rest of us, a sort of insensibility to getting-in-over-my-head, the attitude that "eh, whatever comes up, I can deal with it."&lt;br /&gt;Anyway, if you're looking for some exercises, these might be a good start. --&gt;My super-seekret reason for suggesting these projects is so that we can one day convert the Haskell wikibook to LaTeX, or something else, and produce a nice PDF.   Naturally, it would also be useful for the other wikibooks, many of which have crappy PDFs, or none at all.   But that's not for you to worry about :-)... just have some nice exercises to play with.&lt;br /&gt;&lt;br /&gt;(#3 might be a bit of work... and also, it's not clear that this is exactly what we want for converting wikibooks.  It seems that the point would not be to expand the templates, but to convert them to something else.  If I have a template called &lt;tt&gt;HaskellExercises&lt;/tt&gt;, I don't want to expand it to a bunch of div tags or whatever;  I want to convert it to something else)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5044831627955683325?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5044831627955683325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5044831627955683325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5044831627955683325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5044831627955683325'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/07/mediawiki-code-projects.html' title='mediawiki code projects'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-7322912374951153363</id><published>2007-07-01T00:05:00.000+02:00</published><updated>2007-07-01T00:29:28.964+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>haskell for reprap?</title><content type='html'>Another potentially fun and probably big project for Haskellers: software for the &lt;a href="http://reprap.org"&gt;RepRap&lt;/a&gt; project.  The goal of RepRap is to build an open-source 3D printer for under $500 and with the ability to print out its own parts.  Their control software is &lt;a href="http://blog.reprap.org/2007/05/reprap-needs-your-java-help_14.html"&gt;written in Java&lt;/a&gt;... borriiing.&lt;br /&gt;&lt;br /&gt;Maybe this is the kind of niche that Haskell could jump in to, something a little unusual (like darcs and xmonad), and very useful at the same time (like darcs and xmonad).  My rough thought was that we could similar successes with xmonad, building solid and minimal code for something that is real world (you don't get any more real than physical objects).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-7322912374951153363?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/7322912374951153363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=7322912374951153363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7322912374951153363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/7322912374951153363'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/07/haskell-for-reprap.html' title='haskell for reprap?'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8358983827717447120</id><published>2007-06-16T18:15:00.000+02:00</published><updated>2007-06-16T18:28:47.632+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='irc'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>#haskell-books channel</title><content type='html'>Created on apfelmus's suggestion.  Should provide a place for writers of Haskell books, tutorials, blogs, teaching materials of all sorts.  We mostly had the wikibook in mind, but figured that others might like to join in on the fun.  Real World?&lt;br /&gt;&lt;br /&gt;Maybe we should host an annual monad tutorial contest or something, each year judging on different criteria, like "most creative use of tuna fish".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8358983827717447120?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8358983827717447120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8358983827717447120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8358983827717447120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8358983827717447120'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/06/haskell-books-channel.html' title='#haskell-books channel'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-4953065174788581871</id><published>2007-05-28T10:09:00.000+02:00</published><updated>2007-05-28T10:27:49.717+02:00</updated><title type='text'>good, simple advice</title><content type='html'>I was looking at Audrey Tang's presentation &lt;a href="http://feather.perl6.nl/~audreyt/osdc/vb.xul"&gt;Visual Basic rocks&lt;/a&gt;, and came across a piece of good, simple advice:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;font size="+3"&gt;Dogmatic&lt;br /&gt;&lt;font color="red"&gt;✗&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Humble&lt;br /&gt;&lt;font color="green"&gt;✔&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Well put.  I was grateful to get a little reminder, a little booster shot.  I'm just hoping that I have taken it sufficiently to heart.&lt;br /&gt;&lt;br /&gt;(I'm assuming you see the red X under 'Dogmatic' and the green check mark under 'Humble').&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-4953065174788581871?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/4953065174788581871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=4953065174788581871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4953065174788581871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/4953065174788581871'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/05/good-simple-advice.html' title='good, simple advice'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5974075017372565022</id><published>2007-05-21T08:32:00.000+02:00</published><updated>2007-05-21T09:54:17.237+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='french'/><title type='text'>burn your gas factories down</title><content type='html'>I've been Haskelling for three years now and have been loving it.  The only discomfort is that from time to time I become painfully aware of my habit of making things horrible and ugly.  Consider this code for instance:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;usine à gaz&lt;/h3&gt;&lt;br /&gt;List of random indices. It is a list [ rM, r(M+1), ..., rN ] where rX is a random number from X to N&lt;pre&gt;&gt; nexts g (l,h) = unfoldr nxt (g,l,h)&lt;br /&gt;&gt;  where&lt;br /&gt;&gt;    nxt (_,l,h) | l &gt;= h = Nothing&lt;br /&gt;&gt;    nxt (g,l,h) = let (r,g2) = randomR (l,h) g&lt;br /&gt;&gt;                      glh2   = (g2, l + 1, h)&lt;br /&gt;&gt;                  in  Just (r, glh2)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This code has been called "clever".  Anytime somebody calls your code "clever", you should begin to worry.  I mean just look at that thing!  You can positively hear the gears turning and the doodads clicking.  This code is what the French call a "gas factory", something incomprehensibly and needlessly complex.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;is there no simpler way?&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Stop micromanaging!  Just tell the computer what you want, not what you want it to do&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&gt; nexts2 g (l,h) = map (\x -&gt; fst $ randomR (x,h) g) [l..h-1]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No gears or doodads.  Geez... I don't what it is with me and making things more complicated than they need to be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5974075017372565022?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5974075017372565022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5974075017372565022' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5974075017372565022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5974075017372565022'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/05/perish-imperative-thought.html' title='burn your gas factories down'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3343752159213776279</id><published>2007-05-20T20:54:00.001+02:00</published><updated>2007-05-20T22:12:57.233+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><title type='text'>unsort bis</title><content type='html'>Boy, do I feel like a big dummy!&lt;br /&gt;&lt;br /&gt;Here is a super short and functional version I saw from a Pythonista on reddit.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import Data.List ( sort )&lt;br /&gt;import System.Random ( Random, RandomGen, randoms, getStdGen )&lt;br /&gt;&lt;br /&gt;main :: IO ()&lt;br /&gt;main =&lt;br /&gt; do gen   &lt;- getStdGen&lt;br /&gt;    interact $ unlines . unsort gen . lines&lt;br /&gt;&lt;br /&gt;unsort :: (Ord x, RandomGen g) =&gt; g -&gt; [x] -&gt; [x]&lt;br /&gt;unsort g es = [ y | (_,y) &lt;- sort $ zip rs es ]&lt;br /&gt;  where rs = randoms g :: [Integer]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;edit!&lt;/h3&gt;Heffalump points out that (i) if you have duplicates in &lt;code&gt;rs&lt;/code&gt;, you don't get scrambling for the relevant bits (ii) this requires Ord x, which it really ought not to (although that is ani improvement from the array thing where I had to lock the type down for some reason)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;edit deux&lt;/h3&gt;Hmm... what does it mean to get a list of random arbitrary precision integers?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3343752159213776279?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3343752159213776279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3343752159213776279' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3343752159213776279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3343752159213776279'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/05/unsort-bis.html' title='unsort bis'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-1759799152904740938</id><published>2007-05-20T18:10:00.000+02:00</published><updated>2007-05-20T18:27:49.937+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><title type='text'>unsort</title><content type='html'>Here's a small script I wrote partly for wikibook stuff and partly to learn how to use arrays and random numbers in Haskell.&lt;br /&gt;&lt;br /&gt;I'm not a particularly enlightened Haskeller, so you might want to be careful about learning from me.  Go ask somebody more experienced.&lt;br /&gt;&lt;br /&gt;Note: one thing I'm a bit annoyed about is that I can't figure out how to make the unsort function generic, how to make it work for any type of array, element, index.  Suggestions and by all means simplifications welcome.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;unsort&lt;/h3&gt;&lt;pre&gt;&gt; import Data.Ix ( Ix )&lt;br /&gt;&gt; import Data.List ( unfoldr )&lt;br /&gt;&gt; import Data.Array.MArray ( MArray, getElems, newListArray, readArray, writeArray )&lt;br /&gt;&gt; import System.Random ( mkStdGen, getStdGen, Random, RandomGen, random, randomR )&lt;br /&gt;&gt; import Data.Array.IO&lt;br /&gt;&lt;br /&gt;&gt; main :: IO ()&lt;br /&gt;&gt; main =&lt;br /&gt;&gt;  do gen   &lt;- getStdGen&lt;br /&gt;&gt;     ins   &lt;- lines `fmap` getContents&lt;br /&gt;&gt;     outs  &lt;- unsort gen ins&lt;br /&gt;&gt;     putStr . unlines $ outs&lt;br /&gt;&lt;/pre&gt;Our objective is to scramble a list.  To do this we convert the list into a mutable array and scramble it in place.  This consists of traversing the array from left to right, swapping each element N with a random element from N to the end of the array.&lt;pre&gt;&lt;br /&gt;&gt; unsort :: RandomGen g =&gt; g -&gt; [String] -&gt; IO [String]&lt;br /&gt;&gt; unsort g es =&lt;br /&gt;&gt;  do arr  &lt;- newListArray (l,h) es :: IO (IOArray Int String)&lt;br /&gt;&gt;     unsortH arr l idxs &gt;&gt;= getElems&lt;br /&gt;&gt;  where&lt;br /&gt;&gt;   idxs   = nexts g (l,h)&lt;br /&gt;&gt;   (l, h) = (1, length es)&lt;br /&gt;&lt;/pre&gt;The swapping itself is pretty straightforward.  We swap the element at the&lt;br /&gt;given index at the next random index.  Recursion to the next element until&lt;br /&gt;we run out of indices.&lt;pre&gt;&lt;br /&gt;&gt; unsortH :: (MArray a e m, Num i, Ix i) =&gt; a i e -&gt; i -&gt; [i] -&gt; m (a i e)&lt;br /&gt;&gt; unsortH arr c [] = return arr&lt;br /&gt;&gt; unsortH arr c (r:rs) =&lt;br /&gt;&gt;  do rElem &lt;- readArray arr r&lt;br /&gt;&gt;     cElem &lt;- readArray arr c&lt;br /&gt;&gt;     writeArray arr c rElem&lt;br /&gt;&gt;     writeArray arr r cElem&lt;br /&gt;&gt;     unsortH arr (c+1) rs&lt;br /&gt;&lt;/pre&gt;And here is how we generate that list of random indices.  It is a list [ rM, r(M+1), ..., rN ] where rX is a random number from X to N... Hmm... I'm pretty sure this can be greatly cut down&lt;pre&gt;&lt;br /&gt;&gt; nexts :: (RandomGen g, Num n, Ord n, Random n, Ix n) =&gt; g -&gt; (n,n) -&gt; [n]&lt;br /&gt;&gt; nexts g (l,h) = unfoldr nxt (g,l,h)&lt;br /&gt;&gt;  where&lt;br /&gt;&gt;    nxt (_,l,h) | l &gt;= h = Nothing&lt;br /&gt;&gt;    nxt (g,l,h) = let (r,g2) = randomR (l,h) g&lt;br /&gt;&gt;                      glh2   = (g2, l + 1, h)&lt;br /&gt;&gt;                  in  Just (r, glh2)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-1759799152904740938?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/1759799152904740938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=1759799152904740938' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1759799152904740938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1759799152904740938'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/05/unsort.html' title='unsort'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3077401389174533184</id><published>2007-05-18T07:43:00.001+02:00</published><updated>2007-05-18T08:59:09.363+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><category scheme='http://www.blogger.com/atom/ns#' term='teaching'/><title type='text'>risk and recursion</title><content type='html'>Lately, I've been playing a bit of correspondence Risk with some childhood friends.  The good thing about correspondence Risk, when you're scattered across twelve timezones is that it is inherently self-limiting.  You are forced to wait your turn every day.  Well, that was my hope anyway, but it turns out that things are not quite that simple.  The problem is that though you may well your turn, nothing is stopping you in the meantime from &lt;em&gt;thinking&lt;/em&gt; about World Domination instead of doing something useful.&lt;br /&gt;&lt;br /&gt;But maybe something useful just came out of these daydreams.  I was thinking that Risk might be a good tool for teaching programming techniques.  For example, it seems calculating dice roll outcomes would a rather nice example for teaching recursion and dynamic programming.  This is something we typically do with factorial and fibonacci, but for some students, that might get a little boring.  Perhaps dice rolls aren't all that exciting either, but maybe you could sell the Risk angle an awaken your audience's inner ten year old.  Maybe you could sell this as part of a bigger package... in this class, we'll be putting together our own Risk implementation, with fancy graphics and everything.&lt;br /&gt;&lt;br /&gt;The idea is that you want to ask your program "if the attacker has 37 armies and the defender has 10, what is the most probable outcome and its probability (assuming that each side uses as many dice as possible)?"&lt;br /&gt;&lt;br /&gt;My belief is that there is no way to calculate this 'instantly' and without computing all possibilities.  You would have to basically crunch through each one of the (a * d) eventual outcomes.  (anybody with halfway decent math skills want to confirm that?)&lt;br /&gt;&lt;br /&gt;One idea you might able to show with this is just plain simple recursion (although you probably want to start with a simpler example first).  So I've got 37 and 10, and if I need the expected outcomes of 37/8 (attacker wins), 36/9 (both win one), and 35/10 (defender wins), I could just factor in the probabilities of getting those.&lt;br /&gt;&lt;br /&gt;But I thought was interesting was that you could show that there is some redundant computation going on here. You start at 37/10, but then you go into&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="3"&gt;37/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;37/8&lt;/td&gt;&lt;td&gt;36/9&lt;/td&gt;&lt;td&gt;35/10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;which in turn expands into&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="vertical-align: top;" colspan="9"&gt;37/10&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align: top;" colspan="3"&gt;37/8&lt;br /&gt;&lt;/td&gt;&lt;td style="vertical-align: top;" colspan="3"&gt;36/9&lt;br /&gt;&lt;/td&gt;&lt;td style="vertical-align: top;" colspan="3"&gt;35/10&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;37/6&lt;br /&gt;&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;36/5&lt;br /&gt;&lt;/td&gt;&lt;td&gt;35/8&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;36/7&lt;br /&gt;&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;35/8&lt;br /&gt;&lt;/td&gt;&lt;td&gt;34/9&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;35/8&lt;br /&gt;&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;34/9&lt;br /&gt;&lt;/td&gt;&lt;td&gt;33/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Here, we are recalculating the scenarios 36/7, 35/8 and 34/9.   What happens if we turn the crank some more?  If I'm not mistaken, the naive algorithm would have to do 3^n calculations (loosely speaking), when really we shouldn't be doing any more than n^2.&lt;br /&gt;&lt;br /&gt;I suppose what you'd really want is to have some kind of record of all the outcomes you've already computed.  I'm not sure how it would work out code-wise or how you'd shift all those weights around (and if you are interested, I do invite you to cook up a quick implementation, RiskBuzz).   I will observe, however, that this table could make it simple to turn around and ask a slightly more involved question, like "ok, so what are the &lt;em&gt;three&lt;/em&gt; likeliest outcomes and their probabilities?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3077401389174533184?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3077401389174533184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3077401389174533184'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/05/risk-and-recursion.html' title='risk and recursion'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-634083399247916594</id><published>2007-05-06T07:39:00.000+02:00</published><updated>2007-05-06T07:54:09.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>iron coder</title><content type='html'>There ought to be something like Iron Chef for programming.  Naturally, the Iron Coders would each represent a different paradigm: functional, imperative, object oriented, declarative.  Actually, I have no idea how this would work and suspect it probably would not very entertaining at all.  I just like the idea of summoning IRON CODER FUNCTIONAL! The guy rises with a platform and it's got a little lambda on it...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-634083399247916594?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/634083399247916594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=634083399247916594' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/634083399247916594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/634083399247916594'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/05/iron-coder.html' title='iron coder'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5687928891104558268</id><published>2007-05-01T09:09:00.000+02:00</published><updated>2007-05-01T11:25:32.022+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>haskell wikibook now featured</title><content type='html'>Spot the lambda?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Haskell :: Functional Programming with Types&lt;/h3&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_c6WmXt2id8U/RjcHd3f3RVI/AAAAAAAAADU/HzVWacXoER8/s1600-h/haskell-wikibook-featured-2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_c6WmXt2id8U/RjcHd3f3RVI/AAAAAAAAADU/HzVWacXoER8/s320/haskell-wikibook-featured-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5059520916069238098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;&lt;a href="http://en.wikibooks.org/wiki/Haskell"&gt;Haskell&lt;/a&gt; :: Functional Programming with Types&lt;/i&gt; is now a featured &lt;a href="http://en.wikibooks.org/"&gt;wikibook&lt;/a&gt;, which means that it will be rotated on to the front page on a regular basis.&lt;br /&gt;&lt;br /&gt;There are around 40 books on the site that have this distinction, so if you don't see the Haskell book on the front page, try again in another hour or so.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Write Yourself a Scheme in 48 Hours&lt;/h3&gt;&lt;br /&gt;Note that the wikibook version of  Write Yourself a Scheme in 48 Hours has also been featured for quite some time.  Yay, Johnathan!  It's not on the front page yet, but should be making its way into the rotation at some point.  Its blurb is&lt;br /&gt;as follows:&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_c6WmXt2id8U/Rjbp0Hf3RUI/AAAAAAAAADM/5xfY_VMutSk/s1600-h/haskell-logo-test.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_c6WmXt2id8U/Rjbp0Hf3RUI/AAAAAAAAADM/5xfY_VMutSk/s320/haskell-logo-test.png" alt="" id="BLOGGER_PHOTO_ID_5059488312972494146" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;In this advanced Haskell tutorial, we will implement a significant subset of Scheme together. We assume no prior knowledge; however, we will be going fast. So if you're feeling ambitious, why don't you &lt;a href="http://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours" title="Write Yourself a Scheme in 48 Hours"&gt;Write Yourself a Scheme in 48 Hours&lt;/a&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5687928891104558268?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5687928891104558268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5687928891104558268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5687928891104558268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5687928891104558268'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/05/haskell-wikibook-now-featured.html' title='haskell wikibook now featured'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_c6WmXt2id8U/RjcHd3f3RVI/AAAAAAAAADU/HzVWacXoER8/s72-c/haskell-wikibook-featured-2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3422447877397187638</id><published>2007-04-24T08:45:00.000+02:00</published><updated>2007-04-24T08:52:02.552+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell.fr'/><category scheme='http://www.blogger.com/atom/ns#' term='french'/><category scheme='http://www.blogger.com/atom/ns#' term='français'/><title type='text'>le gentle introduction</title><content type='html'>Je viens de voir sur Haskellwiki que la &lt;a href="http://gorgonite.developpez.com/livres/traductions/haskell/gentle-haskell/"&gt;traduction du Gentle Introduction to Haskell&lt;/a&gt; est terminée.  Félicitations et merci à Nicolas Vallée et TuTuX.&lt;br /&gt;&lt;br /&gt;I just noticed that the French translation of A Gentle Introduction to Haskell has been complete.  Thanks and congrats to the authors.  Now how about a YAHT translation or a &lt;a href="http://fr.wikibooks.org/wiki/Programmation_Haskell"&gt;wikilivre&lt;/a&gt; on Haskell?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3422447877397187638?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3422447877397187638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3422447877397187638' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3422447877397187638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3422447877397187638'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/04/le-gentle-introduction.html' title='le gentle introduction'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6143753031693448127</id><published>2007-04-20T13:13:00.000+02:00</published><updated>2007-04-20T13:27:44.327+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>Haskell wikibook blurb</title><content type='html'>The wikibooks project has a 'featured book' concept, in which the best books of the project are prominently displayed on the &lt;a href="http://en.wikibooks.org/wiki/Main_Page"&gt;front page&lt;/a&gt;.  The Haskell wikibook has been nominated to be listed as one of these featured books.  Votes are positive so far, but nothing official yet.  In the meantime, all wikibook authors are being encouraged to put together an advertising blurb for the front page.&lt;br /&gt;&lt;br /&gt;Here is my attempt.  Can you make it better?  Please feel free to post ideas on this blog, or on the &lt;a href="http://en.wikibooks.org/wiki/Talk:Haskell#good_Haskell"&gt;wikibook talk page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_c6WmXt2id8U/Riig4imL3DI/AAAAAAAAACs/csV7gDnJ0co/s1600-h/haskell-logo-test.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_c6WmXt2id8U/Riig4imL3DI/AAAAAAAAACs/csV7gDnJ0co/s320/haskell-logo-test.png" alt="" id="BLOGGER_PHOTO_ID_5055467474943466546" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Haskell is a functional programming language with a state of the art type system. This book will introduce you to computer programming with our language of choice. It is friendly enough for new programmers, but deep enough to challenge the most experienced. Come stretch your mind with us!&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;(I'm not over-selling am I?  I'm always worried about that)&lt;br /&gt;&lt;br /&gt;Oh and the minimalist logo is just something I threw together (public domain, of course).  Not married to it, just looking for something better than the current one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6143753031693448127?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6143753031693448127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6143753031693448127' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6143753031693448127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6143753031693448127'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/04/haskell-wikibook-blurb.html' title='Haskell wikibook blurb'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_c6WmXt2id8U/Riig4imL3DI/AAAAAAAAACs/csV7gDnJ0co/s72-c/haskell-logo-test.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-1027895752474052346</id><published>2007-04-19T11:30:00.000+02:00</published><updated>2007-04-19T11:33:25.618+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>pleac revamp - thanks!</title><content type='html'>Just wanted to say thanks to whoever it was that started the PLEAC revamp.  Looks much more like Haskell now.  The old notation-abuse version is now called haskell-on-steroids, which annoys me somewhat, but now we have less risk of confusing newbies.  Will be interesting to see how they compare, the &lt;a href="http://pleac.sourceforge.net/pleac_haskell/index.html"&gt;Haskell PLEAC&lt;/a&gt; and the &lt;a href="http://www.haskell.org/haskellwiki/Cookbook"&gt;wiki cookbook&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-1027895752474052346?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/1027895752474052346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=1027895752474052346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1027895752474052346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/1027895752474052346'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/04/pleac-revamp-thanks.html' title='pleac revamp - thanks!'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-9097781352624534091</id><published>2007-04-13T22:22:00.000+02:00</published><updated>2007-04-13T22:43:46.848+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>congrats to hg!</title><content type='html'>I certainly do not speak for the darcs project as whole, but as a contributor and an enthusiastic fan.  In any case, congratulations to the Mercurial team for &lt;a href="http://weblogs.mozillazine.org/preed/2007/04/version_control_system_shootou_1.html"&gt;adoption by Mozilla&lt;/a&gt;!  I'm very happy to see Mercurial being adopted by both mutt and Mozilla, two projects that I also use.  For me, it means that we're slowly starting to move on from centralised version control.  There may be some pain involved, bugs to shake out and what not, but overall it's for the greater good.  (That being said, I'm also pleased to see people upgrading from CVS to SVN, just climbing the ladder in general).&lt;br /&gt;&lt;br /&gt;As for darcs, well, I hope that Jason's work will lead to the resolution of bug numero 1.  No pressure, or anything.  Just a little bit of progress, some useful new insights into the problem would be nice already.&lt;br /&gt;&lt;br /&gt;Now if only I could work out all those Cabalisation issues...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-9097781352624534091?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/9097781352624534091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=9097781352624534091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/9097781352624534091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/9097781352624534091'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/04/congrats-to-hg.html' title='congrats to hg!'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3670933407731340781</id><published>2007-03-31T22:56:00.000+02:00</published><updated>2007-03-31T23:08:55.151+02:00</updated><title type='text'>instant dada</title><content type='html'>Just a small project idea for in case anybody is bored: write a small web toy that generates random blog entries in the style of a given blog.&lt;br /&gt;&lt;br /&gt;My mental image would be basically to have a form in which the user can paste a URL.  What the user should get back is a formatted blog post (maybe even using the right templates), and also html code that they can paste back into their own blogs.&lt;br /&gt;&lt;br /&gt;You'll also want to figure out how to retrieve the individual blog posts, perhaps by using a feed-discovery mechanism.  The result should be a single post with title, text and maybe even comments.  Haskellers, especially newbies, might be particularly interested because it'll give you a chance with the Haskell XML stuff for parsing the RSS, PFP (for the text generation?) and HApps (for the web front-end).  Many of the pieces are there.  I remember seeing an RSS parser and a random text generator floating about, so it might just be a matter of cobbling things together.&lt;br /&gt;&lt;br /&gt;If you're sucessful, you might even kick off one of those memes where people &lt;a href="http://dev.null.org/dadaengine"&gt;dada&lt;/a&gt; their own blogs as a post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3670933407731340781?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3670933407731340781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3670933407731340781' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3670933407731340781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3670933407731340781'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/03/instant-dada.html' title='instant dada'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5719893465683570695</id><published>2007-02-02T20:49:00.000+01:00</published><updated>2007-02-02T20:57:45.370+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>reading and writing UTF-8 in Haskell</title><content type='html'>We were discussing on the Haskell fr what it would take to work with UTF-8.  Here is an example I cobbled together.  Do whatever you want; it's going in the public domain.  Note that I've also posted it to the wiki, so please make corrections &lt;a href="http://www.haskell.org/haskellwiki/UTF-8"&gt;there&lt;/a&gt; if you can.&lt;br /&gt;&lt;br /&gt;Note that I don't really know what the best practices are wrt to reading and writing UTF-8, but here's what works for me.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; module Main where&lt;br /&gt; &lt;br /&gt;&gt; import Control.Monad (mapM_)&lt;br /&gt;&gt; import Data.Word (Word8)&lt;br /&gt;&gt; import Foreign.Marshal.Array (allocaArray, peekArray, pokeArray)&lt;br /&gt;&gt; import System.Environment (getArgs)&lt;br /&gt;&gt; import System.IO (hFileSize, Handle, hGetBuf, hPutBuf, openBinaryFile,&lt;br /&gt;&gt;                   IOMode(ReadMode, WriteMode))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We're going to be using the 2002 &lt;a href="http://abridgegame.org/repos/darcs/UTF8.lhs"&gt;UTF-8 implementation&lt;/a&gt; by Sven Moritz Hallberg. I don't know if this is the best one, but it's what darcs uses. (I do wonder though, if it's worth turning it into a little library, something like Data.Char.UTF8)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; import UTF8&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We perform the demonstration on a list of files, specified as command line arguments. What we want to show is that we can both read and write UTF-8, so the demonstration will be of reading a file in, reverse every one of its lines, and writing it back out with the extension '.reversed'&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; main :: IO ()&lt;br /&gt;&gt; main =&lt;br /&gt;&gt;  do args &lt;- getArgs&lt;br /&gt;&gt;     mapM_ reverseUTF8File args&lt;br /&gt; &lt;br /&gt;&gt; reverseUTF8File :: FilePath -&gt; IO ()&lt;br /&gt;&gt; reverseUTF8File f =&lt;br /&gt;&gt;   do fb &lt;- readFileBytes f&lt;br /&gt;&gt;      case decode fb of&lt;br /&gt;&gt;        (cs, []) -&gt; writeFileBytes (f ++ ".reverse") $ encode $ reverseLines cs&lt;br /&gt;&gt;        (_,  xs) -&gt; fail $ show xs&lt;br /&gt;&gt;   where&lt;br /&gt;&gt;     reverseLines = unlines . map reverse . lines&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For this to work, we need to have some helper functions for reading and writing [Word8]. I don't know if this is the right way to go about it.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; readFileBytes :: FilePath -&gt; IO [Word8]&lt;br /&gt;&gt; readFileBytes f =&lt;br /&gt;&gt;   do h &lt;- openBinaryFile f ReadMode&lt;br /&gt;&gt;      hsize &lt;- fromIntegral `fmap` hFileSize h&lt;br /&gt;&gt;      hGetBytes h hsize&lt;br /&gt;&gt;&lt;br /&gt;&gt; writeFileBytes :: FilePath -&gt; [Word8] -&gt; IO ()&lt;br /&gt;&gt; writeFileBytes f ws =&lt;br /&gt;&gt;  do h &lt;- openBinaryFile f WriteMode&lt;br /&gt;&gt;     hPutBytes h (length ws) ws&lt;br /&gt; &lt;br /&gt;&gt; hGetBytes :: Handle -&gt; Int -&gt; IO [Word8]&lt;br /&gt;&gt; hGetBytes h c = allocaArray c $ \p -&gt;&lt;br /&gt;&gt;                   do c' &lt;- hGetBuf h p c&lt;br /&gt;&gt;                      peekArray c' p&lt;br /&gt;&gt;&lt;br /&gt;&gt; hPutBytes :: Handle -&gt; Int -&gt; [Word8] -&gt; IO ()&lt;br /&gt;&gt; hPutBytes h c ws = allocaArray c $ \p -&gt;&lt;br /&gt;&gt;                      do pokeArray p ws&lt;br /&gt;&gt;                         hPutBuf h p c&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5719893465683570695?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5719893465683570695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5719893465683570695' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5719893465683570695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5719893465683570695'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/02/reading-and-writing-utf-8-in-haskell.html' title='reading and writing UTF-8 in Haskell'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8479624946660839520</id><published>2007-01-31T11:39:00.000+01:00</published><updated>2007-01-31T11:41:30.089+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monads'/><title type='text'>think of a monad...</title><content type='html'>&lt;i&gt;Think of a monad as a spacesuite full of nuclear waste in the ocean next to a container of apples. now, you can't put oranges in the space suite or the nucelar waste falls in the ocean, *but* the apples are carried around anyway, and you just take what you need.&lt;/i&gt; - Dons&lt;br /&gt;&lt;br /&gt;Thought an illustration might be useful:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_c6WmXt2id8U/RcBySK_5gJI/AAAAAAAAAA0/4GFSohXft9U/s1600-h/think_of_a_monad.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_c6WmXt2id8U/RcBySK_5gJI/AAAAAAAAAA0/4GFSohXft9U/s320/think_of_a_monad.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5026142840661049490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(Yes, yes, I know I have better things to be doing with my time)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8479624946660839520?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8479624946660839520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8479624946660839520' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8479624946660839520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8479624946660839520'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/01/think-of-monad.html' title='think of a monad...'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_c6WmXt2id8U/RcBySK_5gJI/AAAAAAAAAA0/4GFSohXft9U/s72-c/think_of_a_monad.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3189807115265393731</id><published>2007-01-17T02:21:00.000+01:00</published><updated>2007-01-17T02:54:52.065+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yaht'/><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>yaht latex now up to date with wiki</title><content type='html'>YAHT has two versions: a LaTeX one, which produces &lt;a href="http://darcs.haskell.org/yaht/yaht.pdf"&gt;a nice PDF&lt;/a&gt; including margin notes, an index, etc; and &lt;a href="http://en.wikibooks.org/wiki/Haskell/YAHT"&gt;a wiki(book) one&lt;/a&gt;, which provides an HTML view and instant editing. &lt;br /&gt;&lt;br /&gt;The latex (darcs) version was lagging a bit behind the wiki one for a while, but it has now caught up.  I'm quite pleased with the results.  I have received 3 darcs patches so far, which may not be huge, but is still better than nothing.  More importantly, I have observed that people still like going to the PDF version a lot, so we know that keeping that up to date is important.  Having YAHT on the wiki has certainly been useful as well.  In the two and half months since its wikification, you have not only corrected countless crappy-script-induced-deformations, over a dozen factual errors, and twice as many typos or spelling/grammatical errors.  Good work, Haskellers!&lt;br /&gt;&lt;br /&gt;Note also that keeping the LaTeX version up to date should now be a lot easier, thanks to (1) a cleaned up and less noisy conversion script (2) stupid darcs tricks.  I've got three branches: the (noisy) auto-convered version (latex-to-darcs), a "production" version, which has less noise than the prior, and an MVS version, which pulls in changes from the wiki.  The noisy version has some gunk from my scripts that I just have to revert.  The MVS version has some changes which only affect noise (errors in where I put my &lt;math&gt; tags, for example), but I can just record these as local patches.  Now if somebody modifies the wiki, I just have to do:&lt;pre&gt;&lt;br /&gt;mvs update&lt;br /&gt;darcs whatsnew&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This tells me right away if there any changes I need to incorporate in the latex version.  We'll have to see how this turns out in practice, but for now it seems we have now averted the danger of forking the YAHT (whew!).  As usual, you can either send me patches to the latex version (&lt;tt&gt;darcs get http://darcs.haskell.org/yaht&lt;/tt&gt;) or just edit the wikibook.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3189807115265393731?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3189807115265393731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3189807115265393731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3189807115265393731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3189807115265393731'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/01/yaht-latex-now-up-to-date-with-wiki.html' title='yaht latex now up to date with wiki'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-8221077480268751030</id><published>2007-01-16T23:30:00.000+01:00</published><updated>2007-01-17T23:00:11.990+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='house'/><category scheme='http://www.blogger.com/atom/ns#' term='parallels'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>House runs under Parallels</title><content type='html'>&lt;a href="http://programatica.cs.pdx.edu/House/"&gt;House&lt;/a&gt; is an operating system written in Haskell.  Ever since CSE380 (titled "Operating Systems") and my many many segfaults, I have deeply impressed with those I call "people who know how computers work".  So whenever somebody says "I wrote an operating system!"... I simply marvel.  &lt;br /&gt;&lt;br /&gt;Anyway, was just sort of fiddling with my computer trying to see if I can get it to run, but I was having the toughest time!  The thing boots fine under Q (the qemu front end), but nothing I did could make it work on Parallels.  Tried renaming it with .hdd extension, but then I just got a grub prompt with no idea how to proceed.  Renaming it to .fdd and connecting it as a floppy wouldn't work, so my first reaction was "oh! it must be some kind of crazy Parallels-specific format", so I kept searching the web and asking on IRC, trying to see if anyone know how to produce Parallels-compatible bootable floppy images...&lt;br /&gt;&lt;br /&gt;Well you know what the problem was?&lt;br /&gt;&lt;br /&gt;Next to the floppy drive icon [connected to hOp-0.8.fdd] are two checkboxes, Enabled and Connect on Startup.  Connect on Startup was unchecked.&lt;br /&gt;&lt;br /&gt;Yes eric, you have to put the disk in the drive for it to work... good job!  &lt;br /&gt;&lt;br /&gt;What a dolt.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Edit 2006-01-17&lt;/h3&gt;Here are a couple of screenshots, as requested.  The first is just the Parallels window:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_c6WmXt2id8U/Ra6aYa_5gHI/AAAAAAAAAAc/GMckDATknmA/s1600-h/house-on-parallels.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_c6WmXt2id8U/Ra6aYa_5gHI/AAAAAAAAAAc/GMckDATknmA/s320/house-on-parallels.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5021120378919551090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And the second is of the whole desktop (probably a little gratuitous):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_c6WmXt2id8U/Ra6aua_5gII/AAAAAAAAAAk/FIVJKjUBPx4/s1600-h/house-on-parallels-full.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_c6WmXt2id8U/Ra6aua_5gII/AAAAAAAAAAk/FIVJKjUBPx4/s320/house-on-parallels-full.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5021120756876673154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you're having trouble getting this to work on your machine:&lt;ol&gt;&lt;li&gt;Rename hOp-0.8.flp to hOp-0.8.fdd&lt;li&gt;Add it as the floppy disk drive to your virtual machine&lt;li&gt;Set the boot sequence to start with the floppy (or at least, have the floppy somewhere)&lt;li&gt;Remember to click that Connect on Setup button next to the floppy config&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Parallels might crash the first two times you do this.  I have no idea why, but it seems to work after that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-8221077480268751030?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/8221077480268751030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=8221077480268751030' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8221077480268751030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/8221077480268751030'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/01/house-runs-under-parallels.html' title='House runs under Parallels'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_c6WmXt2id8U/Ra6aYa_5gHI/AAAAAAAAAAc/GMckDATknmA/s72-c/house-on-parallels.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-2750388051161667265</id><published>2007-01-07T20:26:00.000+01:00</published><updated>2007-01-07T20:38:06.698+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='irc'/><category scheme='http://www.blogger.com/atom/ns#' term='french'/><category scheme='http://www.blogger.com/atom/ns#' term='français'/><title type='text'>nous sommes huit (#haskell.fr)</title><content type='html'>Le nombre d'utilisateurs sur #haskell.fr (irc.freenode.net) a encore doublé.  On est 8, maintenant, 8 êtres humains.  Je vais noter chaque passage à 2X jusqu'à 32.  J'imagine que à partir de cette taille, le channel n'aura plus besoin d'encouragement.&lt;br /&gt;&lt;br /&gt;Ick.  Eric-French is scary.  There's now 8 of us in #haskell.fr (or rather, 8 max) and that's bona fide human beings too.  I'm going to note each of these doublings until there's 32 of us.  At that point, I figure that we're not going to need anybody blowing on the fire.&lt;br /&gt;&lt;br /&gt;Francophone Haskeller?  Come on in!  And stick around; just put it in your automated login.  If #haskell is too busy for you, consider maybe #haskell.fr as a quieter alternative. We want newbies, experts and curious hangers-on alike.  It would be especially good if experienced Haskellers hung around, because newbies really should not be taking advice from yellow-belt Eric. Oh, and unless they kick me out, non-native speakers bienvenues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-2750388051161667265?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/2750388051161667265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=2750388051161667265' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2750388051161667265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2750388051161667265'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/01/nous-sommes-huit-haskellfr.html' title='nous sommes huit (#haskell.fr)'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6908147878525269872</id><published>2007-01-06T01:50:00.000+01:00</published><updated>2007-01-06T01:52:56.663+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>haskell wikibook print version</title><content type='html'>Just a quick note to mention that the wikibook's &lt;a href="http://en.wikibooks.org/wiki/Haskell/Print_version"&gt;print edition&lt;/a&gt; is now automatically generated by &lt;a href="http://eric.kow.free.fr/download/PrintVersion.hs"&gt;a script&lt;/a&gt;.  90ish lines of what I hope to be reasonable-looking Haskell code.  It should make it easier to keep that print version synched up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6908147878525269872?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6908147878525269872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6908147878525269872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6908147878525269872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6908147878525269872'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2007/01/haskell-wikibook-print-version.html' title='haskell wikibook print version'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5783545043377748849</id><published>2006-12-31T15:26:00.000+01:00</published><updated>2006-12-31T17:46:21.178+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><category scheme='http://www.blogger.com/atom/ns#' term='revctrl'/><title type='text'>distributed chiming in</title><content type='html'>It seems that distributed version control has become a &lt;a href="http://www.iovene.com/content/view/93/1/"&gt;somewhat&lt;/a&gt; &lt;a href="http://aseigo.blogspot.com/2006/12/case-for-distributed-revision-control.html"&gt;hot&lt;/a&gt; &lt;a href="http://tim.littlebluefrog.com/?p=553"&gt;topic&lt;/a&gt; lately.  The latter two posts make the case that being able to work offline is extremely useful, both for road warriors and for users with less than ideal Internet access.  Yes, this does seem like a pretty good motivation for distributed version control.  Indeed, it was my laptop and my dialup connection (aside from sheer curiosity) that first got me using darcs two years ago.  But now I have one of these fancy ADSL connections and a less need to travel or hack offline while doing so.  Yet I continue to use and love darcs.  I'm sure this is something that bzr, git, mercurial, etc users can attest to: yes, offline versioning is indeed a great feature, but there is something more.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Warning: this is a rather long post.  My apologies to planet haskellers and other busy readers.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;one mechanism - many benefits&lt;/h3&gt;&lt;br /&gt;The thing that attracts me to a system like darcs is its conceptual elegance.  From one single mechanism, you get the following features for free:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Painless intialisation&lt;li&gt;Offline versioning&lt;li&gt;Branching and merging&lt;li&gt;Easier collaboration with outsiders&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;These are all the same thing in the darcs world, no fanciness at work whatsoever.  I suppose it's not very convincing to sell simplicity in itself, so in the rest of this post, I'm going to explore these four benefits of a distributed model and discuss what their implications might be for you the developer.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Painless initialisation&lt;/h4&gt; Getting started is easier because you don't have any central repositories to set up.  That might sound awfully petty.  After all, setting up a central repository is nothing more than a mkdir and cvs checkout.  But it's much more of an inconvenience than you might think.&lt;br /&gt;&lt;br /&gt;Setting up  a central repository means you have to think in advance about putting your repository in the right place.  You can't, for instance, set something up locally, change your mind, deciding that you want a server and switch over instantaneously.  You COULD tarball your old repository, move it to the server, and either fiddle with your local configuration or checkout your repository again.  But why should you?  Why jump through all the hoops?  The steps are simple, but they add friction.  How many times have you NOT set up a repository for your code because it would have been a pain (a 30 second pain, but a pain nonetheless?).  How many times have you put off a repository move because it was a pain? Painless initialisation means two things (1) instant gratification (2) the ability to change your mind.  I would argue that such painlessness is crucial because it brings down the barrier of inconvenience to the point where you actually do the things you are supposed to do.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Branching and merging&lt;/h4&gt; A well thought out distributed version control system does not need to have a notion of branching and merging?  Why?  Because a branch can simply exactly the same concept as a repository, as a checkout.  No need to learn two sets of concepts of operations  or two views of your version control universe.  Just think of them as one and the same.  Now, you might be worried about say, the redundancy of all this (gee! wouldn't that mean that branches take up a lot of space?)... but eh... details.&lt;br /&gt;&lt;br /&gt;For starters, disk space is cheap, at least much cheaper than it was in the past.  There might be cases where you are trying to version very large binary files, but for many programming jobs, we are only shuffling text around, so why worry?  Besides, branches are supposed to be disposed of one day or another (merged), right?  It's not like they're going to be that long lived, otherwise it's just a fork.  Moreover, worrying about disk space is the version control system's job, not yours.  You could have a VCS that tries very very hard to save space.  For example, it could try to use hard links whenever possible, in much the same manner as "snapshot" backup systems.  Disk space is not what you the programmer should be worrying about.  It's similar to the case being made for having a second or third monitor: programmer time is more valuable than disk space.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Offline versioning&lt;/h4&gt; Previous posts have discussed this at length.  It's still useful, even if your Internet connection is superb.  It's useful because it lets you hold on to things that aren't quite ready for the central repository, but worth versioning until you're more confident about your code.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Collaboration with outsiders&lt;/h4&gt;Open source and free software projects thrive on contributions from outsiders.  For example, in the past year, 80% of the 360 patches to the darcs repository have come from somebody other than David Roundy, the original author of darcs.  I'm cheating a little bit because many of these patches are also from known insiders.  Then again, all of the known insiders were outside contributors at some point.  The switch from outsider to insider has been for the most part informal: you send enough patches in and people eventually get to know you.  And that's it; very little in the way of formal processes.&lt;br /&gt;&lt;br /&gt;Outsider collaboration is made easier for two reasons, offline versioning and decentralisation.&lt;br /&gt;&lt;br /&gt;By offline versioning, I mean that people can make their modifications locally, retrieve changes from the central repository and still have their modifications intact, versioned and ready to go. Consider a popular project, like the mail client mutt.  Some mutt users have patches that are useful for a few people, but not appropriate for the central repository.  So they make their changes available in the form of a Unix patch.  If you're lucky, the patch applies to the version of mutt that you've downloaded.  If you're not so lucky, you've got some cleaning up to do and a new set of patches.  I'm not talking about merging or conflict resolution, per se.  Assume the conflict resolution requires human intervention.  You've fixed things so that it compiles against the new version.  What do you do exactly?  Make a patch to the patched version?  "Update" the original patch so that it works with the new version of the repository?  And what about the original author, what does s/he do with your patch?  These kinds of things are not so hard in themselves, but they are a major source of friction.  They gum up the works of free software development, or any large project, open source or closed.&lt;br /&gt;&lt;br /&gt;If you are a project maintainer, having a tool that handles offline versioning means that it is easier for you to accept changes from outsider contributors (zero insertion force - no need to apply patches and re-commit them).&lt;br /&gt;&lt;br /&gt;If you a contributor, having an offline versioning tool means that it's easier for you to submit modifications to the project.  You don't have manually create patches: you don't have to keep around a clean and working copy of the project, you don't have to worry about where you do your diffs (so that the patch --strip options come out right), you don't have to worry about what happens when the central repository changes and your patch no longer applies.  Again, I'm not referring to conflict resolution.  If there are conflicts, somebody will have to resolve them; but the resolution and versioning of these conflicts should involve as little bureaucracy as possible.  For extra credit points, some version control systems even implement a "send" feature in which you submit your local modifications via email.  The maintainers of the repository can then choose to apply the patch at their leisure.  These aren't regular Unix diff patches, mind you, they are intelligent patches with all the version-tracking goodness built in.&lt;br /&gt;&lt;br /&gt;Offline versioning adds convenience to the mix, a technical benefit.  If you flip it around and look at it in terms of distributed controls, you can see some pretty subtle social consequences as well.  Since there is no need for a central repository, there is a lot less pressure for the central maintainer to accept patches or reject them outright because you know that the outsider contributors can get along fine with their modifications safely versioned in their local repositories.  Worst come to worse, the outside contributors can place their repositories online and have people work from there instead.  It sounds like a fork, which sucks... but sometimes, fork happens.  Look, sometimes you get forks for differences in opinion, disagreements between developers, or general unpleasantness.  But sometimes you get more innocent forks, for example, the main developers suddenly got a new job and is now working 60 hours a week.  S/he is still committed to the project, but to be honest s/he hasn't been looking at patches for the last month.  No big deal, the rest of us will just be working from this provisional repository until the main developer gets back on his/her feet.  There's a social and a technical aspect to forking.  Distributed version control greatly simplifies the technical aspect, and that in turn mellows out the social one.  Distributed version control means that life goes on.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;simplicity and convenience&lt;/h3&gt;&lt;br /&gt;I'm really only making two points here.  Simplicity matters.  It reduces the learning curve for newbies and removes the need for experienced users to carry mental baggage around.  Convenience matters.  It reduces the friction that leads to put off the things you could be doing and it removes some of the technical barriers to wide-ranging collaboration.  I could always be mistaken, of course.  Perhaps there is some bigger picture, some forest to my trees; and upon discovering said forest I find myself deeply chagrined, getting all worked up over something so silly as patches.  But until that time, I will continue to use darcs and love it for how much easier it makes my life.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5783545043377748849?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5783545043377748849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5783545043377748849' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5783545043377748849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5783545043377748849'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2006/12/distributed-chiming-in.html' title='distributed chiming in'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-5805553351709468651</id><published>2006-12-27T15:44:00.000+01:00</published><updated>2006-12-27T15:48:39.954+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><category scheme='http://www.blogger.com/atom/ns#' term='learning haskell'/><title type='text'>the Haskell metatutorial</title><content type='html'>Thanks to ndm for so clearly articulating the idea.  Here is my attempt at implementing the &lt;a href="http://www.haskell.org/haskellwiki/MetaTutorial"&gt;Haskell metatutorial&lt;/a&gt;.  Please add your stuff or even just expand the guide tree.  Embrace the explosion of tutorials.  Make something useful of it.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;15:05:09 &lt; AStorm&gt; YAHT leaps a bit too far for me. I'd like something complete but less steep.&lt;br /&gt;15:05:47 &lt; metaperl&gt; YAHT is probably as good as it gets INHO&lt;br /&gt;15:05:49 &lt; metaperl&gt; IMHO&lt;br /&gt;15:06:01 &lt; uccus&gt; there should be a grant unification project for Haskell tutorials&lt;br /&gt;15:06:02 &lt; metaperl&gt; the "algorithms" book is not bad either&lt;br /&gt;15:06:26 &lt; kowey&gt; uccus: the wikibook attempts to remix heavily&lt;br /&gt;15:06:28 &lt; uccus&gt; *grand [blushes]&lt;br /&gt;15:07:01 &lt; kowey&gt; we've got yaht, write yourself a scheme, jeff newbern's stuff, some original content, all mashed up and duct-taped together&lt;br /&gt;15:07:03 &lt; ndm&gt; what i would like is a meta-tutorial&lt;br /&gt;15:07:14 &lt; ndm&gt; a list of questions about haskell, what does this do, do you understand this etc&lt;br /&gt;15:07:26 &lt; ndm&gt; and if you say no, it points you at a tutorial which explains it&lt;br /&gt;15:07:28 &lt; uccus&gt; well, mashed up and duct-taped is not good&lt;br /&gt;15:07:41 &lt; ndm&gt; is there a tutorial on pattern matching, for instance?&lt;br /&gt;15:07:44 &lt; uccus&gt; aah. yes. I agree with ndm&lt;br /&gt;15:07:47 &lt; kowey&gt; we could use some heavy editing&lt;br /&gt;15:07:48 &lt; ndm&gt; which covers ~, !, @ etc&lt;br /&gt;15:08:12 &lt; kowey&gt; right, me too... it's like the malcolm gladwell stuff&lt;br /&gt;15:08:17 &lt; uccus&gt; the wikibook can do that&lt;br /&gt;15:08:31 &lt; kowey&gt; many "right" flavours of coffee, pepsi; extra-chunky tomato sauce, etc&lt;br /&gt;15:08:40 &lt; uccus&gt; it's divided into sections... they can contain links to complete tutorials&lt;br /&gt;15:08:59 &lt; uccus&gt; everyone has a different style of tutoring you know...&lt;br /&gt;15:09:05 &lt; kowey&gt; i agree&lt;br /&gt;15:09:16 &lt; kowey&gt; the wikibook right now is newbie-oriented&lt;br /&gt;15:09:28 &lt; kowey&gt; but we could steer it towards choose-your-own-adventureness&lt;br /&gt;15:09:43 &lt; uccus&gt; kowey: the wikibook right now has different steams for newbie/advanced(?)&lt;br /&gt;15:09:45 &lt; kowey&gt; comments on the discussion page on how we could implement this would be quite welcome&lt;br /&gt;15:09:55 &lt; kowey&gt; we have two tracks, newbie and advanced&lt;br /&gt;15:10:16 &lt; kowey&gt; although the advanced track assumes you've basically just gotten through the newbie track... it tries to be a friendly "advanced"&lt;br /&gt;15:10:19 &lt; uccus&gt; yes, but shouldn't there be more?&lt;br /&gt;15:10:39 &lt; uccus&gt; tracks?&lt;br /&gt;15:10:41 &lt; kowey&gt; well, it's got two tracks in terms of material, one track in terms of style&lt;br /&gt;15:11:04 &lt; kowey&gt; what ndm is talking about is having multiple tracks in terms of style (well... style, level)&lt;br /&gt;15:11:10 &lt; uccus&gt; I mean, the grand Haskell wikibook should contain things that are really advanced&lt;br /&gt;15:11:25 &lt; uccus&gt; like tutes for gtk2hs...&lt;br /&gt;15:11:37 &lt; ndm&gt; kowey: i more meant accepting there will be loads of tutorials, but trying to point people at those which will teach them something new&lt;br /&gt;15:11:42 &lt; uccus&gt; *that* should be called advanced&lt;br /&gt;15:11:44 &lt; kowey&gt; i tend to suspect that's more the Haskell wiki's job&lt;br /&gt;15:12:13 &lt; kowey&gt; although there is http://en.wikibooks.org/wiki/Haskell/GUI&lt;br /&gt;15:13:07 &lt; uccus&gt; aaah. thanks kowey. that's enough I think.&lt;br /&gt;15:13:33 &lt; kowey&gt; ndm: i think we're saying the same thing, although i'm speaking horribly imprecisely&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-5805553351709468651?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/5805553351709468651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=5805553351709468651' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5805553351709468651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/5805553351709468651'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2006/12/haskell-metatutorial.html' title='the Haskell metatutorial'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3429681360832139280</id><published>2006-12-25T16:41:00.000+01:00</published><updated>2006-12-25T17:30:04.000+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wishlist'/><title type='text'>unraveller</title><content type='html'>I wish unravelling code was easier.  For me, coming to grips with a large software project often consists of undoing bundles of yarn, the big chain, multiple dependencies coming in, multi dependees going out.  You want to find out where function foo is used.  Well, it turns out that it's used by bar, so now you have to find out where bar is used, and oh it's used by quux... and... oh boy.&lt;br /&gt;&lt;br /&gt;I wish there was some tool that would let me start from the center of the big old yarn ball and swim out to the surface.  I'm not sure how something like this would work either.  Ultimately, all the low-level stuff is used in your main, right?  So how can you display this kind of information without just overwhelming the user?&lt;br /&gt;&lt;br /&gt;Ctags/Hasktags aren't too useful here.  They solve the opposite the problem, in which you've got some top level function and you want to drill down to the guts.  Graphviz-ing your modules just gives you a thicket, something to marvel at, but not a great source of insight.  Dep trees in some hypothetical browser don't sound that useful either (sigh, click the triangle, expand the subtree, whoah! too much! collapse! collapse!).&lt;br /&gt;&lt;br /&gt;The mental image I get is that you run it on your code:&lt;pre&gt;unravel Population.applyToPop *.lhs *.hs&lt;/pre&gt; and you'd get a browseable, filtered view of the source code, the relevant bits highlighted, useful links in the right places, but not so many that you feel overwhelmed.  I want it to be a standalone tool (like a graphical diff utility), something I can run without having to learn how to use your favourite IDE.  Likewise, I want it to be quick and easy (again, the standard for ease being a graphical diff).  I don't want to set up a project folder or whatever just so I can run the tool.&lt;br /&gt;&lt;br /&gt;This is one annoying aspect of being a user, hell a consumer of any kind.  I know I want something, but I don't know exactly what, except that I'd probably recognise it when I see it. The ideas in my head are muddled.  If somebody sat me down for a user-interview, I'd just sort of ramble on incoherently for 10 minutes, get confused and wander off.  Dear whoever, please build me an unraveller.  Think like an Apple UI engineer here.  Build the tool from user-experience-in, not from functionality-out.  Don't listen to my precise demands, because I don't really know what I want.  Just help me understand this code.&lt;br /&gt;&lt;br /&gt;Anybody know what it is I'm looking for?  (If you do have such a tool, a good exercise would be to run it on darcs.  Can it help you figure out what a Slurpy is?  How about a Population?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3429681360832139280?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3429681360832139280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3429681360832139280' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3429681360832139280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3429681360832139280'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2006/12/unraveller.html' title='unraveller'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-2090466452603401015</id><published>2006-12-22T21:04:00.000+01:00</published><updated>2006-12-22T21:10:57.675+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>Denotational semantics</title><content type='html'>Apfelmus from IRC just wrote what looks like a very nice chapter on &lt;a href="http://en.wikibooks.org/wiki/Haskell/Denotational_semantics"&gt;denotational semantics&lt;/a&gt;. I am reading it now and learning lots.  Why not check it out and post comments on the talk page?  I'm sure he'll appreciate any comments the Haskell community might have, or anyone with an interest for that matter.&lt;br /&gt;&lt;br /&gt;Thanks, afpelmus; what a great Christmas present!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-2090466452603401015?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/2090466452603401015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=2090466452603401015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2090466452603401015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/2090466452603401015'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2006/12/denotational-semantics.html' title='Denotational semantics'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-6159156991335114233</id><published>2006-12-17T22:07:00.000+01:00</published><updated>2006-12-17T22:12:25.033+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='french'/><category scheme='http://www.blogger.com/atom/ns#' term='français'/><title type='text'>It's alive!</title><content type='html'>Hier sur #haskell.fr, on était plus que 2 personnes pour la première fois.  Grace aux iniatives de Nanar et cie, il est possible qu'un veritable communauté francophone d'Haskelliens (?) verra le jour.&lt;br /&gt;&lt;br /&gt;Sorry for that attempt at parlezing français.  I'm pleased to see that the French Haskell community has now increased two-fold to an amazing four people (on the #haskell.fr at least).  Venez nombreux or something.  It'll be fun.  Thanks to Nanar for kickstarting things with a wiki/mailing list/channel creation initative.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-6159156991335114233?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/6159156991335114233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=6159156991335114233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6159156991335114233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/6159156991335114233'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2006/12/its-alive.html' title='It&apos;s alive!'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-3381435320530024298</id><published>2006-12-10T16:42:00.000+01:00</published><updated>2006-12-10T19:09:50.566+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell wikibook'/><title type='text'>rewriting PLEAC Haskell?</title><content type='html'>One complaint I have heard about the &lt;a href="http://pleac.sourceforge.net/pleac_haskell/index.html"&gt;Haskell cookbook&lt;/a&gt; is that it is rather unidiomatic and thus not very helpful for people trying to learn Haskell.  For example, one particularly shocking thing the implementation does is to shadow &lt;code&gt;(.)&lt;/code&gt; operator to make more "object-like": &lt;code&gt;o . f = f o&lt;/code&gt; (reverse dollar? euro?).  This leads to snippets of code which, as one of the wikibook commentors put it, are barely recognisable as Haskell: &lt;pre&gt;s''' = s1.split " ".reverse.join " "&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;PLEAC Haskell in its present form is not very suitable for educational purposes, but what if the Haskell community ran through and cleaned it up?  Only the first two chapters are implemented anyway, so it doesn't seem to be all that much; the only substantial thing to rewrite perhaps being in soundex code.  I personally cannot invest any time in this, being already behind in other projects like darcs and wxhaskell, but it might be a fun project for Haskell enthusiasts, or even yellow-belt Haskellers trying to come to grips with the language.&lt;br /&gt;&lt;br /&gt;If interested, you should probably subscribe to their &lt;a href="http://lists.sourceforge.net/lists/listinfo/pleac-discuss"&gt;mailing list&lt;/a&gt; and maybe bounce around some ideas on the Haskell café.  Another thing to consider is contacting the &lt;a href="http://pleac.sourceforge.net/AUTHORS"&gt;original author&lt;/a&gt; Yoann.  It would be good to get him on board, maybe with a little gentle persuasion.  I mean, he probably thought it was a good idea to make the language more recognisable to newcomers.   Nice thought... but maybe he would now agree that newbies would be better off with more idiomatic Haskell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-3381435320530024298?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/3381435320530024298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=3381435320530024298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3381435320530024298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/3381435320530024298'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2006/12/rewriting-pleac-haskell.html' title='rewriting PLEAC Haskell?'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-116474311767034746</id><published>2006-11-28T20:10:00.000+01:00</published><updated>2006-11-28T20:45:17.996+01:00</updated><title type='text'>wxhaskell unicode testing</title><content type='html'>One of my reponsabilities is to make sure that the wxhaskell Unicode stuff is working.  I'm still not too sure what the best way to go about this is.  I suppose that any such test would require a majour eyeball component, although it would probably be prudent to add a bit of automation and randomness to things.  Here's my first attempt anyway:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5532/1215/1600/wxhaskell-unicode.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5532/1215/320/wxhaskell-unicode.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have a small UTF-8 text file with text in a bunch of different scripts.  Combined some code from one of the haskell mailing lists to read a file into [Word8] with some an UTF8 encoder/decoder from darcs (this particular code claims to be from the Haskell i18n working group and is BSD licensed).  I read the file, break it down into lines and display a copy of each widget for each line in the file.  I've only got checkboxes, haven't figured out how I want to go through all the widgets yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-116474311767034746?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/116474311767034746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=116474311767034746' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/116474311767034746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/116474311767034746'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2006/11/wxhaskell-unicode-testing.html' title='wxhaskell unicode testing'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-116361322513381201</id><published>2006-11-15T18:51:00.000+01:00</published><updated>2006-11-15T18:54:26.626+01:00</updated><title type='text'>haskell / vim indentation</title><content type='html'>Thanks to motormean for his (or her) &lt;a href="http://tokyoenvious.xrea.jp/vim/indent/haskell.vim"&gt;haskell indentation vim script&lt;/a&gt;.  It solved that annoying problem with birdtracks being indented.  Now I can break up a line without having to deal with the "&gt;".  No word yet on how this words with latex-style literate haskell, but I am grateful already.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-116361322513381201?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/116361322513381201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=116361322513381201' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/116361322513381201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/116361322513381201'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2006/11/haskell-vim-indentation.html' title='haskell / vim indentation'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21123659.post-116345113311225433</id><published>2006-11-13T21:49:00.000+01:00</published><updated>2006-11-13T21:52:13.123+01:00</updated><title type='text'>yaht now pure gfdl</title><content type='html'>Oops.  I realised a couple of weeks ago that dual licensing Hal/GFDL on the PDF meant that I couldn't back-propagate wikibook patches into the LaTeX version.  So now the PDF is GFDL only.  Nice and simple.&lt;br /&gt;&lt;br /&gt;(I dropped Hal an FYI and invited him to yell.  Since it's _already_ GFDL anyway, I saw no reason that he would mind, which he does not seem to, cf no yelling)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21123659-116345113311225433?l=koweycode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://koweycode.blogspot.com/feeds/116345113311225433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21123659&amp;postID=116345113311225433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/116345113311225433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21123659/posts/default/116345113311225433'/><link rel='alternate' type='text/html' href='http://koweycode.blogspot.com/2006/11/yaht-now-pure-gfdl.html' title='yaht now pure gfdl'/><author><name>kowey</name><uri>http://www.blogger.com/profile/11175806459477851520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_c6WmXt2id8U/S77wIvUOBNI/AAAAAAAAAZo/ot_aKwXaJqo/S220/4d6fd554468f338f8bcc3f5775009c47.jpeg'/></author><thr:total>0</thr:total></entry></feed>
