XD blog

blog page

2013-04


2013-04-30 Règles de priorité en Python

A force de coder avec un langage de script qui autorise presque tout, on devient paresseux. On perd du temps pour finalement redécouvrir quelques règles de priorité. J'ai écrit la fonction f1 en pensant qu'elle se comporterait comme la fonction f2.

def f1 (b) : return 1,1 if b else 0,0
def f2 (b) : return (1,1) if b else (0,0)

print ("f1", f1(False), "f2", f2(False))  # f1 (1, 0, 0) f2 (0, 0)
print ("f1", f1(True),  "f2", f2(True))   # f1 (1, 1, 0) f2 (1, 1)
On omet les parenthèses la plupart du temps en ce qui concerne les tuples en Python. Ces conversions implicites ont quelques effets secondaires. Je tâcherai de m'en souvenir.

2013-04-28 Migration of old code

I wanted to use some old code I wrote a while ago about training neural networks but I needed to migrate it under a new version of Python and a new version of the compiler. I assumed that migrating my old code would not be too painful but it cost me day. I don't know if there is a good way to maintain some personal toolbox only used only from time to time. A single framework with a single way to add new features. But it is not very convenient with the multiplication of languages and the maintenane of unused old code. A framework which allows any kind of language but gluing projects with a script language (Python?): the issue with this one is you end up write multiple times the same basic functionalities (parsing text...) So far, my memory and the unit test I wrote were the best help to migrate my old code. It turned out I was able to produce a running version of old stuff here.

When I started that, my main issue was, as a teacher, to check if every piece of code I wrote for my students was still running. I also wanted to check which one would work on Python 3 (it was made on Python 2.6). I decided to come up with a solution allowing me to unit test them. I started to plug the biggest scripts and the new one. But what about the code embbeded in a latex file... I would surely do different now.

However, while doing that, I discover that non-ascii characters (latin) are now difficult to handle while writing a C++ extension for Python. They need to be translated into unicode string. I preferred to remove any French accent from my old code (in the documentation specified in boost::python::def) instead of finding a way to keep them. It will be for the next project.

2013-04-24 Python et GPU

Le processeur GPU permet de paralléliser certains calculs comme la génération de nombres aléatoires pour des apprentissages bayésiens ou des simulation de Monte-Carlo. Sous Python, le module pyCUDA (pypy) permet de paralléliser les calculs. Le code GPU - CUDA est transmis sous forme de chaîne de caractères, il est écrit en C++ et nécessite l'utilisation de numpy. Je n'ai pas encore testé l'installation mais l'ensemble a l'air assez simple avec un coût d'entrée raisonnable.

2013-04-14 La dimension créative du métier de développeur

Je suis tombé sur cette vidéo What most schools don't teach (depuis Le Figaro Etudiant) qui incite les jeunes à choisir le métier de développeur. D'après cet autre article Ces métiers dont personnes ne veut, cette voie n'a pas les faveurs des étudiants. La vidéo présente un métier incontournable, présent partout depuis la table de mixage jusqu'à la voiture. On y voit des hommes et des femmes parler de ce métier et de tout ce que les sociétés font pour attirer les talents (cantine bio, cadre de travail design, salle de repos...), de l'intérêt qu'ils portent à leur travail, du fait que ce travail est bien rémunéré. Bill Gates est interviewé par CNN à ce sujet. Le patron de Facebook milite aussi pour que les Etats-Unis assouplissent les règles d'immigration pour pouvoir recruter des ingénieurs que l'éducation américaine n'arrive pas à fournir (Courrier International). Il a monté un lobby pour influencer les politiques.

Cette réalité est sans doute quelque peu édulcorée, la proportion de femmes travaillant dans l'informatique est toujours très faible, passer un temps conséquent devant un écran ne favorise pas les échanges. Le fait est que ce métier est en grande partie abstrait. Les applications informatiques ont la plupart du temps une interface concrète mais à l'intérieur, les milliers de lignes de code le sont beaucoup moins. Je me dis que parfois se promener dans ces montagnes de symboles revient à joueur une partie d'échec en aveugle.

Beaucoup d'ordinateurs utilisent Linux aujourd'hui. Son créateur s'est inspiré d'Unix inventé en 1969. Il s'est écoulé 40 ans depuis et c'est un assemblage gigantesque de morceaux de codes de tous âges. Il y a probablement plus de personnes qui ont contribué à Linux que de travailleurs ayant posé une pierres sur la Cathédrale Notre-Dame. Une drôle d'aventure.

De mon point de vue, on oublie souvent la partie créative de ce métier. Il ne consiste pas simplement à envoyer des instructions à une machine pour qu'elle exécute plus rapidement ce qu'on faisait manuellement auparavant, c'est aussi imaginer de nouvelles façons d'utiliser des outils existants (comme ici) de créer des algorithmes qui vont chercher de l'information dans un océan de données. Vous ne trouverez pas de manuel pour vous dire comment faire.

2013-04-13 Des légumes en moins de 15 minutes

Et une heure de cuisson. Armé de ma seule recette de ratatouille, cuisiner des légumes prenait du temps. Mon imagination ne déborde pas d'idées avec ces foutus aliments et comme mon quotidien à la cantine se résume à du riz, des haricots verts et un gros chouïa de viande, j'ai du mal à me renouveler. Il doit me rester une pâte feuilletée pour faire une tourte mais je n'ai jamais les trois ingrédients qu'il faut ou jamais avec les bonnes dates de préremption. Bref, la ratatouille, il faut touiller sinon ça colle !

Un soir, j'en ai eu marre des allers retours depuis le salon jusqu'à la cuisine pour vérifier que ça ne collait pas. J'ai fini par mettre les mêmes ingrédients dans un bocal avec de l'huile d'olive, du sel et du poivre, le tout recouvert de papier d'aluminium pour éviter que l'eau s'évapore trop. Au bout d'une heure, ça causait encore, un bout d'une heure et quart, ça fumait bon. J'ai mangé à 23h mais j'ai gardé la recette. Ca laisse tout le temps de prendre l'apéro ou d'essayer de construire un gif animé en Python à partir d'une trentaine d'images. Allez savoir pourquoi, ça avait décidé de ne pas marcher ce soir.


more...

2013-04-06 Installation of module PyMC

Installing a Python module can lead you quite far especially if this one includes some fortran files. That's what happened when I tried to install PyMC. That's what I did for Python 3.3 but it does not mean it is the simplest way.

Then, use Python and try import pymc to see if it worked. After that oue hour I spent gathering all the necessary steps, I forgot why I wanted to do it... Just kidding, Scipy does not exist yet on Python 3.3 and I needed the function normcdf (or cdf).

2013-04-05 Apprendre à coder en Python : illustration

Je suis tombé sur un site très intéressant d'un point de vue pédagogique : PythonTutor. Il permet de représenter visuellement l'exécution pas à pas d'un programme comme celui-ci par exemple qui effectue un tri bulle :

l = [4, 6, 3, -2, 6, 9, 3]
for i in range(0, len(l)) :
    for j in range(0,len(l)-1) :
        if l[j] > l[j+1] :
            a      = l[j+1]
            l[j+1] = l[j]
            l[j]   = a
Le suivant permet de bien visualiser ce que fait Python lorsqu'il interprète une affectation, une copie, un tri :
l = [ [ 0, 1, 2 ], [ 4, 5, 6], [ -1, -2, -3 ] ]
m = l
n = list(l)
n.sort()
L'image qui suit est une copie d'écran du programme dans son état final.


more...

2013-04-04 Coding spirit - which developer are you?

When you work for a big company, you have the opportunity to observe many coding styles and spirits. I will not talk about coding style, it appears mine is not perfect since I never learnt programming in a school but only by myself. I put spaces before semicolon or brackets because it fits the way I write in French. But coding spirit is something else. Some developers goes fast, develop an idea as fast as they can, show it works and...

That's the big question: what happens next? You can continue based on the existing code which is very tempting to avoid losing the momentum of your ideas. Usually, it happens that your development speed decreases as you face issues, bugs, design limitations. The code is most of the time not enough unit tested, it has very small documentation and memory fades away. Code review was not that used and the design did not benefit from too many insights.

Some people might say that you should stop, think again about the whole thing and make it right this time. A good design never fails... I would say design always faces a time when it reaches its limitations just because research moved forward, needs changed. My suggestion is to revisit the code from time to time and not to hesitate holding development just to redesign some parts. A kind of regular code cleaning. It also adresses the goal of not completely losing sight of an old code as you revisit it.

However, the first approach is not bad when you do research. You are only interest in proving an idea is wworking not in maintaining the code which helped to prove it. And it perfectly makes sense... until somebody asks you to continue and develop the new features you promised. You then continue to develop as crazy, show the beginning of the new features. You are successful. My recommendation at this stage of the development: leave the project as it is and be as successful somewhere else. The new team in charge will take some time to fully understand what you did, and will probably decide to make some deep changes which will significantly slow down the software development (at least compare to the previous team).

There are so many ways to develop. But sometimes, I think it is like playing chess, some developers think further. You do not understand why they are playing this move... but it works ten moves later. The only issue is a chess games does not last more than a day when developing game can last many years.


Xavier Dupré