Agenda :
Rappel de lâoffre mobilitĂ© OCTO :
OCTO travaille sur la mobilitĂ© depuis 3 ans avec une Ă©quipe capable dâadresser les projets de lâidĂ©e au store (ergonomes, designers, dĂ©veloppeurs, experts, architectes) qui permet dâaccompagner au mieux ses clients.
OCTO met le focus sur deux types dâactivitĂ©s :
En complĂ©ment, OCTO propose Ă ses clients une solution pour distribuer leurs applications en interne, sous forme dâun store privĂ© sur le Cloud : Appaloosa (lien).
Les tablettes : quels usages pour quels enjeux ?
Il sâest vendu cette annĂ©e plus de tablettes (1,45 millions) que de PC de bureau (1,24 millions) pour les particuliers. 2012 laisse prĂ©sager 3 millions de tablettes vendues, donc de se rapprocher des ventes de portables (4 millions en 2011)
Pourquoi cet engouement et notamment par les usagers en entreprise ?
Les tablettes présentent de nombreux avantages :
En moyenne les utilisateurs utilisent une tablette plus de 90 minutes quotidiennement : dans le salon le soir, le matin au petit-dĂ©jeuner, lors de temps dâattente ou avant de dormir. Ce sont des moments privilĂ©giĂ©s pour capter lâattention de lâutilisateur.
Lâutilisateur type de la tablette est un homme, dâenviron 35 ans, aisĂ© et plutĂŽt geek.
Un support qui capte l’attention, un utilisateur aisĂ©, c’est une excellente opportunitĂ© pour capter le consommateur et pour diffuser ses services en B2C. Ainsi, en quelques mois la SNCF a Ă©coulĂ© plus de 100 000 billets par le biais de son application iPad, en valeur c’est 15% de ses ventes sur applications mobiles.
Le marché des particuliers est donc lancé mais on assiste également à une véritable percée sur le marché professionnel :
En effet le PC fait « écran » entre lâutilisateur et les autres, alors que l’on ne peut pas cacher derriĂšre une tablette. Elle redĂ©finit les contours des usages en entreprise : elle devient un outil propice au partage, Ă la collaboration lĂ oĂč le PC se cantonne dĂ©sormais Ă un outil personnel dâanalyse, de rĂ©flexion et de production.
Quelques exemples dâutilisation en contexte professionnel :
Pour tous ces usages la connexion au SI est primordiale.
Les tablettes : quels impacts sur le SI ?
La volontĂ© du top management de moderniser les processus mĂ©tiers existants et dâintĂ©grer de nouveaux outils  aura un vĂ©ritable impact sur la conception de nos SI. Regardons ce que changent les tablettes en comparaison des smartphones et des projets sur un PC traditionnel.
Les tablettes sont-elles équivalentes aux smartphones ?
La rĂ©volution se trouve en fait  dans le type de projets rĂ©alisĂ©s. Le pĂ©rimĂštre mĂ©tier nâest plus aussi restreint quâavec les smartphones (les Ă©quipes sont plus larges, les durĂ©es de projet plus longues).
Un accent particulier doit ĂȘtre mis sur la qualitĂ©, le design et la conception. Une plus grande libertĂ© est rendue possible grĂące aux Ă©crans plus grands des tablettes ; Ă©crans conçus comme un mashup.
Il existe des  enjeux propres aux tablettes :
En conclusion : on assiste Ă une montĂ©e en puissance de nouveaux canaux  (webapps HTML5, tablettes, smartphones, demain tĂ©lĂ©s connectĂ©es, rĂ©frigĂ©rateursâŠ.) et il est impĂ©ratif de garder la maĂźtrise du SI par rapport Ă tous ces nouveaux besoins.
 Table ronde : retours dâexpĂ©rience de Arval, Corsairfly, Axa et BNP Paribas Fortis
Arval : Sébastien Somchit, Head of Interactive Marketing
Le projet a Ă©tĂ© lancĂ© mi 2011 et est parti dâune question posĂ©e : comment amĂ©liorer les relations commerciales ? LâiPad sâest prĂ©sentĂ© comme un Ă©lĂ©ment efficace face aux clients (accĂšs de qualitĂ© Ă une librairie master de docs rĂ©fĂ©rences, de façon sĂ©curisĂ©e et dans un univers brandĂ© Arval).
Fortis : Yvan Pirenne, Manager Internet & Mobile Banking
Lâapplication easy banking a pour but la gestion quotidienne sur mobile des opĂ©rations bancaires..
Axa : Guillaume LemĂȘle, Directeur Conseil & Services Distribution Internet & Marketing
Lâapplication a pour but dâaider les commerciaux Ă la vente dâassurance (ou de banque) sur le terrain : documents facilement Ă portĂ©e de main, mise en gestion automatique.
Corsairfly : Antoine De Kerviler, DSI
Lâapplication doit rĂ©pondre Ă un enjeu de reporting pour le personnel navigant. Il fallait 15 Ă 20 jours pour reporter un problĂšme sur un vol. Le but est maintenant de remonter les informations en 24h et de les traiter grĂące Ă une description catĂ©gorisĂ©e.
Fortis : TrÚs bon marketing Apple (affinité au produit) et les critÚres de sécurité !
Arval et Corsairfly : des tests ont Ă©tĂ© menĂ©s et lâiPad a rĂ©pondu aux attentes.
Axa : le parc applicatif est énorme et la communauté de développeurs est trÚs importante.
Axa : Ă terme un remplacement est envisagĂ© (gain de temps et de praticitĂ© en Ă©pargnant sur les papiers, les temps de remplissage, de saisie post remplissageâŠ)
Fortis : un remplacement de processus trĂšs lourds est envisagĂ© (photocopies, tris, rangementsâŠ)
Axa : Un plan B papier est toujours envisageable si le commercial se heurte Ă la rĂ©ticence dâun client. Mais dans lâensemble ils sont majoritairement ok pour jouer le jeu et franchir le pas du numĂ©rique.
Fortis : ils semblent satisfaits et les gains escomptĂ©s sont Ă mesurer dans deux types dâaction : le conseil et les transactions.
Axa : Les donnĂ©es collectĂ©es ne sont pas gardĂ©es sur lâiPad mais sur le Cloud et un outil de MDM est prĂ©sent pour protĂ©ger ces donnĂ©es.
Corsairfly : Une libertĂ© assez grande est laissĂ©e aux employĂ©s pour jouer, tester et sâapproprier lâiPad mais un focus est fait sur lâimportance de respecter la loi et de faire attention aux vols (aĂ©roport, personnel navigant).
Arval : lâiPad reste un Ă©lĂ©ment statutaire Ă ce jour. Tout le monde nâen a pas dans lâentreprise mais ça ne durera surement pas Ă long terme.
Axa : lâiPad est un Ă©lĂ©ment motivant pour les commerciaux : perçu comme un signe de reconnaissance. Mais câest un outil dont la valeur est intĂ©grĂ©e Ă lâentreprise et qui nâest en aucun cas personnel.
Arval : câest un projet pilote donc pour le moment les commerciaux sont formĂ©s Il faudra ensuite sâadapter (question autour du bring your own device, systĂ©matisationâŠÂ ?)
Corsairfly : il sera dĂ©montrĂ© individuellement que lâiPad est gĂ©nĂ©rateur de valeur
Fortis : il y aura des changements au niveau rĂ©seau. Les employĂ©s sont les meilleurs ambassadeurs de ce produit (mais il est essentiel de le maĂźtriser avant dâen ĂȘtre capable donc un effort sur la formation doit ĂȘtre fait)
Axa : il y a 4500 commerciaux et tout va tourner autour de lâiPad. Les applications doivent donc ĂȘtre faciles dâutilisation ; permettant ainsi dâĂ©viter des formations longues, nombreuses et coĂ»teuses.
AXA : plusieurs millions d’euros.
Fortis : Le gros du budget est parti dans couche de services, interaction avec le SI.
Corsairfly : 60K tout compris pour l’application mĂ©tier + 350 ⏠par an de TCO pour lâiPad
Arval : Câest un outil qui nâest pas conçu Ă l’origine pour du B2B. Peu de productivitĂ© et de compatibilitĂ© avec Office. On doit adapter les documents Ă la tablette.
Corsairfly : Les processus d’Apple sont compliquĂ©s : difficile d’avoir un contrat, difficultĂ© liĂ©e au dĂ©ploiement, aux numĂ©ros de carte de crĂ©dit, etc.
Fortis : lâinaccessibilitĂ© et la rigiditĂ© dâApple. Nous avons eu de nombreux problĂšmes pour obtenir une licence, une application en accord avec nos brief et sans beaucoup de possibilitĂ©s pour interagir.
Fortis : toujours garder lâĆil sur le produit final.
Arval : avoir une vision claire de lâobjectif Ă atteindre et intĂ©grer toutes les fonctions clĂ©s au projet (IT notamment pour les questions sĂ©curitĂ©, synchronisation, data⊠et le marketing).
Corsairfly : Tester en conditions réelles ! Ce qui permettra un REX des personnes concernées.
Axa : câest une opportunitĂ© pour les DSI de porter lâinnovation. Il ne faut pas avoir peur de se tromper, le projet sera enrichi avec les retours dâusage.
Suggestion d'articles :
Depuis trois ans maintenant, NoSQL remet en question le monde centralisĂ© des RDBMS. Les espaces de stockage distribuĂ©s ne sont pour autant pas nouveaux et les banques, les plateformes de jeux utilisent des « grilles de donnĂ©es » pour adresser leurs enjeux de dĂ©bit et de latence.
Quels sont les points communs? les principales diffĂ©rences entre les univers NoSQL et « data grids »?
Suggestion d'articles :
Tous les navigateurs acceptent HTML5 et CSS3 mais tous ne comprennent pas leurs nouvelles fonctionnalitĂ©s. L’usage de nouveaux attributs HTML5 ou de nouvelles propriĂ©tĂ©s CSS3 ne bloquera pas votre navigateur, ce dernier les ignora tout simplement. Un avantage indĂ©niable qui nous permet d’utiliser dĂšs aujourd’hui HTML5 et CSS3 mĂȘme si certains de nos utilisateurs ne disposent pas encore de navigateurs les supportant. Comme je le prĂ©cisais dans l’article Osez renoncer aux vieux navigateurs, il ne faut pas avoir peur d’utiliser des fonctionnalitĂ©s HTML5 et CSS3 car des comportements dĂ©gradĂ©s natifs existent. Quels sont les comportements dĂ©gradĂ©s natifs acceptables ? Comment profiter d’une fonctionnalitĂ© HTML5 ou CSS3 si son comportement dĂ©gradĂ© n’est pas acceptable ? Comment pallier l’absence de support des nouvelles API JavaScript si le navigateur ne les possĂšde pas ?
Les comportements dégradés natifsDes comportements dégradés existent nativement pour la majorité des nouveautés HTML5 et CSS3 lorsque celles-ci ne sont pas supportées par le navigateur. Prenons deux exemples pour illustrer comment les vieux navigateurs se comportent.
HTML5Certaines fonctionnalitĂ©s HTML5 sont des Ă©volutions de fonctionnalitĂ©s existantes, c’est notamment le cas pour les formulaires. Prenons l’exemple des nouveaux types de champs de saisie qui permettent de spĂ©cifier un champ de saisie en tant que champ de saisie e-mail, tĂ©lĂ©phone, date, etc. Cette spĂ©cification permet d’avoir un clavier spĂ©cifique sur les mobiles et une validation adĂ©quate cotĂ© navigateur. Ci-dessous un exemple d’un champ de saisie de type email sur Firefox pour Android 4.

Code original :
1
<input type="email">
Code compris par un navigateur ne supportant pas les formulaires HTML5 :
1
<input type="text">
Si le navigateur ne comprends pas le type (email dans notre cas), le type par dĂ©faut utilisĂ© sera text. Votre formulaire sera donc totalement fonctionnel sur un ancien navigateur, votre utilisateur ne bĂ©nĂ©ficiera pas d’un clavier spĂ©cifique ni de la validation cotĂ© client mais il pourra soumettre le formulaire. Tout le monde peut utiliser votre formulaire et vos utilisateurs qui utilisent un navigateur rĂ©cent bĂ©nĂ©ficieront de fonctionnalitĂ©s intĂ©ressantes sans la moindre charge de dĂ©veloppement.
CSS3On bénéficie également de ces comportements natifs sur les CSS3.
Si vous voyez les coins arrondis, vous ĂȘtes un utilisateur gĂ©nial qui utilise un navigateur rĂ©cent. Sinon mettez Ă jour votre navigateur.
Style original :
1 2 3 4 5 6
.boite-arrondie {
border-radius: 5px;
padding: 5px;
background: #ddd;
border: 2px solid #777;
}
Style utilisé par un navigateur ne supportant pas la propriété CSS3 border-radius :
1 2 3 4 5
.boite-arrondie {
padding: 5px;
background: #ddd;
border: 2px solid #777;
}
Si une propriĂ©tĂ© n’est pas comprise, elle est tout simplement ignorĂ©e par le navigateur et les coins sont rectangulaires. Sans les CSS3, il nous faudrait 1 Ă 6 images afin de reproduire ce rendu, ce qui en terme de performance n’est pas anodin ni en terme de complexitĂ© de code ajoutĂ©. Est-ce inacceptable de se priver des coins arrondis sur les anciens navigateurs ? Est-ce pertinent de passer du temps et augmenter la complexitĂ© du code ? Il est important de se poser ces questions pour les nouvelles fonctionnalitĂ©s CSS3 qui vous intĂ©ressent.
Ce comportement est notamment trĂšs utilisĂ© par les navigateurs qui prĂ©fixent les propriĂ©tĂ©s lorsque l’implĂ©mentation n’est pas finale. L’utilisation des prĂ©fixes sur certaines propriĂ©tĂ©s n’est pas utile lorsque les navigateurs supportent la propriĂ©tĂ© sans prĂ©fixe depuis plusieurs versions. Des sites comme Can I Use et CSS3 Generator vous permettront de voir si les prĂ©fixes sont indispensables. Ils sont inutiles pour border-radius mais impĂ©ratifs pour les gradients :
1 2 3 4 5 6 7
.fond-degrade {
background: -moz-linear-gradient(top, #1e5799 0%, #7db9e8 100%);
background: -webkit-linear-gradient(top, #1e5799 0%,#7db9e8 100%);
background: -o-linear-gradient(top, #1e5799 0%,#7db9e8 100%);
background: -ms-linear-gradient(top, #1e5799 0%,#7db9e8 100%);
background: linear-gradient(top, #1e5799 0%,#7db9e8 100%);
}
Et si ce comportement dĂ©gradĂ© n’est pas acceptable ?
Il peut arriver que le comportement dĂ©gradĂ© ne soit pas acceptable et qu’il faille envisager une autre solution. Une approche pourrait ĂȘtre de s’interdire d’utiliser une nouvelle fonctionnalitĂ© car 30% des navigateurs de vos utilisateurs ne la supportent pas. Une mauvaise approche car on nivelle par le bas et on se prive de fonctionnalitĂ©s intĂ©ressantes pour l’utilisateur et le dĂ©veloppeur. L’utilisateur profite d’une meilleure expĂ©rience utilisateur. Le dĂ©veloppeur simplifie et rĂ©duit son code car une partie est implĂ©mentĂ©e par le navigateur.
L’approche Graceful degradationL’approche Graceful degradation consiste Ă profiter des nouvelles fonctionnalitĂ©s et proposer une solution de contournement lorsqu’elles ne sont pas disponibles. Pour cela, la librairie JavaScript Modernizr expose de nombreuses mĂ©thodes permettant de dĂ©tecter le support d’une fonctionnalité HTML5 ou CSS3. On peut ainsi utiliser un Polyfill ou encore, si on dĂ©cide de ne pas implĂ©menter du tout cette fonctionnalitĂ© dans ce cas, alerter l’utilisateur que la fonctionnalitĂ© nâest pas disponible. Un Polyfill est un plugin qui fournit une fonctionnalitĂ© que le navigateur devrait possĂ©der nativement. Une longue liste de Polyfill est rĂ©fĂ©rencĂ©e sur GitHub par Modernizr. Ci-dessous un exemple de champ de saisie textuel avec le nouvel attribut placeholder (texte d’aide dans le champ de saisie lorsque celui-ci est vide).
Code HTML :
1
<input type="text" placeholder="exemple de placeholder" />
Code JavaScript permettant de gĂ©rer le non support de l’attribut placeholder :
1 2 3 4 5
// si le navigateur ne supporte pas placeholder
if (!Modernizr.input.placeholder) {
// ajout du comportement avec un plugin jQuery
$('input[placeholder]').placeholder();
}
L’avantage de cette technique est d’isoler le code liĂ© Ă la solution de contournement. Ceci nous permettra de le supprimer sans crainte lorsque vos utilisateurs n’utiliseront plus de navigateurs ne supportant pas cet attribut.
L’utilisation de la cascade pour les CSSEn CSS3, certaines propriĂ©tĂ©s ont de nouvelles valeurs possibles. Il est alors possible de dĂ©finir deux fois une propriĂ©tĂ© avec deux valeurs diffĂ©rentes. Prenons par exemple une boite avec un fond semi-transparent :
Si votre navigateur est récent, le fond de ce paragraphe est vert et transparent. Sinon il est rouge vif.
1 2 3 4
.fond-avec-transparence {
background-color: #ff0000;
background-color: rgba(0,255,0,0.5);
}
Les navigateurs ne supportant pas CSS3 ne comprendront que la premiÚre valeur donc le fond sera rouge. Quant aux navigateurs supportant CSS3, ils comprendront les deux valeurs. Ils appliqueront donc la derniÚre valeur rencontrée pour la propriété ce qui nous donnera un fond vert avec une transparence de 50%.
Des comportements dĂ©gradĂ©s pour les nouvelles APIs ?HTML5 apporte de nouvelles APIs JavaScript (Web Storage, Geolocation, etc.). Ces APIs sont directement utilisables sans import puisque exposĂ©es par le navigateur. Des erreurs JavaScript seront donc levĂ©es si vous les utilisez alors que votre navigateur ne les possĂšde pas. Aucun comportement dĂ©gradĂ© n’existe par dĂ©faut, c’est Ă vous de tester la disponibilitĂ© de ces APIs avant de les utiliser. Comme pour les balises HTML5 ou le CSS3, Modernizr permet de tester facilement la disponibilitĂ© de ces nouvelles API pour proposer une solution alternative ou non. Un exemple ci-dessous avec l’API localStorage :
1 2 3 4 5
// si le navigateur supporte le localStorage
if (Modernizr.localstorage) {
// stockage d'une valeur dans le Web Storage local
localStorage.setItem("clé", "valeur");
}
Aucune raison de ne plus utiliser HTML5 et CSS3
Des solutions existent pour pallier l’absence de support HTML5, parfois simple et fiable, parfois trop complexe ou trop impactant sur les performances du client. C’est un choix Ă prendre sur la solution de contournement lorsque vous dĂ©cidez d’utiliser HTML5 et CSS3. Le site HTML5 Please pourra vous aider Ă prendre ces dĂ©cisions en vous donnant le support des fonctionnalitĂ©s et en vous conseillant sur leur utilisation. D’aprĂšs les statistiques de StatCounter du mois de janvier, prĂšs de 70% des français utilisent un navigateur rĂ©cent qui supporte relativement bien HTML5 et CSS3. Profitez des nouvelles fonctionnalitĂ©s HTML5 et CSS3, des comportements dĂ©gradĂ©s natifs et ne prĂ©voyez de solution alternative que si c’est indispensable.
Suggestion d'articles :
Le modĂšle relationnel est nĂ© Ă une Ă©poque oĂč l’espace Ă©tait rare, et fut donc conçu pour minimiser le niveau de redondance des donnĂ©es: il Ă©tait plus Ă©conomique de stocker une indirection vers une chaine de caractĂšres que de stocker cette chaine deux fois.
Aujourd’hui, cette contrainte d’espace ne tient plus. On achĂšte un Teraoctet pour 100 dollars, la RAM est abondante, et les disques flash aux performances Ă©levĂ©es vont bientĂŽt rejoindre le prix des disques durs rotatifs.
Deux limitations fondamentales du stockage ont donc disparu: le coût de la redondance et le coût de la non-localité pour le traitement de structures de données complexes. Il est maintenant possible de concevoir de nouvelles bases de données plus riches et plus sûres.
Update in place is a poison apple.
- Jim Gray, Turing Award 1998
Le choix d’une base de donnĂ©es mutables n’est plus optimal. Les bases de donnĂ©es purement fonctionnelles n’existent pas encore, mais je pense que les utilisateurs de bases de donnĂ©es auraient dĂ©jĂ intĂ©rĂȘt Ă envisager le stockage read-only et le versioning manuel.
Que veut-on dire par « base de donnĂ©es mutables »? Il s’agit d’une BDD dans laquelle chaque donnĂ©e peut ĂȘtre modifiĂ©e Ă tout moment, et dans laquelle on ne garde pas l’historique de ses modifications. Les modifications sont faites « sur place », de maniĂšre destructive.
Que veut-on dire par « base de donnĂ©es purement fonctionnelle »? Il s’agirait d’une BDD dans laquelle chaque structure de donnĂ©e serait purement fonctionnelle, c’est-Ă -dire immuable par dĂ©faut et ne ferait rĂ©fĂ©rence qu’Ă des donnĂ©es immuables. Pour prendre une analogie programmatique, cette BDD serait une interface vers des snapshots versionnĂ©s. Une sorte de Git!
Vers une implémentation plus adaptée
Les donnĂ©es d’une BDD mĂ©ritent un traitement diffĂ©renciĂ© en fonction de leurs patterns d’usage. Pourquoi par exemple, chez un grand opĂ©rateur tĂ©lĂ©phonique, devrait-on utiliser le mĂȘme objet « table » pour rĂ©fĂ©rencer les monnaies, gĂ©rer la liste des clients et la liste des appels? Examinons leurs particularitĂ©s. A partir de ces trois exemples simplifiĂ©s nous allons infĂ©rer plusieurs mĂ©canismes fondamentaux d’une base de donnĂ©es purement fonctionnelle.
La liste de référence des monnaies est peu volumineuse. Elle est mise à jour quelques fois par an, tout au plus.
La liste des clients de l’opĂ©rateur est moyennement volumineuse. Elle est mise Ă jour quotidiennement, avec quelques ajouts, suppressions et modifications alĂ©atoires.
La liste des appels est trĂšs volumineuse. Elle est mise Ă jour quotidiennement, mais seulement en insertion.
Nous avons donc au moins trois cas d’usage trĂšs diffĂ©rents. Or dans une BDD classique, ces trois donnĂ©es sont stockĂ©es de la mĂȘme maniĂšre, c’est-Ă -dire sous la forme de listes mutables et indexĂ©es.
Beaucoup d’effort a Ă©tĂ© investi pour amĂ©liorer les performances de ces tables avec le matĂ©riel donnĂ©, mais les solutions proposĂ©es sont encore trĂšs gĂ©nĂ©riques.
Revenons Ă nos trois donnĂ©es. Il est possible de les implĂ©menter autrement, en faisant appel Ă trois types d’objets:
La table des monnaies est l’exemple typique d’une liste simple et immuable. La liste d’aujourd’hui s’appelle la ‘v1′. Si demain une union monĂ©taire est créée en AmĂ©rique du sud, nous crĂ©erons une copie modifiĂ©e qui s’appellera la ‘v2′. Pour des raisons de performance, la v1 et la v2 devront ĂȘtre copiĂ©es intĂ©gralement sur tous les noeuds de la base de donnĂ©es. La performance en update de cette implĂ©mentation est mĂ©diocre, mais toutes les lectures pourront ĂȘtre faites sans aucun mĂ©canisme de synchronisation.
La table des clients est un peu plus volatile. Tous les jours quelques clients arrivent ou s’en vont, et quelques clients existants peuvent modifier leur adresse postale. Nous pouvons stocker la liste des clients comme une liste immuable ‘v1′, accompagnĂ©e par une sĂ©quence chronologique de deltas. D’ici Ă quelques mois, l’accumulation des deltas commencera Ă affecter la vitesse de lecture: il faudra alors matĂ©rialiser la liste, la nommer ‘v287′ et archiver la v1. Dans le cas d’une machine seule, nous retrouvons presque exactement la maniĂšre dont Git stocke son historique. Dans le cas d’un cluster, il est bien sĂ»r prĂ©fĂ©rable de partitionner/sharder cette liste sur tous les nĆuds.
Selon quelle politique va-t-on vouloir archiver une version, la compresser ou la supprimer? Et selon quelles modalités? Chaque utilisateur doit prendre cette décision en fonction de ses besoins métier. Il est agréable, en tout cas, de remarquer que le Data Lifecycle Management est offert sur un plateau par les BDD fonctionnelles.
La table des appels tĂ©lĂ©phoniques est diffĂ©rente. Chaque jour elle reçoit des milliers de nouvelles lignes, lesquelles sont parfaitement indĂ©pendantes des lignes antĂ©rieures. Cette liste est segmentable par journĂ©e, et chacun des segments quotidiens est une liste immuable. Nous devrions en plus partitionner chaque segment de maniĂšre Ă coller Ă la liste des clients: l’ID du client devient alors la clef de partitionnement des appels tĂ©lĂ©phoniques.
En rĂ©sumĂ©, Ă travers ces mĂ©canismes de mise Ă jour, on accepte de consommer un peu plus d’espace disque, et de rĂ©duire la localitĂ© des donnĂ©es (car une nouvelle version ne sera probablement pas Ă©crite Ă cĂŽtĂ© de l’ancienne). Tout cela pour garder une information plus riche.
Remarquez bien que ces trois idĂ©es de versioning s’appliquent aussi bien Ă l’implĂ©mentation d’une nouvelle base de donnĂ©es qu’Ă une implĂ©mentation manuelle, basĂ©e sur les outils d’aujourd’hui.
Conséquences
VoilĂ pour les bases. Observons maintenant les consĂ©quences positives de ces nouveaux choix d’implĂ©mentation.
Il devient possible par exemple:
En l’absence d’ « Ă©tat global », nous offrons aux processus d’alimentation et d’interrogation de la BDD tous les bĂ©nĂ©fices de la programmation purement fonctionnelle. Ces processus deviennent rĂ©fĂ©rentiellement transparents (donc sans effet de bord), d’oĂč une meilleure lisibilitĂ© pour les Ă©quipes de dĂ©veloppement et de maintenance, et une diminution du risque d’erreur. De plus, nous avons la garantie que l’ordre d’exĂ©cution des processus n’a plus aucune importance.
La qualitĂ© de transparence rĂ©fĂ©rentielle nous aide aussi Ă implĂ©menter proprement le pattern Command-Query Separation (CQS), qui conseille de sĂ©parer les processus de requĂȘtage des processus d’Ă©criture. Les nombreux « lecteurs » opĂšrent sur des donnĂ©es immuables, Ă©ventuellement dissĂ©minĂ©es dans un cluster, alors que le processus « modificateur » agit sur les donnĂ©es de rĂ©fĂ©rence pour leurs ajouter des deltas.
Quelles sont les contreparties? Il devient plus couteux de rĂ©aliser de nombreuses modifications alĂ©atoires sur une grande table. Une BDD purement fonctionnelle ne serait donc pas adaptĂ©e Ă la table d’inventaire d’Amazon, mĂȘme si l’usage de disques SSD permettrait d’annuler une grande partie de la dĂ©gradation de performance.
Remarquez encore une fois qu’une grande partie de ces bĂ©nĂ©fices/contreparties s’applique telle quelle dans le cas d’un versioning manuel.
Conclusion
Le choix historique d’implĂ©menter les BDD Ă l’aide de donnĂ©es mutables n’est plus optimal. Le besoin de protĂ©ger les mises Ă jour dans un environnement concurrent nuit Ă la scalabilitĂ©, et l’absence d’historique et de points de retour rend toute manipulation pĂ©rilleuse.
Une base de données purement fonctionnelle serait intrinsÚquement plus sûre, et offrirait une meilleure scalabilité pour de nombreuses applications. En outre, ses besoins seraient tout à fait compatibles avec les bénéfices des disques flash.
Mon pari est qu’une telle base de donnĂ©es va rĂ©ellement exister dans les annĂ©es Ă venir. Le monde acadĂ©mique en parle depuis les annĂ©es 80; voir notamment la thĂšse de Phil Trinder qui avait dĂ©jĂ identifiĂ© les consĂ©quences de la transparence rĂ©fĂ©rentielle dans les bases de donnĂ©es, puis ouvert la voie vers le requĂȘtage monadique (LINQ) avec ses collĂšgues de l’universitĂ© de Glasgow. Il ne lui manquait que du matĂ©riel plus performant.
Aujourd’hui, la startup RethinkDB et la base in-memory HANA utilisent dĂ©jĂ une partie de cette technologie et atteignent de belles performances.
En attendant l’arrivĂ©e et la maturation de ces nouveaux outils, il est dĂ©jĂ possible d’enrichir manuellement nos BDD pour bĂ©nĂ©ficier, en partie, de leurs avantages.
Bibliographie
http://www-03.ibm.com/ibm/history/exhibits/storage/storage_3330.html (Histoire du disque dur IBM 3330)
http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-TN-1997-018.pdf (GénÚse du SQL)
www.cs.ox.ac.uk/files/3404/PRG82.pdf: Phil Trinder « A functional database »
http://www.quora.com/What-would-be-the-main-advantages-of-a-(purely-)-functional-database
http://nathanmarz.com/blog/how-to-beat-the-cap-theorem.html
http://research.microsoft.com/~gray/papers/theTransactionConcept.pdf (ImplĂ©mentations d’une transaction)
Suggestion d'articles :
La dĂ©lĂ©gation de tĂąches en asynchrone est un moyen efficace d’allĂ©ger la charge que subissent nos systĂšmes. En effet, de nombreux cas d’utilisation ne nĂ©cessitent pas d’ĂȘtre exĂ©cutĂ©s de façon synchrone lorsqu’un utilisateur effectue une action ou qu’un Ă©vĂ©nement extĂ©rieur intervient.
Par exemple, lorsqu’il n’est pas nĂ©cessaire de restituer la derniĂšre version des donnĂ©es et que le traitement avant restitution est coĂ»teux en ressources, il est possible de renvoyer des donnĂ©es prĂ©alablement mises en cache et de dĂ©porter en asynchrone une tĂąche de rafraĂźchissement de ce cache.
Un autre exemple concerne les systĂšmes qui mĂȘlent des requĂȘtes fortement consommatrices en ressources (CPU, mĂ©moire, …) et des requĂȘtes peu consommatrices pour lesquelles on va vouloir garantir une latence faible mĂȘme lorsque des requĂȘtes consommatrices sont en cours de traitement. Pour cela, dĂ©lĂ©guer les traitements coĂ»teux Ă des workers via une file de messages peut aider Ă garantir des temps de rĂ©ponse faibles pour les autres requĂȘtes. Cette sĂ©paration est d’autant plus importante sur des systĂšmes qui s’appuient sur des technologies monothreadĂ©es telles que Ruby ou NodeJS (ce dernier a nĂ©anmoins l’avantage de ne pas consommer de ressources/process lorsqu’il effectue des I/O).
Pour rĂ©soudre cette problĂ©matique de dĂ©lĂ©gation de tĂąches, on utilise habituellement une solution comme ActiveMQ ou RabbitMQ. Seulement, lorsqu’il est nĂ©cessaire :
aucune de ces deux solutions ne permet de satisfaire l’ensemble de ces critĂšres. Cet article prĂ©sente une solution possible Ă base de ZeroMQ, Ă©crite en NodeJS et utilisĂ©e pour traiter les deux exemples prĂ©cĂ©dents.
ZeroMQ est une bibliothĂšque rĂ©seau Ă©crite en C++ et qui offre des bindings dans de nombreux langages. Elle procure une couche d’abstraction au-dessus des sockets TCP classiques pour ajouter quelques fonctionnalitĂ©s :
Pour utiliser ces patterns de communication, une socket ZeroMQ est capable de se connecter Ă plusieurs autres sockets ZeroMQ. Le comportement lors de l’envoi d’un message sur une socket ZeroMQ connectĂ©e Ă plusieurs sockets dĂ©pendra du type de cette socket.
DĂ©lĂ©gation de tĂąches scalable et tolĂ©rante Ă la panneBien que ZeroMQ fonctionne sans broker, il peut ĂȘtre nĂ©cessaire de rĂ©introduire dans l’architecture un Ă©lĂ©ment de ce type afin de limiter le nombre de connexions rĂ©seau. Par exemple, dans une architecture de dĂ©lĂ©gation de tĂąches, avec 100 publishers et 100 workers, sans broker, il faudra Ă©tablir 10 000 connexions (100 publishers * 100 workers) qui risquent d’engorger le rĂ©seau. Avec 2 brokers (pour supporter la panne de l’un d’entre eux), il faudra 400 connexions (100 publishers * 2 brokers + 100 workers * 2 brokers).
ZeroMQ propose 2 autres types de sockets qui permettent notamment le routage de messages :
Avec ces différents types de sockets nous pouvons les assembler de la façon suivante pour obtenir notre systÚme de délégation de tùches asynchrones avec les caractéristiques suivantes :
NB : Nous utilisons ici 3 brokers, pour Ă©viter que les workers envoient systĂ©matiquement le mĂȘme type de message au mĂȘme broker (ce qui aurait Ă©tĂ© le cas avec 2 brokers car le worker envoie alternativement un message READY et un message RESULT).
Cette architecture permet de supporter la perte de n’importe quel composant mais aussi d’ajouter des publishers, des brokers ou des workers suivant la charge de tĂąches Ă traiter.
En utilisant une socket de type DEALER du cĂŽtĂ© des publishers, celle-ci Ă©tant connectĂ©e Ă tous les brokers, les messages sont envoyĂ©s en round-robin (par ZeroMQ) vers les brokers (Ă©tapes 1, 2 et 3 Ă partir des publishers). Si un broker venait Ă disparaitre, la socket DEALER continuerait Ă dialoguer avec les brokers restants et lorsque le broker perdu serait de nouveau accessible, ZeroMQ se chargera de se reconnecter sur ce broker qui rĂ©intĂšgrera alors le cycle de round-robin d’envoi de messages.1 2 3 4 5 6 7 8
var broker = zeromq.createSocket('dealer');
["tcp://broker1:5555",
"tcp://broker2:5555",
"tcp://broker3:5555"].forEach(function(address) {
broker.connect(address);
});
...
broker.send("task data");
1 2 3 4 5 6 7 8 9 10
var publishers = zeromq.createSocket('router');
publishers.on('message', function() {
// Process messages from publishers
var publisher_id = arguments[0],
task_data = arguments[1];
// Store in a queue
...
});
publishers.bindSync("tcp://*:5555");
Du cÎté workers, ces derniers se connectent à tous les brokers via une socket DEALER. Ils envoient un message de type READY (en utilisant une frame) pour récupérer une tùche disponible sur les brokers (étapes 1 et 4 à partir des workers). Le type du message est géré dans le code applicatif et non pas par ZeroMQ. Il permet au code applicatif du broker de différencier les messages en provenance des workers :
En utilisant une socket DEALER, les messages seront donc alternativement envoyĂ©s sur l’un ou l’autre des brokers et la socket gĂ©rera la perte d’un broker.
Le message envoyé par un worker pour récupérer une tùche ressemble donc à :
Le code du worker :
1 2 3 4 5 6 7 8
var broker = zeromq.createSocket('dealer');
broker.on('message', function() {...});
["tcp://broker1:5555",
"tcp://broker2:5555",
"tcp://broker3:5555"].forEach(function(address) {
broker.connect(address);
});
broker.send(READY);
Le code du broker devient alors :
1 2 3 4 5 6 7 8 9 10 11 12 13
var workers = zeromq.createSocket('router');
workers.on('message', function() {
// Process messages from workers
var worker_id = arguments[0],
message_type = arguments[1]; // READY
if (message_type == READY) {
// dequeue tasks
var task, publisher_id = ...;
workers.send(worker_id, publisher_id, task);
}
});
workers.bindSync("tcp://*:5555");
Le worker (celui qui a envoyé un message READY) reçoit alors le message (étape 2 à partir du broker1) suivant contenant la tùche à exécuter :1 2 3 4 5 6 7
broker.on('message', function() {
// Process task messages from broker
var publisher_id = arguments[0],
task_data = arguments[1];
// process task
...
});
Cette architecture permet aux workers de renvoyer une rĂ©ponse au publisher si l’on veut par exemple que le publisher rĂ©ponde de façon synchrone sans pour autant accaparer le CPU et bloquer les requĂȘtes suivantes (cas de NodeJS ici). Le cheminement inverse s’effectue alors de la façon suivante :
Le worker envoie un message contenant le résultat via sa socket DEALER vers les brokers (toujours en round-robin et suivant la disponibilité de ces derniers) en utilisant une frame pour spécifier un type de message RESULT (étape 3 à partir des workers) :
Code du handler de traitement des messages par un worker :
1 2 3 4 5 6 7 8 9 10 11 12
broker.on('message', function() {
// Process task messages from broker
var publisher_id = arguments[0],
task_data = arguments[1];
// process task
...
// Send a result to the publisher
broker.send(RESULT, publisher_id, result);
// Send READY message to get a new task
broker.send(READY);
});
L’identifiant du publisher Ă l’origine de la tĂąche Ă©tant toujours prĂ©sent dans le message, il est possible de lui envoyer le message suivant sur la socket ROUTER sur laquelle sont connectĂ©s les publishers. La socket routera alors le message vers le bon publisher :
Le handler des messages en provenance des workers devient alors :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
workers.on('message', function() {
// Process messages from workers
var worker_id = arguments[0],
message_type = arguments[1], // READY or RESULT
publisher_id = arguments[2],
result = arguments[3];
if (message_type == READY) {
// dequeue tasks
var task, publisher_id = ...;
workers.send(worker_id, publisher_id, task);
} else if (message_type == RESULT) {
publishers.send(publisher_id, result);
}
});
le publisher reçoit alors le message contenant le résultat sur sa socket DEALER (étape 4 à partir du broker2) :1 2 3 4 5
broker.on('message', function() {
// Process messages from broker
var result = arguments[0];
...
});
Comme nous avons pu le constater, ZeroMQ permet d’Ă©laborer une solution adaptĂ©e Ă ses besoins en combinant les diffĂ©rents types de sockets disponibles (d’autres exemples sont accessibles dans le guide ZeroMQ). Cette souplesse vient tout de mĂȘme au prix d’une certaine complexitĂ© puisqu’il faut Ă©laborer son propre protocole (en utilisant les frames des messages ZeroMQ) et traiter quelques sujets qui n’ont pas Ă©tĂ© abordĂ©s dans cet article comme la gestion des timeouts. Par exemple, lorsqu’un broker reçoit avec succĂšs un message READY mais ne peut rĂ©pondre au worker en raison d’une coupure rĂ©seau ou d’un crash du broker, dans ce cas lĂ , sans timeout, le worker pourrait attendre indĂ©finiment que le broker lui renvoie une tĂąche Ă exĂ©cuter.
ZeroMQ offre aussi de trĂšs bons rĂ©sultats concernant les performances, que ce soit la latence ou le dĂ©bit de transmission des messages. Ceci en fait une bonne solution pour les systĂšmes devant traiter de gros volumes de messages (en nombre ou en taille). Il est cependant moins adaptĂ© lorsque l’on ne peut pas se permettre de perdre des messages : dans l’exemple de cet article, la file de messages est n’est pas persistĂ© sur le broker et ZeroMQ ne gĂšre pas de transaction; un message envoyĂ© aux brokers n’est donc pas garantir d’atteindre un worker ou un publisher si un broker crash.
Suggestion d'articles :
Un prĂ©cĂ©dent article a exposĂ© les grands principes de la sĂ©rialisation avec Thrift et Procotol Buffers. Ces deux frameworks promettent notamment une reprĂ©sentation des messages optimisĂ©e en termes de taille, ce qui est avĂ©rĂ© dans le benchmark JVM Serializers : Thrift et Protocol Buffers y obtiennent une rĂ©duction de taille du message de 73% par rapport Ă la sĂ©rialisation native Java. Ce benchmark regroupe par ailleurs de nombreux autres frameworks de sĂ©rialisation du monde Java, mais se limite toutefois Ă l’utilisation d’un unique message de test.
Le prĂ©sent article analyse l’influence de la structure (nombre et taille des objets, complexitĂ© de la grappe) sur la compacitĂ© du message sĂ©rialisĂ© pour Thrift et Protocol Buffers. La comparaison est rĂ©alisĂ©e en Java, son protocole de sĂ©rialisation standard servant de rĂ©fĂ©rence.
Afin d’Ă©valuer diverses structures de messages, le prototype utilise une structure arborescente. Traditionnellement, ce type de structure est rĂ©cursif. Cependant, il n’est pas compatible avec la limitation de Thrift sur la dĂ©claration avancĂ©e abordĂ©e dans le prĂ©cĂ©dent article.
La profondeur a donc Ă©tĂ© arbitrairement limitĂ©e au niveau 6, soit 127 nĆuds au maximum pour un arbre binaire complet. Il y a un type diffĂ©rent par profondeur, de Node0 pour la racine Ă Node6 pour les feuilles les plus basses. Les arbres gĂ©nĂ©rĂ©s le sont selon trois paramĂštres :
La construction des arbres se fait rĂ©cursivement et Ă©quitablement entre les fils d’un nĆud. Ci-dessous trois exemples d’arbre Ă 5 nĆuds avec, de gauche Ă droite, des tailles de fratries de 1, 2 et 3. Les numĂ©ros sont prĂ©sents Ă titre indicatif et indiquent l’ordre de crĂ©ation des nĆuds par l’algorithme de construction.

Les dĂ©clarations dans les IDLs Thrift IDL et Protocol Buffers language sont disponibles en fin d’article. Les versions utilisĂ©es sont 0.8.0 pour Thrift, 2.4.1 pour Protocol Buffers et HotSpot 1.6.0_29 pour la JVM.
Impact du nombre d’objets du messageDans un premier temps, la complexitĂ© est fixĂ©e au minimum :
En effet, si la cardinalitĂ© des fratries est supĂ©rieure au nombre de nĆuds n, on obtient un arbre Ă deux niveaux, une racine Node0 et n-1 enfants Node1. Les 1024-trees de cet article ont tous cette structure car n est toujours infĂ©rieur Ă 1024.

Tracer la taille du message sĂ©rialisĂ© en fonction du nombre de nĆuds donne le graphe suivant :

Aussi bien sur cet histogramme que sur les suivants, une barre plus basse correspond systĂ©matiquement Ă un meilleur rĂ©sultat et l’ordre des barres (de gauche Ă droite) correspond Ă celui de la lĂ©gende (de haut en bas).
Sur ce premier graphique, on retrouve un constat du benchmark Java Serializers, mais dans un contexte de message plus complexe : Thrift et protobuf ont des performances trĂšs proches.
Le graphique ci-dessous rapporte leurs rĂ©sultats Ă ceux de la sĂ©rialisation Java. On constate que leur avantage en termes de taille de message s’amenuise Ă mesure que l’arbre grossit.

Sur le graphique suivant, on observe que la taille moyenne d’un nĆud dĂ©croĂźt rapidement pour la sĂ©rialisation Java. En effet, le protocole de sĂ©rialisation Java ajoute aux informations du message lui-mĂȘme la description des classes sĂ©rialisĂ©es. Ce surcoĂ»t, important pour un petit message, devient nĂ©gligeable pour des messages constituĂ©s de nombreux objets du mĂȘme type.

Les protocoles de protobuf et Thrift, quant Ă eux, contiennent trĂšs peu d’information de structure : uniquement un identifiant de champ et un type. Ainsi ils voient la taille moyenne d’un nĆud croĂźtre lĂ©gĂšrement, car les listes d’enfants augmentent en nombre et taille quand l’arbre grossit.
Pour ce second test, on fige la structure du message pour mesurer l’influence de la quantitĂ© d’information contenue dans chaque nĆud :

Les résultats concernant la taille du message sont similaires au test précédent, Thrift et protobuf sont trÚs proches et font mieux que la sérialisation Java surtout pour de petits objets.

Figer la structure du message montre que la diffĂ©rence de taille par rapport au protocole de sĂ©rialisation Java est quasi-constante. Ceci est dĂ» au fait que protobuf et Thrift n’apportent aucun gain notable lorsqu’on fait varier la taille de la chaĂźne de caractĂšres.
En effet, les trois protocoles en jeu la sĂ©rialisent sous forme de chaĂźne en UTF8 prĂ©cĂ©dĂ©e de sa longueur. La diffĂ©rence est que le protocole Java utilise 2 octets pour la longueur des chaĂźnes de moins de 2^16 caractĂšres, tandis que les deux frameworks ont recours Ă un varint. Le saut entre 64 et 128 caractĂšres est dĂ» au fait que le format varint n’utilise qu’un octet pour coder les entiers entre 0 et 127, puis deux de 128 Ă 2^14.
Pour Ă©valuer l’influence de la structure du message :
Par exemple, voici les trois variations considĂ©rĂ©es de l’arbre Ă 7 nĆuds :

Le graphique qui suit recense les tailles des messages sérialisés.

Pour tous les protocoles de sérialisation, le comportement est similaire : plus de complexité conduit à un message sérialisé moins compact.
Cela est dû au fait que plus de complexité se traduit par un plus grand nombre de listes de noeuds-enfants. Cependant, la variation reste négligeable (environ 1%) pour Thrift et protobuf.
Le protocole de sĂ©rialisation Java est lui plus fortement influencĂ© (jusqu’Ă 13%). En effet la quantitĂ© d’information utilisĂ©e par les descripteurs de classes est liĂ©e au nombre de types de classes mises en jeu. Plus les fratries sont grandes, moins on utilise de classes diffĂ©rentes. Par exemple, pour 63 nĆuds, le 2-tree utilise toutes les classes de Node0 Ă Node5, le 4-tree s’arrĂȘte Ă Node3, et le 1024-tree Ă Node1.
Le rĂ©sultat particuliĂšrement bon du 2-tree de taille 127 est liĂ© au fait que Node6 n’a pas de liste d’enfants et est donc plus compact que les autres types de Nodes. Dans cet arbre, la majoritĂ© des nĆuds (64) est de type Node6.
Les tailles moyennes par nĆud sont reprĂ©sentĂ©es dans l’histogramme ci-dessous :

L’Ă©volution est conforme aux observations du premier test : l’Ă©cart entre Java et les deux frameworks s’amenuise lorsqu’on augmente la taille du graphe sans pour autant ĂȘtre nĂ©gligeable.
En traçant le gain apporté par les deux frameworks par rapport à la sérialisation Java on obtient :

Par exemple, en considĂ©rant le message du 4-tree Ă 63 nĆuds et un systĂšme devant soutenir une charge de 10000 requĂȘtes/s, le remplacement de la sĂ©rialisation Java par Thrift permet de diminuer le besoin de bande passante de 75.45 Mo/s Ă 40.68Mo/s, soit un gain de 46%.
ConclusionCet article a prĂ©sentĂ© une comparaison portant sur la taille de sĂ©rialisation avec des messages complexes. Par rapport au benchmark JVM-serializers, l’avantage de Thrift et protobuf sur la sĂ©rialisation native Java est moins dĂ©cisif en termes de compacitĂ©, mĂȘme s’il reste intĂ©ressant.
La taille du message sĂ©rialisĂ© par Thrift ou Protocol Buffers n’est pas influencĂ©e par la structure mĂȘme du message. C’est surtout son volume qui a un impact : les deux frameworks offrent une sĂ©rialisation bien plus compacte que celle de Java surtout sur de petits messages. Cette observation rejoint le fait que Protocol Buffers n’est pas particuliĂšrement adaptĂ© aux volumes de donnĂ©es importants.
Il faut rappeler qu’employer la sĂ©rialisation native Java comme rĂ©fĂ©rence n’est lĂ©gitime que parce que cet article se limite aux protocoles de sĂ©rialisation. Thrift et Protocol Buffers offrent d’autres avantages tels l’interopĂ©rabilitĂ© avec plusieurs langages et la compatibilitĂ© ascendante et descendante des messages. Ils sont abordĂ©s dans l’article prĂ©cĂ©dent.
Pour aller plus loin, on pourrait analyser les temps de sĂ©rialisation, l’empreinte mĂ©moire, l’intĂ©gration aux processus de build…
AnnexesVoici la déclaration des objets en Thrift IDL : tree.thrift
namespace java com.octo.example.serialization.model.thrift
enum RoomType {
SINGLE =0,
DOUBLE =1,
SUITE =2
}
struct Node6 {
1: optional i32 number,
2: optional bool even,
3: optional double rate,
4: optional RoomType type,
5: optional string description,
}
struct Node5 {
1: optional i32 number,
2: optional bool even,
3: optional double rate,
4: optional RoomType type,
5: optional string description,
6: list children,
}
[...]
et ainsi de suite jusqu’au Node0, qui correspond la racine de l’arbre. L’ordre employĂ© Ă©vite le recours Ă la dĂ©claration avancĂ©e.
Ci-dessous, l’Ă©quivalent en Protocol Buffers language : tree.proto
package serialization;
option java_package = "com.octo.example.serialization.model";
option java_outer_classname = "LimitedTreeProto";
enum RoomType {
SINGLE =0;
DOUBLE =1;
SUITE =2;
}
message Node0 {
optional int32 number =1;
optional bool even =2;
optional double rate =3;
optional RoomType type =4;
optional string description = 5;
repeated Node1 children = 6;
}
[...]
message Node6 {
optional int32 number =1;
optional bool even =2;
optional double rate =3;
optional RoomType type =4;
optional string description = 5;
}
L’ordre des nĆuds plus naturel est supportĂ© par le compilateur Protobuf.
Suggestion d'articles :
Suite de notre cycle dâateliers dĂ©diĂ©s aux praticiens agiles, avec une nouvelle session au format Open Space le 14 FĂ©vrier de 14h Ă 18h dans les locaux dâOCTO. 3 bonnes raisons dây participer :
Â
1.Un rendez-vous dédié aux acteurs des DSI :
Le calendrier IT agile est dĂ©jĂ plutĂŽt chargĂ©, mais il se compose pour majeure partie de rendez-vous rĂ©servĂ©s aux « experts » de lâagile : gourous, coachs, formateurs, etc. Aucun nâest dĂ©diĂ© Ă ceux qui font au quotidien, câest Ă dire aux Ă©quipes internes au sein des DSI. Or Product Owner, ScrumMaster, MOA, Tech Lead, PMO, tous sont confrontĂ©s Ă des problĂ©matiques rĂ©currentes au sein de leurs projets agiles.
2.De nouvelles pistes pour continuer Ă progresser :
Lâobjectif des Open Spaces est de partager entre pairs vos questions, vos problĂ©matiques, vos doutes, vos convictions et vos retours dâexpĂ©rience :
AprĂšs plusieurs mois, voire plusieurs annĂ©es de pratiques agiles au sein de ses Ă©quipes, il est primordial de lever de temps en temps la tĂȘte du guidon et de considĂ©rer au-dehors les choix que dâautres ont faits.
3.Un support illustré retraçant les échanges :
Comme lors de la premiĂšre session cet automne, VĂ©ronique Olivier-Martin revient pour capter la substantifique moelle de nos Ă©changes et la restituer sous forme dâillustrations sur une fresque murale vĂ©lĂ©da. Chaque participant repartira avec une version numĂ©risĂ©e du croquis dâensemble retraçant lâĂ©volution des Ă©changes au fil de la session et quelques zooms en bonus sur les croquis les plus percutants !
A lâissue de cet atelier, vous aurez pu :
Animateurs :
Christophe Thibaut & Mathieu Gandin : Consultants Seniors et Coachs Agile OCTO
Progamme :
Cliquez ici pour vous inscrire Ă l’Open Space du 14 FĂ©vrier
Suggestion d'articles :
Agenda :
DĂ©finition : « Un systĂšme dâanalyse de donnĂ©es temps rĂ©el est un systĂšme Ă©vĂšnementiel disponible, scalable et stable capable de prendre des dĂ©cisions (actions) avec une latence infĂ©rieure Ă 100ms »
100ms est l’ordre de grandeur retenu lorsque l’on parle de « temps rĂ©el ». Cette valeur permet de prendre les dĂ©cisions dans un temps adaptĂ© au business.
Quelles diffĂ©rences avec lâanalyse traditionnelle ?
Quels intĂ©rĂȘts pour les entreprises ?
Les entreprises sont dĂ©jĂ aujourdâhui confrontĂ©es aux problĂ©matiques de volumĂ©trie. A cela sây ajoute 3 nouveaux facteurs majeurs entraĂźnant toujours plus de donnĂ©es dans nos systĂšmes :
Pourquoi CEPÂ ?
DĂ©finition : Le Complex Event Processing (CEP) est une technique permettant de manipuler des Ă©vĂ©nements au fur et Ă mesure de leur prise en compte, d’identifier des relations entre ces Ă©vĂ©nements (corrĂ©lation, causalitĂ©, patterns), et d’en tirer de l’information sous forme de nouveaux Ă©vĂ©nements dits « dĂ©rivĂ©s » ou « complexes ».
Le CEP apparaĂźt ĂȘtre une opportunitĂ© pour lâanalyse et la prise de dĂ©cision en temps rĂ©el lĂ ou mĂȘme le stockage sur cache/grille de donnĂ©es seul peut montrer ses limites :
Pourquoi faire converger Big Data et CEPÂ ?
LâintĂ©rĂȘt principal du CEP rĂ©side dans le traitement en mĂ©moire de lâĂ©vĂ©nement avant son stockage, afin de conserver une forte rĂ©activitĂ©.
DĂ©tails sur lâanalyse en temps rĂ©el :
Enjeux de lâanalyse en temps rĂ©el :
Lâapproche peut se faire par :
DĂ©mo ActivePivot Sentinel : nous ne sommes pas en mesure de vous proposer les vidĂ©os aujourd’hui ; nous vous proposons de retrouver les dĂ©mos en vidĂ©os plus tard.
Suggestion d'articles :
Une date à retenir ? Oui !  Le mardi 31/01/2012 pour nous faire part de vos idées sur les sujets IT, techniques, métiers ou liés aux aspects managériaux de la DSI !
Pas d’idĂ©e de session ? Aucun problĂšme ! Vous pouvez élire votre session prĂ©fĂ©rĂ©e en votant pour elle !  D’ailleurs vous pouvez aussi la partager  pour augmenter le nombre de vote !
Pour rappel : la qualitĂ© du rĂ©sumĂ© de session proposé (fond et forme) sera le critĂšre de sĂ©lection principal pour l’Ă©quipe USI. Merci donc dâen tenir compte lors du remplissage de ce formulaire.
LâĂ©quipe programme Ă©tudiera toutes les propositions et sĂ©lectionnera les sessions qui lui paraĂźtront les plus intĂ©ressantes. Vous serez peut-ĂȘtre invitĂ© Ă venir prĂ©senter votre session lors dâune journĂ©e dĂ©diĂ©e : mi fĂ©vrier et nous informerons de notre dĂ©cision finale fin mars 2012.
Cliquez ici pour soumettre votre session Ă lâUSI
On attend vos candidatures avec impatience !
Suggestion d'articles :
OCTO organise le mardi 07 fĂ©vrier 2012 Ă partir de 8h45 un petit-dĂ©jeuner gratuit, aux Salons Wagram « L’agilitĂ© Ă grande Ă©chelle » : retour dâexpĂ©rience en partenariat avec Strator.
Un projet de développement logiciel impliquant 80 personnes, distribuées sur 9 équipes réparties dans 4 pays.
Un produit devant soutenir une activité de plus de 5 000 000 de transactions de vente par jour.
Une premiĂšre mise en production au bout de 6 mois.
Et de nouvelles fonctionnalités tous les deux mois.
Qui a dit que lâagile nâĂ©tait pas adaptĂ© aux gros projets ?
Strator et OCTO Technology se proposent de partager avec vous un retour dâexpĂ©rience sur la mise en place de mĂ©thodes agiles Ă large Ă©chelle : feature-teams, communautĂ©s de pratique, interactions avec des Ă©quipes off-shore, livraisons frĂ©quentes et mises en production par un simple clic, prise de dĂ©cisions collaboratives…
A lâissue de ce sĂ©minaire nous aurons partagĂ© avec vous :
Ce petit-dĂ©jeuner sâadresse aux :
Intervenant(s) :
Philippe Chevalier – Strator, Directeur Technique
HervĂ© Lourdin – OCTO, Delivery Manager
Mathieu Despriee – OCTO, Manager
Ce petit-déjeuner est à destination de nos clients et prospects en priorité.
Cliquez ici pour vous inscrire au petit-déjeuner : AgilitéSuggestion d'articles :

Pour la troisiÚme fois cette semaine, Edouard, votre Product Owner, vous a demandé sur quoi vous pouviez vous engager pour cette itération ?
Vous souhaitez annoncer à Sophie du Marketing dans combien de temps votre fonctionnalité principale sera réalisée, mais vos indicateurs actuels vous donnent le vertige ?
Lors du sprint planning, 10 Ă©crans ont dĂ» ĂȘtre estimĂ©s. Vous ĂȘtes dubitatif : quel Ă©cran doit porter le coĂ»t de dĂ©veloppement du premier ?
Dans un autre registre, vous démarrez un projet Agile sur un lourd existant. Comment concilier le manque de tests unitaire avec des itérations rapides ?
LâĂ©quipe mainframe nâest pas Agile, et demande des commandes trois mois Ă lâavance. Est il possible de faire de lâAgile dans ces conditions ?
Je suis manager. Avant, je rĂ©digeais des plannings, et jâattribuais des tĂąches Ă chacun. Quel sera mon rĂŽle dans la nouvelle organisation ?
Vous avez envie dâen parler, venez le mardi 31 janvier Ă lâApĂ©ro Agile dans les locaux d’OCTO !
Autours dâun verre, nous discuterons de pilotage, dâintĂ©ractions avec des projets non agiles, ainsi que de postes et de carriĂšre. Nous parlerons de pratiques, de techniques, et de vos rĂ©ussites.
Que vos Ă©quipes soient dĂ©jĂ Agiles, que vous soyez vous mĂȘme praticien de longue date, ou que vous souhaitiez vous mettre Ă l’Agile prochainement, venez partager avec d’autres pratiquants vos problĂšmes du quotidien afin de les rĂ©soudre ensemble.
L’inscription est ouverte aux 20 premiers :Â http://aperoagile2.eventbrite.com/
Edit : Je suis impressionnĂ© ! Les 20 places sont parties en une soirĂ©e ! Du coup, j’ai ouvert une liste d’attente. Inscrivez vous si vous le souhaitez, vous serez contactĂ©s en cas de dĂ©sistement.
DerriĂšre cette formulation humoristique se cache un des fondements de lâindustrialisation des dĂ©veloppements : le fait de pouvoir tester de maniĂšre automatisĂ©e tout ou partie dâun systĂšme informatique.
Aussi bien dans les architectures complexes que dans les applications les plus simples, il est pertinent de pouvoir tester un composant logiciel unitairement (indĂ©pendamment des autres composants duquel il dĂ©pend) : les dĂ©pendances sont donc « mockĂ©es » ou simulĂ©es en français.
Il est aussi nécessaire de pouvoir créer un contexte favorable au scénario de test en injectant un jeu de données particulier via un automate de tests ou un injecteur.
Le dĂ©veloppement dâapplications Kinect nâĂ©chappe pas Ă cette nĂ©cessitĂ©. Voici comment simuler une Kinect avec la librairie MocKinect.
Pour rappel, la Kinect est un pĂ©riphĂ©rique composĂ© de capteurs optiques (video couleur et infrarouge) permettant de capturer une vue en relief des Ă©lĂ©ments entrant dans son champ de vision. Le SDK (kit de dĂ©veloppement) Kinect intĂšgre une fonctionnalitĂ© d’analyse de l’image et de reconnaissance de forme humaine qui gĂ©nĂšre un « pseudo-squelette ».
Capture des flux venant des capteurs


Pour plus d’informations sur le fonctionnement de la Kinect, consultez l’article Kinect : un tour dâhorizon tout naturellement.
La dĂ©tection de mouvement se basant sur des seuils et des distances, il faut souvent travailler par ajustements successifs. Tester un scĂ©nario dâutilisation Kinect est dâautant plus long et fastidieux pour un dĂ©veloppeur quâil lui faut :
MĂȘme si ce type dâexercice est bon pour la santĂ©, cela ne vaut pas une activitĂ© sportive au grand air et cela impacte fortement la productivitĂ©.
Avec MocKinect, je mâen mock de la KinectPour faciliter mon travail, jâai dĂ©veloppĂ© la librairie MocKinect (http://mockinect.codeplex.com/) qui contrairement Ă son nom nâest pas un mock mais un injecteur (on ne peut pas toujours rĂ©sister Ă un mot-valise).
MocKinect permet dâenregistrer les flux bruts venant des capteurs de la Kinect et de le stocker pour les rejouer ultĂ©rieurement.
La librairie sâutilise en deux temps :
Une fois les enregistrements effectuĂ©s, il est possible dâutiliser MocKinect SANS Kinect. Vous pouvez ainsi intĂ©grer les tests Kinect dans une usine dâintĂ©gration continue et mĂȘme contrĂŽler leur exĂ©cution avec des outils de tests fonctionnels tels que FitNesse ou GreenPepper.
MocKonceptionPour favoriser lâutilisation de cette librairie, jâai voulu limiter les freins inhĂ©rents Ă lâintĂ©gration de nouveaux frameworks en suivant ces deux principes :
Pour cela, jâai optĂ© pour une solution utilisant lâencapsulation. MocKinect est donc composĂ© dâun ensemble de classes reprenant les prototypes des classes du SDK Kinect de Microsoft. Pour lâutiliser, il suffit de remplacer la directive dâinclusion du SDK par celle de MocKinect.
Remplacez:
1
using Microsoft.Research.Kinect ;
Par:
1
using MocKinect;
Le dĂ©clenchement dâun enregistrement ou dâune injection sâeffectue par lâappel Ă la mĂ©thode SetMode.
1 2 3
// Mode proxy kinectRuntime.SetMode(MocKinectMode.Reality); // L'application reçoit les informations issues des capteurs de la Kinect
1 2 3 4
// Enregistrement kinectRuntime.SetMode(MocKinectMode.Record, "SwipeGesture"); // L'application reçoit les informations issues des capteurs de la Kinect // Ces informations sont en mĂȘme temps enregistrĂ©es dans le fichier SwipeGesture
1 2 3 4
// Injection kinectRuntime.SetMode(MocKinectMode.Replay, "PinchGesture"); // La véritable Kinect est désactivée // Les flux précédemment enregistrés dans le fichier PinchGesture sont lus et injecter dans l'application
Lâimpact sur les performances est assez faible et peut ĂȘtre rĂ©duit en optimisant la gestion du tampon (buffer) dâenregistrement des flux. Une application recevant 25 images Kinect par seconde peut voir ce dĂ©bit rĂ©duit Ă 20 images par seconde en utilisant MocKinect.
Appel Ă MocKontributionMocKinect est encore en version bĂȘta et beaucoup de fonctionnalitĂ©s peuvent ĂȘtre rajoutĂ©es pour amĂ©liorer la productivitĂ© des dĂ©veloppeurs dâapplications Kinect.
Parmi celles-ci :
NâhĂ©sitez pas Ă partager vos recommandations ou mâindiquer votre envie dâĂȘtre contributeur afin de mener ce projet à bien.
Dans la mĂȘme veine, la Kinect Toolbox de David Catuhe permet dâenregistrer/rejouer un squelette et fournit de plus un socle de reconnaissance de mouvements (Gestures)
Kinews de derniĂšre minuteAu moment de l’Ă©criture de cet article, Microsoft a annoncé la sortie officielle de la Kinect For Windows. Ce pĂ©riphĂ©rique est similaire Ă la Kinect pour Xbox mais sera dĂ©diĂ© Ă un usage PC. Cette nouvelle Kinect apportera un gain de performance et de prĂ©cision, elle pourra gĂ©rer le « near-mode » (objet Ă 50 cm des capteurs). Son SDK intĂ©grera la reconnaissance de mouvements types et permettra probablement la dĂ©tection prĂ©cise des doigts de la main.
Rendez-vous le 1er février lors de la mise sur le marché de ce nouveau périphérique et les 7-8-9 février pour la conférence Microsoft TechDays.
Suggestion d'articles :
Depuis que les sites web sont devenus des applications riches, le besoin de push sâest largement manifestĂ©. Il est prĂ©sent sur des sites de mails, de feeds dâinformation, de partage de documents, de rĂ©servation de billets avec choix des places⊠Le push web permet de notifier le client dâune certaine information directement depuis le serveur, sans nĂ©cessiter de recharger la page du client. Câest typiquement un paradigme quâon peut utiliser sur un site de messagerie instantanĂ©e.
Plusieurs technologies permettent dâimplĂ©menter ce genre de comportement, les plus connues Ă©tant probablement les WebSockets, les server-sent events (tous deux inclus dans les spĂ©cifications HTML5), ou encore le long polling, du web pull simulant du web push, utile sur certains navigateurs des moins rĂ©cents.
Un précédent article posté sur ce blog présentait le push web implémenté avec Diffusion (article en 2 parties). Nous allons présenter dans cet article une autre solution reposant sur la technologie WebSockets : Pusher.
Pusher se compose dâune API dĂ©veloppĂ©e pour plusieurs langages (Ruby, Ruby on Rails, PHP, et ASP .Net) et dâune Infrastructure as a Service hĂ©bergĂ©e sur Amazon EC2, ce qui lui confĂšre une scalabilitĂ© apprĂ©ciable. Toute l’infrastructure gĂ©rant les connexions WebSockets et les canaux cĂŽtĂ© serveur est implĂ©mentĂ©e par la plateforme cloud Pusher. Il se distigue en cela d’autres frameworks tels socket.io qui implĂ©mentent uniquement la technologie WebSocket avec de nombreux fallbacks en cas d’incompatibilitĂ©, mais laissent la main Ă l’utilisateur sur la mise en place de l’infrastructure.
Dâautre part, la PaaS Heroku ne supportant pas la technologie WebSocket, Pusher propose un add-on permettant son utilisation sur la plateforme de dĂ©ploiement.
Mise en pratique Canal PublicSans plus attendre, passons Ă la pratique en mettant en place un site de messagerie instantanĂ©e, illustration typique de push web. Cet exemple permettra Ă la fois de transmettre des messages Ă tous les utilisateurs connectĂ©s, mais aussi dâafficher la liste de tous les utilisateurs prĂ©sents. La comprĂ©hension de cette article implique des connaissances basiques en Ruby on Rails et en javascript, notamment jQuery. Vous pouvez dâores et dĂ©jĂ trouver une dĂ©monstration de lâapplication finale ici (attention, rendu minimaliste !). Les credentials Ă utiliser sont test@pusher-chat-example.com/tester et test2@pusher-chat-example.com/tester. Tout le code est disponible sur github.
Au prĂ©alable, nous avons dĂ©jĂ mis en place un site dĂ©veloppĂ© en Ruby on Rails, dĂ©ployĂ© sur Heroku, et Ă©quipĂ© de lâadd-on Pusher. La librairie javascript jQuery est Ă©galement ajoutĂ©e au projet. Enfin, le projet est configurĂ© pour utiliser la gem pusher.
Le site dispose dâune page dâaccueil et  dâune page dâauthentification. Tout utilisateur accĂ©dant Ă la page dâaccueil est dĂ©jĂ authentifiĂ©. La page dâaccueil sera celle oĂč nous crĂ©erons le service de messagerie instantanĂ©e.
Pour commencer, nous devons inclure dans notre page le fichier de lâAPI javascript de Pusher. On ajoute donc la ligne suivante dans le fichier html de la page dâaccueil.
index.html.erb :
<%= javascript_include_tag "http://js.pusher.com/1.11/pusher.min.js" %>
Lors de lâajout de lâadd-on pusher depuis Heroku, un compte Pusher nous a Ă©tĂ© attribuĂ©.  Depuis ce compte, nous pouvons rĂ©cupĂ©rer des informations dâidentification pour le dĂ©veloppement et pour la production. Ajoutons ces informations dans les fichiers appropriĂ©s :
config/environments/development.rb :
Pusher.app_id = '13342' Pusher.key   = 'd8d6a55bc5e7ffb81f0e' Pusher.secret = 'my-development-secret-key'
config/environments/production.rb :
Pusher.app_id = '13341' Pusher.key   = '6c786501a9b463e4465d' Pusher.secret = 'my-production-secret-key'
Notre projet est Ă prĂ©sent correctement paramĂ©trĂ© pour utiliser Pusher. Nous pouvons dĂ©sormais crĂ©er une fonction javascript dâinitialisation qui sâabonne Ă un canal de push que lâon appelle « instant-messaging-channel » et ouvre une connexion sur ce canal vers la plateforme cloud de Pusher. Lâapplication est identifiĂ©e auprĂšs de Pusher par lâAPI key. La fonction dâinitialisation est appelĂ©e au chargement de la page.
application.js :
function subscribeToPush() {
 var pusher = new Pusher('d8d6a55bc5e7ffb81f0e');
 var channel = pusher.subscribe('instant-messaging-channel');
}
Pour lâinstant, la clĂ© de lâAPI est Ă©crite en dur dans le code.
Dâautre part, cĂŽtĂ© html, nous ajoutons un formulaire depuis lequel nous pourrons poster un nouveau message aux destinataires, ainsi quâun peu de code « cosmĂ©tique ».
index.html.erb :
<h1>Messagerie Instantanée</h1>
<div id="instant-messaging" data-pusher-key="<%=Pusher.key%>">
<%= form_tag "home/send_message", :remote => true do %>
<%= text_field_tag "message" %>
<%= submit_tag "Envoyer" %>
<% end %>
</div>
On constate quâun attribut data de la balise div permet de communiquer la clĂ© de lâAPI Pusher au javascript. Cela nous permet de rĂ©cupĂ©rer la clĂ© de dĂ©veloppement ou de production via jQuery. On peut ainsi modifier la fonction javascript comme suit.
application.js :
function subscribeToPush() {
var pusher = new Pusher(jQuery('#instant-messaging').attr('data-pusher-key'));
var channel = pusher.subscribe('instant-messaging-channel');
}
Lorsquâon poste un nouveau message par le formulaire, on souhaite maintenant quâil soit diffusĂ© sur le canal et dispatchĂ© entre les diffĂ©rents abonnĂ©s du canal. Lâaction appelĂ©e par la soumission du formulaire est lâaction send_message du contrĂŽleur home. Dans cette action, on rĂ©cupĂšre le contenu du message postĂ© par le formulaire, et on le diffuse sur le canal « instant-messaging-channel ». On dĂ©finit lâĂ©vĂšnement que lâon souhaite diffuser Ă travers ce canal comme du type « new-message ». Les donnĂ©es associĂ©es Ă l’Ă©vĂšnement envoyĂ© sont un hash qui contient ici le message postĂ© avec :message comme clĂ©. On rĂ©pond ensuite par un header http de code 200.
home_controller.rb :
def send_message
message = params[:message]
Pusher['instant-messaging-channel'].trigger('new-message', {:message => message}) unless message.blank?
head :ok
end
Ca nâest pas encore visualisable, mais croyez moi sur parole, nous diffusons Ă prĂ©sent un Ă©vĂšnement sur notre canal « instant-messaging-channel » chaque fois que nous cliquons sur le bouton dâenvoi, et tous les abonnĂ©s de ce canal le reçoivent. LâĂ©vĂšnement, comme lâindique le schĂ©ma prĂ©sentĂ© plus haut, est envoyĂ© depuis le serveur de lâapplication (en lâoccurrence, le serveur Heroku) vers la plateforme Pusher. Cette derniĂšre le redistribue alors vers tous les clients ayant ouvert une connexion avec la mĂȘme clĂ© dâAPI Pusher et le mĂȘme nom de canal.
Il nous reste maintenant Ă capter lâĂ©vĂšnement poussĂ© sur le client et Ă le traiter. Pour cela, nous allons ajouter un callback Ă notre canal. Celui-ci sera appelĂ© chaque fois quâun Ă©vĂšnement de type « new-message » sera poussĂ© sur le canal « instant-messaging-channel ». Nous utiliserons pour ça la fonction bind() de lâAPI javascript de Pusher. Dans notre application de messagerie instantanĂ©e simple, le traitement du callback sera de rĂ©cupĂ©rer les donnĂ©es associĂ©es Ă lâĂ©vĂ©nement, câest-Ă -dire le hash envoyĂ© depuis le contrĂŽleur, et de les afficher les uns Ă la suite des autres. Donc, dans notre mĂ©thode dâabonnement au canal, nous ajoutons les lignes ci-dessous.
application.js :
function subscribeToPush() {
var pusher = new Pusher(jQuery('#instant-messaging').attr('data-pusher-key'));
var channel = pusher.subscribe('instant-messaging-channel');
channel.bind('new-message', function(data) {
jQuery('#instant-messaging').append(data.message + "<br />");
});
}
Et voilĂ Â ! comme disent les amĂ©ricains. Vous avez Ă prĂ©sent une application de messagerie instantanĂ©e, minimaliste certes, mais fonctionnelle. Pour la tester en local, il suffit de sây connecter depuis plusieurs navigateurs diffĂ©rents. Nous pourrions Ă prĂ©sent ajouter devant chaque message lâe-mail de son auteur trĂšs facilement. Il suffirait dâajouter la paire clĂ©/valeur e-mail dans les donnĂ©es associĂ©es Ă lâĂ©vĂ©nement « new-message » lors de son envoi, et de rĂ©cupĂ©rer ce nouveau paramĂštre Ă la rĂ©ception de lâĂ©vĂ©nement pour lâafficher Ă lâendroit qui convient. Le canal utilisĂ© ici est un canal dit public, et son principe reste trĂšs simple.
Canal PrĂ©senceNous allons Ă prĂ©sent voir comment connaĂźtre en temps rĂ©el la liste des diffĂ©rents utilisateurs connectĂ©s au service de messagerie en utilisant un canal de prĂ©sence. Le principe ici est globalement similaire Ă celui du canal public, mais il sâen distingue par quelques subtilitĂ©s ayant leur importance.
LâidĂ©e est la suivante. Lorsquâun client se connecte Ă Pusher, un token unique pour lâutilisateur et lâapplication est gĂ©nĂ©rĂ© et lui est attribuĂ©. Lorsque ce mĂȘme client souhaite sâabonner Ă un canal de prĂ©sence (ou Ă un canal privĂ©, dont le fonctionnement est sensiblement identique), lâAPI envoie dâabord une requĂȘte au serveur de lâapplication pour savoir si lâaccĂšs lui est autorisĂ©. Le serveur peut dĂ©terminer lâautorisation dâaccĂšs grĂące au nom du canal qui est transmis en paramĂštre. Le cas Ă©chĂ©ant, le service dâautorisation retourne avant tout une clĂ© dâauthentification. Cette clĂ© permettra ensuite Ă Pusher de dĂ©terminer que lâutilisateur a bien accĂšs au canal. Dâautre part, le service retourne Ă©galement certaines informations concernant lâutilisateur : un id obligatoire, dâune part, et toutes les informations que lâon souhaiterait voir transiter dans le canal de prĂ©sence dâautre part (e-mail, statut, IP,âŠ). Le message ainsi retournĂ© ressemble Ă cela :
{"auth" => "d8d6a55bc5e7ffb81f0e:0d355103f73ba4de6a6f56975d3261bcea", "channel_data" => "{"user_id":4, "user_info":{"email":"mark.zuckerberg@gmail.com", "ip":"127.0.0.1"}}"}
Le schéma suivant illustre ce processus :
Maintenant que le principe est clair, passons Ă la pratique. On va donc commencer par dĂ©finir auprĂšs de lâAPI Pusher lâurl sur laquelle il doit authentifier lâutilisateur. On ajoute dans la mĂ©thode subscribeToPush() :
application.js :
Pusher.channel_auth_endpoint = 'home/authenticate'
On demande ensuite un abonnement au canal prĂ©sence (dont lâidentifiant doit impĂ©rativement commencer par âpresenceâ) :
applicaton.js :
var presence_channel = pusher.subscribe('presence-instant-messaging-channel');
Mais toute tentative dâabonnement Ă ce canal fera appel au service dâauthentification que nous nâavons pas encore implĂ©mentĂ©. Il faut donc ajouter lâaction authenticate dans le contrĂŽleur home.
def authenticate
if user_signed_in?
response = Pusher[params[:channel_name]].authenticate(params[:socket_id], {:user_id => current_user.id, :user_info => { :email => current_user.email}})
render :json => response
else
render :text => "Not authorized", :status => '403'
end
end
Ici, nous vĂ©rifions simplement que lâutilisateur sâest bien connectĂ© au site, mais les contrĂŽles pourraient ĂȘtre plus poussĂ©s et personnalisĂ©s, puisque lâidentifiant du canal (« presence-instant-messaging-channel ») est passĂ© dans les paramĂštres. La seule information pertinente que nous souhaitons envoyer Ă propos de lâutilisateur est son e-mail.
Les canaux de présence répondent par défaut à 4 évÚnements déclenchés par Pusher :
Dans les Ă©vĂšnements dĂ©crits ci-dessus, les informations associĂ©es aux membres sont celles-lĂ mĂȘmes que lâon renvoie dans le service dâauthentification.
Dans le cadre de notre application de messagerie instantanĂ©e, nous souhaitons afficher en temps rĂ©el la liste des utilisateurs prĂ©sents sur le chat. Pour ĂȘtre Ă jour dans le liste, nous devons donc Ă©couter les Ă©vĂšnements « pusher:subscription_succeeded », « pusher:member_added » et « pusher:member_removed ».
CÎté javascript, nous ajoutons donc les bind() suivants sur ces évÚnements :
application.js :
presence_channel.bind('pusher:subscription_succeeded', function(members){
members.each(function(member) {
jQuery('#members-list').append("<div id='member_" + member.id + "'>" + member.info.email + "</div><br />");
});
});
presence_channel.bind('pusher:member_added', function(member) {
jQuery('#members-list').append("<div id='member_" + member.id + "'>" + member.info.email + "</div><br />");
});
presence_channel.bind('pusher:member_removed', function(member) {
jQuery('#member_' + member.id).remove();
});
CĂŽtĂ© html, nous crĂ©ons un div dâidentifiant « members-list » destinĂ© Ă accueillir les e-mails des utilisateurs connectĂ©s.
Ainsi, Ă lâĂ©tablissement de lâabonnement au canal de prĂ©sence, nous rĂ©cupĂ©rons la liste des utilisateurs dĂ©jĂ prĂ©sents, et affichons leurs e-mails. Dâautre part, chaque fois quâun utilisateur sâabonne ou se dĂ©sabonne, nous ajoutons ou retirons son e-mail de la liste.
LimitationsComme on vient de le voir le service de push web proposé par Pusher permet de mettre en place la technologie WebSocket au sein de son application de façon simple, rapide, et sécurisée si nécessaire. Cependant, Pusher souffre de quelques limitations.
Tout dâabord, si le protocole WebSocket est Ă prĂ©sent largement supportĂ© par les navigateurs rĂ©cents, ce nâest pas le cas pour tous (voir ici la liste des navigateurs supportant le protocole). De plus, mĂȘme si certaines anciennes versions de browsers sont compatibles, elles dĂ©sactivent par dĂ©faut le support WebSockets Ă cause dâune faille de sĂ©curitĂ© (dĂ©crite ici) antĂ©rieure Ă lâactuelle spĂ©cification du protocole. Heureusement, Pusher, dans son infinie sagesse, a automatiquement recours Ă un workaround dans le cas des navigateurs incompatibles. En effet, lâAPI fait alors appel Ă une Ă©mulation de WebSocket en Flash. Ici encore, cela impose quâun plugin Flash soit installĂ© sur le navigateur. Si ces limitations peuvent prĂ©senter un problĂšme sur certaines infrastructures vieillissantes, elles sont toutefois vouĂ©es Ă disparaĂźtre.
De mĂȘme, toujours en relation avec la technologie WebSocket, celle-ci peut connaĂźtre des dysfonctionnements si la connexion passe par un proxy. En effet, celui-ci, si il est configurĂ© dans ce sens, peut parfois interrompre la connexion Ă©tablie et empĂȘcher le bon dĂ©roulement du push.
Ensuite, comme tous les services hĂ©bergĂ©s sur le cloud, tous vos messages passeront par Pusher, avec les craintes de confidentialitĂ© que ça peut susciter. Cette inquiĂ©tude est inhĂ©rente au cloud, et rien nâempĂȘche de chiffrer ses messages avant de les transmettre. Il existe d’ailleurs une alternative Ă la plateforme Pusher avec le projet open source Slanger qui implĂ©mente le mĂȘme protocole et permet d’internaliser la transmissions des messages WebSockets.
Enfin, Pusher est bien entendu payant si lâon va au-delĂ du simple test. Il propose plusieurs programmes allant de 19$/mois pour 100 connexions concurrentes et 200 000 messages/jour jusquâĂ 199$/mois pour 5000 connexions concurrentes et 10 millions de messages/jour. La version de test permet toutefois de sâamuser suffisamment puisquâelle permet 20 connexions concurrentes et 100 000 messages/jour.
Suggestion d'articles :
La sĂ©rialisation est une des bases de la transmission de donnĂ©es entre systĂšmes. Certains langages proposent d’ailleurs une mĂ©thode de sĂ©rialisation en standard, qui leur est souvent propre.
L’interopĂ©rabilitĂ© entre systĂšmes hĂ©tĂ©rogĂšnes nĂ©cessite que le format de sĂ©rialisation soit comprĂ©hensible par diffĂ©rents langages et plates-formes. De nombreux standards utilisent le mĂ©canisme d’IDL (Interface Description Language) pour rĂ©pondre Ă ce besoin : ASN.1, CORBA ou encore SOAP.
Depuis quelques annĂ©es, de nouveaux frameworks basĂ©s sur un IDL ont vu le jour pour l’interopĂ©rabilitĂ© de technologies hĂ©tĂ©rogĂšnes dans une optique d’Ă©conomie de bande passante. Parmi eux, on trouve Thrift et Protocol Buffers. Ce premier article prĂ©sente les deux frameworks sous l’angle de la sĂ©rialisation des messages et dĂ©taille leur utilisation en Java.
Thrift et Protocol Buffers (abrĂ©gĂ© en protobuf) ont en commun d’avoir Ă©tĂ© dĂ©veloppĂ©s par des acteurs majeurs du Web. Thrift a Ă©tĂ© initialement dĂ©veloppĂ© par Facebook, et est dĂ©sormais en incubation chez Apache suite Ă son passage en open source. Protocol Buffers a commencĂ© comme framework interne chez Google, oĂč son utilisation est majoritaire. L’ouverture de son code source s’est faite aprĂšs une remise Ă plat nommĂ©e Proto2.
Afin de s’affranchir des barriĂšres de langages, ces deux frameworks reposent sur des mĂ©canismes classiques :
On peut par exemple gĂ©nĂ©rer du code permettant l’Ă©change de messages entre Java et C++ :

Cet article se focalise en prioritĂ© sur le protocole de sĂ©rialisation, qu’il convient de distinguer du protocole de transport. Ce dernier correspond au support vĂ©hiculant le message sĂ©rialisĂ© suivant le protocole de sĂ©rialisation.
Pourquoi de nouveaux protocoles de sĂ©rialisation ?Protobuf se limite au protocole de sĂ©rialisation, et est donc similaire Ă la CDR de CORBA ou Ă ASN.1 associĂ© Ă un encodeur : il s’agit uniquement de reprĂ©senter un message sous forme sĂ©rialisĂ©e.
Thrift y ajoute des implĂ©mentations de RPC en mode client/serveur sur plusieurs protocoles de transport (HTTP, Socket, File…). Leurs fonctionnalitĂ©s sont limitĂ©es par rapport Ă ce que propose CORBA par exemple : Thrift ne propose pas de gestion des transactions, de reprise sur erreur ou de fonctionnalitĂ©s d’annuaire.
Les principes de Thrift et Protocol Buffers ne sont donc pas nouveaux. Ces deux frameworks ont néanmoins deux avantages majeurs pour les contextes de haute disponibilité et forte scalabilité, tels ceux de Google ou Facebook :
L’argument de compacitĂ© du message est uniquement valable si on emploie le protocole de sĂ©rialisation binaire de Protobuf et le protocole compact de Thrift, car ils permettent une optimisation de la taille du message Ă l’octet prĂšs.
Par exemple, les deux sĂ©rialisent une chaĂźne de caractĂšres en la faisant prĂ©cĂ©der par sa longueur, Ă l’instar de CDR. Mais ils codent cette longueur avec un varint, qui est plus compact que l’entier sur 32 bits employĂ© par CDR.
Thrift et Protobuf se ressemblent Ă©normĂ©ment en pratique. L’IDL du premier s’appelle Thrift IDL, celui du second se nomme simplement protocol buffer language. Les deux frameworks supportent la plupart des types de donnĂ©es courants, le dĂ©tail est disponible ici pour Thrift et lĂ pour Protobuf.
L’exemple considĂ©rĂ© est l’objet Node dont une version en Java est la suivante :
package com.octo.example.serialization.model;
public class Node implements Serializable {
private Integer mNumber;
private boolean mEven;
private Double mRate;
private RoomType mType;
private String mDescription;
[...]
}
Il contient quelques membres de types différents, dont une énumération ; les accesseurs ont été omis par concision.
Voici le descripteur équivalent en Thrift IDL : tree.thrift
namespace java com.octo.example.serialization.model.thrift
enum RoomType {
SINGLE =0,
DOUBLE =1,
SUITE =2
}
struct Node {
1: optional i32 number,
2: optional bool even,
3: optional double rate,
4: optional RoomType type = RoomType.SINGLE,
5: optional string description
}
La premiĂšre ligne permet de spĂ©cifier le package Java auquel appartiendra le code gĂ©nĂ©rĂ© par le compilateur Thrift. L’Ă©numĂ©ration RoomType associe une constante numĂ©rique Ă chaque valeur possible. Puis notre objet Node lui-mĂȘme est dĂ©fini.
En Thrift IDL, chaque champ est défini par
Le message est donc sĂ©rialisĂ© sous forme clef-valeur, avec l’identifiant unique comme clef. La valeur contient le type puis la valeur elle-mĂȘme. Voici Ă fins d’illustration ce que donne la struct Node sĂ©rialisĂ©e avec le protocole de sĂ©rialisation TJSONProtocol de Thrift :
{
"1":{
"i32":0
},
"2":{
"tf":1
},
"3":{
"dbl":0.0
},
"4":{
"i32":0
},
"5":{
"str":"Lorem ipsum dolor sit amet, cons"
}
}
Voici le pendant en Protocol Buffers language : tree.proto
package serialization;
option java_package = "com.octo.example.serialization.model";
option java_outer_classname = "TreeProto";
enum RoomType {
SINGLE =0;
DOUBLE =1;
SUITE =2;
}
message Node {
optional int32 number =1;
optional bool even =2;
optional double rate =3;
optional RoomType type =4 [default = SINGLE];
optional string description = 5;
}
La premiĂšre ligne correspond au package protobuf, ce qui permet d’Ă©viter les conflits lors d’imports de fichiers .proto externes par exemple. Les deux lignes suivantes sont des options propres Ă la gĂ©nĂ©ration de code Java ; il s’agit du nom de package et du nom de la classe gĂ©nĂ©rĂ©e par protoc.
La dĂ©claration d’un champ se fait de maniĂšre similaire Ă celle de Thrift :
La sĂ©rialisation suit le mĂȘme principe que celle de Thrift : le message est sĂ©rialisĂ© en clef-valeur avec l’identifiant unique comme clef. Le dĂ©tail de l’encodage binaire est fourni ici.
Versioning et Ă©volution de l’interfaceLa compatibilitĂ© ascendante/descendante des messages nĂ©cessite de respecter certaines rĂšgles afin d’ĂȘtre garantie. Ces derniĂšres sont similaires pour les deux frameworks.
La pierre angulaire de la compatibilitĂ© est l’identifiant unique associĂ© aux champs. La principale rĂšgle de dĂ©sĂ©rialisation est que tout champ d’identifiant inconnu est ignorĂ©. Il reste nĂ©anmoins conservĂ© dans le message car il peut ĂȘtre utile Ă d’autres versions de l’interface.
Les rĂšgles Ă respecter lors de l’Ă©volution des interface sont les suivantes
A ces rĂšgles protobuf ajoute
L’Ă©tape suivante consiste Ă gĂ©nĂ©rer le code correspondant aux objets et interfaces dĂ©finies ci-dessus. Le compilateur Thrift est utilisĂ© de la maniĂšre suivante :
thrift -v --gen java -o . tree.thrift
Le code généré est placé dans un sous-répertoire gen-java, avec autant de fichiers-classes que de structs et énumérations :
gen-java
âââ com
âââ octo
âââ example
âââ serialization
âââ model
âââ thrift
âââ Node.java
âââ RoomType.java
Pour Protobuf, le principe reste le mĂȘme, mĂȘme si la ligne de commande change un peu :
protoc -I=project/root/ --java-out=. tree.proto
Dans ce cas un unique fichier est gĂ©nĂ©rĂ©, contenant l’ensemble des messages sous forme de classes internes
java
âââ com
âââ octo
âââ example
âââ serialization
âââ model
âââ TreeProto.java
Cas particulier : déclaration avancée et récursion
Le but initial de l’exemple Ă©tait de sĂ©rialiser un arbre constituĂ© de nĆuds. Or Thrift ne supporte pas la dĂ©claration avancĂ©e, donc les structures rĂ©cursives. Cette limitation est explicite dans le white paper de Thrift :
Due to inherent complexities and potential for circular dependencies, we explicitly disallow forward declaration. Two Thrift structs cannot each contain an instance of the other.
Par exemple, le compilateur Thrift bloque sur deux erreurs lors du parsing de la struct suivante :
namespace java com.octo.example.serialization.model.thrift
struct InvalidNode {
1: optional i32 number,
2: optional bool even,
3: optional double rate,
4: optional RoomType type = RoomType.SINGLE,
5: optional string description,
6: list<InvalidNode> children
}
enum RoomType {
SINGLE =0,
DOUBLE =1,
SUITE =2
}
La premiĂšre est Ă la ligne 6 : Type « RoomType » has not been defined, et la seconde Ă la ligne 8 : Type « Node » has not been defined.
Protobuf n’a pas cette limitation et compile donc sans erreur un .proto Ă©quivalent. La classe chargĂ©e de la sĂ©rialisation, CodedInputStream propose une sĂ©curitĂ© sur le niveau de rĂ©cursion. La limite par dĂ©faut est de 64, et peut ĂȘtre modifiĂ©e via la mĂ©thode setRecursionLimit.
Conversion modĂšle applicatif – objets sĂ©rialisablesSi l’applicatif utilise dĂ©jĂ un modĂšle d’objets existants, des mĂ©thodes de conversion entre ce modĂšle et les objets sĂ©rialisables doivent ĂȘtre dĂ©veloppĂ©es. Ni Thrift ni protobuf ne proposent de moyen d’automatiser ou de gĂ©nĂ©rer ce code de conversion. Afin d’Ă©viter ce surcoĂ»t, il est prĂ©fĂ©rable de manipuler directement les objets sĂ©rialisables gĂ©nĂ©rĂ©s Ă l’Ă©tape prĂ©cĂ©dente quand cela est possible.
Dans l’exemple, l’objet de dĂ©part Node est un simple POJO, la conversion a donc Ă©tĂ© codĂ©e manuellement dans des classes dĂ©diĂ©es Ă la sĂ©rialisation. Les objets gĂ©nĂ©rĂ©s par Thrift exposent des accesseurs pour chacun des champs :
package com.octo.example.serialization.serializers.tree;
public class ThriftTreeSerializer {
[...]
public com.octo.example.serialization.model.thrift.Node convertToSerializable(Node pNode) {
com.octo.example.serialization.model.thrift.Node vNode = new com.octo.example.serialization.model.thrift.Node();
vNode.setNumber(pNode.getNumber());
vNode.setRate(pNode.getRate());
vNode.setType(RoomType.valueOf(pNode.getType().toString()));
vNode.setDescription(pNode.getDescription());
vNode.setEven(pNode.isEven());
for (Node vChild : pNode.getChildren()) {
vNode.addToChildren(convertToNode1(vChild));
}
return vNode;
}
}
Protobuf utilise des messages immuables et le pattern builder :
package com.octo.example.serialization.serializers.tree;
public class ProtoBufTreeSerializer {
[...]
public com.octo.example.serialization.model.LimitedTreeProto.Node convertToSerializable(Node pNode) {
com.octo.example.serialization.model.LimitedTreeProto.Node.Builder vBuilder = com.octo.example.serialization.model.LimitedTreeProto.Node.newBuilder()
.setNumber(pNode.getNumber())
.setRate(pNode.getRate())
.setType(LimitedTreeProto.RoomType.valueOf(pNode.getType().toString()))
.setDescription(pNode.getDescription())
.setEven(pNode.isEven());
for (Node vNode : pNode.getChildren()) {
vBuilder.addChildren(convertToNode1(vNode));
}
return vBuilder.build();
}
}
Une autre mĂ©thode consiste Ă faire implĂ©menter l’interface Externalizable aux objets du modĂšle applicatif. Cela permet d’utiliser l’un des deux frameworks tout en maintenant la compatibilitĂ© avec les API de sĂ©rialisation Java standards. Cependant, l’utilisation du protocole de sĂ©rialisation de Java augmente la taille du message, notamment Ă cause la prĂ©sence des noms de classes complets.
Sur un court message, le surcoĂ»t est rĂ©dhibitoire. Ă titre d’exemple, le mĂȘme Node pĂšse 49 octets s’il est sĂ©rialisĂ© par protobuf directement, et 118 octets si on utilise protobuf via Externalizable.writeExternal.
Thrift propose plusieurs protocoles de sérialisation à choisir parmi les implémentations de TProtocol fournies, dont deux binaires :
Ce dernier est préférable et globalement équivalent à celui de protobuf. Voici un exemple de classe de sérialisation avec Thrift
package com.octo.example.serialization.serializers.tree;
import com.octo.example.serialization.model.thrift.Node;
[...]
public class ThriftTreeSerializer {
public byte[] serialize(Node Object) throws Exception {
TSerializer serializer = new TSerializer(new TCompactProtocol.Factory());
return serializer.serialize(Object);
}
public Node deserialize(byte[] pMessage) throws Exception {
TDeserializer deserializer = new TDeserializer(new TCompactProtocol.Factory());
Node vRoot = new Node();
deserializer.deserialize(vRoot, pMessage);
return vRoot;
}
[...]
}
Protobuf lui ne propose nativement qu’un protocole binaire. Des extensions permettent le support d’autres protocoles de sĂ©rialisation, par exemple protobuf-java-format qui sĂ©rialise en JSON, XML ou HTML.
La classe de sérialisation équivalente en protobuf :
package com.octo.example.serialization.serializers.tree;
import com.octo.example.serialization.model.LimitedTreeProto.Node;
[...]
public class ProtoBufTreeSerializer {
public byte[] serialize(Node object) throws Exception {
return object.toByteArray();
}
public Node deserialize(byte[] message) throws Exception {
CodedInputStream vStream = CodedInputStream.newInstance(message);
return Node.parseFrom(vStream);
}
[...]
}
Conclusion
Thrift et Protocol Buffers sont deux frameworks qui n’innovent pas sur le principe. Les deux frameworks sont relativement similaires et rĂ©pondent surtout aux besoins des sociĂ©tĂ©s qui les ont créées, Facebook et Google. Elles ont revisitĂ© les mĂ©canismes classiques d’interopĂ©rabilitĂ© via un IDL, en mettant l’accent sur les performances et la compatibilitĂ© ascendante et descendante, deux caractĂ©ristiques cruciales dans leur contexte. Ces frameworks proposent principalement de la sĂ©rialisation, avec en sus une implĂ©mentation RPC simple pour Thrift.
Du fait de la gĂ©nĂ©ration statique de code et de la nĂ©cessitĂ© potentielle de dĂ©velopper des mĂ©thodes de conversion, leur utilisation peut s’avĂ©rer coĂ»teuse Ă mettre en Ćuvre. Comme beaucoup d’outils spĂ©cialisĂ©s, il vaut donc mieux avoir un besoin avĂ©rĂ© de leurs avantages et bien Ă©valuer leurs limitations avant d’envisager leur utilisation.
D’autres frameworks de sĂ©rialisation utilisent des principes diffĂ©rents de ceux de Thrift et Protocol Buffers. Apache Avro notamment, qui repose sur la prĂ©sence systĂ©matique de l’interface dans le format sĂ©rialisĂ©. Cela lui permet de rendre la gĂ©nĂ©ration de code optionnelle et de se passer d’identifiants uniques de champs.
Thrift et Protocol Buffers obtiennent des performances Ă©quivalentes dans un benchmark regroupant plusieurs sĂ©rialiseurs Java. Ce benchmark se limite toutefois Ă l’utilisation d’un unique message. Dans un prochain article, les deux frameworks seront comparĂ©s en termes de compacitĂ© de la sĂ©rialisation avec une structure de message variable.
RéférencesLes versions utilisées pour cet article sont la 0.8.0 pour Thrift et la 2.4.1 pour Protocol Buffers. Les liens suivants sont en anglais.
Suggestion d'articles :
OCTO organise le jeudi 26 janvier 2012 Ă partir de 8h45 un petit-dĂ©jeuner gratuit, Ă Eurosites George V « Tablettes : passons Ă lâĂšre du post-PC ».
Avec la participation de BNP Paribas Fortis, ARVAL et AXA.
Pour vous inscrire cliquez ici . DĂ©couvrez le descriptif de lâĂ©vĂšnement et les intervenants dans ce billet.
En moins de 2 ans les tablettes se sont imposées partout. Elles ont cannibalisé le marché du PC et tué celui du netbook !
Internet, mails, rĂ©seaux sociaux, actualitĂ©s ou jeux. Ceux qui ont essayĂ©e la tablette lâont adoptĂ©e.
Rapidité, légÚreté, simplicité, autonomie et prix sont au coeur de ce succÚs.
Vos entreprises ont lâopportunitĂ© dâĂ©pouser cette rĂ©volution et de faire Ă©voluer leurs mĂ©tiers, services et applications en tirant pleinement partie des tablettes. Les exemples ne manquent pas : outils dâaide Ă la vente, applications RH, bureau mobile, contrĂŽle qualitĂ© in situ, documentation ou encore formation.
Et vous, quels usages faites ou ferez-vous des tablettes ?
OCTO Technology vous propose dâĂ©changer, avec ses clients, autour des enjeux que reprĂ©sentent les tablettes en entreprise :
- Quelles applications métiers sur tablette ?
- Comment dégager du ROI ?
- Quelles sont les différences avec un développement smartphone ?
- Pouvez-vous faire confiance Ă une tablette comme outil de travail ?
- Comment sécuriser les applications et les données de votre entreprise ?
Rejoignez la révolution le 26 Janvier 2012 au Georges V de 9h à 11h
A lâissue de ce petit-dĂ©jeuner vous aurez dĂ©couvert :
Ce petit-déjeuner sera présenté par :
Intervenants keynote :
- Jean-François Grang â OCTO Technology
- Olivier Martin â OCTO Technology
Intervenants table ronde :
- Antoine De Kerviler – Corsairfly – DSI
- Yvan Pirenne â BNP Paribas Fortis â Manager Internet & Mobile Banking
- Sebastien Somchit â ARVAL â Head of Interactive Marketing
- Guillaume LemĂȘle â AXA France Services – Directeur Conseil & Services Distribution Internet & Marketing
- Eric Biernat (animateur) â OCTO Technology
Ce petit-déjeuner est à destination de nos clients et prospects en priorité.
Cliquez ici pour vous inscrire au petit-déjeuner : TablettesSuggestion d'articles :
Chers lecteurs, tous les OCTOs vous souhaitent une belle et heureuse annĂ©e 2012 ! Nous espĂ©rons qu’elle sera remplie de  projets ambitieux, d’Ă©changes, de bonheur et de rĂ©ussite !
Et surtout merci de nous faire part de vos avis, vos envies et vos remarques. C’est grĂące Ă vous  que nous prenons toujours plaisir Ă alimenter le blog  d’articles , de prises de position et des sujets de « geeks » et de « boss » qui nous passionnent.
Une occasion pour nous de vous faire partager la carte de voeux OCTO Ă©dition 2012 ! Oui, en 2012 nous changerons notre logo. Nouvelle annĂ©e, nouveau logo mais toujours OCTO !Â
Suggestion d'articles :
Jeudi 15 dĂ©cembre, OCTO organisait un petit-dĂ©jeuner NoSQL : « lâExtreme Transaction Processing, devient une rĂ©alitĂ© ».
Aujourdâhui, la multiplication des systĂšmes connectĂ©s Ă Internet (smartphone, tablette, TV connectĂ©e, vĂ©hicule connectĂ©) et lâĂ©mergence des nouveaux flux de donnĂ©es issus notamment du web social (Facebook commerce, mobile-to-mobile, etc) vont pousser un peu plus les SystĂšmes dâInformation vers lâExtreme Transaction Processing (XTP).
(Pour plus d’informations sur le contenu, veuillez cliquer ici)
GrĂące Ă la vidĂ©o de lâĂ©vĂšnement disponible sur You Tube, vous pouvez dĂ©couvrir les divers points abordĂ©s lors de ce Petit-DĂ©jeuner, Ă savoir :
Pour tout autre renseignement, contactez nous sur : contact@octo.com
 Cliquez sur lâimage pour lancer la vidĂ©o
Â
Suggestion d'articles :
OCTO organise le jeudi 12 janvier 2012 Ă partir de 8h45 un petit-dĂ©jeuner gratuit Big Data & CEP : « L’analyse dĂ©cisionnelle en temps rĂ©el : Convergence entre Big Data et Complex Event Processing », Ă Eurosites George V.
Pour vous inscrire cliquez ici . DĂ©couvrez le descriptif de lâĂ©vĂšnement et les intervenants dans ce billet.
Le pilotage des activités opérationnelles devrait pouvoir se faire au rythme du business et avec une connaissance précise de son état courant.
La lutte contre la fraude, lâanalyse des parcours clients en temps rĂ©el ou le suivi des liquiditĂ©s permettent dâamĂ©liorer vos profits et demandent une analyse complexe instantanĂ©e sur dâimportants volumes dâĂ©vĂšnements.
Ces nouveaux usages en matiĂšre dâanalyse des flux de donnĂ©es introduisent de nouveaux dĂ©fis techniques et dâarchitecture des SI : comment faire converger analyse temps rĂ©el et gestion de volume de donnĂ©es important ?
Les Ă©volutions des marchĂ©s du DĂ©cisionnel et du CEP permettent dây apporter aujourdâhui des rĂ©ponses concrĂštes. Des solutions sont dĂ©jĂ opĂ©rationnelles dans diffĂ©rents secteurs : finance, telecoms, logistique, e-commerce, âŠ
OCTO Technology et Quartet FS vous proposent de découvrir les nouvelles opportunités métiers liées à ces évolutions technologiques, positionner ces nouvelles architectures dans vos SI et les possibilités de ActivePivot Sentinel.
A l’issue de ce sĂ©minaire, vous aurez dĂ©couvert :
Ce petit-déjeuner sera présenté par :
Julien CABOT, OCTO, Associé
Olivier MALLASSI, OCTO, Architecte Senior
Romain COLLE, Quartet Financial Systems, Senior R&D Engineer
Suggestion d'articles :
LâannĂ©e derniĂšre USI vous a proposĂ© plus de 40 sessions. Mais le programme USI ne se fait pas sans vous, alors si vous avez une idĂ©e de session nâhĂ©sitez pas Ă nous la soumettre et/ou venez voter pour vos sessions favorites !
Proposez votre session !
Leader dâopinion, porte-parole de sujets IT, super geek, manager ou partie prenante de la DSI⊠le formulaire pour proposer votre session est en ligne et ce jusquâau 31/01/2012. Profitez-en !
L’Ă©quipe USI dĂ©terminera, aprĂšs Ă©tude de votre proposition, la durĂ©e de votre session, qui sera de 40 ou de 20 minutes. Pour rappel, le premier critĂšre de sĂ©lection de l’Ă©quipe USI sera la qualitĂ© du rĂ©sumĂ© de session proposĂ© (fond et forme). Merci donc d’en tenir compte lors du remplissage de ce formulaire.
LâĂ©quipe programme Ă©tudiera toutes les propositions et sĂ©lectionnera les sessions qui lui paraĂźtront les plus intĂ©ressantes. Vous serez peut-ĂȘtre invitĂ© Ă venir prĂ©senter votre session lors dâune journĂ©e dĂ©diĂ©e : mi fĂ©vrier et nous informerons de notre dĂ©cision finale fin mars 2012.
500 personnes, opĂ©rationnels ou managers dans la DSI ou les directions mĂ©tiers, sont attendus pour cette nouvelle Ă©dition. Une belle audience donc pour votre prĂ©sentation et rencontrer vos pairs ! NâhĂ©sitez plus !
Cliquez ici pour soumettre votre session Ă lâUSI
Votez pour vos sessions préférées
Nous vous invitons à venir consulter toutes les sessions qui seront proposées cette année et de votre celles que vous préférez et que vous aimeriez voir à USI 2012.
Ou parlez-en tout simplementâŠ
MĂȘme si vous ne proposez pas de session vous avez peut-ĂȘtre dans votre entourage une personne qui le peut et que vous jugez pertinente. Alors  nâhĂ©sitez pas ! Et partagez lâinfo !
A vos candidatures donc et merci !
LâĂ©quipe USI
Suggestion d'articles :
Les connections réseaux sont une source fréquente de lenteur des applications mobiles. Remplacer 10 téléchargements de 1Mo par 1 de 10Mo peut améliorer le fonctionnement de votre application.
Lâutilitaire unix Tar permet justement de regrouper des fichiers en un seul package. Malheureusement aucune implĂ©mentation sous iOS de tar nâest satisfaisante : trop lourde et surdimensionnĂ©e par rapport aux besoins dâune simple application.
Pourtant une librairie qui dĂ©compresserait simplement des fichier tar nâest pas trop compliquĂ©e Ă dĂ©velopper.
La suite en anglais:Â http://blog.octo.com/en/untar-on-ios-the-pragmatic-way/
Suggestion d'articles :