<?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-33049444</id><updated>2012-02-17T21:35:08.024-05:00</updated><category term='logic'/><category term='lambda calculus'/><category term='latex'/><category term='methodology'/><category term='lisp'/><category term='monads'/><category term='philosophy'/><category term='xul'/><category term='codata'/><category term='equality'/><category term='Haskell'/><category term='beamer'/><category term='firefox'/><category term='free theorem'/><category term='goodness'/><category term='job'/><category term='commutativity'/><category term='git'/><category term='induction'/><category term='agda'/><category term='shell'/><category term='comonads'/><category term='bookmarklet'/><category term='kernel'/><category term='languages'/><category term='dependent types'/><category term='god'/><category term='curry-howard isomorphism'/><category term='requirements'/><category term='greasemonkey'/><category term='gmail'/><category term='rant'/><category term='google'/><title type='text'>Bloggy Badger</title><subtitle type='html'>Code and ideas in computer science. And maybe a short story or two.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33049444.post-8740221857660769025</id><published>2012-02-09T23:44:00.001-05:00</published><updated>2012-02-09T23:44:37.878-05:00</updated><title type='text'>Success!</title><summary type='text'>Has it only been a week? Wow. This challenge was both easier and harder than expected.

Easier, because I expected to finish in a month, rather than a week. I'm really bad at making time estimates.

Harder, because I ended up writing much more code than I expected. I initially thought that I would implement the four stories back-to-back, with a few lines of code each. That was the plan. But I </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/8740221857660769025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=8740221857660769025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/8740221857660769025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/8740221857660769025'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2012/02/success.html' title='Success!'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-IcLtr93-9uY/TzSaeH8RmwI/AAAAAAAAAIQ/S1CUpvyVmrA/s72-c/Substrate.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-5927839310606119161</id><published>2012-02-04T12:24:00.000-05:00</published><updated>2012-02-05T13:07:57.966-05:00</updated><title type='text'>May the day I actually complete something finally come</title><summary type='text'>Completing projects is hard

I have a curse.

My curse is that I have too many great ideas. Now, I know that ideas are cheap, so I don't just publicly announce my ideas and then complain that nobody is acting on them. I know that if I want my ideas to have an impact, I must act on them myself. I do act! But I'm still cursed.

Often, my idea is something that I can code on a computer. That's great</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/5927839310606119161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=5927839310606119161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5927839310606119161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5927839310606119161'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2012/02/may-day-i-actually-complete-something.html' title='May the day I actually complete something finally come'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-1277101772867926655</id><published>2011-12-30T15:51:00.001-05:00</published><updated>2011-12-30T15:54:55.343-05:00</updated><title type='text'>An unusual "terms and conditions" page</title><summary type='text'>
You might have noticed my new "Terms and conditions" page, above. But then again, if you're like most users, you probably haven't.

Which is the whole point.


Nobody reads those pointless agreement pages, yet they are legally binding. This is crazy! I don't want to be legally bound by contracts I haven't even read.

For this reason, today, I counter-attack using my own "Terms and conditions" </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/1277101772867926655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=1277101772867926655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/1277101772867926655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/1277101772867926655'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2011/12/unusual-terms-and-conditions-page.html' title='An unusual &quot;terms and conditions&quot; page'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-5955451427692774941</id><published>2011-12-05T20:47:00.001-05:00</published><updated>2011-12-05T20:49:03.087-05:00</updated><title type='text'>Our Life in 3D</title><summary type='text'>By the way, my girlfriend and I will be updating the blog Our Life in 3D, a blog about our common project: modelling her entire condo using Houdini and 3DS Max.</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/5955451427692774941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=5955451427692774941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5955451427692774941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5955451427692774941'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2011/12/our-life-in-3d.html' title='Our Life in 3D'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-6228793014437144753</id><published>2011-09-14T01:26:00.000-04:00</published><updated>2011-09-14T01:28:24.987-04:00</updated><title type='text'>Time != Money</title><summary type='text'>Today's xkcd comic depends on a very common, but unjustified economic equation: that time is money. More precisely, I am objecting to the practice of using a person's hourly salary to evaluate the amount of money lost when that person wastes one hour of his time.

Granted, if that person wastes time during working hours, then he costs at least that much to his employer. At least as much, because </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/6228793014437144753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=6228793014437144753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/6228793014437144753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/6228793014437144753'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2011/09/time-money.html' title='Time != Money'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-2277379076942775113</id><published>2010-10-09T09:22:00.020-04:00</published><updated>2010-10-09T14:45:44.152-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agda'/><category scheme='http://www.blogger.com/atom/ns#' term='dependent types'/><category scheme='http://www.blogger.com/atom/ns#' term='curry-howard isomorphism'/><category scheme='http://www.blogger.com/atom/ns#' term='equality'/><category scheme='http://www.blogger.com/atom/ns#' term='logic'/><title type='text'>Equality is a (useless) transmutation machine</title><summary type='text'>Even since I heard about the Curry-Howard isomorphism, I've been wondering: to which computational principle corresponds equality? and the axiom of choice? and all those other mathematical concepts which would probably be much more intuitive to me in computational form? Unfortunately, there is no Curry-Howard dictionary translating concepts from one domain to the other, much like a French-English</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/2277379076942775113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=2277379076942775113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/2277379076942775113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/2277379076942775113'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2010/10/equality-is-useless-transmutation.html' title='Equality is a (useless) transmutation machine'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-4529905994043133219</id><published>2010-09-17T21:20:00.016-04:00</published><updated>2010-09-18T00:30:17.220-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='methodology'/><category scheme='http://www.blogger.com/atom/ns#' term='job'/><title type='text'>How to cope with changing requirements</title><summary type='text'>the context
Programming an application is a complicated endeavor. Often, people outside of the field greatly misjudge the amount of work necessary to implement one; either by vastly underestimating the work necessary to build programs similar to the ones they already use, or by vastly overestimating the work necessary to build programs unlike the ones they already use.

A misguided client in the </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/4529905994043133219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=4529905994043133219' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4529905994043133219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4529905994043133219'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2010/09/how-to-cope-with-changing-requirements.html' title='How to cope with changing requirements'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-632140425533800632</id><published>2009-12-09T12:01:00.009-05:00</published><updated>2009-12-09T12:44:25.010-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>intra-line diff</title><summary type='text'>Introducing linediff, a quick ruby wrapper around diff to highlight changed words instead of changed lines.


#!/usr/bin/ruby
pre, post = $stdin.read.split("\n=======\n")
post[-1..-1] = ""

class String
  def bash
    `bash -c #{inspect.gsub("$", "\\$")}`
  end

  def binspect
    split("\n").map {|s|
      "echo #{s.inspect.gsub("$", "\\$")}"
    }.join(";")
  end

  def to_lines
    gsub("\n", </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/632140425533800632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=632140425533800632' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/632140425533800632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/632140425533800632'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2009/12/intra-line-diff.html' title='intra-line diff'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-7285738893394373089</id><published>2009-09-06T16:37:00.009-04:00</published><updated>2010-04-27T23:21:01.993-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agda'/><category scheme='http://www.blogger.com/atom/ns#' term='dependent types'/><category scheme='http://www.blogger.com/atom/ns#' term='free theorem'/><title type='text'>Samuel's Really Straightforward Proof of the Parametricity Result, extended (trivially) to dependent types.</title><summary type='text'>[I'll eventually write a version which begins by explaining free theorems, but for now here's a proof for the cognoscenti]


Consider an agda expression, any typed agda expression whose type is a Set1. Here are two examples, including one using dependent types.

id : {a : Set}
   → a
   → a
id x = x

ff : {a : Set}
   → {s : a → a}
   → (F : a → Set)
   → (f : {x : a}
        → F x
        → F (s</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/7285738893394373089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=7285738893394373089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/7285738893394373089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/7285738893394373089'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2009/09/samuels-really-straightforward-proof-of.html' title='Samuel&apos;s Really Straightforward Proof of the Parametricity Result, extended (trivially) to dependent types.'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-5222897328170078855</id><published>2009-02-05T16:29:00.014-05:00</published><updated>2009-02-05T17:58:24.316-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>An even more careful fox</title><summary type='text'>Firefox goes to great lengths to preserve the user's work. For the rare cases when it fails, read this.

If I browse for some time, opening a bazillion tabs before the computer crashes, firefox will offer to restore those tabs as soon as I start it again.

If I type some text in a &lt;TEXTAREA/&gt; form before the computer crashes, firefox will restore the text.

But if I type some text in a fancy </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/5222897328170078855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=5222897328170078855' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5222897328170078855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5222897328170078855'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2009/02/even-more-careful-fox.html' title='An even more careful fox'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-6963604432919698835</id><published>2009-01-24T16:02:00.016-05:00</published><updated>2009-01-24T18:38:35.085-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='goodness'/><title type='text'>Rant against charitable organizations (and solution)</title><summary type='text'>I happen to be an highly optimistic person. That's a good thing.

Sometimes, my less optimistic friends think the world is a terrible place to live in. Thankfully, they're wrong, so I can cheer them up by pointing out solutions to the problems they perceive. Given this ability, I think I'd make a great volunteer at one of those teen help hotlines. The problem is, none of them wants my help! Well,</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/6963604432919698835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=6963604432919698835' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/6963604432919698835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/6963604432919698835'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2009/01/rant-against-charitable-organizations.html' title='Rant against charitable organizations (and solution)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-4792306729808976935</id><published>2009-01-09T15:35:00.017-05:00</published><updated>2010-10-09T09:58:05.095-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='induction'/><category scheme='http://www.blogger.com/atom/ns#' term='logic'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='codata'/><title type='text'>well-foundedness, part 2 of 2: code is data. or is it codata?</title><summary type='text'>Whether it is represented as finite strings or as finite trees, code is finite, and thus code is data, not codata. That should settle the question.


  
    
      haskell
      code = 2 + 3 * 4
    
    
    
      haskell
      string_data = "2 + 3 * 4"
    
    
    
      haskell
      data Exp = Lit Int | Add Exp Exp | Mul Exp Exp
    
    
      haskell
      tree_data = Add (Lit 2) (Mul (</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/4792306729808976935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=4792306729808976935' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4792306729808976935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4792306729808976935'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2009/01/well-foundedness-part-2-of-2-code-is.html' title='well-foundedness, part 2 of 2: code is data. or is it codata?'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-3838587760384742770</id><published>2009-01-09T09:42:00.025-05:00</published><updated>2009-01-09T16:53:58.218-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='induction'/><category scheme='http://www.blogger.com/atom/ns#' term='logic'/><title type='text'>well-foundedness, part 1 of 2: who cares?</title><summary type='text'>If you're like me, you've often heard of well-foundedness, but never really bothered to learn what it really meant nor why it's important. If you're like most people, on the other hand, then you've never even heard the word and you couldn't care less. Well, go ahead, skip this post. You'll be back and eager to learn once you try and fail to read part 2.






...see? I told you you'd be back. </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/3838587760384742770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=3838587760384742770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/3838587760384742770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/3838587760384742770'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2009/01/well-foundedness-part-1-of-2-who-cares.html' title='well-foundedness, part 1 of 2: who cares?'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-4246156619259106382</id><published>2008-12-25T02:12:00.011-05:00</published><updated>2008-12-26T16:09:40.614-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='god'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='logic'/><title type='text'>God exists (with probability one)</title><summary type='text'>Bonjour Gab. Joyeux Noël. C'est un jour tout particulier pour toi, alors profites-en.

Tu n'aimes pas quand, à la messe de minuit, les imposteurs envahissent ton église pour prier maladroitement à tes côtés, alors je ne prétendrai pas partager ton enthousiasme. Par contre, je voulais te rappeler que moi aussi je crois en dieu — juste pas en Dieu, avec une majuscule. Tu dois te dire que je dis ça </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/4246156619259106382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=4246156619259106382' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4246156619259106382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4246156619259106382'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/12/god-exists-with-probability-one.html' title='God exists (with probability one)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-3117124405936785111</id><published>2008-11-30T22:28:00.030-05:00</published><updated>2010-10-09T10:47:05.823-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='logic'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><title type='text'>Non-standard inhabitants</title><summary type='text'>The goal of this post is to demonstrate that I'm not crazy. One of my latest discoveries involves a function called "inhabitants", but that's impossible, so says the textbooks, and I can't explain my discovery any further because I crumble under the mathematically rigorous objections. You know, the way researchers whose latest discovery involves a perpetual motion engine tend not to be taken very</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/3117124405936785111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=3117124405936785111' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/3117124405936785111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/3117124405936785111'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/11/non-standard-inhabitants.html' title='Non-standard inhabitants'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-8413248457969346886</id><published>2008-11-28T11:30:00.025-05:00</published><updated>2009-02-13T09:48:21.414-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lambda calculus'/><title type='text'>Axes of the lambda cube</title><summary type='text'>Can't see the math behind the greek? For reference, here are the appropriate greek letters for each abstraction mechanism introduced in each axis of the lambda cube. For completeness, lambda abstraction is also included on its own, even though it appears in all axes.

Each cell begins with an example type, followed by an example term of that type. Either the term, the type, or both (...or neither</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/8413248457969346886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=8413248457969346886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/8413248457969346886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/8413248457969346886'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/11/axes-of-lambda-cube.html' title='Axes of the lambda cube'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-2864902562942555216</id><published>2008-11-27T00:02:00.010-05:00</published><updated>2009-12-09T13:08:32.853-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='xul'/><title type='text'>Testing Chrome Overlays</title><summary type='text'>Writing a Firefox extension involves writing a so-called "chrome overlay", which is an xml description of the interface changes you wish to make.

I'm in the process of learning how to write overlays. That means I make mistakes. Lots of them. They're completely normal stepping stones in the process of learning, and I'm totally prepared to spend lots of time doing nothing but mistakes. But while </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/2864902562942555216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=2864902562942555216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/2864902562942555216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/2864902562942555216'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/11/testing-chrome-overlays.html' title='Testing Chrome Overlays'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-4015106484742264855</id><published>2008-11-02T14:32:00.009-05:00</published><updated>2008-11-02T17:28:04.798-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='job'/><title type='text'>I want to be a knowledge engineer!</title><summary type='text'>The best thing about being a student is that your job is to learn. Except it isn't really a job at all, since I'm the one paying the university, not the other way around.

The sad thing about being a student, is that it cannot last. Once you've done enough learning, you're expected to go out there in the industrial world and use that knowledge. My current plan is to work in the mornings, raising </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/4015106484742264855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=4015106484742264855' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4015106484742264855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4015106484742264855'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/11/i-want-to-be-knowledge-engineer.html' title='I want to be a knowledge engineer!'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-8949327191284887952</id><published>2008-10-29T19:40:00.005-04:00</published><updated>2008-10-29T22:18:30.713-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='latex'/><category scheme='http://www.blogger.com/atom/ns#' term='beamer'/><title type='text'>Rant against beamer's shaky animation support (and solution)</title><summary type='text'>I love LaTeX.

I love it because TeX is a programming language, and the other typesetting products aren't. Other that that, it's a horrible language.

For some reason, I don't follow the "separate presentation from contents" dogma. I guess it must be a bit strange coming from a guy who otherwise strongly advocates separation of concerns in all manners of code, but that's the way it is. </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/8949327191284887952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=8949327191284887952' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/8949327191284887952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/8949327191284887952'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/10/rant-against-beamers-shaky-animation.html' title='Rant against beamer&apos;s shaky animation support (and solution)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-7765533415308643177</id><published>2008-10-21T15:36:00.011-04:00</published><updated>2010-09-10T09:21:14.689-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commutativity'/><title type='text'>Designing a mergeable filesystem structure</title><summary type='text'>In my previous post, I have argued that it would be better if filesystems could be merged without human supervision. This could only happen if conflicts were impossible, but with today's filesystems, merge conflicts are actually inevitable! Let's design a filesystem without this flaw.

My study of conflicts has led me to the study of a family of data-structures which I call commutative types. </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/7765533415308643177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=7765533415308643177' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/7765533415308643177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/7765533415308643177'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/10/designing-mergeable-filesystem.html' title='Designing a mergeable filesystem structure'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-4722559473040197798</id><published>2008-10-19T16:15:00.016-04:00</published><updated>2008-10-19T18:17:44.878-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Rant against merge conflicts (and a solution strategy)</title><summary type='text'>Version control used to be all about versioning. I never used RCS, but I bet the killer command was something like "rcs commit", to create a new version.

Projects soon grew bigger and version control began to be all about collaboration. The killer command was then "cvs checkout", to get the source and begin collaborating.

Then projects grew even more complicated and it was no longer sufficient </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/4722559473040197798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=4722559473040197798' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4722559473040197798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/4722559473040197798'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/10/rant-against-merge-conflicts-and.html' title='Rant against merge conflicts (and a solution strategy)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-9201393851221275434</id><published>2008-10-18T19:52:00.012-04:00</published><updated>2008-10-18T21:42:01.808-04:00</updated><title type='text'>Rant against choices (and solution)</title><summary type='text'>This is a mashup between Barry Schwartz's paradox of choice talk and sigfpe's presentation of ordinals as a survival game.

Apparently, math tells us that there are three kinds of totally ordered single player games.


∅, where we've got no choices at all. if society gives you this choice, blame society.
successor ordinals such as 42 or ω + 1, where you've got many choices, including one which is</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/9201393851221275434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=9201393851221275434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/9201393851221275434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/9201393851221275434'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/10/rant-against-choices-and-solution.html' title='Rant against choices (and solution)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-6217643787787796283</id><published>2008-08-27T10:42:00.005-04:00</published><updated>2008-08-27T11:43:49.341-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google's badware hoop (and solution)</title><summary type='text'>As you've probably noticed, Google began warning users against some websites, making them read through a "this site may harm your computer" message before allowing them to proceed. I'm glad to see you care about me, Google, thanks, but no thanks. I can take care of myself.

The problem is, you can't turn this off.

Until today, of course, since I'm publishing this greasemonkey script. There are </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/6217643787787796283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=6217643787787796283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/6217643787787796283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/6217643787787796283'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/08/googles-badware-hoop-and-solution.html' title='Google&apos;s badware hoop (and solution)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-3771479200989875711</id><published>2008-08-06T16:39:00.017-04:00</published><updated>2010-09-10T09:22:24.347-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>filenamed</title><summary type='text'>Does your shell script use temporary files? Does it clean up the temporaries after it dies? What if the user aborts your script early by using ^C? What if he feels mean and uses kill -9 instead?

Not using temporary files is the easiest way out of this mess, but unfortunately there are situations where this is unavoidable. Let's say, for example, that you want to diff the output of two programs. </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/3771479200989875711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=3771479200989875711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/3771479200989875711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/3771479200989875711'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/08/filenamed.html' title='filenamed'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-947001938005040101</id><published>2008-06-04T23:54:00.001-04:00</published><updated>2008-12-03T16:37:47.959-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Rant against .gitkeep (and solution)</title><summary type='text'>Git claims to be miles ahead of Subversion, looking down on it as "only" fixing CVS's flaws. Well, one annoying CVS flaw is its failure to archive the existence of directories on the server side, and it seems that git is still behind Subversion in this respect.

Of course, it would be incorrect to state that CVS doesn't track directories at all. It tracks changes to individual files, where a "</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/947001938005040101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=947001938005040101' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/947001938005040101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/947001938005040101'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/06/rant-against-gitkeep-and-solution.html' title='Rant against .gitkeep (and solution)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-5920698551558742449</id><published>2008-05-31T15:56:00.021-04:00</published><updated>2008-06-04T21:58:32.929-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Rant against Firefox version checks (and solution)</title><summary type='text'>I'm not particularly fond of Firefox's XUL+js architecture, but I'm more than willing to live with this unusual choice if it allows people to easily write Firefox extensions to customize their experience.

But did you ever notice that most of the plugins break every time you update Firefox? I thought that APIs which change this fast must reflect a development model where refactoring is frequent. </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/5920698551558742449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=5920698551558742449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5920698551558742449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5920698551558742449'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/05/rant-against-firefox-version-checks-and.html' title='Rant against Firefox version checks (and solution)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-988477544892597489</id><published>2008-05-29T21:40:00.003-04:00</published><updated>2008-05-29T22:42:22.455-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bookmarklet'/><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><title type='text'>Gmail's fullscreen mode (and solution)</title><summary type='text'>Gmail has a so-called "fullscreen mode" which ought to please me: it dedicates all of the browser's screen real estate to the message I'm reading. No pesky sidebars at all. Ain't it great? Well, it turns out I'm rather difficult to please.

What should I do once I'm done with the message? I will either want to delete it, to archive it, or to read my next message. But I can't do any of those in </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/988477544892597489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=988477544892597489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/988477544892597489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/988477544892597489'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/05/gmails-fullscreen-mode-and-solution.html' title='Gmail&apos;s fullscreen mode (and solution)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-7482175023891649366</id><published>2008-05-12T11:38:00.018-04:00</published><updated>2008-05-26T23:12:55.946-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='bookmarklet'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><title type='text'>Rant against sidebars (and solution)</title><summary type='text'>I don't browse fullscreen.

Let me repeat that, in case it isn't absolutely clear. My internet browser is never maximized. I have a few windows sprinkled about my screen, the more the merrier, until I run out of space to put them. Thanks to you, web designers (but do continue reading even if you're not a web designer as I have a goodie for you at the end), this occurs as soon as I launch firefox.</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/7482175023891649366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=7482175023891649366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/7482175023891649366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/7482175023891649366'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/05/rant-against-sidebars-and-solution.html' title='Rant against sidebars (and solution)'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-45828878405934861</id><published>2008-02-29T00:09:00.018-05:00</published><updated>2008-11-06T18:03:06.507-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='bookmarklet'/><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><title type='text'>Gmail signature bookmarklet</title><summary type='text'>update: As of November 2008, gmail now has a setting to place your signature above the quotation if you want to. Thanks Google!

---

When you reply to a message, Gmail creates a text editor with your cursor at the top, a giant quotation containing the message you're replying to, some useless double-colon separator, and your signature.

Gmail's default cursor location encourages top-posting, </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/45828878405934861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=45828878405934861' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/45828878405934861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/45828878405934861'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2008/02/gmail-signature-bookmarklet.html' title='Gmail signature bookmarklet'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-107005915356704809</id><published>2007-04-29T11:05:00.000-04:00</published><updated>2007-04-29T11:24:47.324-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comonads'/><title type='text'>Of comonads and nightclubs</title><summary type='text'>In this awesome explanation of monads, you have been building space stations under the master directive that all stations must output their astronauts in space suits. We're going to build nightclubs. In winter. Under the master directive that clients must take off their wintercoats before dancing.We are especially concerned about the entrance procedure. There is a sequence of things which clients</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/107005915356704809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=107005915356704809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/107005915356704809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/107005915356704809'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2007/04/of-comonads-and-nightclubs.html' title='Of comonads and nightclubs'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-5187937175101266004</id><published>2007-04-28T12:18:00.003-04:00</published><updated>2010-08-19T12:18:22.454-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monads'/><category scheme='http://www.blogger.com/atom/ns#' term='comonads'/><title type='text'>I understand comonads</title><summary type='text'>Upon discovering the incredible coolness of monads, I decided that the closely related concept of comonads had to be at least as interesting. Unfortunately, far fewer people seem to be interested in this little underestimated cousin, at least not enough for anyone to post a spacesuit metaphor for them. But as always, when proper documentation is lacking, it suffices to ask the source.

        
</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/5187937175101266004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=5187937175101266004' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5187937175101266004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/5187937175101266004'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2007/04/i-understand-comonads.html' title='I understand comonads'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-116317156216438891</id><published>2006-11-10T10:08:00.001-05:00</published><updated>2008-06-01T11:18:29.598-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Cumulative DSLs</title><summary type='text'>I like first class constructs. Every time the language gurus out there manage to find an old thing they overlooked, a thing which wasn't first-class yet, and promote it to a first-class citizen, the programming world gets better. At least for those who aren't prevented from using the language by company rules.It's not an issue of fairness at all. I'd like everything to be first-class, but not for</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/116317156216438891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=116317156216438891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/116317156216438891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/116317156216438891'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2006/11/cumulative-dsls.html' title='Cumulative DSLs'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-116208045240645923</id><published>2006-10-28T20:05:00.000-04:00</published><updated>2007-04-29T08:08:59.885-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monads'/><title type='text'>Monads as Universe Helpers</title><summary type='text'>To see if the grass is greener on the other side of the programming fence, I've been accumulating a scaffolding of knowledge about functional programming which recently culminated in my understanding of the really cool and deep concept of monads.Monads chain computations in a special way. There are many types of monads, and each chains its computations in its own special way. One of them chains </summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/116208045240645923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=116208045240645923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/116208045240645923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/116208045240645923'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2006/10/monads-as-universe-helpers.html' title='Monads as Universe Helpers'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33049444.post-115608567440825282</id><published>2006-08-20T08:10:00.001-04:00</published><updated>2008-06-01T11:18:07.435-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Lisp is Low-Level</title><summary type='text'>Lisp is built out of an amazing idea: like everything else in the machine, code is also data. This is true in any language, but Lisp's syntax makes the code especially easy to manipulate as data.This feature allows new language constructs to be implemented as program transformations, without touching the core language. Given this uncommon ability, how could any language ever beat Lisp in terms of</summary><link rel='replies' type='application/atom+xml' href='http://gelisam.blogspot.com/feeds/115608567440825282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33049444&amp;postID=115608567440825282' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/115608567440825282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33049444/posts/default/115608567440825282'/><link rel='alternate' type='text/html' href='http://gelisam.blogspot.com/2006/08/lisp-is-low-level.html' title='Lisp is Low-Level'/><author><name>gelisam</name><uri>http://www.blogger.com/profile/10619127479176568208</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos-b.ak.facebook.com/photos-ak-sf2p/v251/140/48/656715601/n656715601_3058097_7939.jpg'/></author><thr:total>8</thr:total></entry></feed>
