XD blog

blog page


2013-08-18 Manger des sandwitchs à Paris

Les émissions culinaires font de plus en plus envie : La PIZZA. On tombe sur des adresses comme ça : Chez Aline rue de la Roquette à Paris où on a soudainement envie de sandwitch.

Un jour, j'aimerais bien construire une carte de bons restaurants qui quadrille Paris. D'autres adresses : Pierre Sang in Oberkampf, Chez Mamane, Le camion qui fume, Le pantruche, Cantine California, Le Grand Pan.

2013-08-15 L'économie, à quoi ça sert ?

C'est l'histoire que j'aurais voulu entendre avant de commencer mes cours d'économie à l'ENSAE. Elle est tirée du livre Pourquoi les crises reviennent toujours ? de Paul Krugman dont je recommande la lecture. Il est bien écrit et très clair. L'histoire de la coopérative de baby-sitting du Capital Hill (en) sert d'exemple illustratif tout au long du livre. L'économie prend un tout autre sens qu'une liste de modèle macro/micro économiques. Je reprends ici les différents passages du livre qui ont trait à ce petit univers fort passionnant du Capitol Hill. Les derniers paragraphes relatifs à la dépréciation du coupon d'hiver sont fictifs mais ils permettent à l'auteur de transposer la récession économique du Japon des années 1990 dans ce microcosme.

Pendant les années 1970, les Sweeney étaient membres d'une coopérative de baby-sitting : une association constitutée de jeunes couples, travaillant presque tous au Congrès, qui désiraient prendre en charge mutuellement la garde de leurs enfants. Cette coopérative d'un genre particulier avait une taille peu commune, près de cent cinquante couples ; c'est dire le nombre de baby-sitters potentiels, mais aussi la difficulté d'exploitation d'une telle structure - il faut assurer en particulier que chaque couple s'acquitte de sa quote-part.

A l'instar de nombreuses institutions de ce genre (et d'autres formes de troc), la coopérative de Capitol Hill résolut le problème en émettant ses propres titres : des coupons donnant droit au porteur à des heures de baby-sitting. Lorsqu'ils gardaient des bébés, les baby-sitters recevaient un nombre de coupons correspondant au nombre d'enfants. Le système était conçu pour empêcher le resquillage : il assurait automatiquement que chaque couple, en fin de compte, fournirait autant d'heures de baby-sitting qu'il en aurait lui-même utilisé.

Mais ce n'était pas si simple, un tel système requiert la circulation d'une quantité considérable de bons. Les couples disposant de plusieurs soirées libres d'affilée, et sans projet immédiat de sortie, allaient essayer de se constituer des réserves pour les utiliser ultérieurement ; cette accumulation se ferait aux dépens des réserves des autres couples, mais il était probable que chaque couple chercherait à détenir suffisamment de coupons pour sortir plusieurs fois entre les épisodes de baby-sitting qu'il assurerait. L'émission de coupons dans la coopérative de Capitol Hill était compliquée : les couples recevaient des coupons lorsqu'ils adhéraient, ils étaient censés les rembourser lorsqu'ils la quittaient ; mais ces coupons leur servaient également à payer des cotisations pour rémunérer les administrateurs, etc. Les détails ne sont pas importants ; le fait est est qu'il arriva un moment où il y eut trop peu de coupons en circulation - trop peu pour couvrir les besoins de la coopérative.

Le résultat fut surprenant. Les couples qui jugeaient leur réserve de coupons insuffisante se montrèrent plus désireux de faire du baby-sitting et réticents pour sortir. Mais il fallait qu'un couple décide de sortir pour qu'un autre couple puisse faire du baby-sitting. Dans ces conditions, les occasions d'en faire devinrent rares, ce qui rendit les couples encore plus hésitants à utiliser leur réserve, sauf pour des occasions exceptionnelles, attitude qui contribua à raréfier encore davantage les occasions de faire du baby-sitting...

Bref, la coopérative était entrée en récession.


more...

2013-08-14 A propos du titre de certains articles dans la presse

Je ne suis pas sûr que le titre de l'article La lettre de Valls à Hollande qui torpille la réforme Taubira paru dans Le Monde du 13 août soit bien choisi. Il parle d'une lettre d'un ministre à un autre concernant un projet de loi en cours. Le projet est en cours de rédaction et non pas dans sa version définitive. Torpiller un projet en cours d'élaboration me paraît plus être un titre pour arrêter le lecteur qu'un fait avéré. Le projet final sera probablement le résultat de ces échanges. Le moyen de communication choisi est-il la preuve d'un désaccord irréconciliable ? Difficile à dire sans savoir comment ces deux ministres ont l'habitude de communiquer. Personnellement, j'aurais préféré un avis sur les chiffres exposés, leur interprétation et les mesures déduites de ces interprétations. Les deux lettres sont précises mais font aussi référence à des échanges passés. Parfois, une bonne engueulade permet d'avancer plus vite. Pour en revenir aux chiffres, le livre L'industrie de la punition, prison et politique pénale en Occident (Nils Christie) permettrait sans doute de considérer ces chiffres avec un peu plus de recul. On n'est plus prompt à émettre un avis sur deux personnes discutant un sujet technique que d'émettre un avis sur le sujet technique en question.

Voici un autre article dont le titre est la conclusion : In Recessions, Women Seek to Become More Attractive. Tout ça parce qu'on achète plus de ouge à lèvre en temps de crise.

Un autre article mais cette fois-ci, le titre est décrit le fait de départ : Big data : vos données en vente. La conclusion reste prudente quant aux possibles conséquentes de cette pratique. Disons que l'anonymat dans les données n'est pas une notion figée. Un peu comme les algorithmes de cryptage / décryptage, elle est en constante évolution. Ce qui est anonyme aujourd'hui ne le sera probablement plus demain parce qu'on disposera de méthodes statistiques puissantes pour inférer des données personnelles à partir de données agrégées mais aussi parce qu'on sera en mesure de croiser des bases de données anonymisées beaucoup plus facilement.

Pour faire écho à ce qui précède, vous regarderez d'un autre oeil les pouelles à Londres : Londres : des poubelles capables de collecter des données. Et pour finir, collecter des données sera bientôt aussi facile que de poser un autocollant. Plus besoin d'énergie, de câbles... Devices Connect with Borrowed TV Signals, and Need No Power Source

Bientôt peut-être, le passeport le plus envié sera celui que deux enfants obtiennent à la fin de la bande dessinée Beatifica Blues (Griffo) sur lequel on peut lire : I Don't Exist.

2013-08-13 Add your module to pipy

The purpose is to upload your own module to pipy and be able to install using:

pip install module_name

First you must have a login. You can do that by clicking on register on pipy. Then type:

c:\python33\python setup.py sdist register upload
If you add any classifiers, they must be in the following list. Last detail, you are being asked to save your credentials, say yes, otherwise it fails.

2013-08-12 Exceptions in Python

when raising an exception, we might be tempted by using the type Exception. But this type also gives information on the error. Python has a list of standard exceptions with a meaningful name: standard exceptions. They should be used.

2013-08-11 pyensae

Exchanging code with students through emails is easy but after a couple of years, looking into my database of emails became difficult. Plus, it is difficult to maintain pieces of code inside emails.

pyensae is the module I will use from now on to exchange code for my teachings. So far, it only contains a function to download materials I put on my website. It should grow over the next years. The module can be obtained:

Having students contributing will be another story. Let's see after a year.

2013-08-10 Machine Learning with Python

Here is the list of modules you should install:

All modules can be installed from Unofficial Windows Binaries for Python Extension Packages except IPython which should be installed with pip (+ setuptools) because it has may dependencies (see installation guidelines) to get a command line windows with colors and copy/paste functionalities. IPython is very interesting for auto-completion. Press TAB and you will get a list of possible options.

Some others modules can be useful:

2013-08-04 Quelques restaurants à Paris, Londres

J'ai découvert le restaurant AuxArtistes dans le XVième. C'est une brasserie sympapthique où il faut inscrire sa commande soi-même sur une feuille de papier que le serveur reprend. Elle était complète le soir où nous y étions. Et comme je n'ai pas souvent l'occasion de manger du boudin noir aux pommes, c'est ce que j'ai choisi et je n'ai pas été déçu. Les frites sont fraîches : un délice.

Je ne sais pas si c'est une mode mais on trouve régulièrement des articles dans la presse sur des restaurants culinaires à Paris dans d'autres capitales d'Europe. Le dernier sur le site du Monde L'Abri à Paris, parmi les meilleurs nouveaux restaurants du monde fait l'éloge de quelques-uns d'entre eux. Dorénavant, le cuisinier n'est plus seulement un bon artisan mais aussi un créateur. On insiste davantage sur la personnalité du chef, sa cuisine fruit de ses expériences et de sa propre recherche qui arrive à maturation. La cuisine n'est pas seulement une affaire de livres ou de recettes.

Les suggestions viennent de ce site Condé Nast Traveler. Le restaurant Abri donne tout de suite envie d'essayer. On sait d'avance qu'on va déguster quelques chose qu'on n'a jamais vu auparavant. Le second restaurant est Bones (voir aussi ici). Apparemment, le chef est passé par celui-ci Spring. Je suis repassé par Sémilla qui reste toujours très bon mais la carte des plats ne changent pas beaucoup.

A Londres, quelques bonnes adresses aussi : Bones Daddies qui fait aussi très envie. La cuisine est aux frontières de plusieurs cultures (et donne envie). Il y a aussi BubbleDogs qui intrigue. Le site web est sympapthique et la présentation de l'équipe donne une touche personnelle qui invite à découvrir une cuisine et leurs auteurs. Enfin, Cevicheuk qui séduit, peut-être parce que c'est une cuisine d'un pays très lointain.

Pour finir, un point de vue sur la complexité française : Moi, ex-ingénieur, libraire entrepreneur.

2013-08-03 La paperasserie administrative

Kate Middleton portait une robe d'une créatrice française d'après cet article La styliste française Séraphine vend ses robes tous azimuts grâce à Kate. Passé l'anecdote l'article retranscrit les propos de la créatrice à propos d'un sujet connexe : "Je travaille aujourd'hui avec cinquante employés, mais je ne sais pas si j'aurais eu le courage d'en avoir autant en France (...) côté administratif : le rapport entre les papiers que je dois remplir pour John Lewis/Peter Jones et les Galeries Lafayette est de un à dix."

Les chiffres simples raisonnent toujours plus longtemps. La France est dix fois plus administrative que le Royaume-Uni. On savait qu'elle l'était plus mais de là à l'être dix fois plus, je me demande ce que cela représente.

On nous promet ou on nous a promis de simplifier tout ça. Simplifier comment... Lorsque la complexité s'installe de manière durable, on s'en accomode et on crée des raccourcis. L'un des moyens et d'écrire des logiciels qui vous précisent ces démarches et leurs coûts associés. Simplifier voudrait dire réécrire ces logiciels... Pas si simple. Les grosses entreprises devraient investir du temps et de l'argent pour cette migration. L'Etat français aussi. On ne passe pas d'un système complexe mais en quelque sorte digéré à un système plus simple mais pour lequel il faut tout adapter. Et puis tout système complexe a ses conseillers qui en ont optimisé l'utilisation, qui en ont cherché les failles. Il a ses avantages aussi.

Toutefois, il apparaît que le temps d'apprentissage nécessaire pour appréhender les règles administratives nécessaires à la création d'une compagnie est plus court en Angleterre qu'en France. Ce savoir complexe est peut-être une barrière à l'entrée, peut être aussi une source d'inégalité entre ceux qui savent et ceux qui doivent apprendre.

Maintenant, comment fait-on pour simplifier si telle est la direction souhaitée ? Comment remplacer le moteur d'un bateau en marche ? A moins d'en créer un en parallèle pendant que l'autre tourne encore... Il faudra former de nombreuses personnes sur le nouveau système (il y a avait environ 18 400 experts comptables en France en 2007).

Ou alors, on garde le sytème actuel qu'on considère un peu comme une boîte noire et on crée des chemins balisés pour les usages les plus fréquents comme par exemple : guide création. On crée des pages Facebook pour la plupart des organismes administratifs, des flux RSS pour informer les gens (et sans doute pour les connaître aussi). Une fois les usages changés, on changera peut-être la boîte noire en boîte claire.

2013-08-01 Datamining avec R ou Python

Il est devenu assez facile de travailler avec R. Même si je trouve toujours le langage compliqué, il faut avouer que des outils comme RStudio rendent l'outil indispensable et de moins en moins difficile d'accès. On peut importer ses données depuis une grande variété de format, créer des rapports en utilisant knitr ou encore créer une application web avec shiny. Il existe un package pour presque tout comme pour faire des tests unitaires avec RUnit.

J'ai pour habitude de faire le plus de choses possibles en Python, de passer au C++ quand c'est vraiment nécessaire et d'utiliser R pour tout ce qui statistiques. R a l'avantage d'avoir une modèle suivi par tous les packages alors que les modules Python suivent leur propre logique le plus souvent.

Un exemple sur les méthodes à noyau : sous R, il faudrait utiliser le package kernlab, sous Python, on se dirigerait vers scikit-learn. Les packages sous Python sont souvent plus gros car les auteurs auront voulu intégrer de nombreux algorithmes selon la même logique. Sous R, chaque package a un périmètre plus réduit et suit les mêmes conventions. Comme Python s'interface avec à peu près tout y compris R, je préfère ce langage dont la syntaxe me paraît plus facile même si je n'hésite pas à repasser à R dès qu'il le faut.

C++

Les deux langages permettent d'inclure des morceau de C++ si nécessaire. Python dispose de diverses façons~: Cython, Boost.Python, ou cffi. Avec R, il y a Rcpp (tutoriel sur Rcpp, il faut aussi installer devtools). Est-ce que le langage C va disparaître ? Pour le moment, si les langages de scripts sont beaucoup plus utilisés, les compilateurs sont la plupart du temps écrits en C++. De nombreuses extensions ont été écrites en C++ (voir Eigen par exemple). Ce langage est souvent un choix raisonnable lorsqu'on veut écrire du code très rapide.

Graphiques

L'outil qui prend un peu plus d'importance ces temps-ci est d3.js car il permet de réaliser des graphiques facilement intégrables sur un site web, un journal en ligne, qu'il permet de faire plus facilement des animations et surtout, comme il est écrit en javascript, il permet de créer des graphes qui réagissent à la souris ou au clavier. Je n'arrive pas encore à trouver un module qui le rende facilement utilisable depuis Python. L'article Method: Data visualization with D3.js and python - part 1 décrit comment s'y prendre sans toutefois citer de module dédié à cet usage. Ca ne devrait pas tarder. Sous R, sans être javascript, il existe ggplot2 qui propose des graphes assez jolis.

Big Data

Enfin, dans le domaine des Big Data, les solutions lourdes type Map/Reduce Hadoop sont de plus en plus fréquentes lorsqu'on traite des données qui arrivent en continu (internet, téléphone, consommation d'énergie...). Pour le reste, un ordinateur portable avec quelques giga octets de mémoire et un disque dur conséquent suffit. Des outils existent pour ne pas avoir à charger une base complète en mémoire. C'est le cas de ff et ffbase (ou ça bigvis) sous R. Sous Python, l'environnement de travail le plus approprié est IPython. Pour manipuler les données, on trouve pandas ou PyTables.

2013-07-30 IExplorer and class HTTPServer (Python)

I was wondering why I could not make something work on IExplorer while it was perfectly working with Firefox and Chrome. My simple Python web server seemed to get stuck most of the time by IExplorer (no logs) when I could see all the requests sent by Firefox. When I was leaving IExplorer, the error message was "interrupted connection". I finally found the error: IExplorer sends mulitple requests in parallel and the class HTTPServer does not handle it. To fix that, you need to do the following:

from http.server import BaseHTTPRequestHandler, HTTPServer, SimpleHTTPRequestHandler
from socketserver import ThreadingMixIn

class ThreadedServer (ThreadingMixIn, HTTPServer) :
   pass
   
class MyHandler(BaseHTTPRequestHandler):
    def respond(self, status_code):
        self.send_response(status_code)
        self.end_headers()

    def do_GET(self):
        # ...

server = ThreadedServer(('localhost', 8080), MyHandler)
server.serve_forever()

2013-07-29 Starting a coding projet

When I was young, I was writing code, running, fixing bugs and going on to something else to code. After I joined my first company, I realized many people were doing that. There were very different styles of coding, spaces anywhere, indentation not following a single rule and always some resistance to follow one set of rules. I started to work in a company with various cultures and styles. People usually write code following the style which is the clearest for them, the easiest to understand for them. I'm usually skeptical when somebody explains everybody should do this or this because it makes more sense. As a teacher, I saw too many different logics, each of them writing in their own style. And if you do different, it is because it is more simple that way for you. For example, I usually choose small variables name for a loop (n, i, t, u) because I read it as a mathematical loop (\sigma_{i=1}^n ...). I add a space before semicolon because you do this in French. One rule I follow is when I modify something written by somebody else: I try to follow the same style. I remember some code review which came back with many comments because my spaces were not good. I think there should be a tool for that.

Anyway, when you work on a big project, I'm not sure about the importance of the style but I know some tools and practice are unavoidables:

If there are specific guidelines to follow, I usually implement them in unit tests: you cannot submit a modification if one fails. I prefer an explicit error message than a document to read explaining how I should code. And every repetitive task should be automated.

2013-07-28 my RSS Reader

When Google Reader died, I was reluctant to move to something different. Not because others solutions are worse or anything like that, but more because I needed to create a new account, a new password, eventually to pay if the number of blogs I wanted to follow was above a given threshold. With Google, I did not have to do anything like that. I would argue that giving everything to a single company which can monitor every single move you do on the net is not a good idea.

But if I push this reasoning to its extreme, why not having a tool on my laptop which allows me to read blog posts? That way, I would download myself the blog content, I would keep any statistics about my own uage for myself. And if the design is not good enough, I just have to change it. Well, the only argument against that is the time I will need to build that tool (and to maintain it).

Well, to be honest, I also did it because I wanted to learn about some python and javascript figures of programming which I talk about in previous blogs. The tools looks that way:


more...

2013-07-27 Logging click events on your server

Many websites log events, where users clicked for example. They want to optimize for a better use. You would assume every time a user requests a page, your server needs to provide the user with the content of the page. However some cache mechanism could prevent you from getting that information, a user could click on a link leading outside your website or the same page could be obtained from different others pages. You need a more precise information. How to log a click event then?

To do that, we first need to do something when a user clicks on a url: we need to catch this event and to call another function. We use the following syntax:

<a href="url" onmousedown="sendlog('url')">anchor</a>
The function sendlog will be executed when the user clicks on this particular url. The string between the quotes is the information to log. The function sendlog is defined in another file, defsendlog.js in this case. The following lines must be added to the HTML page (header section):
<script type="text/javascript" src="/defsendlog.js"></script>


more...

2013-07-26 Keep the scrolling position after resfreshing

I added the scrolling property to a div section:

div.divblogs{
	position:absolute; 
	margin-top:10%; 
	margin-left:0%; 
	margin-right:0%;
	text-align: left;
	width:20%;
	height:80%;
	overflow:scroll;
} 
Unfortunately, after a refresh or a click somewhere which makes only helf the page change, every list returned to its first position. It was bothering me. I finaly found a way to keep list the way they are after a refresh. It requires cookies: we store the position of each section in cookies.
function createCookie(name,value,days) 
{
	if (days) 
    {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) 
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function savePosition(document, divId)
{
    var intY = document.getElementById(divId).scrollTop;
    if (intY >= 0) {
        createCookie("divid" + divId, "y" + intY + "_", 1) ;
    }
}

function getPosition(document, divId)
{
    var cook  = readCookie("divid" + divId) ;
    if (cook == null) return 0 ;
    var start = cook.indexOf("y") ;
    if (start == -1) return 0 ;
    var end   = cook.indexOf("_", start) ;
    var sub = cook.substring( start+1, end) ;
    return sub ;
}
So to save the scrolling position of a div section, you just need to call the function savePosition each time it is updated:
<div class="divblogs" id="divblogs" onscroll="savePosition(document,'divblogs')">
...
</div>
The last detail left is a function called when the page is reloading to restore each section's position:
<body onload="setPositions(document,['divblogs', 'divpostsshort', 'divpostsext'])">
The function setPositions is defined as follows:
function setPositions(document, listDiv)
{
    for (var i = 0 ; i < listDiv.length ; ++i)
    {
        var divObject = document.getElementById(listDiv[i]);
        divObject.scrollTop = getPosition(document,listDiv[i]) ;
    }
}
Last detail, each section div has attributes (class and id). They are important to enable the scrolling and the make them easily accessible.


<-- -->

Xavier Dupré