Categories
Programming

The Semantic Web

Ontologies and other formal definitions of data are useful, but in our experience, even simplified things like Dublin Core are rarely encountered in the wild.

Good Enough Practices in Scientific Computing.

Categories
Programming

pyAggr3g470r 6.1

La nouvelle version de pyAggr3g470r est arrivée!
Voici le changelog ainsi que la nouvelle documentation.

La prochaine version devrait pointer son nez bientôt.

Categories
Programming

Emacs

N'est-ce pas beau?
Emacs – En plus l’interface est jolie!

C’est décidé, à partir d’aujourd’hui mon objectif dans la vie est de maîtriser Emacs. J’avais déjà fait quelques tentatives sans conviction, mais maintenant c’est du sérieux. Il est même presque honteux que je m’y attelle si tard. Heureusement, c’est toujours bon pour la plasticité du cerveau.

Pour commencer, je trouve que le moins évident est finalement de s’habituer aux buffers et surtout de les placer dans les bonnes fenêtres. C’est assez frustrant. Contrairement à ce que l’on peut entendre, les raccourcis clavier ne sont pas moins intuitifs que ceux de Vim. La colorisation syntaxique par défaut me convient très bien, pour les quelques langages avec lesquels j’ai pu tester (je n’utilise pratiquement jamais l’auto-complétion, sauf en Java). Aussi, il faut un certain temps pour avoir «l’esprit Emacs». Par exemple, aujourd’hui j’ai demandé à un collègue si il était possible d’avoir un buffer dédié à l’explorateur de projets. Question à ne pas poser, puisque on évite d’utiliser la souris et qu’il est embêtant de naviguer dans une telle arborescence avec le clavier. Je trouve ceci particulièrement problématique avec les projets Java qui comportent habituellement beaucoup de packages, sous-packages, etc. Ou tout simplement les projets «corporate» (vous reconnaîtrez de quel type de code je parle).

Je pense que je vais utiliser Python pour cet apprentissage. Ça passera mieux. J’ai trouvé un ensemble d’extensions bien sympathique. Et je suis d’ailleurs plutôt satisfait de ces extensions qui, pour moi, mettent déjà Emacs au niveau de Kate (d’un point de vue utilisabilité et «rendement»).
À terme je développerai idéalement uniquement avec cet éditeur (et Vim). Il se substituerait ainsi principalement à KDevelop, Kate, Kwrite et Kile. Le top serait de finalement pouvoir même remplacer Eclipse que j’utilise pour le développement Java (en ce moment Spring). Non, je n’ai (pas encore) perdu la tête. Car il faut d’abord que j’utilise vraiment bien cet éditeur. Sinon, ce serait juste pour la frime. Oui, il y a un côté sexy à utiliser des outils de nerd.

Bref, à l’ère des éditeurs comme Sublime Text et Atom, moi je change pour Emacs. Aussi, j’aimerais bien copier vos fichiers de configuration. Voici le mien.

Categories
Programming Python

pyAggr3g470r: version 4.5

La nouvelle version simplifie enfin l’installation. Il y a même pas un an il fallait faire ça. Il suffira dorénavant d’exécuter un script, plus d’information ici. Le script utilise virtualenv principalement afin d’éviter les problèmes de dépendances.
L’annonce sur la page freecode du projet.

evolution-pyAggr3g470r

J’aime bien ce graphique, il résume bien l’évolution du projet, les changements de technologies (SQLite -> PyMongo, CherryPy -> Flask, PyMongo -> MongoEngine). J’ai effectivement l’impression que le code est toujours plus propre, mieux isolé (vues et «templates») et aussi plus moderne (notamment virtualenv, MongoEngine, WTForms).

Depuis ce temps j’ai pu conserver une base de données cohérente et je fais régulièrement des exports HTML, en voici un assez récent.

Categories
Programming

Influences des langages de programmation

Relations between programming languages
Relations between programming languages

J’aime bien ce graphique généré à partir des boites d’informations sur les pages de Wikipédia de différents langages de programmation.

Voici une petite liste des langages avec lesquels je suis le plus à l’aise et dont j’ai eu l’occasion d’utiliser, dans des contextes professionnels (y compris à l’université) ou personnels. Grossièrement sur ce graphe il s’agit de l’ensemble défini par le triangle Lisp – Haskell – Perl (plus OCaml et C, un petit peu plus bas). J’ai cependant encore pas mal de progrès à faire avec Haskell et je voudrai apprendre Lisp. Ce n’est pas si évident car je n’utilise pas ces langages à mon travail. Mais bon, je peux être content de ne pas utiliser PHP et Java (qui a quand même influencé un langage appelé Pizza!).

Categories
Programming

Autovivification

Je peux enfin mettre un terme sur une astuce Python que j’utilise depuis déjà longtemps: l’Autovivification.

from collections import defaultdict

def tree():
    return defaultdict(tree)

IP = tree()
IP['212.110.251.3']['212.112.245.2'] = 451
Categories
Python

Python devient fainéant

Python 3 est un peu plus fainéant. Voyez:

>>> r = range(10)
>>> print(r)
range(0, 10)
>>> print(r[3])
3

Avec Python 2.7:

>>> r = range(10)
>>> print r
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print r[3]
3

C’est encore une petite chose à savoir à propos de Python. Cela peut sembler ridicule de prime abord, mais il peut y avoir un avantage avec un très grand range. Bon avec Python 2, on peut aussi utiliser les itérateurs pour avoir ça.

Tu trouveras d’autres «astuces» Python sympa ici.

Et tiens, au lieu de fainéanter je pourrai continuer d’apprendre Haskell. Un vrai langage de paresseux.

Categories
Programming

Une fin d’année le nez dans le code

Ohloh profile for Cedric Bonhomme

J’ai récemment posté un lien vers le dépôt de pyAggr3g470r sur Reddit (r/Python). Ça fait vraiment plaisir de voir les points positifs et les commentaires plutôt intéressants. J’ai maintenant de nouvelles idées ainsi qu’un regain d’énergie ;-).

C’est marrant, parce que le projet commençait à stagner un peu et soudain alors que la fin de l’année approche, le nombre de commits grimpe en flèche. Sur l’ensemble de cette année nous pouvons voir sur le graphe qu’il y a principalement deux pics: 1) le passage à MongoDB et 2) le passage à Mako.
Ce second graphe montre l’évolution du nombre de lignes de code par langage. Sur la toute fin de l’année le nombre de lignes de Python diminue alors que le nombre de lignes de HTML augmente, ce qui est tout à fait normal et même encourageant. Le code HTML inséré disgracieusement dans le code Python migre dans les templates. Le code est déjà plus propre. J’ai aussi dernièrement (juste avant de faire le sapin de Noël) amélioré certaines fonctions du côté des lectures de la base MongoDB. Du coup certaines pages s’affichent bien plus vite.

À côté de ça je dois faire avancer cette “documentation”, le petit projet évoqué au billet précédent et un tas d’autres choses liées à l’informatique. C’est horrible comme les journées sont trop courtes alors que soi-disant il est bon de garder une activité sociale. Mais je sais que d’autres personnes ont se problème de temps. Et là je pense à une certaine personne qui termine sa thèse.

Fort malheureusement pour moi ce week-end va à nouveau être dédié à des tâches comme la peinture et du rangement. Hier soir (plutôt cette nuit) j’ai commencé le sapin de Noël (je n’aime pas l’hiver, mais j’adore le mois de Décembre). Il est beau.

Categories
Programming

Learn programming by visualizing code execution

J’aime beaucoup cette idée. Ça peut être pratique pour des étudiants.

Categories
Programming

Go: Channels et Goroutines

Je me suis lancé dans l’apprentissage du langage Go. Lorsque Go a été lancé publiquement en 2009 je m’y étais intéressé que de loin, à mon regret. Car finalement ce langage est bien intéressant et présente certains avantages, particulièrement concernant la programmation concurrente. Ce qui peut résoudre des problèmes de programmation réseau. Pour le moment les aspects qui me plaisent le plus sont donc les channels et les goroutines.

Voici une illustration avec le problème du producteur/consommateur:

package main

import ("fmt")

var done = make(chan bool)
var cake = make(chan int)

func produce (firstname string) {
    for i := 0; i < 10; i++ {
        fmt.Printf("%s make cake %d\n", firstname, i)
        cake <- i
    }
    done <- true
}

func consume (firstname string) {
    for {
      cake_number := <-cake
      fmt.Printf("%s eat cake %d\n", firstname, cake_number)
   }
}

func main () {
   go produce("Alice")
   go consume("Bob")
   go consume("Maxime")
   <- done
} 

Aux lignes 24, 25 et 26 nous lançons 3 goroutines. Il s'agit en fait de 3 threads. Alice va faire des gâteaux pendant que Bob et Maxime vont les manger.

À la ligne 6 nous définissons un channel nommé cake. On peut voir un channel comme un tube FIFO (First In, First Out). Tant que l'envoie de données (cake <- i) dans le tube n'est pas terminé, il n'est pas possible de recevoir des données (cake_number := <-cake) de l'autre côté. Ce qui permet de synchroniser des goroutines sans utiliser de mutex ou autres verrous.

Voici donc le résultat de l'exécution de ce petit programme:

cedric@kubuntu:~$ 6g produc-consum.go
cedric@kubuntu:~$ 6l -o produc-consum produc-consum.6
cedric@kubuntu:~$ ./produc-consum 
Alice make cake 0
Alice make cake 1
Bob eat cake 0
Alice make cake 2
Maxime eat cake 1
Alice make cake 3
Bob eat cake 2
Alice make cake 4
Maxime eat cake 3
Maxime eat cake 4
Alice make cake 5
Alice make cake 6
Bob eat cake 5
Alice make cake 7
Maxime eat cake 6
Alice make cake 8
Bob eat cake 7
Alice make cake 9
Maxime eat cake 8
Bob eat cake 9

Personnellement j'aime assez l'idée des channels. Voici un autre exemple intéressant.