Mon motto cette année

•January 5, 2010 • Leave a Comment

Je viens de finir de lire “Dieu et nous seuls pouvons” de Michel Folco et voilà un extrait qui tombe à point:

Moins tu réussis, plus tu parles des difficultés.
Celui qui réussit n’en parle jamais.
As-tu bien rempli ta journée ?
Pose-toi cette question tous les soirs.

Quebec City is beautiful!

•December 14, 2009 • Leave a Comment

You have to come here at least once in the winter!

Quebec in the winter

Quebec in the winter

CRIA me a river!

•December 7, 2009 • Leave a Comment

The Canadian Recording Industry Association faces a lawsuit for 60 billion dollars over willful infringement.

L’autre St-Jean

•June 24, 2009 • Leave a Comment

Ceux qui capotent sur la question de la langue française devrait regarder du côté de l’Irlande, qui a su faire rayonner sa culture partout à travers le monde sans qu’elle repose principalement sur la langue. Tsé, le jour de la St-Patrick, tout le monde est Irlandais, peu importe la religion ou la langue. En fait, ce jour-là, le trip de plusieurs est de remonter son arbre généalogique pour se trouver du sang vert et en tirer une certaine fierté … ou ben justifier une méchante brosse, c’est selon. Pas obligé d’être unilingue gaélique pour être fier d’être Irlandais comme on n’est pas obligé de parler français pour être fier d’être Québécois.

J’rêve d’un Québec où des touristes affluent de partout pour s’imprégner de notre culture unique … Un Chinois avec une chemise à carreaux ben chaud sur le caribou en criant Tabarnak, ça me ferait verser une petite larme de joie.

On the other hand, the reality of being French in Canada still resembles what is portrayed in this parody, so it’s not like it’s only the frenchies who have to open up their mind…

Insider look at Blizzard’s cinematics

•June 5, 2009 • Leave a Comment

I have been a fan of Blizzard’s cinematics since day one. In the April 2009 issue, Atomic gives us a chance to take a look behind the scenes. Enjoy this interview!

NUnit 2.5 Release Candidate now available

•April 28, 2009 • Leave a Comment

The NUnit 2.5 release candidate is now available at http://nunit.org/?p=download.

NUnit 2.5 is a very big release, so you’ll have to read the release notes at http://nunit.org/?p=releaseNotes&r=2.5 for the full story. But here are ten reasons to give it a try…

  1. Parameterized (data-driven) tests are supported, with features similar to those found in mbUnit and xUnit.net.
  2. Theories – as used in JUnit- are supported fully, including support for Assume.That.
  3. New attributes allow the specifying the thread and apartment state requirements of a test.
  4. Exception handling can now be moved into the test code using Assert.Throws or the Throws.Exception syntax.
  5. Test methods and fixtures may now be generic and many asserts and constraint expressions now support generic syntax.
  6. Many constraints now permit substitution of a user-defined comparison algorithm through the Using modifier. Lambda expressions are supported.
  7. Test execution may now take place in a separate process for better isolation.
  8. Tests may be loaded and executed using a selected runtime version.
  9. Tests, setup methods, teardown methods and data sources may be static if desired. If there are no instance methods, then NUnit doesn’t need to construct your test class.
  10. Source code is displayed in the gui, where available.

See http://nunit.org for more info.

UPDATE: Charlie Poole posted an explanation of each point on his blog.

Playing for change

•February 28, 2009 • Leave a Comment

From the award-winning documentary, “Playing For Change: Peace Through Music“, comes the first of many songs being released independently and played by musicians around the world adding their part to the song as it travelled the globe.

Stand by me

One love

Don’t worry

20 cynical project management tips

•February 28, 2009 • Leave a Comment

Not sure if we should laugh or be sad that they are often true.

http://blogs.zdnet.com/projectfailures/?p=2024

Wide integration gap when migrating to Google Apps

•February 8, 2009 • Leave a Comment

I am currently in the process of moving all my stuff over to a Google App, but as I do so, it has become clear that there is a wide gap in the integration between personal apps (mail, sites, docs, calendar, etc.) and their profesional version (either Standard or Premier edition).

There is no way to import an existing Google Site, synching calendars has some issues, and the options for moving mail from an account to another are way too basic if you are not using Education or Premier Edition. The Mail Fetcher will not import labels. Finally, there is currently no way to import chat history at the moment, except by forwarding them one by one (I have hundreds…).

So the best option for synching calendards, assuming you will not use the old one, seems to be to export the old one into a .ICS file and then import that file back into the new one, thus bypassing the sync tool entirely.

For transfering emails, the best way I found out is to use IMAP and a synching tool or script. For the record, I have successfully used the following Ruby script over my 25,000+ emails (from this post):

#!/usr/bin/env ruby
require 'net/imap'

# Source server connection info.
SOURCE_HOST = 'mail.example.com'
SOURCE_PORT = 993
SOURCE_SSL  = true
SOURCE_USER = 'username'
SOURCE_PASS = 'password'

# Destination server connection info.
DEST_HOST = 'imap.gmail.com'
DEST_PORT = 993
DEST_SSL  = true
DEST_USER = 'user@gmail.com'
DEST_PASS = 'password'

UID_BLOCK_SIZE = 1024 # max number of messages to select at once

# Mapping of source folders to destination folders. The key is the name of the
# folder on the source server, the value is the name on the destination server.
# Any folder not specified here will be ignored. If a destination folder does
# not exist, it will be created.
FOLDERS = {
  'INBOX' => 'INBOX',
  #'sourcefolder' => 'gmailfolder'
}

# Utility methods.
def dd(message)
   puts "[#{DEST_HOST}] #{message}"
end

def ds(message)
   puts "[#{SOURCE_HOST}] #{message}"
end

def uid_fetch_block(server, uids, *args)
  pos = 0
  while pos < uids.size
    server.uid_fetch(uids[pos, UID_BLOCK_SIZE], *args).each { |data| yield data }
    pos += UID_BLOCK_SIZE
  end
end

# Connect and log into both servers.
ds 'connecting...'
source = Net::IMAP.new(SOURCE_HOST, SOURCE_PORT, SOURCE_SSL)

ds 'logging in...'
source.login(SOURCE_USER, SOURCE_PASS)

dd 'connecting...'
dest = Net::IMAP.new(DEST_HOST, DEST_PORT, DEST_SSL)

dd 'logging in...'
dest.login(DEST_USER, DEST_PASS)

# Loop through folders and copy messages.
FOLDERS.each do |source_folder, dest_folder|
  # Open source folder in read-only mode.
  begin
    ds "selecting folder '#{source_folder}'..."
    source.examine(source_folder)
  rescue => e
    ds "error: select failed: #{e}"
    next
  end

  # Open (or create) destination folder in read-write mode.
  begin
    dd "selecting folder '#{dest_folder}'..."
    dest.select(dest_folder)
  rescue => e
    begin
      dd "folder not found; creating..."
      dest.create(dest_folder)
      dest.select(dest_folder)
    rescue => ee
      dd "error: could not create folder: #{e}"
      next
    end
  end

  # Build a lookup hash of all message ids present in the destination folder.
  dest_info = {}

  dd 'analyzing existing messages...'
  uids = dest.uid_search(['ALL'])
  dd "found #{uids.length} messages"
  if uids.length > 0
    uid_fetch_block(dest, uids, ['ENVELOPE']) do |data|
      dest_info[data.attr['ENVELOPE'].message_id] = true
    end
  end

  # Loop through all messages in the source folder.
  uids = source.uid_search(['ALL'])
  ds "found #{uids.length} messages"
  if uids.length > 0
    uid_fetch_block(source, uids, ['ENVELOPE']) do |data|
      mid = data.attr['ENVELOPE'].message_id

      # If this message is already in the destination folder, skip it.
      next if dest_info[mid]

      # Download the full message body from the source folder.
      ds "downloading message #{mid}..."
      msg = source.uid_fetch(data.attr['UID'], ['RFC822', 'FLAGS',
          'INTERNALDATE']).first

      # Append the message to the destination folder, preserving flags and
      # internal timestamp.
      dd "storing message #{mid}..."
      success = false
      begin
        dest.append(dest_folder, msg.attr['RFC822'], msg.attr['FLAGS'], msg.attr['INTERNALDATE'])
        success = true
      rescue Net::IMAP::NoResponseError => e
        puts "Got exception: #{e.message}. Retrying..."
        sleep 1
      end until success

      dest.append(dest_folder, msg.attr['RFC822'], msg.attr['FLAGS'],
          msg.attr['INTERNALDATE'])
    end
  end

  source.close
  dest.close
end

puts 'done'

Yes We Can

•January 20, 2009 • Leave a Comment

From Barack Obama’s Inaugural Address:

“On this day, we come to proclaim an end to the petty grievances and false promises, the recriminations and worn-out dogmas that for far too long have strangled our politics.”

“And those of us who manage the public’s knowledge will be held to account, to spend wisely, reform bad habits, and do our business in the light of day, because only then can we restore the vital trust between a people and their government.”

“But this crisis has reminded us that without a watchful eye, the market can spin out of control. The nation cannot prosper long when it favors only the prosperous.”

“[...] our power alone cannot protect us, nor does it entitle us to do as we please. Instead, they knew that our power grows through its prudent use. Our security emanates from the justness of our cause; the force of our example; the tempering qualities of humility and restraint.”

“We will not apologize for our way of life nor will we waver in its defense.”

“To those leaders around the globe who seek to sow conflict or blame their society’s ills on the West, know that your people will judge you on what you can build, not what you destroy.”

“What is required of us now is a new era of responsibility [...]“