Blogs

Radar system calibration
  • http://googlewebmastercentral.blogspot.com/2010/03/googles-seo-report-ca...
    Google a mené en interne une enquête sur le respect des bonnes pratiques SEO dans leurs propres produits. Les résultats ont été rendus publics, même s'ils ne sont pas flatteurs. On peut par exemple se rendre compte que même les éléments de base comme la balise title sont très mal utilisés.

  • http://martinfowler.com/bliki/VcsSurvey.html
    Cette enquête sur les outils de gestion des versions montre que le trio Subversion, Git et Mercurial est très apprécié. Ceci est d'autant plus vrai quand on les compare aux équivalents propriétaires que ce sont ClearCase ou Microsoft VSS. Si l'on rentre plus dans les détails, on se rend compte que Git sort du lot : 65% de ses utilisateurs considèrent que c'est le meilleur outil pour leurs besoins, contre 20% pour svn et 33% pour hg.

  • http://github.com/progrium/DrEval
    DrEval est un serveur web qui exécute du javascript et renvoie le résultat. Sa particularité est d'avoir été conçu spécialement pour faire tourner des scripts utilisateurs dans des environnements sandboxés. Cela en fait donc un serveur applicatif idéal pour utiliser des webhooks créés par des utilisateurs.

  • http://www.regexprn.com/2010/03/nosql-paradox-of-choice.html
    Cet article met un avant le paradoxe du choix pour les bases de données NoSQL : il y a un choix très large de bases de données NoSQL, mais cela n'est pas forcément pour les aider à devenir populaires. En effet, choisir une base de données ne se fait pas à la légère et prends du temps. Le nombre important de bases de données fait qu'il devient difficile de trouver la base de données qui nous convient, et dans le doute, il est parfois plus simple de rester sur une base de données relationnelle. Il serait donc bienvenu qu'une base de données NoSQL (ou un nombre très réduit) sorte du lot.

  • http://dean.edwards.name/weblog/2010/03/ie7js-update/
    IE7.js est une bibliothèque javascript qui vise à combler les déficiences des différentes versions d'Internet Explorer Elle corrige notamment des problèmes HTML et CSS, et permet d'utiliser des PNG transparents sous IE6. En théorie, cela doit permettre de se concentrer sur les standards, tout en faisant un site qui va passer sous IE.

  • http://jashkenas.github.com/coffee-script/
    CoffeeScript est un langage qui se compile vers du javascript. Il apporte une syntaxe qui se veut plus agréable : pas de points-virgules, utilisation simplifiée des objets et tableaux, interpolations pour les chaînes de caractères, etc. De plus, le code javascript généré respecte les règles de JSLint et n'est pas pénalisant pour les performances. Le seul point que je regrette est le choix des espaces significatifs à la Python.

  • http://www.smashingmagazine.com/2010/03/08/entering-the-wonderful-world-...
    Christian Heilmann nous offre ici un tour d'horizon sur les données géospatiales. Il aborde différentes techniques comme la récupération de la localisation d'un utilisateur via les API Geo du W3C, le géocodage (transformer une adresse en latitude/longitude) et son inverse (trouver le nom d'un lieu à partir de ses coordonnées). Cet article est vraiment un bon point de départ pour savoir ce qu'il est possible de faire et trouver les pointeurs pour le faire.

  • http://jashkenas.github.com/docco/
    Docco est un outil de génération de documentation à partir des commentaires d'un code source. On parle de Literate programming, car le code et sa documentation sont mélangés au sein d'un même document et évoluent simultanément. Docco génère un fichier HTML avec deux colonnes : la première contient les commentaires transformés via Markdown, et la seconde reprend le code source avec de la coloration syntaxique grâce à Pygments. À noter : il existe également un portage en Ruby de Docco qui se nomme Rocco.

  • http://ozmm.org/posts/man_what.html
    Chris Wanstrath explique l'intérêt des pages de man, à savoir être une documentation syntaxique permettant de trouver facilement une information précise. Il fait également le tour des outils qui permettent de les créer, les trouver et les lire.

  • http://vagrantup.com/
    Vagrant est un outil en ruby qui permet de construire facilement des machines virtuels pour des projets. Il facilite notamment tout ce qui est la mise en place de l'environnement (via Chef), ainsi que le partage des fichiers entre l'hôte et l'environnement virtuel. Je me verais bien l'utiliser pour partager un environnement complexe sur certains projets avec des personnes qui n'interviennent que ponctuellement.

Fail Road

I met today with a young entrepreneur, you might know his kind of company. They have a niche in a local market, a sweet business model, they are four and their business is running great, they are really good at SEO and know how to strike a partnership deal.

The site is good looking. And it does what it is supposed to do.

They built everything in-house, in PHP/MySQL and they don't really have big performance issues (500ms average response time of their scripts which they find acceptable). They know they are not supposed to do sys admin and have a hosting company that takes care of their machines. The guy writing the code is not that bad either. He doesn't really do OOP programming nor does he really know what is the practical use of the MVC pattern. But he does separate logic from design using his own templating solution, there is not a lot inline css, and the majority of the javascript code is not inline either.

So these guys are really not in that much of trouble, I can surely say I have seen much much worse.

The code to be vs. The code that is

So what do I mean when I say their code is Liability not an Asset? It means that more or less all project code is. Before you are running a live system the "code to be" represents what you need to do in order for your business to run, and make money.

Afterwards the same code, "the code that is" mostly represents the added cost to implement new features. The more code you have, the costlier it will be to add anything new. And the real bad news is that everything you add will just pile up on top of the "code that is" making every subsequent addition even costlier. Now the negative marginal utility of the existing code is not a fixed quantity : the better structured you code is, the more unit tests you have, the more cool schema-less or loose schema databases you use, the less new code is costly. This is true of course for small changes (just change the graphic design of the site), but when it goes down to structural issues (getting your site multilingual, adding user roles, changing workflows) the difference can be tremendous. And some times it means that the moment the company succeeds in its local niche -- and wants to go bigger, go international -- or resist the big players coming to the niche market it simply can't. Even if it can now raise the money to have enough development power, it will take too long. Becoming from an innovative first player, the late to market guys can be a real hard wake up call.

Now, these companies: brave, self-financed and successful can probably not exist by doing "stuff right" from the beginning. There is an initial investment in development quality that would probably not have been able to afford. You don't have that many professional developers running around looking for biz-dev guys with an idea, willing to work for a year and a half without salary, and being able to explain to their partner: hey let's not implement anything new this week, let's write some more tests, let's just refactor that old code (from 4 weeks ago). In order to hire an external professional team well you need to have the seed money, and not everybody has access to that.

Is doom a fatality?

But doom is not a fatality, there is a tipping point. There is a specific moment in time, when the company is already successful enough a time where there is still time to refactor, not that much code has been written. Although it took a year to write it a bunch of professionals can probably redo the whole thing in a month this time with the scalability, the internationalization, the security built-in and maybe the most important, the ability to add new stuff without breaking the old one, to tweak the system without being afraid it will make the whole thing collapse.

So if you are the business guy, how can you prepare yourself well to throwing away everything and still staying in business? What can you do to make sure you will not fail by succeeding? Here is a preflight checklist you should verify with your tech guy, before you write a single line of code. If you don't know you are going to be writing marvelous code. You should try to find out how to write as less code as possible and how to make it as disposable as possible.

Best practices for people who can't follow best practices

First three:

  • You are using existing open source code that enforces as many good practices as possible such as Ruby On Rails, Django or Drupal and you know the implications of the licensing model on you business model
  • Your coder is a respected open source contributor, he has a bunch of projects up on github or bitbucket and many people fork his stuff
  • On some of the comments you see on these platform people tend to be respectful for the number and the quality of tests he has written and praise his documentation

At this point there is a very good chance you can stop reading this. Things will be cool. Trust the tech guy. Just really make sure you have some kind of back up for your data, and if you see the tech guy drinking too much whisky before noon, also make sure you have access to backups of the code as well as the data, maybe on a physical support only you have access to.

You should still talk to the guy and make sure:

  • You are paying him enough money and he won't quit on you too soon

You could also verify together:

  • You are using standards, and don't invent anything but your core value
  • You respect as much as possible the spirit of the framework you use
  • You have discussed together the ambitions in terms of scalability, and he is thinking about that

The big checklist (not that big)

Normally the framework you have chosen will take care of most of the following. But if you can't use one (because you tech guy is too young/too old, he is not a respected open source contributor, he doesn't like frameworks for X/Y reason, he says doesn't have time for, etc.), you still must check the following list:

  • The source code of the application is on an SCM (source code management system)
  • You know where the SCM is. You know it is backed up. You have learnt how to get your own copy of the code or some third party you trust has
  • No development is done directly on a server
  • There are at least two environments: test and production. But really, there are four environments: the local environment of the developer(s), an unstable integration machine representing the current status of the code, a testing machine -- representing the next version to be put to production -- and the production environment.
  • You have a procedure in place to use the SCM to move code from development to production
  • If you need to put more then just code changes to production (modify database structure, dependencies on libraries/executables) you have a procedure to make these modifications
  • If you have interesting data on the server (anything that if lost might pose any kind of problem), it is backed-up
  • You have a way to verify that your backups work

Talk with the tech guy if you left any of the checkboxes unchecked. Stop, there is no point in reading this post any further. Talk with the tech guy again. Make sure all are checked, that you have a way to verify this. Make sure the procedures are written.

Next verify the following:

  • You know what your application is supposed to do, and you know how this can be tested
  • This is written in a simple text format or nice images, but both you and the developer can understand these documents

Now go on the following checklist with your developer(s):

  • The application has a single point of entry
  • Design is separate from application code
  • The application code does not talk directly to a database but uses some kind of abstraction
  • There is a single source for text strings, with every call to static text running through a translation layer
  • You have a caching infrastructure in place
  • You use something else than MySQL queries for full-text search

To earn some extra points try and check the following:

  • You only develop the features that you can make money out of and do the simplest thing that might possibly work
  • You don't develop code you are not going to immediately use
  • You understand what "Horizontal Scalability" means
  • You don't have anything in the architecture that prevents that

Every time you add a feature, every single time, go through the checklist. If you could not tick a checkbox, don't develop the feature.

On the next blog post in the series I will get into some more details on each element of the checklist, to be clear on how you verify this. The last chapter will address what happens when you've already started coding, and this article has put the fear of god into you.

Book Holder

Les pages de man sont un ensemble de manuels pour les commandes UNIX. Elles sont très utiles pour les personnes qui travaillent régulièrement avec la ligne de commande sous un UNIX, car elles permettent d'accéder facilement aux informations utiles. En effet, celles-ci sont placées dans une dizaine de sections et respectent toujours la même structure.

Par exemple, man 1 ls va afficher la page de man de la commande ls, le 1 servant à indiquer la section, en l'occurence les commandes utilisateur. On y trouve bien entendu des informations générales comme une courte description de la commande et le synopsis (ie comment l'appeler), mais également des informations beaucoup plus détaillées comme la liste des options et ce que fait chaque option.

Dans l'ensemble, les pages de man sont une solide source de documentation qui permet de retrouver très efficacement une information quand on sait se servir de man. Pourtant, les pages de man sont restées très liées aux commandes UNIX et n'ont jamais réussies à s'imposer dans d'autres domaines comme les gems Ruby ou les applications web. Il y a plusieurs raisons à ça :

  • La syntaxe Troff est relativement difficile et obscure, surtout quand on la compare à markdown ou textile.
  • Les développeurs ne connaissent pas forcément très bien la culture UNIX, et n'ont même pas envisagé la possibilité d'utiliser les pages de man pour leur documentation.
  • Les pages de man ne sont pas forcément très jolies et se lisent surtout dans des terminaux. Par exemple, l'absence d'une application graphique pour lire des page de man sous Mac OSX a peut-être repoussé certaines personnes.
  • L'export vers du HTML pour mettre cette documentation en ligne n'est pas toujours très concluant.

Mais il semblerait que les pages de man aient un regain d'activité. On voit ainsi surgir un certain nombre de projets visant à simplifier l'accès aux pages de man et leur écriture. Je voudrais mettre en avant 2 programmes qui me semblent particulièrement pertinents.

Le premier est gem-man : il permet d'accompagner les gem Ruby d'une page de man et fournit un moyen simple de les afficher. Par exemple, gem man 1 mustache affiche la page de man de la commande mustache fournit par le gem du même nom.

Le second, ronn, simplifie l'écriture d'une page de man en fournissant une syntaxe proche de Markdown. Il offre également la possibilité d'exporter la page de man en hTML pour la mettre en ligne. Je vous laisse comparer la version ronn de ronn(1) avec son équivalent troff, et regarder le résultat de l'export HTML.

Ça ne vous donne pas envie d'écrire de jolies pages de man ?

Mise à jour : Chris Wanstrath, aka defunkt, a publié un article sur le même sujet (en anglais) : man what.

  • http://vimcasts.org/ : ce site met diffuse des screencasts sur vim. Chaque semaine, un nouveau screencast de 5 à 10 minutes est publié, mettant en avant une fonctionnalité particulière de Vim.

  • http://www.igvita.com/2010/03/01/schema-free-mysql-vs-nosql/ : cet article d'Ilya Grigorik discute de la pertinence des bases de données NoSQL. En particulier, il souherait voir émerger un moteur Schema-free pour MySQL. Les discussions qui ont suivies cet article sont également intéressantes.

  • http://www.opscode.com/blog/2010/02/28/chef-0-8-2-release/ : Chef est un outil d'automatisation pour son infrastructure. La sortie de la version 0.8.2 est la première de la nouvelle branche, et apporte des nouvelles fonctionnalités majeures comme une API REST complète, un outil en ligne de commande, knife, totalement opérationnel, ou encore un mécanisme d'authentification plus robuste.

  • http://code.google.com/p/html5media/ : cette initiative vise à offrir la balise HTML5 <video> pour tout le monde. Tous les navigateurs web ne supportent pas cette balise, et pour ceux qui la supportent, les codecs ne sont pas toujours les mêmes. Ce projet permet aux développeurs web d'utiliser la balise <video> sans avoir à se soucier de ces problèmes.

  • http://rickosborne.org/blog/index.php/2010/02/09/infographic-migrating-f... : ce document est une représentation graphique d'une transformation d'une requête SQL en requête MongoDB équivalente. Elle illustre une méthode permettant de convertir systématiquement des requêtes SQL relativement complexe en requête de type Map-Reduce pour MongoDB.

  • http://groups.fsf.org/wiki/Group:GNU_Social : des personnes proches du mouvement GNU ont décidé de monter leur propre réseau social décentralisé. Celui-ci vise à offrir un équivalent distribué à facebook dans un premier temps. Il devrait également permettre un meilleur contrôle des données et de sa vie privée par la suite. Tout le code est diffusé sous licence AGPLv3.

  • http://bsonspec.org/ : le BSON, ou Binary JSON, est un protocole de sérialisation dans le style de JSON. Il est notamment utilisé par MongoDB, et présente des avantages intéressants si on le compare à Protocol Buffers : légèreté, traversabilité et efficacité.

  • http://www.cdncatalog.com/ : ce catalogue de CDN pour les bibliothèques javascripts et CSS est une ressource utile. Utiliser pour ces bibliothèques est très pertinent, car il permet aux utilisateurs d'avoir ces versions dans le cache de leurs navigateurs, ce qui accélère le temps de chargement des pages de manière non-négligeable.

Comment mobiliser et gérer une communauté autour d’un projet ?

Nous vous proposons aujourd'hui un compte-rendu d'un événement qui s'est tenu vendredi 5 mars 2010 à La Cantine, sur le thème : Les modèles de développement et de collaboration au sein des projets Open Source.

L’événement a été animé par Charles-H. Schulz d'Ars Aperta, avec les invités :

- Louis Montagne, AF83.
Louis dirige af83 et Bearstech, il est secrétaire de Silicon Sentier et président de Collibri, la communauté Web2 et Logiciel Libre de Cap Digital.

- Tristan Nitot, Mozilla Europe
Tristan est fondateur et président de l’association Mozilla Europe depuis 2003.

- Nicolas Barcet, Ubuntu (Canonical)
Nicolas fait partie de Canonical, la société derrière Ubuntu. Nicolas est en charge de la version serveur d’Ubuntu.

- John Lejeune, Hackable Devices
John gère une communauté autour d’une e-boutique spécialisée dans le matériel librement modifiable.

- Luis Belmar, Itaapy
Luis s’occupe de recherche et développement chez Itaapy et il est le directeur scientifique de Caritat.

 Couverture du livre Web Design For Developers

Je lis régulièrement des livres, et j'ai envie de partager mon avis sur certains d'entre eux. Je vais donc me lancer dans un exercice assez nouveau pour moi : la critique de livres.

Pour commencer, j'ai choisi le livre Web Design For Developers. C'est un livre publié par The Pragmatic Bookshelf qui s'adresse aux développeurs qui souhaitent s'initier au design de sites web. Ça tombe bien, c'est mon cas.

Ce livre explique comment construire le design d'un site web pas-à-pas. On commence par agréger les demandes et faire une esquisse sur papier qui répond à ces demandes. Puis, viennent le choix d'une palette de couleurs et des polices que l'on va utiliser pour le site. On part ensuite dans la partie graphique : création d'un logo et d'une maquette sous photoshop. On attaque alors le coeur du sujet, l'intégration HTML/CSS, avec bien sûr, un chapitre complet dédié au cas particulier d'Internet Explorer 6. Pour finir, on a le droit à des chapitres pour élargir notre horizon : un chapitre sur l'accessibilité (bien que ce sujet soit également abordé tout au long du livre), un autre sur l'optimisation d'un site pour les mobiles, etc.

Globalement, ce livre aborde de nombreux sujets sans demander de connaissance a priori des lecteurs. Il est donc très facile de prendre ce livre et de suivre chaque étape de la construction du site web d'exemple. On y trouve un grand nombre de conseils faciles à appliquer, et généralement très pertinents.

Pourtant, Web Design For Developers me laisse une impression mitigée. J'ai vraiment appréciés certains chapitres, mais d'autres m'ont laissé sur ma faim. Le chapitre sur le SEO m'a même semblé à coté de la plaque (la moitié du chapitre parle de la balise meta keywords, alors que celle-ci est ignorée par de nombreux moteurs de recherche). Je regrette également que le site d'exemple ait au final un design assez décevant.

Au final, je pense que ce livre est une bonne introduction au design web, mais qu'il ne faut pas attendre de miracles. Il vous fera découvrir les problématiques, mais ce sera à vous de creuser chacun de ces sujets si vous voulez vraiment créer un design vraiment réussi.

AF83 est fier de sortir ErrorNot. ErrorNot est un service web open source sous licence AGPLv3. Le but de ErrorNot est de gérer les exceptions levées par vos applications. ErrorNot s'inspire fortement de l'application Hoptoad.

J'ai ainsi fait découvrir ErrorNot ce matin au sein d'AF83 grâce à nos fameux ateliers du lundi. Vous pouvez trouver les slides sur http://showoff-errornot.heroku.com/.

Le code est disponible sur ErrorNot (github). Essayez-le et remontez-nous les bugs pour que nous puissions l'améliorer.

Plus de détails à suivre...

books

Javascript avancé

Vision Media a publié un ebook sur le javascript avancé. Il ne coûte que 4$ canadien (moins de 3€), mais j'ai appris pas mal de choses avec sur le langage javascript lui-même (pas le DOM). Ses 64 pages sont découpées en 6 chapitres :

  • Closures, Scope & Context
  • Prototypal Inheritance
  • Advanced Meta-programming Techniques
  • Behavior Driven Development with JSpec
  • Creating a jQuery Clone
  • Tools of the Trade

Si vous souhaitez mieux comprendre le javascript, pour l'utiliser avec Node.js par exemple, ça serait vraiment dommage de passer à coté.

http://www.dev-mag.com/2010/02/18/advanced-javascript/

Rails 3 Upgrade Handbook

Jeremy McAnally a écrit un ebook de 120 pages avec tout ce qu'il faut pour passer une application à Rails 3 (actuellement en beta). La plupart des informations sont disponibles ailleurs, sur le site officiel ou des blogs, mais il est très difficile d'avoir une vue synthétique de l'ensemble des modifications. Le prix de cet ebook, 12$, se justifie très simplement par le temps gagné. Vous aurez toutes les informations sous les yeux pour faire votre migration, et la liste des points à ne pas oublier est vraiment très pratique. Pour ma part, je ne regrette absolument pas cet achat.

http://www.railsupgradehandbook.com/

Contribuer en retour à l'Open Source

Ryan Bates a lancé une initiative qui va être, je l'espère, suivie par de nombreux développeurs. L'idée est simple : on utilise régulièrement des Logiciels Libres, notamment des plugins ou gems pour Ruby on Rails, et il est souhaitable de participer à cet effort. Pour cela, Ryan Bates propose une méthode :

  1. Trouver votre projet Rails le plus important
  2. Lister tous les plugins et gems que vous utilisez sur ce projet
  3. Pour chacun, faites une contribution avec, au choix :
    • Donner de l'argent
    • Corriger un bug
    • Ajouter de la documentation
    • Ou, tout simplement, remercier son auteur

Je compte sur vous pour faire la différence en faveur de ses plugins et gems Libres.

http://railscasts.com/give_back

Internet pipes

Le web évolue en permanence. Certaines tendances ne sont que des effets de mode passagers, tandis que d'autres transforment de manière profonde le web. En particulier, ces évolutions peuvent amener de nouvelles façons de concevoir et construire les sites web.

En ce moment, nous entendons de plus en plus parler de « web temps réel ». Cette dénomination est assez floue, mais derrière elle, on peut retrouver le fait que l'information navigue rapidement et relativement facilement entre le sites web : google va récupérer dans google buzz vos images en provenance de flickr et picasa, de nombreux sites intègrent des flux twitter, même ce blog récupère de l'information en provenance de github et de delicious.

Cette approche a des conséquences techniques non-négligeables. Les sites web ne sont plus juste un intermédiaire entre une base de données et des utilisateurs, mais sont de plus en plus obligés de se communiquer entre eux. Or, la communication entre deux sites web est un phénomène assez lent à cause de la latence. Cette lenteur est toute relative : en générale, c'est de l'ordre de quelques centièmes de secondes. Pourtant, cela a un impact énorme sur des applications web qui étaient jusque là capable de générer une page web en moins d'un dixième de seconde.

Les frameworks actuels comme Ruby on Rails ou Django reposent leurs capacité à encaisser un trafic conséquent sur cette rapidité, mais quand ils se retrouvent littéralement à piétiner en attendant que d'autres sites web répondent, cela peut rapidement devenir le drame : le site s'engorge puis finit par ne plus répondre.

La solution existe et est bien connue : il faut changer de paradigme de scalabilité au profit d'architectures asynchrones. L'idée est simple : quand un site web attend la réponse d'un autre site web, il va en profiter pour commencer à répondre à un deuxième client, puis à un troisième, un quatrième, etc. Il va alors se retrouver à gérer un certain nombres de requêtes en parallèle.

Ça ne paraît pas très compliqué, mais pour le développeur, c'est l'enfer : il doit savoir quand il peut traiter une requête, quand il doit passer la main, éviter à tout prix de mélanger les données de l'un avec celle de l'autre, etc. À l'heure actuelle, ce style de programmation est vraiment très exigeant, et une erreur est très vite arrivée.

Heureusement, des personnes ont décidées de s'attaquer à ce problème et de proposer des outils pour simplifier ça. Les frameworks Event-Driven commencent à apparaître, mais cela demande de mettre en place de nouvelles API, d'apprendre de nouveaux réflexes aux développeurs.

Par exemple, là où un simple tweets = Twitter::Base.new(credentials).user_timeline aurait suffit pour récupérer les tweets d'un utilisateur (en Ruby avec le gem twitter), il faut utiliser une approche bien plus compliquée dans un monde asynchrone (exemple libre) :

  1. var tweets = []
  2. new Twitter(credentials).addListener('tweet', function(tweet) {
  3.     tweets.push(tweet);
  4. }).addListener('close', function() {
  5.     // Faire quelque chose d'intéressant avec les tweets ici
  6. });

Comme on peut le voir, le code intéressant doit maintenant se trouver à l'intérieur de la fonction de callback passée à close. On va alors avoir tendance à imbriquer des fonctions dans d'autres fonctions, elles-mêmes imbriquées dans d'autres fonctions, et ainsi de suite. Au final, cela le rend le code difficilement lisible, et assez peu flexible.

Les créateurs de frameworks sont à la recherche de solutions pour proposer des API plus agréables à utiliser. EventMachine, coté Ruby, et Tornado, coté Python, essayent d'encapsuler le tout dans des classes. Cela donne un code relativement lisible, mais très verbeux (trop à mon goût) :

  1. class MainHandler(tornado.web.RequestHandler):
  2.     @tornado.web.asynchronous
  3.     def get(self):
  4.         http = tornado.httpclient.AsyncHTTPClient()
  5.         http.fetch("http://friendfeed-api.com/v2/feed/bret",
  6.                    callback=self.async_callback(self.on_response))
  7.  
  8.     def on_response(self, response):
  9.         if response.error: raise tornado.web.HTTPError(500)
  10.         json = tornado.escape.json_decode(response.body)
  11.         self.write("Fetched " + str(len(json["entries"])) + " entries "
  12.                    "from the FriendFeed API")
  13.         self.finish()

D'autres frameworks comme Node.js tâtonnent encore. Cela se voit par exemple sur ce long de fil de commentaires, qui a amené à la suppression des Promises dans node-v0.1.30. L'article "Do" it fast! est également une réflexion très intéressante sur le sujet.

Une des solutions possibles est de s'inspirer du modèle de passage de messages proposé par Erlang ou des chans et goroutines de Go :

  1. c := make(chan int)  // Allocate a channel.
  2. // Start the sort in a goroutine; when it completes, signal on the channel.
  3. go func() {
  4.     list.Sort()
  5.     c <- 1  // Send a signal; value does not matter. 
  6. }()
  7. doSomethingForAWhile()
  8. <-c   // Wait for sort to finish; discard sent value.

Pour conclure, je dirais que la seule chose qui est sûr aujourd'hui, c'est que les frameworks de demain seront asynchrones et proposeront des API adaptées à ce nouveau fonctionnement, mais pour le moment, nous n'en sommes encore réduit à explorer les différentes possibilités.

Some times ago, I was trying to re-synchronize subtitles and video whithin VLC player, the typical : "150 ms after ... erf, 50 ms before, that's it ! no ... it's still desynchronized ...".

After giving up, and by curiosity, I opened the file, and found that the SubRip format is, in fact, quite simple. Just for trying, I read and displayed them in a browser. This is the way SubRipReader was born, using Mootools 1.2.

Unfortunately, it won't resolve my initial problem. But it's still able to load the subtitles through an Ajax request, to parse them, and to display them step by step, into a DOM element.

It supports :

  • play / pause states
  • overlapping subtitle levels : when several lines of texts should be displayed at the same time, each one took a different css class :
    1. 2
    2. 00:00:15,000 --> 00:00:25,000
    3. A text
    4.  
    5. 3
    6. 00:00:20,850 --> 00:00:30,000
    7. An other text

    For instance, the previous subtitles lines will be injected in DOM and could be displayed like that, depending of your custom styles :

    1. <div class="overlapping0"><p>A text</p></div>
    2. <div class="overlapping1"><p>An other text</p></div>

    subtitles screenshot

For playing subtitles, use Srt.Parser and Srt.Reader :

  1. var myReader = null;
  2.  
  3. var myParser = new Srt.Parser({
  4.     url: 'test.srt', // the subtitle file url
  5.     onComplete: function(data) {
  6.         myReader = new Srt.Reader(data, {
  7.             container: 'mysubtitlecontainer', // where to display subtitles
  8.             time_container: 'mytimecontainer' // where to optionnaly display the internal timer state
  9.         });
  10.     }
  11. });

Then, you should be able to call the start and pause actions :

  1. myReader.start();
  2. myReader.pause();

I've just seen about the Universal Subtitle Format, it's going to be the time to implement its own parser !