<rss version="2.0">
  <channel>
    <title>Nicolas Pouillard&#39;s Blog</title>
    <link>http://blog.nicolaspouillard.fr</link>
    <description>Nicolas Pouillard&#39;s Blog</description>
    <item>
      <title>Bug Tracker Design Issues</title>
      <link>http://blog.nicolaspouillard.fr/entries/2009-11-01-bug-tracker-design-issues.html</link>
      <description>&lt;p&gt;This post details some design considerations about a simple bug tracker system. Indeed the &lt;a href=&quot;http://sup.rubyforge.org/&quot;&gt;Sup&lt;/a&gt; project needs a better way to track issues and is looking for a bug tracking software.&lt;/p&gt;&lt;p&gt;This article is cross posted to &lt;a href=&quot;http://rubyforge.org/mailman/listinfo/sup-talk&quot;&gt;Sup mailing list&lt;/a&gt; and the discussion will take place there.&lt;/p&gt;&lt;p&gt;Finding a bug tracking system we really like seems a difficult task...&lt;/p&gt;&lt;p&gt;A simple question I asked me was:&lt;/p&gt;&lt;p&gt;&amp;quot;Do we really need to invent this (big) tool?&amp;quot;&lt;/p&gt;&lt;p&gt;And more and more the answer I see is that we do not need yet another big tool. Especially for a bug tracker we need recipes, protocols more than a nice interface. And generally I think we better need thinking on how to split the problem in small issues than writing the tool that tackles all of them in one go.&lt;/p&gt;&lt;p&gt;Again the UNIX philosophy can help us to simplify all this mess!&lt;/p&gt;&lt;p&gt;So we need a web interface for non technical users, great. What about a pre-formatted email explained on a single web-page for reporting bugs. This simple web-page will also have a form to fill which will send the email for them. This micro web app is really simple and does a very clear job.&lt;/p&gt;&lt;p&gt;So we now have issues as emails. Thus the mailing-list is our bug tracker as before. However issues are now in a proper format.&lt;/p&gt;&lt;p&gt;A bot will receive emails on the mailing-list and process those which are in the right format.&lt;/p&gt;&lt;p&gt;I think that the bot will not have a lot of information to store:&lt;/p&gt;&lt;p&gt;(correct me if you find something else)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Issue type, severity, priority, category, person assigned, progress status, incriminated version and platform, planned milestone/released.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Issue details, discussion, answers, attachments.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All those of the first category can be easily handled in a very flexible way either with labels, or a simple mapping: Labels (like the Google bug tracker on code.google.com): Type-Defect Priority-Critical Component-UI Mapping: type: defect priority: critical component: UI&lt;/p&gt;&lt;p&gt;This is very flexible because this set of labels/attributes is chosen by the project maintainer to match the complexity of the project.&lt;/p&gt;&lt;p&gt;I would store and manage the first category using a simple YAML file.&lt;/p&gt;&lt;p&gt;The bot acknowledges its updates by simply answering to the discussion.&lt;/p&gt;&lt;p&gt;Those of the second category can be managed using a single email discussion.&lt;/p&gt;&lt;p&gt;Since the discussion is central to the issue, tracking the original message-ID could be used as the unique identifier.&lt;/p&gt;&lt;p&gt;About the issues identifier I see two options, either we try to allocate simple integers like most of the trackers or we just keep the unique (long) identifier.&lt;/p&gt;&lt;p&gt;Then, optionally a simple set of HTML pages can be generated using the YAML file.&lt;/p&gt;&lt;p&gt;About storage of the YAML file I would simply store it in the repository. If we make the bot accessible, we just have to periodically pull from it.&lt;/p&gt;&lt;p&gt;I don&#39;t know yet how many issues I&#39;ve forgotten, and if this design is really as simple and lightweight as I claim it to be. I look forward to your answers on that.&lt;/p&gt;</description>
      <pubDate>2009-11-01 00:00:00 UTC</pubDate>
    </item>
    <item>
      <title>Simple E-Mail Delaying</title>
      <link>http://blog.nicolaspouillard.fr/entries/2009-10-03-simple-email-delaying.html</link>
      <description>&lt;p&gt;Yesterday I have finally scratch an itch that was bugging me since months. And guess what it fits in less than 40 lines of shell script!&lt;/p&gt;&lt;div id=&quot;e-mail-driven-actions&quot;&gt;&lt;h2&gt;E-Mail Driven Actions&lt;/h2&gt;&lt;p&gt;I tend to be quite bad at managing tasks to do, however I try improve myself, and already follow two simple rules. The first one is called the &amp;quot;two minutes rule,&amp;quot; it says that if one thing you have to do takes less than two minutes, then it does not worth to be delayed, you should do it now! The second rule I apply is to do tasks when it pops-up in my email client (&lt;a href=&quot;http://sup.rubyforge.org/&quot;&gt;sup&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;However from time to time, I receive an email which incurs a &amp;quot;more than two minutes&amp;quot; action, that I cannot cope with now. If I keep that email in my in-box, it will keep bugging me until I either pick it up or trash it because it is now outdated.&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;delaying&quot;&gt;&lt;h2&gt;Delaying&lt;/h2&gt;&lt;p&gt;The feature I often wanted is to be able to delay an email-based action, without having to pick it up myself in the pool of waiting emails. More precisely I really enjoy the event based approach of email processing, it is just that some emails come at the wrong time.&lt;/p&gt;&lt;p&gt;In this kind of situation I would like to say, &amp;quot;bring me that email again in two days&amp;quot; or &amp;quot;this evening&amp;quot; or &amp;quot;2 days before &lt;deadline&gt;&amp;quot; or &amp;quot;when in vacations&amp;quot; or &amp;quot;when back online&amp;quot;... This way you can keep both your in-box clean (&lt;a href=&quot;http://inboxzero.com/video/&quot;&gt;in-box-zero&lt;/a&gt;) and continue to follow an event based style of reacting.&lt;/p&gt;&lt;p&gt;This technique can also be useful to passively distribute the answer to a question among a group on a mailing-list. If you feel not the most concerned about the question then you can say &amp;quot;let&#39;s wait two days,&amp;quot; and answer something if no one took it before!&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;getting-delaying-into-sup&quot;&gt;&lt;h2&gt;Getting Delaying Into Sup&lt;/h2&gt;&lt;p&gt;The next point was to actually have the feature in the email client I use. However I didn&#39;t really take the time to implement this. It seemed quite easy but a bit tedious and with a bunch of design choice: Where to store reminders, how often do we check them, do we poll, do we use threads, timers...&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;bam-unix-philosophy-to-the-rescue&quot;&gt;&lt;h2&gt;BAM! Unix Philosophy To The Rescue&lt;/h2&gt;&lt;p&gt;During months, instead of actually coding this not-too-complex module, I was procrastinating. However this was not vain, since I got a better idea. What if we could make this feature independent of the email client? Even better I could reuse and compose existing tools!&lt;/p&gt;&lt;p&gt;So, the usage is as follow: you are on a discussion, and you want to delay processing it. In sup you press &#39;|&#39; to pipe the current email to a given program. I have named that command &lt;a href=&quot;http://gist.github.com/199197&quot;&gt;email-reminder&lt;/a&gt;. It reads the email, extracts the &lt;code&gt;Message-ID&lt;/code&gt; and setups a task at the given time specification. The task is simply to reply to the email using the &lt;code&gt;Message-ID&lt;/code&gt;. The time specification is the one defined by the &lt;a href=&quot;http://en.wikipedia.org/wiki/At_(Unix)&quot;&gt;&lt;code&gt;at(1)&lt;/code&gt;&lt;/a&gt; Unix command.&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;about-the-script&quot;&gt;&lt;h2&gt;About the script&lt;/h2&gt;&lt;p&gt;The script first extracts the &lt;code&gt;Message-ID&lt;/code&gt; (and the &lt;code&gt;Subject&lt;/code&gt;) of the input mail. Then it cooks up a little response email, using your email and the current date, generating a &lt;code&gt;Message-ID&lt;/code&gt; and the &lt;code&gt;In-Reply-To&lt;/code&gt; field. Finally it runs the &lt;a href=&quot;http://en.wikipedia.org/wiki/At_(Unix)&quot;&gt;&lt;code&gt;at(1)&lt;/code&gt;&lt;/a&gt; command, feeding it with the time specification and a call to the &lt;code&gt;$SENDMAIL&lt;/code&gt; or &lt;a href=&quot;http://msmtp.sourceforge.net/&quot;&gt;&lt;code&gt;msmtp(1)&lt;/code&gt;&lt;/a&gt; command.&lt;/p&gt;&lt;p&gt;This little script is now published on &lt;a href=&quot;http://gist.github.com/199197&quot;&gt;github&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</description>
      <pubDate>2009-10-03 00:00:00 UTC</pubDate>
    </item>
    <item>
      <title>Starting a new Blog using Blogination</title>
      <link>http://blog.nicolaspouillard.fr/entries/2009-09-11-starting-a-new-blog-using-blogination.html</link>
      <description>&lt;p&gt;It&#39;s time for a new blog. The main non technical goal for this one is to be non-empty :)&lt;/p&gt;&lt;p&gt;This time, I&#39;m gonna force myself to write new posts on a regular basis.&lt;/p&gt;&lt;p&gt;The intended topics would be among: theory and practice of programming languages, in particular functional ones; some system administration tips and tools; and communication services/software like emails, &lt;a href=&quot;http://twitter.com&quot;&gt;twitter&lt;/a&gt; or &lt;a href=&quot;http://wave.google.com&quot;&gt;Google wave&lt;/a&gt;.&lt;/p&gt;&lt;div id=&quot;choosing-a-blogging-platform&quot;&gt;&lt;h2&gt;Choosing a blogging platform&lt;/h2&gt;&lt;p&gt;I wanted a really lightweight platform, at least from the developer point of view. I&#39;ve used &lt;a href=&quot;http://typosphere.org&quot;&gt;Typo&lt;/a&gt; then &lt;a href=&quot;http://mephistoblog.com&quot;&gt;Mephisto&lt;/a&gt; and they were really to heavyweight to maintain. So I wanted a system for which I can be responsible of the code in a sustainable way. Not that I couldn&#39;t fix the various issues I had with &lt;a href=&quot;http://typosphere.org&quot;&gt;Typo&lt;/a&gt; and &lt;a href=&quot;http://mephistoblog.com&quot;&gt;Mephisto&lt;/a&gt; but more that I no longer want to!&lt;/p&gt;&lt;p&gt;Here are the features I wanted:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Plain text&lt;/li&gt;&lt;li&gt;Really small code-base&lt;/li&gt;&lt;li&gt;Written in &lt;a href=&quot;http://haskell.org&quot;&gt;Haskell&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Static pages&lt;/li&gt;&lt;li&gt;Comments&lt;/li&gt;&lt;li&gt;Syndication&lt;/li&gt;&lt;li&gt;Tagging&lt;/li&gt;&lt;li&gt;UTF8&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;After some search, there were two competitors &lt;a href=&quot;http://chrisdone.com/blog/tags/Blogination.html&quot;&gt;Blogination&lt;/a&gt; and &lt;a href=&quot;http://all-thing.net/label/whisper/&quot;&gt;Whisper&lt;/a&gt;. However since only &lt;a href=&quot;http://chrisdone.com/blog/tags/Blogination.html&quot;&gt;Blogination&lt;/a&gt; was written in &lt;a href=&quot;http://haskell.org&quot;&gt;Haskell&lt;/a&gt; I opted for it.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://chrisdone.com/blog/tags/Blogination.html&quot;&gt;Blogination&lt;/a&gt; was written by Chris Done and I must say that this tool fits almost all my needs.&lt;/p&gt;&lt;p&gt;Of course as I will go along with adapting &lt;a href=&quot;http://chrisdone.com/blog/tags/Blogination.html&quot;&gt;Blogination&lt;/a&gt; for my needs I will submit patches to Chris Done.&lt;/p&gt;&lt;p&gt;Let&#39;s go a bit deeper into the expected features:&lt;/p&gt;&lt;div id=&quot;plain-text-no-rdbmssql&quot;&gt;&lt;h3&gt;Plain text: No RDBMS/SQL&lt;/h3&gt;&lt;p&gt;Relying on plain text files makes the blogging code much more simpler. Indeed the blogging code only needs to read the files. All the CRUD (create, update, delete) is done with your favorite editor.&lt;/p&gt;&lt;p&gt;To quote William Morgan (&lt;a href=&quot;http://all-thing.net/label/whisper/&quot;&gt;Whisper&lt;/a&gt;&#39;s author):&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Storing your blog entries in a RDBMS is like driving to work in the Space Shuttle.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;So even if driving a Space Shuttle could be kind of cool, I don&#39;t consider RDBMS/SQL as cool in the long run.&lt;/p&gt;&lt;p&gt;Then it is really simple to keep track of the contents safely using a version control system, and here &lt;a href=&quot;http://darcs.net&quot;&gt;Darcs&lt;/a&gt; is a perfect match for the situation.&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;small-code-base&quot;&gt;&lt;h3&gt;Small code-base&lt;/h3&gt;&lt;p&gt;I want to acquire the control of the code almost as if I had written it. Being able to change it easily to fit my needs is of prime importance.&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;written-in-haskell&quot;&gt;&lt;h3&gt;Written in &lt;a href=&quot;http://haskell.org&quot;&gt;Haskell&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Because maintaining high level, well abstracted, well typed, purely functional code is a much more pleasant task to do than what one can find elsewhere.&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;static-pages&quot;&gt;&lt;h3&gt;Static pages&lt;/h3&gt;&lt;p&gt;Static pages generated in batch makes the administration much more simpler. Moreover there is almost no scalability issues with static pages.&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;tagging-and-utf8&quot;&gt;&lt;h3&gt;Tagging and UTF8&lt;/h3&gt;&lt;p&gt;Those speak for themselves.&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;comments&quot;&gt;&lt;h3&gt;Comments&lt;/h3&gt;&lt;p&gt;At the beginning no support for comments is not a problem. I think that blog comments should reuse an existing communication layer like emails.&lt;/p&gt;&lt;p&gt;Comments could be supported via emails like it is done in &lt;a href=&quot;http://all-thing.net/label/whisper/&quot;&gt;Whisper&lt;/a&gt;. However in the mean time that is not the main task, sending &lt;a href=&quot;http://nicolaspouillard.fr&quot;&gt;me&lt;/a&gt; emails will be enough.&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;syndication&quot;&gt;&lt;h3&gt;Syndication&lt;/h3&gt;&lt;p&gt;Some RSS support or Atom was really needed. I also like to experiment with some &lt;a href=&quot;http://code.google.com/p/pubsubhubbub&quot;&gt;pubsubhub&lt;/a&gt; support in the future.&lt;/p&gt;&lt;p&gt;Syndication will be also done with &lt;a href=&quot;http://twitter.com&quot;&gt;twitter&lt;/a&gt;, since every post will be accompanied by some tweets about it, answering to these tweets will be another way to comment on each post.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;future-improvements&quot;&gt;&lt;h2&gt;Future improvements&lt;/h2&gt;&lt;p&gt;On the list of improvements there is: A nicer design, an inspiring blog title, more features... All of these need to come, however as I said earlier the main task is to publish contents regularly and to stop keeping these thoughts for myself.&lt;/p&gt;&lt;/div&gt;</description>
      <pubDate>2009-09-11 00:00:00 UTC</pubDate>
    </item>
  </channel>
</rss>