Archives pour la catégorie Non classé

BlendWebMix, ma conf et mes impressions

Je ne suis pas encore rompu à l’exercice du blog corpo vs. blog perso donc je me permets le double-post, juste pour rappeler que ma conférence au BlendWebMix s’est plutôt bien passée, et que tout est en ligne :

Il ne manque que la vidéo, qui devrait être mise en ligne bientôt (suivez donc @BlendWebMix pour plus d’infos).

Et sinon pour parler d’autre chose que de mon retour en tant que speaker, en tant que participant c’était vraiment un bon événement. Organisation au top, les flux de migrants spectateurs étaient très bien gérés, il n’y a pas eu de retards. Le Centre de congrès est toujours un peu trop grand à mon goût, mais ça plaira à d’autres. La bouffe était cool, et retrouver les copains est toujours un bonheur.

Je regrette quand-même l’augmentation du prix qui en a repoussé pas mal dans mon entourage alors que ça valait vraiment le coup. J’espère que l’année prochaine sera plus raisonnable, perso ça m’a fait un peu tiquer quand j’ai vu les panneaux luxueux, les bonnes bouteilles de vin… c’était agréable, ça donne une bonne image, mais si mes copains n’ont pas pu venir à cause de ce genre de chose, c’est ballot :/

Parce que l’événement lui-même est pour moi devenu un incontournable qui a trouvé son équilibre entre tech et non tech en satisfaisant tout le monde, et c’était pas gagné (l’année dernière, j’avais été frustré par la partie tech). Well done!

*Breaking New* Streams & 0.9.8: objectMode!

C’est tout frais ça vient de sortir dans la 0.9.8, le support des objets autre que des String ou des Buffer dans les streams !

Tiens pour changer je vais mettre les exemples en coffee-script 😉 (je n’aime pas particulièrement, mais c’est utile d’en voir de temps en temps, vue sa popularité il faut bien s’habituer).

Rappelez-vous, notre classe ArrayReadStream :

class ArrayReadStream extends stream.Readable
        constructor: (array) ->
                super {objectMode: true}
                @_array = array
                @_index = 0
        _read: (n, cb) ->
                process.nextTick =>
                        if @_index < @_array.length
                                cb null, @_array[@_index++]
                        else
                                cb null, null

Imaginons qu’on l’utilise pour un tableau d’objet (exemple typique du résultat qu’on aurait voulu avoir avec un client SQL) :

array = [{name: 'John Smith'}, {name: 'John Williams'}, {name: {first: 'John', last: 'Rambo'}}]
 
s = new ArrayReadStream array
 
s.pipe process.stdout

La nouveauté c’est l’option « objectMode«  qui permet d’activer le support des objets directs.

Jusqu’à la 0.9.7 comprise, Ce code ne fait rien. En effet, les données retournée par _read n’étant ni des Buffer ni des String la lecture s’arrête (sans erreur, ce que je trouve un peu moche d’ailleurs…).

En 0.9.8 en revanche ce code va planter :

[…]
TypeError: invalid data
    at WriteStream.Socket.write (net.js:565:11)
[…]

C’est parce que d’un coup process.stdout se prend dans la tête un truc qu’il ne sait pas écrire. Des objets autre qu’un Buffer ou une String ?

Lire la suite

Authentification WebSocket avec les sessions Express 3.x et Socket.IO

Suite à mon premier article complet sur le sujet (« Authentification et WebSocket, avec Node.JS, Express, et Socket.IO »), beaucoup m’ont signalé que les exemples ne fonctionnent plus avec Express 3.x. C’est pas tout ça mais Express est quand-même officiellement en version 3 depuis un petit moment, donc il était grand temps de mettre à jour le code !

Je vous encourage à consulter les commentaires de l’article original (merci à Laurent et Will pour leurs discussions sur ce thème) pour de plus amples informations sur les petites surprises qu’on peut rencontrer 😉

J’en profite pour vous décrire l’intégralité de la manœuvre pour que vous voyez un cas de migration Express 2→3, avec des petites astuces en passant :) Le code est dispo sur github, et chaque étape est accompagnée d’un lien vers le commit correspondant.

Lire la suite

Varnish & les Edge Side Includes pour faire du cache partiel de page

ESI – ou Edge Side Includes – est une solution de mise en cache partiel de page. L’idée générale est d’avoir des « portions » de la page qui sont servis avec différentes règles de mise en cache que le reste de la page.

On peut imaginer une page qui sera mise en cache dans sa globalité, sauf le petit widget « panier » qui lui ne sera pas mis en cache. Une problématique extrêmement fréquente et qui empêche généralement toute mise en cache, alors qu’on n’a qu’un tout petit morceau de la page qui est réellement dynamique :(
L’idéal serait alors que la page soit mise en cache complètement, et que sa partie dynamique soit simplement identifiée par un « marqueur », et que la navigateur aille chercher le contenu de ce « marqueur » à une autre adresse, qui elle a une politique de mise en cache différente.

Et bien c’est ce que propose ESI :) Le marqueur en question est un tag XML <esi src="adresse du morceau de page à rendre" />. Par contre les navigateurs ne comprennent pas ce langage directement, il faut donc ajouter entre les deux un « proxy cache » qui lui saura interpréter ces portions, et rendre au navigateur le résultat final.

Lire la suite