October 2006

Cheers!

Sun 29 October 2006, ,

Yesterday night, a friend of mine and I discussed how to know how many glasses are touching each other when you says “Cheers!” before drinking.

It’s a simple combinaison written like that like you learn it at school. p is 2 and n is the number of friends you have (you included).

combinaison of 2 in n

But for this simple example where p is set to 2, this big equation with lots of ! inside it, can be written like a sum.

sum from 1 to n minus 1

But a sum isn’t very friendly to a computer. It’s not bad but you can do this better. My solution abuse of the modulo function.

a simple calc for computer

It’s probably clearer in Python.

cheers = lambda x: (x/2) * (x-(x+1)%2)

You’ll discover some cool things like :

10 → 45
100 → 4950
1,000 → 499,500
1,0000 → 49,995,000

or

20 → 190
200 → 19,900
2,000 → 1,999,000
2,0000 → 199,990,000

Have fun!

Hier soir, en rentrant de soirée nous est venu la question du nombre de fois que deux verres font se toucher en fonction du nombre de personnes qu’il y a autour de la table. Ce sont des mathématiques dites simples où il est question de dénombrement. Ici, nous intéresse le nombre de combinaisons de 2 (p) dans une population de n. Qui s’écrit :

combinaisons de p dans n

Tout ceci peut revient à faire la somme de 1 à n-1 (comme p vaut 2) :

somme des x de 1 à n moins 1

Une fois de plus, ce n’est pas un calcul très convivial pour une machine étant donné que la complexité est de l’ordre de O(n2). Il y a de quoi faire plus simple, j’ai trouvé ça sous ma douche ce matin donc, il y a certainement mieux encore.

le nombre pair le plus proche de n divisé par 2,    fois le nombre impair le plus proche de n

Qui revient à dire : le nombre pair le plus proche de n divisé par 2, fois le nombre impair le plus proche de n. En Python (notez la division entière) :

cheers = lambda x: (x/2) * (x-(x+1)%2)

En jouant avec cette fonction, il y a des valeurs intéressantes qui peuvent sortir.

Digg it!, so del.icio.us, blogmarks, reddit.

A server for your projects

Sun 22 October 2006, , , , ,

At my work, we just installed a development server that will host the demo of the work of the web developers. I’ll explain here how I managed to do that.

First of all, install your box. I choose Ubuntu server my employer loves everything that is trendy. If I prefer Gentoo, Ubuntu is probably more convenient for most users.

The power of Ubuntu Server is that you can directly install a LAMP server. Here we’ll need some extra packages for Trac and Subversion.

sudo apt-get install trac libapache2-svn libapache2-mod-python

The idea is to have for a project a virtual host, a Subversion repository and a Trac.

I’ve choose this directory structure:

~/projects/
   .htpasswd        (Password file)
   project_name/
      apache.conf   (Apache configuration file)
      log/          (Apache logs)
      svn/          (Subversion repository)
      trac/         (Trac)
      www/          (VirtualHost document root)
		

For the better flexibility and don’t deal with a DNS server. Every project will be mapped on a port.

Here is a Python script that will create for you this structure.

All you need is to create the directory projects and .htpasswd in it, then run :

python create_project.py project_name port

An example:

  1. Create your project called “test” and mapped on the port 8000.

    python create_project.py test 8000
  2. Install it in Apache.

    sudo ln -s /home/`whoami`/projects/test/apache.conf /etc/apache2/sites-enabled/test
  3. Restart Apache to see the change

    sudo /etc/init.d/apache2 restart
  4. Open you browser and visit:

    • http://your-server-ip:8000/
    • http://your-server-ip/svn/test/
    • http://your-server-ip/trac/test/

For a very convenient server, I suggest you to use ssh for everybody. They just have to give you their public key, you add it into .ssh/authorized_keys and then they can log in safely for SCP, SFTP (need to configure the FTP server) or remote control.

Feel free to give me feedback about your experience, this script is in a early stage of development use it at your own risk.

Au boulot, il a été mis en place un serveur de test qui a pour objectif de permettre de faire des démonstrations aux clients de manière simple et également de centraliser les informations. Ce qui est toujours utile lorsqu’on travaille en équipe (de plus de une personne).

Ci-dessous, vous trouvez un descriptif de comment, je m’y suis pris pour mettre un place un serveur basé sur Ubuntu server et fournissant pour chaque projet :

un accès web de démonstration sur un port choisit ;
http://votre-serveur:port/
un répertoire Subversion ;
http://votre-serveur/svn/nom_du_projet/
un gestionnaire de projet Trac.
http://votre-serveur/trac/nom_du_projet/

Un script Python permet l’automatisation de la création des projets.

Cet outil est pour l’instant à un état très jeune, je vous invite à me faire un retour de votre expérience. Et sachez, que vous l’utilisez à vos risques et périls.

Digg it!, so del.icio.us, blogmarks, reddit.

Simple Web Application Unit Testing

Sun 15 October 2006, ,

After having discovered that PHP sucks less than JavaScript reading the feedback of the last WebTuesday (I’ll need to go there one day, a Tuesday maybe). Harry mentioned in his presentation Selenium a powerful tool for doing Web Application Unit Testing. Sounds great! Let’s dive!

  1. Download it: Selenium Remote Control

  2. Unzip it and go in.

  3. Run the server (Java is required).

    cd server/
    java -jar selenium-server.jar -interactive
  4. We’ll try it with Python but Selenium support lots of cool languages like Ruby, Perl, Java and .Net (try Mono).

    In an other shell go into the selenium directory and then into the python dir.

    Simply run:

    python test_google.py

    Rocks? Fails? For myself, it fails with firefox but I manage to run it with Opera.

  5. Too Fast? Let’s try it into the Python shell. From the python directory run:

    python

    Woo! I hope you already done that before, you may love it.

    from selenium import selenium
    sel = selenium('localhost', 4444, '*opera', 'http://www.google.ch')
    sel.start()

    Wait a second, it runs Opera for you.

    sel.open('http://www.google.ch')
    sel.type('q', 'Yoan Blanc')
    sel.click('btnG')
    print sel.get_title()

    It normally displays: “u'Yoan Blanc - Recherche Google'”. Now you can quit.

    sel.stop()

    Hit Ctrl+D to quit the Python shell

Selenium will become your next new friend (after Firebug of course) for testing your web application.

Ayant fait la lecture du compte-rendu du dernier Webtuesday (un évènement zurichois des bons développeurs du coin), j’ai pu découvrir dans la présentation de Harry sur JavaScript un nouveau nom et outil, nommé Selenium. Cet outil permet de piloter un navigateur web dans un langage de script tel que Python, Ruby, Perl ou via Java et même via le framework .NET (Mono pour les linuxiens).

L’objectif premier est la création de tests unitaires qui permettent de faire des tests de régression sur son application web. Une méthode déjà fortement (bien que pas assez) répandue dans le milieu des framework, bibliothèques, applications serveur, applications desktop.

Ce genre de tests permettent de tester l’intégrité d’une application. Qu’une chose ayant fonctionné, fonctionne toujours comme initialement conçu. Certains vont même plus loin en disant qu’il faudrait écrire les tests avant de réaliser l’application. Un concept certainement accessible dans le cadre de bibliothèques ou API mais difficilement dans un application web sauf si celle-ci fournit un API REST.

À vos tests !

Digg it!, so del.icio.us, blogmarks, reddit.

Python hierachy

Tue 10 October 2006, , ,

A friend of mine, who loves C# and gonna play with Python, asked me about the file hierarchy of the pythonic module/package. For every Java or C# users it’s a bit different.

In the beautiful world of Java, a file is a class. Everything is clean and at it’s own place. The file hierarchy reflects the package hierachy. It can be the jungle in the directories.

package/Foo.java      import package
package/bar/Bar.java  import package.bar
		

With C#, which is very (very) similar to Java, the one class per file is the usual way to do, but you aren’t forced to. And the hierarchy is also the namespace hierarchy (or not). In the example bellow the both files can be in completely different namespace, strange isn’t it?

package/file.cs     using Package
package/file2.cs    using Package.Foo.Bar

With Python, it’s much more fun because a directory is a package if it contains a __init__.py file. You can use this packages with use directory. .py files in it are modules, you can use them with use directory.file (without the extention). A module (a file) can contains lots of variables, functions and classes. For every Java/C# coder it’s very messy.

package/__init__.py     use package
package/module.py       use package.module
package/foo/__init__.py use package.foo
package/foo/bar.py      use package.foo.bar

I don’t think this is messy, this is flexible. You can arrange thing exactly how you will use them.

I’ve written a very messy implementation of the State Pattern in both C# and Python just for the fun. C# is full of public, private, abstract, override... but in Python you need (if you want) to check the type of the data you receive. (I definitely love Python but, you can do a very similar job in both languages). Oh, there is no documentation because it’s very basic (google around about this design pattern if you want).

For the curious, I’ll stay in Switzerland for a while. The Dublin offices will not hire me (for the moment, keep believing).

Un pote m’a questionné à propos de la hiérarchie qui est utilisée par Python dans un projet. C’est une personne qui va sortir de l’école donc Java (triste sort) et un peu de C# par passion. Et quand on doit s’attaquer à un projet de taille respectable, venant de ces mondes là, Python peut perturber.

En Java, un fichier est une classe (quand tout va bien et qu’on respecte une certaine propreté). Ça peut juste devenir un beau bordel dès qu’un projet grossit un peu trop.

En C#, les choses sont assez semblables à Java, sauf que les choses sont un peu plus souples et qu’il est possible que la structure fichier ne colle pas à la structre du namespace.

Finalement en Python, un dossier est un paquetage et un fichier .py un module qui peut contenir moulte variables, fonctions, classes. Il est également possible de mettre tout un tas de truc dans un paquetage via le fichier __init__.py qui définit le paquetage.

En passant, le design pattern : State pattern écrit en C# et en Python. Très simple et qui peut s’avérer utile.

Pour les curieux, je reste en Suisse et vais m’installer sur Lausanne.

Digg it!, so del.icio.us, blogmarks, reddit.

Get your OpenID, simply

Sat 07 October 2006

OpenID is a tool that allow you to login into several web applications with the same login. A light-weight decentralized authentication system.

If you can have one like me at my OpenID, you can also have your own, like, for example http://yoan.dosimple.ch/. What a nice idea.

Scott Kevton gives in his blog a status of the OpenID Bounty Program that support softwares like (PhpBB, MediaWiki, ...) to implement that feature.

La blogosphère et les autres s’agitent autour de OpenID, un système d’authentification décentralisé. Il permet de s’inscrire, à un forum par exemple, avec son ID personnelle, comme on peut par exemple le faire pour les services Google ou Yahoo (pour ne citer qu’eux). Il faut bien sûr que le système le supporte. Donc fini les mots de passes différents et la crainte d’avoir affaire à un site qui ne respecterait pas la confidentialité des mots de passe données.

J’ai obtenu grâce au service my OpenID mon ID. Super! Bon à quoi ça sert ? Scott Kevton nous donne dans son blog un aperçu de l’état des lieux du support de ce système avec par exemple PhpBB, Mediawiki (utilisé par Wikipédia), ...

Digg it!, so del.icio.us, blogmarks, reddit.

Thank you for (not) smoking

Fri 06 October 2006

Yesterday in the evening, I’ve watched a very interesting movie that will make you feel very powerless if you imagine having a talk with this kind of guy.

photo of 'Thank you for smoking (2005)'

“Don’t forget, I’m his father. You’re just the guy who fucks his mom.”

Oct 6, 2006 by Yoan Blanc

★★★★☆ A lesson of dignity in the hard world of a Tobacco Industry’s spokesman. The purpose of the movie isn’t tobacco but how a man can stand on his feet whatever he does. Having the right words for every situation and teaching it to his son. Be very careful to what what you ear, you read and always know what other people want.

A nice movie with a... moral flexibility.

Hier, petite séance cinématographique avec le film « Thank you for smoking », un film tendre d’un père divorcé, Nick Naylor, porte-parole d’une grande firme de tabac et n’ayant que deux amis, eux-mêmes porte-paroles des lobbies des armes et de l’alcool. Il va, dans sa volonté de toujours prendre le dessus, y laisser des plumes.

Voici l’extrait d’un dialogue lorsqu’il va rendre visite à la classe de son fils.

une fille :
Ma mère fumait avant, elle dit que les cigarettes tuent.
Nick Naylor :
Ah oui, est-ce que ta maman est médecin ?
la fille :
Non.
Nick Naylor :
Scientifique ? Elle travaille dans la recherche ?
la fille :
Non.
Nick Naylor :
Donc elle n’est pas experte dans ce domaine, si ?
[Silence] Oh, ce n’est pas grave, c’est bien d’écouter sa maman, c’est bien d’écouter ses parents.

Il y a toujours un point de vue, un angle mort, où il est possible de dire, faire dire à peu près ce que l’on a envie. À visionner sans modération.

Digg it!, so del.icio.us, blogmarks, reddit.

I’ll not fix any computer for money anymore

Thu 05 October 2006,

I hate that (fixing computer) and I know why, but I’m sometimes too gentle to refuse. Just because when you start, you never end. Always a phone call asking you to help them.

This time it’s for wifi troubles: installing a wifi access point or fixing another one. If people pay me, I’m doing that for the money not for my pleasure of helping a friend. And here is the main problem.

I’m doing things for my pleasure, it’s sometimes my pleasure to help, or giving some hints that can help people but I think that one day boys-and-girls-with-computer(s)-at-home need to care a little about how all this world works.

By fixing bugs you learns a lot! I learned a lot of things by running an unstable gentoo box. Once a month it breaks and you need to browse the bugzilla, forums, chat on IRC and so one. Just do thing by yourself.

Aller chez les gens pour réparer leurs problèmes informatiques est une activité que je haïs par dessus tout. Car quand on commence on ne sait jamais quand on va s’arrêter. Un problème résolu en amène un autre. Et quand on pense se sentir enfin libéré, le téléphone sonne pour demander de l’aide. Argh !

Ses derniers temps j’ai accepté de m’occuper de réseaux wifi : installation d’un Access Point ou réparation d’un système défectueux...

Le problème ce n’est pas que je n’aime pas faire ça, je n’aime pas être payé pour ça. J’aime aider quand j’en ai envie, donner des astuces à qui en a besoin. Quelqu’un qui pait espère au miracle, là commencent les ennuis. Aider quelqu’un pour le plaisir implique que cette personne est intéressée et qu’elle a déjà cherché une solution.

Bon je file de ce pas chez quelqu’un... À 18h., ça pue grave !

Digg it!, so del.icio.us, blogmarks, reddit.

Back from Dublin, some pictures

Wed 04 October 2006, ,

I’m back from a little two-days trip over Dublin (mostly for a job). Show the Pictures I’ve made.

I’va nothing to say at the moment because I’m waiting for a feedback. Keep waiting (and believing)!

De retour d’un petit séjour de deux à Dublin (Irelande), je vous laisse visionner les quelques photos que j’ai fait. Sinon, je n’ai malheureusement ni bonne ni mauvaise nouvelle à annoncer pour le moment.

Digg it!, so del.icio.us, blogmarks, reddit.