<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:hsenag</id>
  <title>Ganesh Sittampalam</title>
  <subtitle>Ganesh Sittampalam</subtitle>
  <author>
    <name>Ganesh Sittampalam</name>
  </author>
  <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom"/>
  <updated>2009-12-06T10:30:58Z</updated>
  <lj:journal userid="683501" username="hsenag" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://hsenag.livejournal.com/data/atom" title="Ganesh Sittampalam"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:13694</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/13694.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=13694"/>
    <title>Canon scanner grumbles</title>
    <published>2009-12-06T10:30:58Z</published>
    <updated>2009-12-06T10:30:58Z</updated>
    <content type="html">We have a &lt;a href="http://www.canon.co.uk/For_Home/Product_Finder/Scanners/Flatbed_with_Film_Scanning/canoscan_4400f/index.asp"&gt;CanoScan 4400F&lt;/a&gt;. Recently I've been trying to scan lots of pieces of paper into PDF format so I can dispose of the originals.&lt;br /&gt;&lt;br /&gt;Annoyingly, the scanner is completely unsupported under Linux, so I'm having to do this all with Windows. After looking around at the free options for a while, I settled on using the bundled "CanoScan Toolbox" software which mostly works quite well and integrates with buttons on the scanner so I don't have to change focus on my PC to the application to tell it to scan the next page.&lt;br /&gt;&lt;br /&gt;In the process of using it heavily, I have discovered that&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;it leaks virtual memory, so you have to restart it every 100-200 pages or it hits the 2GB limit! Naturally you discover this when it has a whole lot of pages you just scanned sitting in memory which you now can't save.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;it seems to use a quadratic time algorithm for writing PDF files to disk.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt; &lt;br /&gt;So all in all it's not going too badly, as long as I only scan long things in batches of 50 pages or so and remember to restart it every so often. It's a shame that stupid things like this spoil what's generally a reasonably usable piece of software.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:13508</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/13508.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=13508"/>
    <title>Act of God</title>
    <published>2009-07-29T07:06:20Z</published>
    <updated>2009-07-29T07:08:02Z</updated>
    <content type="html">I blame &lt;a href="http://news.bbc.co.uk/1/hi/scotland/highlands_and_islands/8173784.stm"&gt;this&lt;/a&gt; on &lt;a href="http://news.bbc.co.uk/1/hi/scotland/highlands_and_islands/8157570.stm"&gt;this&lt;/a&gt;.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:12071</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/12071.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=12071"/>
    <title>Olympic torch</title>
    <published>2008-04-06T21:20:20Z</published>
    <updated>2008-04-06T21:21:26Z</updated>
    <content type="html">I went to one of the torch protests earlier, &lt;a href="http://maps.google.co.uk/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=bedford+place&amp;amp;sll=51.519579,-0.122502&amp;amp;sspn=0.008051,0.020084&amp;amp;ie=UTF8&amp;amp;ll=51.52024,-0.124347&amp;amp;spn=0.008051,0.020084&amp;amp;z=16&amp;amp;iwloc=addr"&gt;here&lt;/a&gt;. The torch route was along Great Russell St, so the idea was that the protest would be at the end of Bedford Place. The police had placed their cordon about 5 or 10 metres down the road, though, which would have significantly restricted the view of the route - in sharp contrast to the fact that people who were displaying Chinese flags etc or no obvious protest material at all were allowed to "line the route" wherever they wanted. I decided to go and do this, as I wasn't carrying any flags or anything, so I ended up on Great Russell St just opposite Bedford Place. In the end the police did move the cordon to the end of Bedford Place, which was good; it should have been there in the first place.&lt;br /&gt;&lt;br /&gt;As far as I can tell from the torch route they were supposed to be on foot at that point, but in the end it came through on a bus and I'm not even sure which of the many buses and coaches that passed had it. &lt;br /&gt;&lt;br /&gt;I think it's a shame that the headlines are dominated by a few incidents of (very minor) violence, rather than the sheer numbers of the protestors who I think did succeed in turning the torch route into a &lt;a href="http://www.timesonline.co.uk/tol/comment/columnists/simon_jenkins/article3689920.ece"&gt;tunnel of shame&lt;/a&gt;, at least where I was and probably in several other places.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:11803</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/11803.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=11803"/>
    <title>Restricted monads in Haskell</title>
    <published>2008-03-23T11:46:47Z</published>
    <updated>2008-03-23T16:57:00Z</updated>
    <category term="haskell"/>
    <content type="html">&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;I was playing around with restricted monads and came up with the following. It seems really simple, so I was wondering if it's either already known or obvious?&lt;br /&gt;&lt;br /&gt;The &lt;i&gt;restricted monad&lt;/i&gt; problem is well-known in Haskell. We have some type constructor &lt;font face="Courier New"&gt;Foo&lt;/font&gt; and some restriction &lt;font face="Courier New"&gt;Restr&lt;/font&gt;, such that &lt;font face="Courier New"&gt;Foo&lt;/font&gt; is a monad, but only for contained types that are members of &lt;font face="Courier New"&gt;Restr&lt;/font&gt;. We can't make &lt;font face="Courier New"&gt;Foo&lt;/font&gt; an instance of &lt;font face="Courier New"&gt;Monad&lt;/font&gt;, because in the normal &lt;font face="Courier New"&gt;Monad&lt;/font&gt; class the types of &lt;font face="Courier New"&gt;return&lt;/font&gt; and &lt;font face="Courier New"&gt;(&amp;gt;&amp;gt;=)&lt;/font&gt; are fully polymorphic in the contained type. This in turn blocks us from using &lt;font face="Courier New"&gt;do&lt;/font&gt;-notation with our "monad". We can get round this using &lt;font face="Courier New"&gt;NoImplicitPrelude&lt;/font&gt; in GHC, but that's rather messy and means that normal &lt;font face="Courier New"&gt;Monad&lt;/font&gt;s don't work properly in that module.&lt;br /&gt;&lt;br /&gt;For concreteness, suppose that &lt;font face="Courier New"&gt;Restr&lt;/font&gt; is actually &lt;font face="Courier New"&gt;Ord&lt;/font&gt;, but we could use anything. We'll parameterise over the actual "monad" type, so we don't need to decide on that yet, but I have the usual &lt;font face="Courier New"&gt;Set&lt;/font&gt; example in mind.&lt;br /&gt;&lt;br /&gt;First, let's define a restricted monad class:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
class OrdMonad m where
  ordReturn :: Ord a =&amp;gt; a -&amp;gt; m a
  ordBind :: (Ord a, Ord b) =&amp;gt; m a -&amp;gt; (a -&amp;gt; m b) -&amp;gt; m b
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Just to keep things concrete, obviously &lt;font face="Courier New"&gt;Set&lt;/font&gt; is a member of this:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
instance OrdMonad Set where
  ordReturn = Set.singleton
  s `ordBind` f = Set.fold (\v ret -&amp;gt; f v `Set.union` ret) Set.empty s
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Now, how can I make a monad from this? Let's start by defining a new type constructor, GADT-style. We intend to apply this type constructor to our &lt;font face="Courier New"&gt;OrdMonad&lt;/font&gt; instance.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
data AsMonad m a where
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Now we need some data constructors. Firstly we want to be able to embed "proper" &lt;font face="Courier New"&gt;OrdMonad&lt;/font&gt;s. Here we'll need the full power of the &lt;font face="Courier New"&gt;GADTs&lt;/font&gt; extension, i.e. restricted return types:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
  Embed :: (OrdMonad m, Ord a) =&amp;gt; m a -&amp;gt; AsMonad m a
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;OK so far, but what we're really after is a way to implement &lt;font class="Courier New"&gt;return&lt;/font&gt; and &lt;font class="Courier New"&gt;(&amp;gt;&amp;gt;=)&lt;/font&gt;. Well, let's take the easy way out:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
  Return :: OrdMonad m =&amp;gt; a -&amp;gt; AsMonad m a
  Bind :: OrdMonad m =&amp;gt; AsMonad m a -&amp;gt; (a -&amp;gt; AsMonad m b) -&amp;gt; AsMonad m b
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Now we can implement &lt;font face="Courier New"&gt;Monad&lt;/font&gt; trivially (I'll ignore &lt;font face="Courier New"&gt;fail&lt;/font&gt;, but it's not hard to add):&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
instance OrdMonad m =&amp;gt; Monad (AsMonad m) where
  return = Return
  (&amp;gt;&amp;gt;=) = Bind
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;That was a nice bit of sleight-of-hand, but did it actually help? We've just delayed the problem till later.&lt;br /&gt;&lt;br /&gt;Well, actually it does help. "Later", what we'll want to do is get back to our &lt;font face="Courier New"&gt;m a&lt;/font&gt; type from &lt;font face="Courier New"&gt;AsMonad m a&lt;/font&gt;. But at this point we can restrict &lt;font face="Courier New"&gt;a&lt;/font&gt; to being in &lt;font face="Courier New"&gt;Ord&lt;/font&gt;. What we want is a function &lt;font face="Courier New"&gt;unEmbed&lt;/font&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
unEmbed :: Ord a =&amp;gt; AsMonad m a -&amp;gt; m a
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;The &lt;font face="Courier New"&gt;Embed&lt;/font&gt; case of &lt;font face="Courier New"&gt;unEmbed&lt;/font&gt; is easy:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
unEmbed (Embed m) = m
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Since we've restricted &lt;font face="Courier New"&gt;a&lt;/font&gt;, the &lt;font face="Courier New"&gt;Return&lt;/font&gt; case is easy too:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
unEmbed (Return v) = ordReturn v
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Now for &lt;font face="Courier New"&gt;Bind&lt;/font&gt;. Let's split that up into cases based on what the left-hand argument is. Yes, I know this seems like delaying the inevitable, that's how it felt to me too!&lt;br /&gt;&lt;br /&gt;If the left-hand argument is &lt;font face="Courier New"&gt;Embed&lt;/font&gt;, then both &lt;font face="Courier New"&gt;a&lt;/font&gt; and &lt;font face="Courier New"&gt;b&lt;/font&gt; are in &lt;font face="Courier New"&gt;Ord&lt;/font&gt;. So we can call &lt;font face="Courier New"&gt;unEmbed&lt;/font&gt; recursively and use &lt;font face="Courier New"&gt;ordBind&lt;/font&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
unEmbed (Bind (Embed m) f) = m `ordBind` (unEmbed . f)
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;For &lt;font face="Courier New"&gt;Return&lt;/font&gt;, one of the monad laws applies:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
unEmbed (Bind (Return v) f) = unEmbed (f v)
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Now for the &lt;font face="Courier New"&gt;Bind&lt;/font&gt; case. My initial assumption when I was writing this code was that I'd be trapped in a loop, only able to break out the left argument of the inner &lt;font face="Courier New"&gt;Bind&lt;/font&gt; into yet more cases. Then I realised that actually we can just bring the monad laws to bear again:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
unEmbed (Bind (Bind m f) g) = unEmbed (Bind m (\x -&amp;gt; Bind (f x) g)))
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And, well, that's it. We can use &lt;font face="Courier New"&gt;do&lt;/font&gt;-notation on the &lt;font face="Courier New"&gt;AsMonad&lt;/font&gt; type, and move freely between that and the base type using &lt;font face="Courier New"&gt;Embed&lt;/font&gt; and &lt;font face="Courier New"&gt;unEmbed&lt;/font&gt;.&lt;br /&gt;&lt;font face="Courier New"&gt;MonadPlus&lt;/font&gt; is a simple addition along the same lines:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
class OrdMonad m =&amp;gt; OrdMonadPlus m where
  ordMZero :: Ord a =&amp;gt; m a
  ordMPlus :: Ord a =&amp;gt; m a -&amp;gt; m a -&amp;gt; m a

instance OrdMonadPlus Set where
  ordMZero = Set.empty
  ordMPlus = Set.union

data AsMonad m a where
  (...)
  MZero :: OrdMonadPlus m =&amp;gt; AsMonad m a
  MPlus :: OrdMonadPlus m =&amp;gt; AsMonad m a -&amp;gt; AsMonad m a -&amp;gt; AsMonad m a

instance OrdMonadPlus m =&amp;gt; MonadPlus (AsMonad m) where
  mzero = MZero
  mplus = MPlus

unEmbed :: Ord a =&amp;gt; AsMonad m a -&amp;gt; m a
(...)
unEmbed MZero = ordMZero
unEmbed (MPlus m1 m2) = ordMPlus (unEmbed m1) (unEmbed m2)
unEmbed (Bind MZero f) = unEmbed MZero
unEmbed (Bind (MPlus m1 m2) f) = unEmbed (MPlus (Bind m1 f) (Bind m2 f))
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Here's some test code:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
newtype Wrap a = Wrap { unWrap :: a } -- not an Ord even if a is

test1 = unEmbed $ do x &amp;lt;- Embed $ Set.fromList [6, 2, 3]
                     do y &amp;lt;- return (Wrap x)
                        z &amp;lt;- Embed $ Set.fromList [1..2]
                        guard (unWrap y &amp;lt; 5)
                        return (unWrap y + z)
                      `mplus`
                        return 10
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;One annoyance is that we can't parametrise over typeclasses (at least not nicely), so we can't make &lt;font face="Courier New"&gt;AsMonad&lt;/font&gt; fully general, instead we need one for each restriction.&lt;br /&gt;&lt;br /&gt;Finally, if we are willing and able to add extra constructors to an existing type, I think it should be possible to directly make that type into a &lt;font face="Courier New"&gt;Monad&lt;/font&gt; using the same approach.&lt;br /&gt;&lt;br /&gt;The closest thing I've seen to this before is something like this: &lt;a href="http://www.haskell.org/pipermail/haskell-cafe/2007-January/021086.html"&gt;http://www.haskell.org/pipermail/haskell-cafe/2007-January/021086.html&lt;/a&gt;. It's the same sort of approach, but I don't think it generalises to arbitrary restricted monads in the same way as this.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:11373</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/11373.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=11373"/>
    <title>More Catholic church induced nonsense</title>
    <published>2007-12-19T19:19:54Z</published>
    <updated>2007-12-19T19:19:54Z</updated>
    <content type="html">&lt;a href="http://news.bbc.co.uk/1/hi/uk_politics/7151346.stm"&gt;Clegg doesn't believe in god but still happy for his children to be indoctrinated&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:11178</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/11178.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=11178"/>
    <title>Dear Mr Ratzinger,</title>
    <published>2007-11-30T18:44:45Z</published>
    <updated>2007-11-30T18:45:22Z</updated>
    <content type="html">&lt;a href="http://www.timesonline.co.uk/tol/comment/faith/article2977564.ece"&gt;You are a hypocrite&lt;/a&gt;.&lt;br /&gt;No love,&lt;br /&gt;&lt;span class='ljuser ljuser-name_hsenag' lj:user='hsenag' style='white-space: nowrap;'&gt;&lt;a href='http://hsenag.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://hsenag.livejournal.com/'&gt;&lt;b&gt;hsenag&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:10362</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/10362.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=10362"/>
    <title>Kill Shambo</title>
    <published>2007-05-27T18:24:26Z</published>
    <updated>2007-05-27T18:24:26Z</updated>
    <content type="html">&lt;a href="http://petitions.pm.gov.uk/kill-shambo/"&gt;http://petitions.pm.gov.uk/kill-shambo/&lt;/a&gt; (apropos of &lt;a href="http://news.bbc.co.uk/1/hi/wales/south_west/6670693.stm"&gt;http://news.bbc.co.uk/1/hi/wales/south_west/6670693.stm&lt;/a&gt;)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:9648</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/9648.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=9648"/>
    <title>patch-based versus tree-based merging</title>
    <published>2006-09-24T18:53:47Z</published>
    <updated>2006-09-25T00:22:22Z</updated>
    <category term="darcs"/>
    <content type="html">I don't normally post about deeply technical things I've been working on, but I've been thinking about this for a few days now and wanted somewhere public to record my conclusions.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;Almost uniquely amongst distributed version control systems (&lt;a href="http://dev.libresource.org/home/doc/so6-user-manual"&gt;SO6&lt;/a&gt; being the exception, but I'm not aware of it being in wide use), darcs is &lt;i&gt;patch-based&lt;/i&gt; rather than &lt;i&gt;tree-based&lt;/i&gt;. But what does this mean in practice?&lt;br /&gt;&lt;br /&gt;To get a better handle on this, we need to look at what happens during a merge, the key thing that a version control system needs to do.&lt;br /&gt;&lt;br /&gt;All of the tree-based systems are based around three-way merges. Given two repositories A and B to be merged, they pick a common ancestor (more on how later), diff each of them against the ancestor, then adjust one diff for any offset changes implied by the other diff, and apply it to the other repository. (Things become a bit more complicated in the case of merging directory operations such as file moves and renames, but there's nothing conceptually hard and I haven't investigated the details of how this is handled. It's not really important.)&lt;br /&gt;&lt;br /&gt;So, how is the ancestor chosen? Clearly it should be some repository state that did actually exist in the histories of A and B, or it would make no sense to use as a basis for the merge. It also should contain all the changes that have already been merged between A and B, because otherwise we will either get a spurious conflict, identical changes have to be silently merged, which can cause problems in the case where we really want a conflict from identical changes.&lt;br /&gt;&lt;br /&gt;Unfortunately, it is not necessarily the case that a repository state will exist with such a property. &lt;a href="http://revctrl.org/CrissCrossMerge"&gt;http://revctrl.org/CrissCrossMerge&lt;/a&gt; gives some examples of when this can occur. It causes problems for most of the tree-based revision control systems.&lt;br /&gt;&lt;br /&gt;In fact, the correct solution is to &lt;i&gt;make up&lt;/i&gt; an appropriate ancestor. It should contain precisely the intersection of the sets of changes in A and B. One way to construct it is to merge all the possible LCAs (an LCA of A and B is an ancestor of both A and B that is not itself an ancestor of another common ancestor of A and B). This is what &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt; does. However, I believe its solution goes wrong in the presence of conflicts. Suppose X, Y and Z are three such LCAs, and that they all conflict with each other. Git merges them in non-deterministic order, leaving the conflict markers in the merge results. The order in which they are merged will determine the order of conflict markers. This means that the contents of the base tree used for the merge are non-deterministic, which will make the merge results themselves non-deterministic. I haven't yet tried to actually construct an example of git going wrong, though. Another flaw with git is that if the conflict between two trees that need to be merged is at the directory level (e.g. between two different renamings of the same file), it just gives up.&lt;br /&gt;&lt;br /&gt;On the other hand, one of the fundamental properties of darcs is that any repository with the same set of patches must behave the same. When darcs does a merge, it implicitly constructs the correct ancestor as described above (the precise mechanics are different, but the effect is the same). Because of this fundamental property, it is guaranteed that merges are reproduceable; merge the same two sets of patches and you'll get the same result. Darcs handles the conflict scenario described above by competely ignoring the effects of conflicting patches when merging two repositories. (This strategy has its own problems, but that's a different topic entirely.)&lt;br /&gt;&lt;br /&gt;From a usability point of view, the fact that every merge in darcs is repeatable means that it doesn't need to track them as separate commits.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm happy to discuss this further with anyone interested, either on #revctrl or #darcs on freenode, or in the comments of this post. However, they are just my current tentative conclusions after some investigation, so please don't take them as gospel truth or flame me too hard for being wrong :-)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:8918</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/8918.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=8918"/>
    <title>Compare and contrast</title>
    <published>2006-02-21T21:54:30Z</published>
    <updated>2006-02-22T00:29:30Z</updated>
    <content type="html">&lt;a href="http://www.publications.parliament.uk/pa/cm200506/cmbills/111/2006111.htm"&gt;Legislative and Regulatory Reform Bill&lt;/a&gt; (written in impenetrable legalese, but explained, amongst other places, &lt;a href="http://www.timesonline.co.uk/article/0,,6-2049791,00.html"&gt;here&lt;/a&gt;)&lt;br /&gt;vs&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Enabling_Act"&gt;Enabling Act&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I don't _think_ the government is trying to pull off a coup, but it's getting to the point where nothing they do would surprise me.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:7188</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/7188.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=7188"/>
    <title>In response to a question I asked some time back...</title>
    <published>2005-11-30T23:30:22Z</published>
    <updated>2005-11-30T23:30:22Z</updated>
    <content type="html">Apparently my vote was worth 72p:&lt;br /&gt;&lt;a href="http://news.bbc.co.uk/1/hi/uk_politics/4485664.stm"&gt;http://news.bbc.co.uk/1/hi/uk_politics/4485664.stm&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:6952</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/6952.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=6952"/>
    <title>Labour and postal voting</title>
    <published>2005-04-11T02:13:50Z</published>
    <updated>2005-04-11T02:13:50Z</updated>
    <content type="html">Since my last post seemed to be met with some disbelief, I thought I'd catalogue the reasons behind my claims.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;First, a quick summary of my argument:&lt;ul&gt;&lt;li&gt;I accept that all parties have probably engaged in fraud at the local level to some extent. However, in the last few years (and last year in particular) Labour members have been disproportionately involved in this.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Labour's initial support for extending postal voting and the pushing of all-postal votes was based on the calculation that it would disproportionately increase their own support. This is not in itself unreasonable, &lt;/li&gt;&lt;br /&gt;&lt;li&gt;At the national level, in the face of increasing evidence of fraud over the last couple of years, Labour have consistently downplayed the seriousness of it and refused a number of opportunities to do anything about it. There is strong evidence that they did not want to do anything about it because they believed that making postal voting harder would damage their vote disproportionately. In many other walks of life, such behaviour would be considered criminally negligent.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;It's this combination - the national party making rules which local parties can abuse, and then refusing to fix them in the face of strong evidence that this is happening - that I believe justifies my claim that Labour rigs elections.&lt;br /&gt;&lt;br /&gt;Many of the links below are to the Times which you may need to register for to read and which will stop working 7 days after the article is published, sorry.&lt;br /&gt;&lt;br /&gt;The postal voting system is completely insane. You can apply for a voting form to be sent to any address. Anyone can make up their own application form and ask for it to be returned via them. Completed voting forms have to be accepted by the Returning Officer however they reach him or her, and if they contain any alterations they are still valid if the intent is clear. The Returning Officer has no power to check any of the signatures, witness names and addresses etc on either the application form for a postal vote or on the documents accompanying a returned postal vote. Indeed, in the Birmingham case the police found strong evidence of hundreds of postal votes being filled in en masse in a warehouse, but the recovered votes were nonetheless added to the count.&lt;br /&gt;&lt;br /&gt;Over the last few years there have been a steady flow of recommendations, from the Electoral Commission and others, that the system should be tightened up. Labour has done nothing to act on them, and even did everything it could to extend the scope of the all-postal voting experiments last year.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.timesonline.co.uk/article/0,,2087-1562575,00.html"&gt;Ministers ditched vital measures to stop voting fraud&lt;/a&gt; :&lt;br /&gt;Leaked cabinet minutes showed that a cabinet committee concluded in April 2004 that the law "clearly needed" to be changed, and a draft bill was drawn up, but then dropped. The strong suggestion is that this was because studies from Northern Ireland had shown that on of the suggested measures, individual registration (which would mean that election officers could compare the signature on a postal ballot with the signature on the registration form) caused voter registration to drop by about 10%, disproportionately amongst Labour-supporting groups.&lt;br /&gt;&lt;br /&gt;The day after Mawrey delivered his &lt;a href="http://news.bbc.co.uk/1/hi/uk_politics/4408101.stm"&gt;final judgement&lt;/a&gt; in the Birmingham case, Blair called an election. This meant that the general election, which did not need to be called for another year, will be conducted under this screwed up system. Why didn't he delay it? It wasn't as if he hadn't had &lt;a href="http://news.bbc.co.uk/1/hi/england/west_midlands/4373719.stm"&gt;plenty of warning&lt;/a&gt; of what Mawrey was going to say. Apparently there will be &lt;a href="http://www.timesonline.co.uk/printFriendly/0,,1-18169-1564522,00.html"&gt;legislation immediately after the election&lt;/a&gt; to improve the situation - why couldn't he have arranged to have it before? Apparently he believes that "postal voting is no more prone to fraud than other electoral systems" - which is blatantly untrue.&lt;br /&gt;&lt;br /&gt;Mawrey's full judgement, a copy of which can be found at &lt;a href="http://groups.yahoo.com/group/savedemocracy/files/"&gt;here&lt;/a&gt; (I'd like to find a more authoritative source but haven't been able to) states that he believes there was malpractice in marginal seats throughout the Birmingham area (he did not have the power to set aside results in areas other than the two wards for which election petitions were brought). He states that it was a "Birmingham-wide campaign by the Labour Party". In other words, the Labour party organisation as a whole, in Britain's second largest city was involved in the fraud. He quotes examples of 10-fold increases in postal votes in marginal wards, compared to increases of less than 50% in safe Conservative or Labour wards.&lt;br /&gt;&lt;br /&gt;There are many other allegations about Labour arising from the 2004 elections in various cities - particularly Oldham, Bradford, Blackburn and Burnley - some of which I believe are still under investigation. In Burnley apparently all the workers in a factory were told to bring their postal ballots in to work and complete them for Labour, or lose their jobs. There are also instances of the &lt;a href="http://www.guardian.co.uk/guardianpolitics/story/0,3605,1446754,00.html"&gt;Tories doing the same kind of thing&lt;/a&gt; and I think the same for the Lib Dems, though I can't find any references to this right now.&lt;br /&gt;&lt;br /&gt;There's apparently a time limit of 1 year on charging people with most electoral offences, so whilst hopefully at least some of the people involved in the Birmingham rigging will be charged, it seems that it won't happen in the other cases if malpractice is eventually proven.&lt;br /&gt;&lt;br /&gt;Other recent instances of electoral fraud: &lt;ul&gt;&lt;li&gt;&lt;a href="http://news.bbc.co.uk/1/hi/england/lancashire/4425519.stm"&gt;Former Labour councillor jailed for vote rigging in Blackburn in 2002 by stealing postal votes&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Persistent allegations of vote rigging by Tories and Lib Dems in Hackney - not postal vote related as far as I can tell - for example &lt;a href="http://www.lgcnet.com/pages/products/elections/news53.htm"&gt;http://www.lgcnet.com/pages/products/elections/news53.htm&lt;/a&gt; or just Google for "Hackney electoral fraud".&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I'll update this with edits if appropriate in response to comments and list the edits here (though I'm away for a week from Tuesday afternoon).&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:6869</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/6869.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=6869"/>
    <title>Poster</title>
    <published>2005-04-04T23:27:29Z</published>
    <updated>2005-04-04T23:27:29Z</updated>
    <content type="html">In view of &lt;a href="http://news.bbc.co.uk/1/hi/uk_politics/4408101.stm"&gt;this story&lt;/a&gt;, I intend to put up a poster along the lines of &lt;a href="http://urchin.earth.li/~ganesh/temp/labour-election.pdf"&gt;this&lt;/a&gt; (&lt;a href="http://urchin.earth.li/~ganesh/temp/labour-election.ps"&gt;postscript version&lt;/a&gt;) in my window.&lt;br /&gt;&lt;br /&gt;Any coments on how it could be improved would be gratefully received. Note that it's for printing on an A4 B&amp;W printer, though I might use something a bit more colourful than a white background.&lt;br /&gt;&lt;br /&gt;I'd like to put more information really, but there's no room if I want decent sized text. I guess I could make a website and put the URL on the poster.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:6444</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/6444.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=6444"/>
    <title>Stupid legislation</title>
    <published>2005-03-29T00:49:53Z</published>
    <updated>2005-03-29T00:49:53Z</updated>
    <content type="html">I'm sure many people have already picked over the &lt;a href="http://www.legislation.hmso.gov.uk/acts/acts2000/20000011.htm"&gt;Terrorism Act 2000&lt;/a&gt; in much detail, but I only just now noticed how stupid some of it is.&lt;br /&gt;&lt;br /&gt;I was reading &lt;a href="http://news.bbc.co.uk/1/hi/uk/4388863.stm"&gt;this news story&lt;/a&gt;. A has been charged with having B's name and address, which apparently is a crime because B is a soldier and A has a Muslim name (OK, the "A having a Muslim name" bit isn't mentioned in the charge, but the rest is..)&lt;br /&gt;&lt;br /&gt;It seemed like a bit of a sweeping offence, so I went to consult &lt;a href="http://www.legislation.hmso.gov.uk/acts/acts2000/00011--g.htm#58"&gt;the relevant section&lt;/a&gt;, and indeed possessing any information likely to be useful to a person committing or preparing an act of terrorism is a crime. Eeek! I'd better destroy any records I have of the address of my friend in the RAF, then. Oh, wait, clause (3): "It is a defence for a person charged with an offence under this section to prove that he had a reasonable excuse for his action or possession." So as long as I'm happy with being considered guilty until I can prove myself innocent, I'm probably OK. Great.&lt;br /&gt;&lt;br /&gt;Actually, I'd better be careful about having any information at all. After all, if I have a record of where the nearest supermarket is, a terrorist might be able to use that to get some food, which would certainly be useful to him or her.&lt;br /&gt;&lt;br /&gt;Scrolling on down to sections 59-61, yet more stupidity. The section essentially says "It's a crime to incite someone to do something outside the UK if it would be one of a certain set of crimes in the UK." Obviously they then thought that this might get the Armed Forces etc in trouble, so they added clause (5): "Nothing in this section imposes criminal liability on any person acting on behalf of, or holding office under, the Crown." So anyone who holds office under the Crown can do what they like in terms of incitement, whether or not they are acting on behalf of HMG at the time.&lt;br /&gt;&lt;br /&gt;I'd love to know what idiot wrote this law.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:6390</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/6390.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=6390"/>
    <title>Vote buying</title>
    <published>2004-12-09T14:21:07Z</published>
    <updated>2004-12-09T14:33:31Z</updated>
    <content type="html">A pet bugbear of mine...&lt;br /&gt;&lt;br /&gt;The UK does not have a secret ballot. If you want to prove to me that you have voted in a particular way, you just need to apply for a postal vote, and fill it in and post it with me watching. Since some time in the late 1990s or early 2000s anyone can get a postal vote on demand.&lt;br /&gt;&lt;br /&gt;This is particularly bad because it can lead to coercion. There were some reports in the recent European elections of low-paid employees in some factory being told to bring their ballots in to work and fill them in there, on pain of losing their jobs. In days gone by when landlords could throw out tenants on a whim, it was routine for them to control the votes of their tenants - which is what led to the &lt;a href="http://en.wikipedia.org/wiki/Reform_Bill"&gt;1872 Reform Act&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This also leads me to wonder how much it would cost to buy an election. So...&lt;br /&gt;&lt;br /&gt;[If you can't vote in the next general election for whatever reason, answer as if you can (and have at least some stake in the outcome of the vote).]&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://www.livejournal.com/poll/?id=400238"&gt;View Poll: How much is your vote worth?&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And no, the votes in this poll aren't secret either :-)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edits:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I know there are two 11p-20p options. Pick whichever one you like :-)&lt;br /&gt;&lt;br /&gt;I am asking the question solely for purposes of research and this should not be treated as an attempt to buy your vote, nor will or should your answers be treated as an offer to sell your vote.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:5979</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/5979.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=5979"/>
    <title>Posting policy (amended)</title>
    <published>2004-12-08T14:02:53Z</published>
    <updated>2004-12-08T14:02:53Z</updated>
    <content type="html">Since a couple of people have mentioned this now, I should mention that I've decided to change my posting policy.&lt;br /&gt;&lt;br /&gt;General discussion points, complaints about the world etc will generally be public. Discussion of what I've been doing and so on will remain friends-only. I'm normally happy to add anyone I know even vaguely to my friends list - just comment here or something.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:5676</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/5676.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=5676"/>
    <title>Religious right 1 - 0 Literary integrity</title>
    <published>2004-12-08T13:06:45Z</published>
    <updated>2004-12-08T13:06:45Z</updated>
    <content type="html">Oh my god, they &lt;a href="http://news.bbc.co.uk/1/hi/entertainment/film/4077987.stm"&gt;killed the message&lt;/a&gt;!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:5591</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/5591.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=5591"/>
    <title>Christ 0-1 Satan</title>
    <published>2004-12-07T22:38:19Z</published>
    <updated>2004-12-07T22:38:19Z</updated>
    <content type="html">&lt;a href="http://news.bbc.co.uk/1/hi/england/north_yorkshire/4074685.stm"&gt;This&lt;/a&gt; is just the kind of thing to restore my belief in Christmas :-)&lt;br /&gt;&lt;br /&gt;I do wonder how much press coverage there'd be if the &lt;a href="http://www.secularism.org.uk"&gt;National Secular Society&lt;/a&gt; asked the CofE to stop holding services (religion rots the brain, you know...)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:4537</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/4537.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=4537"/>
    <title>hsenag @ 2004-02-04T00:20:00</title>
    <published>2004-02-04T00:18:40Z</published>
    <updated>2004-02-04T00:18:40Z</updated>
    <content type="html">&lt;a href="http://www.bloggerheads.com/bbc/"&gt;&lt;img src="http://www.bloggerheads.com/bbc/bbc.gif" alt="I support the BBC." /&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:2392</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/2392.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=2392"/>
    <title>Friends/posting policy</title>
    <published>2003-08-22T11:10:15Z</published>
    <updated>2003-08-22T11:10:15Z</updated>
    <content type="html">Almost all of my posts are friends only (though actually there's not very many of them either). This is because I'm uncomfortable with the idea that someone randomly browsing can just read all my random semi-public utterances/news about my life without me having any control over it whatsoever. &lt;br /&gt;&lt;br /&gt;This doesn't mean I want to exercise very much control, however - so if you'd like me to add you as a friend, just ask me (e.g. by commenting on this post). If I know you I'll almost certainly add you. If I don't know you, I probably will too, but why on earth would you want to read this? :-)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:1738</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/1738.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=1738"/>
    <title>Something I wouldn't have believed possible</title>
    <published>2003-07-06T23:06:00Z</published>
    <updated>2003-07-06T23:22:37Z</updated>
    <content type="html">&lt;a href="http://education.guardian.co.uk/classroomviolence/story/0,12388,987932,00.html"&gt;Tranquility Bay&lt;/a&gt; - legal (offshore) child abuse.&lt;br /&gt;&lt;br /&gt;Update: &lt;a href="http://www.strugglingteens.com/archives/1998/2/seen01.html"&gt;Apparently&lt;/a&gt; the judge in the California case referred to in the article held that it was within the "broad rights to how parents can treat and handle their kids" usually granted by Californian Courts, but that concrete evidence of abuse would be grounds for returning to court on the issue.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:hsenag:340</id>
    <link rel="alternate" type="text/html" href="http://hsenag.livejournal.com/340.html"/>
    <link rel="self" type="text/xml" href="http://hsenag.livejournal.com/data/atom/?itemid=340"/>
    <title>Hello</title>
    <published>2002-08-28T14:57:05Z</published>
    <updated>2002-08-28T14:57:05Z</updated>
    <content type="html">Well, I've got myself a Livejournal. Mostly because lots of people I know have one and I was reading them, so I thought using the "friends" display would be cunning. But I might write something in here occasionally. Maybe. Don't hold your breath though. If I do it'll probably be friends-only, though, since I don't like the idea of advertising my life to the world.</content>
  </entry>
</feed>
