XD blog

blog page

~technical


2013-05-09 Créer un site web en Python : Flask ou Django ou Pelican

Django est le framwork le plus connu quand il s'agit de créer un site web en Python. Le projet a démarré il y a plusieurs années (2005), il est robuste et il est maintenu. En contre partie, le coût d'entrée est assez lourd.

Récemment, j'ai découvert Flask qui est plus léger et suffit largement lorsqu'on veut construire un site internet à usage interne. Il nécessite l'installation des modules JinJa (disponible pour Python 3) et Werkzeug (non disponible pour Python 3). L'installation de ces modules se fait simplement avec pip (pip install <module>, voir article 2013-05-10 : Installer un package simplement avec Python : pip).

Pour démarrer avec Flash, il suffit de lire la page suivante : Introduction à Flask. Le code d'un service web hello world :

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Bonjour !"

if __name__ == "__main__":
    app.run()
Qu'on lance de cette façon :
$ python hello.py
 * Running on http://localhost:5000/
Si j'avais su, j'aurais probablement créé ce blog de cette façon en m'appuyant sur cet exemple. Flask permet l'utilisation d'une base de données de type SQLlite. Différentes configurations sont disponibles ici pour interacer Flask avec Heroku, MongoDB, CouchDB, OpenID...

Pour ceux qui souhaitent créer un blog en Python (et avec Python 2.7 ou 3), il existe aussi le package pelican. Il dépend des packages, feedgenerator, pygments, docutils, pytz, blinker, unidecode, six, automatiquement installé avec pip (pip install pelican).

Vous trouverez d'autres ressources pour créer un site sur ce blog : ScopArt.

2013-05-08 PCA, eigen values and numerical approximation

High dimensional data do not behave very well with linear computation, especially when coefficients are very different in order of magnitude.

Yesterday, I was playing with some observations trying to do a PCA. Usually, we do not look at very small eigen values because they do not explain the variance of the observations set. However, I was surprised to find negative values. My observations were described with 29 variables, let's denote them as a centered matrix X. Computing a PCA means extracting the eigen values of the covariance matrix: X'X / N (N is the number of centered observations). This matrix is symmetric so it is diagonalisable and its eigen values are positive or null. However, when I looked at them, the last ones were negative (as the determinant).

Getting negative eigen values for this kind of matrices is necessarily wrong and it is due to numerical approximations. To observe that, I computed the eigen values for the series of submatrices X'X [1:n,1:n]. I also compared the eigen values to the one I could get from the Jacobi algorithm. This algorithm cannot converge to a matrix having negative values on the diagonal (when the matrix is a covariance matrix). You can see the results below.


more...

2013-05-06 Quelques références

Python XY est une compilation de modules Python utilisés pour le calcul scientifique. Il inclut également un environnement qui ressemble à Matlab où R studio. Je n'ai pas vraiment réussi à l'installer sans casse la dernière fois que j'ai essayé et il n'est pas disponible en version 3. La liste des modules est intéressante. On y trouve un module tel que swapy qui permet d'automatiser des clicks sur des applications Windows, pyMC pour faire de l'inférence bayésienne ou encore WinMerge un outil pour comparer des fichiers ou des arborescences de fichiers.

Le format de documentation (ReStructuredText) développé pour Sphinx est directement intégré à GitHub qui recueille de plus en plus de projets open source. Le livre Probabilistic Programming and Bayesian Methods for Hackers est écrit avec ce format et il s'affiche directement depuis GitHub.

Dans un autre ordre d'idées, lorsqu'on développe et qu'on veut tester l'installation d'un module ou d'avoir des versions différentes de modules, il est possible de créer un environnement virtuel avec VirtuelEnv. Pour déployer un site web avec un push sur GitHub, on peut utiliser Heroku qui prend en charge des tests basiques et le déploiement.

Enfin, JCDecaux a rendu certaines données temps réel publiques données vélib. On peut télécharger au moyen d'une interface des données sur la présence ou l'absence de vélos à toutes les stations à n'importe quelle heure.

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-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.

2013-03-30 Python, R, MOOC, Big Data, quelques références

A chaque fois qu'on change de distribution Python, il faut réinstaller les modules dont on se sert et aussi ceux dont on se sert parfois et dont on découvre qu'ils ne sont pas toujours maintenus à jour. Le module Rpy2 permet de lancer des scripts R depuis l'interpréteur Python. Il permet également d'accéder à certains objets puisque l'espace de travail reste ouvert et garde la mémoire de ce qui a été fait. J'essaye de l'installer, ce que je n'ai pas encore réussi à faire avec la version 3 de Python, et ce faisant, je suis tombé sur le module RPython qui permet de faire exactement l'inverse, c'est-à-dire d'exécuter du code Python depuis R.

Je suis beaucoup plus à l'aise avec Python dès qu'il s'agit de faire les choses les plus ennuyeuses (charger des données, réarranger des colonnes, filtrer, appliquer des modifications textuelles...), je vais probablement l'essayer. Mais cela montre que le langage Python est plutôt populaire. La même chose existe avec Excel : le module pyxll permet d'écrire des macros en Python de façon plutôt simple. L'idée est plutôt séduisante, il est plus facile de maintenir un code Python plutôt que de VBA.

L'apprentissage de l'informatique se démocratique en ce sens qu'il devient de plus en plus facile de trouver des cours gratuits et de très bonne qualité. Le site du zéro propose également de nombreux tutoriels sur la plupart des langages informatiques courants. En langue anglaise, il y a code school ou Khan Academy qui dispose de nombreuses vidéos à propos de sujets allant de la programmation à computer science même si dans ce domaine le must est Coursera. L'école Polytechnique a décidé d'y participer : EP. edX est une autre plateforme choisie par Harvard, le MIT. Ces plateformes sont appelées MOOC, le blog suivant un MOOC c'est quoi au juste sera plus disert que moi sur le sujet. Le dernier cité est Udacity. Le premier (Coursera) est probablement le plus riche, on y trouve également des cours d'improvisation musicale.

Chose amusante, peu de cours apparaissent lorsqu'on en cherche un à propos de Big Data. Sans doute cette présentation Big Data, Sorry What Does a Data Scientist Do en donnera quelques raisons (j'ai trouvé cela depuis le blog Freakonometrics).

2013-03-26 L'informatique, une matière moins noble

Quand j'ai soutenu ma thèse, j'ai découvert que mon doctorat m'offrirait moins de portes académiques tout simplement parce celui-ci me désignait comme docteur en informatique et non en mathématiques. Je ne sais pas si c'est toujours le cas mais l'informatique a toujours eu en France un côté moins noble parce que très appliqué. Aujourd'hui, des phénomènes comme Big Data, Data Scientist prennent de l'ampleur et avec eux l'utilisation de l'informatique. Il est pratiquement impossible de se passer des ordinateurs, dès qu'on aborde un sujet un tant soit peu appliqué, il faut savoir coder, ce que j'ai très peu fait dans un cadre scolaire, ce que j'ai beaucoup fait en dehors de l'école et surtout au travail. On peut prétendre que cela s'apprend facilement, que comprendre les maths est plus difficile, et qu'avec un peu de pratique, on saura faire. Il me serait difficile de réfuter ça, c'est comme ça que j'ai appris. Toutefois, c'est un peu comme les gammes au piano, plus on en fait, plus on est à l'aise.

Cette division math/info est beaucoup moins présente dans les pays anglosaxons où les mathématiques appliquées et l'informatique s'appellent computer science. Lors des entretiens d'embauche, il est rare de passer au travers d'exercices de codes. C'est parfois même le premier filtre écrit préalable au premier entretien. Entre quelqu'un que cela ne rebute pas et quelqu'un qui prend la chose de haut, les sociétés n'hésitent pas longtemps. Même s'il est prétendument facile de devenir programmeur, de nombreuses compagnies ont tendance à rejeter des candidats qui n'ont jamais beaucoup programmé si c'est un élément important du poste à pourvoir.

Les smartphones sont aussi de petits ordinateurs programmables. Il est probable que d'autres objets du quotidien gagneront en complexité et deviendront à leur tour pilotables à l'aide un langage de programmation. Je pense que c'est un outil dont il faudrait commencer l'apprentissage plus tôt. Il en serait moins rébarbatif et, accessoirement, n'en limiterait plus l'usage aux seuls geeks. C'est d'ailleurs le cas dans certains pays de l'est comme la Roumanie. Maîtriser la programmation pourrait faire gagner beaucoup de temps à quiconque se sert d'Excel au quotidien.

Lorsqu'on doit pondre un algorithme qui doit tourner en production 24h sur 24, savoir coder est très important. Il peut y avoir des facteurs 10 ou 100 sur le même algorithme programmé de façon plus ou moins efficace. Savoir programmer n'est pas tout, il est utile d'apprendre les tournures de phrases les plus fréquentes, d'acquérir une sorte de culture générale du domaine, savoir ce que sont des tableaux, des arbres, savoir quand il est préférable d'utiliser l'un plutôt que l'autre, savoir pourquoi quand on divise un problème en deux, on passe d'un coût en O(n) à un coût en O(ln(n)), comprendre pourquoi il vaut mieux utiliser un index lorsqu'on fait une jointure sur deux tables SQL...

En ce qui concerne l'informatique, j'ai quasiment tout appris en pratiquant, parce que terminer un programme signifie aussi l'avoir compris. La pratique permet aussi de comprendre qu'il existe rarement un programme optimal en toute circonstance et qu'on choisira une façon de coder plutôt qu'une autre en fonction du volume, de la nature des données qu'on manipule. De ce fait, beaucoup de programmes sont une compilation complexe de recettes simples. On s'aperçoit aussi parfois qu'on retrouve le même algorithme sous différents visages, plus court chemin dans un graphe de Djikstra, distance d'édition de Levenstein, séquence la plus probable de Viterbi.

Je manipule tellement de données qu'en regarder quelques-unes ne suffit plus à donner une vue d'ensemble. Il faut sans cesse agrégrer, classifier, régresser. Ce travail est quasiment impossible si on ne sait pas programmer. Cette culture algorithmique me permet bien souvent d'aller plus vite, d'obtenir les mêmes résultats en un temps moindre avec, parfois, une certaine élégance.

Pour finir, je conseille l'écoute d'une émission de radio que j'ai découverte après avoir écrit ceci : L'éloge du savoir, Algorithmes, machines et langages (entretien avec Gérard Berry) L'informatique est train de changer la façon d'organiser nos vies et il est mal enseigné aujourd'hui et surtout trop tard. Que sera notre monde dans les prochaines années (et non les prochaines décennies) ? Nos dirigeants ne prennent la mesure des changements que l'informatique n'a pas fini d'apporter comme le dit Michelle Volle dans cet article : Pour comprendre l'iconomie.

2013-03-21 Palindromes

Aujourd'hui, je suis tombé sur cette vidéo sur le site du Monde qui parlait des palindromes (nombres ou mots qui ont la même signification qu'on les lise de gauche à droite ou de droite à gauche). A la fin de la question, Cédric Villani pose deux questions :

Les deux questions ne sont pas très difficiles mais pour la seconde, la réponse est presque toujours 11. Voici le résultat de la première si n est le nombre de chiffres :

 9 * 10^{\left[\frac{n}{2}\right]-1} * 10^{(n \mod 2)}

La partie entre crochets désigne la partie entière de la division de n par 2. Le 11 est surprenant. Au début, je me suis dit qu'il suffisait de changer les deux chiffres les plus proches du milieu et de fil en aiguille, on pense au fait que 1 et 0,999999999999, c'est quasiment la même chose et qu'il devrait y moyen d'appliquer ça ici. Rapide calcul de tête : 11. Facile de démontrer que ce n'est pas plus grand quand on comprend quels palidromes choisir (voir plus bas). Pour démontrer que ce n'est pas plus petit, il suffit de démontrer que cela ne peut être ni 1, ni 2, ni 3, ..., ni 10 excepté pour les palindromes à trois chiffres.

2  - py  9  theo  9  - ecart (11, '**', 11, '-->', 22)
3  - py  90  theo  90  - ecart (10, '**', 101, '-->', 111)
4  - py  90  theo  90  - ecart (11, '**', 1991, '-->', 2002)
5  - py  900  theo  900  - ecart (11, '**', 19991, '-->', 20002)
6  - py  900  theo  900  - ecart (11, '**', 199991, '-->', 200002)
7  - py  9000  theo  9000  - ecart (11, '**', 1999991, '-->', 2000002)

J'ai écrit un rapide programme en Python palindrome.py pour produire la liste ci-dessus qui m'a permis de me souvenir que Python 3 fait des divisions réelles par défaut au lieu de division entière pour Python 2. Vous pourrez voir la réponse filmée du mathématicien ici.

En cherchant un peu sur le net, on découvre qu'on s'est intéressé à beaucoup de problèmes autour des palindromes. Travaillant pour un moteur de recherche, ce qui m'intrigue, c'est de savoir si on peut relier la difficulté de l'exercice au nombre de réponses reçues par le journal.

2013-03-16 Create Anime Gif in Python

Creating an animated gif does not seem to be an easy task. Some people recommend to use the library PIL which is not maintained anymore and does not work on Python 3 according to the website. Some others prefer to use PyGame to animate the gif themselves (see this post, it contains some simple examples on how to do it). Some others recommend to use ImageMagick (see this post or this one).

I tried the solution using ImageMagick. It should be working as it is. You will need too files (you just have to copy paste them in a folder, keep the same name)

The second one calls the first to make the example works. It downloads ImageMagick and process your files following the instructions introduced in the blogs post linked above.

2013-03-14 Migration to Python 3, only for geeks!

I tried to migrate some of the script I wrote and to use Python 3. I just cut half of what I wrote. Too painful at the end, The print change, ok, iteritems into items, ok, not unicode object anymore, I do like, no cmp parameter for sort, just key, ok again, the integer division, definitively not ok. 1/2 is 0 in many languages except Python. No script can fix because Python is interpreted and discovered types during the execution. The following loop is just longer than expected and hard to catch using unit testing if you do not specifically look for it.

i = 10
while i > 0 :
    i /= 10
The rule to import files changed too, not too bad except it is really difficult to migrate every file or to keep everything working for two versions of Python (2.7 and 3.x). After finishing all the replacements, I had many failing unit tests, I started to fix them one by one but at the end, I gave up. Having an empty list instead of a list with one element, more than one thousand lines of code involved, I gave up, too many side effect I cannot easily guess, easier to rewrite. On the other hand, the C library went easy (using boost really helped).

I wonder how a company could impose such a change to its customers by introducing big breaks without having difficulties to keep them. The language is probably in a better shape now but I think it was too sudden. I wish there could be a tool allowing a program to run at the same on both versions and throwing exception whenever a variable contains a different results (not very easy to write if you generate random variables or if you have dependencies on others libraries which changed their behavior).


<-- -->

Xavier Dupré