Freedelity  - Derniers blogs actifs  - Liste des blogs  -
Utilisateur   Mot de passe  
Webmaster
Suivez l'actualité de Freedelity en direct. Abonnez vous dès maintenant à notre flux RSS, à notre page facebook et à notre feed Twitter!
Publié le 04/10/2016 @ 17:00:00 Dans Chroniques
Tout commence en 2009 lorsque, de retour de vacances, je montre à mon futur associé et partenaire d'aventure un prototype plus ou moins bricolé de plateforme de gestion de fidélité/CRM basé sur la carte d'identité - prototype qui allait, sans conteste, devenir le projet le plus important et le plus amusant de nos carrières respectives.

Et depuis 2009, malgré les innombrables obstacles, cette idée (ou du moins, si vous avez déjà suivi nos précédents épisodes dans ce blog, son implémentation) a fait son chemin pour se transformer en un projet utilisé au quotidien par plus de 75% de la population active belge (soit tout de même plusieurs millions de personnes).

Alors bien sûr, pour tout ce chemin parcour, il nous faudrait remercier un nombre incalculable de personnes qui nous ont aidées et qui ont cru en nous (à commencer pas nos clients). Mais à l'occasion de ce billet n°42 (qui est, comme chacun le sait, la réponse à la question ultime sur la vie, l'univers et tout le reste), revenons plutôt sur une série de chiffres qui, il n'y a pas si longtemps, nous auraient semblés parfaitement inconcevables...

3.800.867: C'est le nombre de personnes uniques qui ont utilisé Freedelity depuis son apparition. Nous dépasserons sans aucun doute les 4 millions de membres pour la fin 2016. A chaque fois que je me promène en public, je ne peux m'empêcher de regarder autour de moi et d'imaginer dans quel magasin partenaire nous avons croisé le destin de toutes ces personnes. Comment cela leur a été présenté, si ils s'en souviennent, et ce qu'ils pensent du principe... On est bien loin des premiers jours quand on nous prédisait que "personne ne donnera sa carte" ou que "ce système ne marchera jamais". Quand on simplifie la vie des gens, cela ne peut forçément que fonctionner...

18.147.698: C'est le nombre de ventes que la plateforme a enregistré depuis le début. Et ici encore, nous pouvous être sûr que nous dépasserons les 20 millions de ventes d'ici la fin d'année car...

962.715: C'est le record de ventes enregistrées sur un mois par la plateforme (en décembre 2015) ; et au vu de l'augmentation très substantielle du réseau de partenaires, nous pouvons raisonnablement estimer que décembre 2016 nous permettra de dépasser pour la première fois un million de ventes enregistrées en un seul mois !

22 tonnes: C'est le poids en papier que nous avons économisé (au grand minimum) en supprimant les formulaires d'inscriptions en magasin. Sachant qu'il faut 22 arbres pour une tonne de papier, cela représente une forêt de 528 arbres... Avouons, c'est pas mal tout de même, non ? Freedelity, projet écolo... Qui l'eut crû ?

1.749.468: C'est le nombre de consommateurs actifs sur les 6 derniers mois. Cela signifie que chacun de ces comptes a été validé, permettant ainsi à nos partenaires de toujours avoir des statistiques à jour et représentatives sur leur base de consommateurs.

5.618.061: C'est le nombre de cartes d'identités que nous avons lues sur tablette. Chose qui était totalement impossible technologiquement à notre lancement, nous avons débarqué sur support mobile pour répondre à des besoins de marketing évenementiel à la base. Et plus de 5 millions de cartes lues sur un support qui était encore impossible il y a 5 ans, ne boudons pas ce succès!

Vous l'avez compris, on aime les chiffres, la précision, et nous espérons pouvoir continuer à vous simplifier la vie toujours un peu plus chaque jour !

Merci à tous, et bonne fin d'année 2016!

Sébastien
Publié le 12/08/2016 @ 17:00:00 Dans Chroniques
Aujourd'hui, j'avais envie de revenir sur un point qui m'est particulièrement cher, l'optimisation. Malheureusement souvent négligé au profit du développement de toujours plus de nouvelles fonctionnalités, parfois mal intégrées en acceptant le rush imposé, ou totalement oublié car il n'apporte rien à la solution de base.

Et pourtant, ces petites millisecondes économisées sont cruciales pour un business Saas. Si votre page se charge en 5s ou 1.5s, le confort de vos utilisateurs s'en trouvera augmenté, et ils auront tendance à mieux utiliser votre plateforme. Mais surtout, une bonne gestion des performances vous permettra aussi de gérer les pics sur la même infrastructure, et de souvent simplifier celle-ci.

Pourquoi faire tourner un mastodonte sur un rack de 20 machines, alors qu'une seule pourrait suffire, réduisant du coup considérablement le rôle de l'admin système, et les problèmes éventuels. Et finalement, même considérant toutes les données traitées, toutes les stats générées, tout le trafic, la quasi-totalité tourne aujourd'hui avec une seule machine. Un monstre de guerre, mais ce n'est toujours qu'une seule machine.

On parle souvent de construire vite, et de faire le scaling après. Mais si on a construit trop rapidement, sans fondation, essayez d'y mettre une tour de 20 étages ! Et même si je suis partisan du principe de construire vite, ils ne faut pas oublier de garder un oeil sur la globalité, pour ne pas prendre un jour le sysadmin venant supplier pour encore plus de puissance.

[b]Mais ... comment?[b]

Cela doit être dans vos gènes. Dans mon développement, j'ai toujours, y compris avant Freedelity, passé quasi 25% de mon temps exclusivement dédié à surveiller les performances. A rechercher le maillon faible, à le remplacer, à le contourner, et surtout à essayer de comprendre.

Tout cela a commencé il y a bien longtemps, quand j'ai essayé de développer mon premier CMS en PHP. PHP était un rêve pour un développement rapide, mais comme j'avais tout écrit en orienté objet, et qu'on était à l'époque encore aux débuts de PHP4, les performances étaient tout simplement médiocre. J'ai donc abandonné le scripting pour passer à du pur compilé, et cela permets, toujours aujourd'hui, une différence pour un code similaire énorme en performance. Mais, cela ne suffit bien sûr pas, et passer à une plateforme à 100% compilée n'est pas non plus chose aisée.

Après la compilation, il a fallu optimiser tout le reste du système. A commencer par MySQL qui, bien que très sympathique, manque parfois un peu de puissance, et pour MySQL, la solution est simple, la machine qui héberge la base doit toujours avoir plus de mémoire que la taille de la base, pour pousser MySQL via sa configuration à tout laisser en mémoire. Vos disques vous en remercieront, et vous aurez encore gagné de précieuses millisecondes.

Puis on s'occupe du serveur web. Apache c'était bien... à l'époque. Aujourd'hui il n'a toujours pas évolué pour permettre de tenir une charge importante sans tuer complètement votre machine. De nombreuses alternatives permettent de gagner considérablement de charge. Mais il ne faut pas s'arrêter à cela, dès que vous avez votre serveur web, il faut le pousser au maximum en forçant par exemple un cache côté client pour tout ce qui est statique. Aucun besoin pour vos visiteurs de venir rechercher à chaque fois votre image ou jQuery, il y a peu de chances que cela ait changé entre 2 pages, et pourtant quasi aucun site ne configure proprement la manière dont est gérée le cache client.

Ne pas oublier de déporter un maximum du traitement côté client. Nous générons par exemple des gigas de statistiques, tout cela chaque nuit pour profiter des heures creuses, et éviter la charge en pleine journée. Certes on génère beaucoup de données (de 20 à 30gb) chaque nuit, dont 2 à 3gb utile, mais ces 3gb utiles auraient plombés la plateforme en pleine journée, alors que tout ceci pouvait être précalculé. Nous ne générons pas des gigabytes de statistiques vers une base de données, pas besoin d'encombrer la mémoire ici avec cela, mais nous séparons chaque morceau utile dans un fichier javascript différent. Et de ce fait, pour chaque statistique il suffit alors de combiner une série de scripts pour calculer ce qui est utile, tout en profitant du processeur du visiteur pour les derniers calculs.

Il y a encore plein d'autres astuces, comme l'utilisation de sprites, le regroupement de css, de js, etc, et l'utilisation massive de caches en mémoire, mais je ne vous dévoilerai pas tous les secrets non plus.

Juste quelques chiffres pour terminer, imaginez que sur une seule machine, vous puissiez générer plus de 1M de requêtes par jour, avec un load oscillant entre 1 et 1.5 au maximum (sur une machine à 2 Xeon), et des pages générées entre 10 et 50ms en moyenne.

Et pourtant, je suis sûr qu'il reste encore des centaines optimisations possibles! Alors, vous aussi, il est peut être temps de s'y plonger, non?

Sébastien
Publié le 13/06/2016 @ 09:00:00 Dans Chroniques
Cela fait quelques mois que nous ne vous avons pas proposé de nouveau billet sur ce blog. Non pas que nous n'en ayons pas envie, mais chaque article cherche sa source d'inspiration dans une expérience bonne ou mauvaise. Le temps passant, et pour ne pas tomber dans la répétition, les sujets deviennent de plus en plus rares.

La cause en est peut-être la relative lenteur des marchés européens. Provocation ? Oui, certainement, mais ceci est un ressenti, pas une analyse économique. Juste une lecture, à notre niveau, de ce que notre société occidentale a traversé en quelques années. Mais également frustration, dont je voudrais vous parler aujourd'hui. Cette frustration de savoir qu'un produit va répondre à une problématique importante d'une société, et d'en avoir une certitude quasi absolue. Non seulement parce que démontrée mathématiquement, parce qu'en sachant viscéralement que notre solution va répondre à un problème crucial d'une société qui n'en a malheureusement pas conscience.

Pompeux ? Prétentieux ? Arrogant ? Peut-être. Réaliste ? Certainement. Voici pourquoi.

Notre société est un succès, nul ne peut plus le nier maintenant. Nous venons de dépasser 3.500.000 consommateurs-utilisateurs en Belgique, nous travaillons avec déjà une partie importante des leaders dans le retail. Et pourtant, lorque vous entendez certains raisonnements à l'occasion de rendez-vous avec des sociétés que vous avez démarché il y a plusieurs années, les réactions sont parfois très étonnantes.

Quand vous entendez : "Votre succès me montre que je me suis trompé [...] il y a 5 ans. [...] Revenez dans 2 ans". Ou "[...] Revenez lors qu'il y aura au moins un autre leader dans mon secteur", vous serez souvent tenté de vous frapper la tête contre le mur tant l'incompréhension est immense. Incompréhension de cette lenteur (et je ne parle pas ici que de notre secteur) face à la nouveauté. La nouveauté fait peur, et plutôt que de chercher les sources d'améliorations qu'elle apporte, on y cherche la faille pour surtout garder la situation confortable dans laquelle on se trouve et ne pas devoir sortir de sa petite zone de confort... en attendant de prendre le mur de plein fouet.

Nous ne parlons pas de ces sociétés qui adoraient le concept, mais chez lesquelles nous avons rencontré une réflexion similaire de la part de l'informatique ou du management, et qui après 2 ans ont dû se résigner la mettre la clef sous le paillasson. C'est certainement simpliste de résumer ces faillites à un manque d'ambition et d'opportunisme, mais il est indubitable que ces facteurs aggravants y ont contribué de manière assez importante.

Pourquoi dès lors qualifions-nous les startups de génération sacrifiée, alors qu'elles sont par nature et par définition censées être plus orientées vers la prise de risque ?

Simple. Freedelity est un succès, nous en sommes conscients, et on nous le répète, c'est agréable, certes. Mais Freedelity est né en 2009, et nous sommes aujourd'hui 7 ans plus tard. 7 ans, au lieu d'un développement qui aurait selon nous dû prendre au maximum 2 ans si les acteurs du marché avaient "osé" plus tôt. Et alors que les premières années d'une société comme celle-ci sont un challenge technologique, chaque année supplémentaire la fait se transformer de plus en plus en une société de vente et se borne souvent à améliorer ses services. Mais tout entrepreneur qui lira ce texte comprend qu'on est loin aujourd'hui de cette "vibration" et de l'excitation du risque qu'est la création d'entreprise.

Avec une progression plus rapide, nous aurions probablement déjà intégré ou créé un nouveau projet, ou la société serait présente dans de multiples autres pays. Mais cela ne sera pas le cas pour les prochaines années. Nous sommes toujours bien chez Freedelity, et la société aura encore besoin de nous quelques années. Mais je peste régulièrement contre cette lenteur, qui nous obligera finalement à devoir sacrifier quelques idées de projets, car il sera "trop tard pour nous". Et sur une vie complète, je suis sûr que du coup nous perdons la possibilité en Europe de créer 2 ou 3 sociétés supplémentaires, porteuses de projets qui auraient pu faire la différence.

Est-ce un mal ou un bien ? D'un point de vue économique, cela est tout un débat, car on peut arguer qu'on crée grâce à cela des sociétés plus fortes, avec des fondations solides et des revenus assurés. Mais de l'autre, on laisse les révolutions majeures venir d'autres continents. Et l'Europe ne vivra peut être de révolution de certains secteurs que par la vision entreprenariale américaine (Uber, Tesla, SpaceX, PayPal, Amazon, eBay, Google, Apple, ...). Et là, vous ne pourrez plus me contredire qu'il y a manifestement un grain dans l'engrenage.

Bien sûr, des esprits chagrins nous rétorquerons qu'il est facile d'imputer la lenteur de notre croissance au marché, aux autres acteurs, aux clients ou que sais-je encore. Il n'empêche que la réalité est là, les chiffres aussi, les faits également. Il existe dans la culture de notre veille civilisation occidentale une frilosité pathologique pour tout ce qui touche à l'innovation. Peur du changement, nous l'avons dit, mais également allergie à la moindre prise de risque même si tous les indicateurs sont là pour démontrer que ce risque est mesuré, mais également qu'il garantit statistiquement un succès.

Alors, au risque de faire plus d'erreurs, mais plus de réussites, essayons peut être à notre niveau de simplement essayer d'agir, plutôt que de retourner chaque décision dans tous les sens pour se protéger d'un éventuel échec. Osons la nouveauté, osons le risque, osons l'impertinence et bien entendu, osons l'échec!

Sébastien
Publié le 30/01/2016 @ 09:00:00 Dans Chroniques
Quand on regarde une plateforme comme la nôtre, ou comme toute plateforme SaaS, on se dit que tout est maîtrisé, que tout est simple, et qu'il suffit de rajouter quelques lignes par ci par là pour ajouter une fonctionnalité par magie. On m'a aussi déjà souvent demandé ce que je faisais depuis que le produit était sorti, comme si une plateforme SaaS n'avait ni besoin de maintenance, ni besoin de nouveautés... Et ces remarques ne venaient pas de profanes mais bien d'autres professionnels de l'IT.

Tout cela est donc si simple?

Pour ajouter une fonctionnalité, il suffit en fait d'avoir l'idée, c'est ça le principal. Puis, d'écrire les 3 ou 4 lignes nécessaires, car après tout, on a l'idée, et d'appuyer sur le bouton pour envoyer cela en production. Si seulement... Si seulement...

Des plateformes comme la nôtre, cela représente des milliers de lignes de code, au dernier comptage on dépassait déjà le demi million de lignes de code. Oui, un demi million de lignes. Chaque fonction a des impacts, des dépendances, et doit fonctionner aussi bien pour les nouveaux utilisateurs que pour tous les autres. Elle doit fonctionner par tous temps, doit avoir un comportement logique lorsque l'infrastructure est en mode dégradé, et ne doit surtout pas impacter les performances de l'application en générant un flot de données impossibles à traiter.

Et quand vous avez pris tous les paramètres en compte, votre idée sortie en 5 minutes en salle de réunion ou autour de la machine à café vous aura déjà coûté plusieurs jours de sueur.

Et cela fonctionne, c'est le minimum!

Et le jour venu de la mise en production, si la fonctionnalité peut avoir un impact significatif sur la production, votre coeur bat plus vite. Votre concentration est maximale, et votre cerveau turbine dans tous les sens pour essayer de rejouer tous les scenarii possibles vous assurant du bon fonctionnement de celle-ci dans l'environnement.

Vous avez réalisé tous les tests possibles dans un environnement de test, dans un environnement de pré production, cela ne vous suffit toujours pas pour appuyer si magiquement sur le bouton pour passer cela en production sans encombre. Vous préparez les derniers points, et à chaque étape votre cerveau repasse toutes les étapes passées et futures pour certifier qu'il est possible de faire un retour en arrière, ou de continuer la mise en production si importante.

Généralement, tout se passe bien, le stress induit est utile pour débusquer les derniers points que vous auriez oublié. Et sinon, ce sera le lendemain sous la douche que vous jurerez en ayant oublié ce point, que vous corrigerez en vitesse avant qu'il n'ait impacté qui que ce soit.

Le lendemain matin, car notre profession est vouée à travailler de nuit pour n'impacter qu'un nombre minimal de clients, la fonctionnalité est en production, vous avez une tête de zombie car vous avez dépensé une énergie considérable à vous assurer du bon fonctionnement de toute la plateforme. Et cela fonctionne, ce n'en est que normal.

Si vous travaillez dans une entreprise technologique, et que le jour de la mise en production tout fonctionne, n'oubliez jamais d'avoir un peu de compassion pour ces équipes de l'ombre... Car bien souvent, comme tous vos collègues, vous ne vous rendrez pas compte de l'existence et des efforts de ces équipes de l'ombre, ces équipes qui font tourner vos outils tous les jours sans encombre, ces mêmes équipes dont on se souvient toujours en cas de problème majeur... Maintenant, vous aurez peut être compris que le reste de l'année, ils ne font pas que se reposer :wink:

Sébastien
Publié le 31/12/2015 @ 09:00:00 Dans Chroniques
Après quelques épisodes génériques, revenons sur un des points que nous répétons régulièrement au sein de Freedelity chez nos collaborateurs. L'inbox 0. En quoi cela consiste, et pourquoi essayer de toujours arriver à ce paradigme?

L'inbox zéro, cela consiste comme son nom le dit assez bien à toujours essayer d'arriver à avoir une inbox vide à la fin de journée. En gros, chaque fois que vous recevez un email, soit vous le traitez, soit vous le déléguez, soit il est classé dans un outil de gestion de tâches pour pouvoir suivre son développement car il vous sera impossible de le traiter rapidement. L'important pour votre interlocuteur, ce qui est source de stress, c'est de savoir si oui ou non vous avez bien reçu sa demande et dans quels délais vous aller pouvoir la traiter.

Au final donc, même si vous n'êtes pas dans la possibilité de pouvoir répondre à la demande le jour même, votre interlocuteur sera content de savoir que vous avez bien reçu son email, et qu'il dispose d'un délai pour avoir sa réponse. Il pourra de se fait s'organiser en conséquence en attendant, ou vous revenir car le timing n'est pas acceptable de son point de vue pour une raison ou une autre, mais en tous cas, il aura été rassuré.

Si la demande ne prend que quelques minutes, il est de coutume de le réaliser de suite, c'est plus simple, et même si vous avez une journée chargée vous devriez toujours avoir 1h à consacrer aux tâches simples pour ne pas bloquer votre correspondant. Si la tâche est complexe, il faudra la planifier, mais au plus vite cette tâche sera réalisée au plus vite vous serez à nouveau disponible pour une nouvelle tâche, ou pour vous occuper d'un développement plus conséquent.

Autre raison technique, lorsqu'on envoie un email, il est daté de l'heure en cours sur la machine sur laquelle il est écrit. Si par hasard cet email est écrit hors ligne, et que votre correspondant ne récupère son accès que quelques jours plus tard, si vous ne disposez pas d'une inbox vide, son email sera perdu dans vos vieux emails et il sera difficile de vous en rendre compte. Mais peut être ne disposez vous pas forcément d'un CRM derrière, ou peut être la demande reçue n'a pas pour une raison ou une autre besoin de se retrouver dans votre CRM. Si tel est le cas, il existe plein d'autres astuces, comme de créer des dossiers pour les 3 à 4 jours à venir, et de remplir chaque dossier avec les tâches que vous pourrez exécuter ce jour précis. C'est basique, mais le cerveau humain a du mal à s'organiser et à se motiver en voyant une longue liste de tâches, alors qu'en voyant 3 ou 4 emails à absolument traiter pour la journée c'est beaucoup plus facile.

Ce concept n'est pas évident à toujours suivre, c'est une discipline à avoir, mais on peut également étendre le principe à d'autres outils. Si vous disposez d'un CRM avec des dizaines de tâches à court terme, concentrez vous sur toutes les tâches courtes afin de pouvoir aérer votre planning, puis de prendre enfin en mains ce qui sera plus conséquent. Cela permettra une fois encore à vos correspondants de débloquer plein de petites tâches, et ne donnera pas d'impression de surcharges alors que vous avez parfois du mal à tout finir sur une journée.

Alors... quand passerez-vous aussi à une inbox zéro?

Sébastien
Publié le 01/12/2015 @ 21:00:00 Dans Chroniques
En soufflant notre 5ème bougie en août dernier, nous soufflions également notre bannissement plus ou moins officiel du monde des startups. On peut retourner la question dans tous les sens, finalement, il faut se rendre à l'évidence, nous ne faisons plus réellement partie de cet écosystème, et pourtant.

Jetez un oeil à toutes ces soirées qui foisonnent, tous ces happening, ces présentations, ces recherches de fonds, ces tentatives parfois osées d'essayer d'imposer cette nouvelle idée. Disruption, révolution, c'est un peu le moto actuel pour attirer les projecteurs sur tout nouveau projet qui va révolutionner le monde.

Et peut être sommes-nous trop vieux, car quand nous nous retrouvons dans ces événements, il n'est pas rare que nous ne nous retrouvions plus. Entre ces idées brillantes qui cherchent encore les bonnes équipes pour les rendre fructueuses, entre ces idées balbutiantes qui n'en sont encore finalement qu'à l'idée, ... Et finalement entre ceux qui ont envie de faire quelque chose, mais chez qui on sent que l'idée va encore chercher longtemps son public, force est de constater que nous y sommes étrangers. Parfois en vieux sages, parfois en témoins survivants d'une génération précédante de startups, ou peut être qu'autre chose a changé dans le visage belge des startups?

Certes, nous avons 5 ans. Certes, nous sommes loin de chercher notre marché, il est clair, et nous y rencontrons un certain succès. Mais nous sommes toujours nous même. Nous ne perdons plus notre énergie à essayer de comprendre comment nous allons réussir encore mieux demain, nous ne devons plus de la même manière monter cette équipe, ce cheval de bataille crucial pour le succès de notre entreprise. Non, nous pouvons nous concentrer sur l'évolution de notre personnel, pour l'enrichir mois après mois de nouveaux talents pour améliorer nos outils, et nous pouvons nous concentrer sur les évolutions majeures qui feront à chaque fois évoluer ce produit vers l'excellence.

Mais, finalement, dans notre coeur, nous sommes toujours ces entrepreneurs en quête de simplification technologique, d'amélioration de notre cadre de vie, et de "révolution". Nous disposons maintenant des outils, des fonds, et des équipes, et même si nous avons perdu il faut l'avouer un peu cette capacité de pouvoir (ou de devoir surtout) réorienter notre cible au gré du vent, nous avons gagné le fait d'avoir justement ce marché , sur lequel nous avons acquis une connaissance et dont nous nous servons au jour le jour pour baser nos prochaines évolutions, nos prochaines révolutions.

Alors oui, il est vrai que je me sens chaque année de plus en plus étranger à ce mot "startup", à ce besoin de projecteur pour montrer au monde qu'on a une idée géniale, mais que l'implémentation est encore toute frétillante. Mais je ne me sens pas non plus comme cette entreprise, remplie de financiers qui calculent chaque geste afin de pouvoir continuer à faire tourner un même business, qui n'évolue plus que par nécessité. Peut-être sera-t-il nécessaire un jour de créer un nouveau mot pour définir ces entreprises, car même si maintenant nous sommes donc une entreprise "comme une autre", notre coeur reste voué à l'innovation. Et quoi qu'on en dise, je ne trouve pas le terme de "entreprise en croissance" si plein de couleur que ce que l'on retrouvait dans la "startup".

Sébastien
Publié le 10/11/2015 @ 09:00:00 Dans Chroniques
Quelques mois sans nouvel épisode, et en relisant les derniers épisodes je me rends compte qu'il y a 6 mois seulement nous étions fiers d'arriver au cap de 2 millions de consommateurs. Et bien qu'aucun nouveau billet n'ait été posté, nous ne nous sommes pas reposés, loin de là. A tel point que dans quelques jours, nous pourrons déjà fêter un nouveau cap, l'arrivée aux 3 millions de consommateurs uniques, plus d'un tiers de la population active en Belgique.

Chaque fois que je suis en public, je ne peux m'empêcher de regarder autour de moi et de me demander qui est déjà consommateur actif dans la base de Freedelity via nos nombreux partenaires. Qui a, au moins une fois, accepté d'utiliser sa carte d'identité pour une garantie, pour un système de fidélité, ou comme identifiant au travers de notre code. Ce code qui, même si on ne parle de quelques secondes par personne, a à chaque fois demandé à vous, à vos voisins, à vos amis, un acte d'acceptation de cette technologie.

Certes, une bonne partie de ces millions de consommateurs ont déjà oublié notre nom, et cela leur sera rappelé lors de leur prochaine visite, mais de la même manière que nos partenaires ont généralement tous dépassé leurs objectifs en terme de qualité (et quantité) d'acquisition de consommateurs, nous aussi avons largement explosé les premiers espoirs les plus fous que nous pouvions avoir. Nous avons fêté la petite dizaine de milliers de consommateurs inscrits la première année, et il nous arrive maintenant de dépasser ce que nous avons fêté sur un an, en une seule journée. A tel point que ces chiffres deviennent parfois difficile à matérialiser.

Bref, nous pourrons encore bien sûr écrire sur l'arrivée aux 4, 5, ou 10 millions de consommateurs. Bien sûr nous espérons maintenant pousser la barre encore plus haut en arrivant l'année prochaine à 5 millions, mais même si ce total continue d'être une chose importante, au fur et à mesure de notre évolution il perd doucement de son importance. Ce chiffre était crucial pour valider l'acceptation de nos choix par la population, il ne subsiste plus aucun doute maintenant dans le milieu, à moins d'être résolument fermé à la réalité. Nous surveillons maintenant bien plus l'usage au jour le jour que la globalité, et ce faisant, nous terminons également en fait notre transition du monde "startup" à un monde de l'entreprise plus classique. Mais cela, ce sera pour le prochain épisode!

Sébastien
Publié le 10/05/2015 @ 19:00:00 Dans Chroniques

For one of our project, we needed to send and receive data from the iPad to an external device, an Android tablet. We first decided to rely on WiFi, but sadly the production environment is highly perturbated and we had to find a more reliable solution, ... a cable! We could have used the audio port, but for practical reason it was impossible for us, so we decided to take a closer look at the lighning port.

In our environement, we already have an accessory plugged into the lighning port, so we decided to open everything up and see if it was possible to hijack the connexion opened by the accessory and add our own data into it... and, it is! Sadly, we are highly limited by the speed of the solution, and our production team decided to go forward with another solution, getting rid of this problem.

We are still happy to share our work, hoping it will help someone else understanding how to use lightning in a professionnal environment. Enjoy the technical read and feel free to share your improvements on github or by email at info@freedelity.be

Let's talk dirty now!

How Lightning works

The Lightning cable

The lightning cable is a cable with 8 wires:
  1. GND
  2. HOST PWR to power the iDevice
  3. ACC_PWR to power the accessory
  4. ACC_ID, used to determine the kind of accessory
  5. two data pairs.


The connector has two rows of 8 pins connected to each wire:
https://blog.freedelity.be/images/stories/lightning/lightning_connector.jpg

As all wires are connected to both sides of the connector and that its shape is symmetrical, the connector can be inserted in both orientation.
But we can see that the way the wires are connected to pins aren't the same on both rows:
https://blog.freedelity.be/images/stories/lightning/lightning_connector_pinout.jpg

Connector configuration process

When plugging a lightning connector, the wires are not directly connected to the corresponding wires on the iDevice, there is a configuration process first (at least to detect the orientation of the cable). That is why you cannot just put voltage on the HOST PWR pin to power up your iDevice, you need to use a genuine charger cable.

Thanks to these articles: http://www.chipworks.com/en/technical-competitive-analysis/resources/blog/systems-analysis-of-the-apple-lightning-to-usb-cable/ and http://ramtin-amin.fr/#tristar, we know that the process is initiated by the iDevice by sending some commands on the ACC_ID pin with a protocol that looks like 1-wire.

In this protocol, the bus has a high voltage by default and any device connected can pull the voltage low (thanks to an open drain or open collector circuit, look at this article to have further info about this kind of connection).
When wanting to send a bit, we announce it by pulling the line low, then all the other devices prepare to sample the line to read the bit value. The sender either keep the line low to send a zero, or let it go high to send a one.
There are timings requirements to let all devices detect the falling edge, let the sender change the line to the good value, and then let each devices the time to read that value. The line is then released by letting the line go high.

The timings used in Lightning ACC_ID pin are:
  1. the complete bit time is: 10.2 μs (micro seconds)
  2. to send a zero, the line is low for 6.9 μs
  3. to send a one, the line is low for 1.6 μs

So when detecting a falling edge, we can sample the line after about 4 μs to read the bit value.

We wrote a little program (acc_id_sniff) to sniff the bytes exchanged in this pin using an Arduino and the exchanged bytes look like this:

iDevice: 74 00 01 FD
Accessory: 75 02 C0 00 00 00 00 50
iDevice: 70 00 00 3D
Accessory: 71 93
iDevice: 76 10
Accessory: 77 01 25 01 00 AC F5 57 29 F6 8A AF
iDevice: 78 0F
Accessory: 79 44 57 48 33 32 36 34 34 37 35 41 46 39 34 4E 31 4A 00 2E 88 AF
iDevice: 7A B3
Accessory: 7B 44 57 48 33 32 36 34 34 37 35 41 46 39 34 4E 31 4A 00 16 08 B5
iDevice: 72 71
Accessory: 73 00 00 C0 00 5E 84 00 00 05 46 46 34 33 32 E8


We didn't decode the exact meaning of these bytes but their purpose is for the iDevice to know the kind of the accessory.
There are four types of accessories (USB Host, USB accessory, Power and Serial) and they need to be connected to different buses. So, following the bytes received, the iDevice will connect one data pair to a serial RX/TX pair, or to an USB differential pair.
The interesting thing here is that the bytes exchanged are always the same for a given iDevice/accessory couple ! There is no authentication process whatsoever. So if you manage to sniff the bytes sent by a genuine charger, you could build your own.

For the orientation detection, in fact, it first tries in one possible orientation, if it has not got any response, it then tries on pin for the other orientation. If the accessory responds, the orientation is correct.

After the identification is made, the ACC_ID pin is let high as no one is communicating and it can serve as a power line for the accessory instead of the ACC_PWR. Some accessories use that to save a wire. In that case, the accessory chip is asleep when plugging the connector to the iDevice. The connector identifies itself so that we connect to the correct internal bus. And then, the accessory chip is awake by the fact that ACC_ID is kept high and it can freely communicate over its data pairs.

Serial communication

It seems that to be able to communicate directly to an iOS app, the connector needs to be of "Serial" type. The only USB device we found is the Apple USB adapter that only serves to connect standard USB devices like keyboards.

When plugging a Serial lightning connector, the Data1/Data2 pair is connected to a UART port (Data1 is matched against the TX line of iDevice, Data2 is matched against the RX line).
The UART uses 8 bits, no parity and one stop bit and its baudrate is 57600.

We wrote another program to sniff the serial communication (serial_sniff) and we manage to figure out some parts of the protocol used.

The communication is divided in blocks of bytes. The frame of the block is as follows:

FF 55 LL 00 XX XX XX XX XX YY


  1. The block starts with the two bytes: 0xFF 0x55
  2. The following bytes encode the length of data. The number of bytes for this field can vary:
    1. for length <= 255: the length is encoded in one byte
    2. for length > 255: the first byte is set to zero, then the length is encoded in the two following bytes in big endian
  3. After length, there is always a null byte (maybe reserved for future usage)
  4. The following bytes are the data to transmit
  5. The last byte is a checksum and is computed so that the sum (truncated to one byte) of all the bytes is equal to 0x54

Note: The length encodes the number of data bytes plus the checksum byte.

The first byte of data defines the type of the packet:
  1. 0x42: data from accessory to iOS app
  2. 0x43: data from iOS app
  3. 0x02: ack from iDevice when receiving a 0x42 packet
  4. 0x41: ack from accessory when receiving a 0x43 packet
  5. there are other types that we could not define and that are used during the authentication process


For 0x42 and 0x43 messages, it seems that the following two bytes encode the frame number (big-endian), and the two following are kind of a session id. That "session" bytes must be the same as the ones the iOS app is using to communicate with the accessory. Then the following bytes are the payload from or to the iOS app.

Here is a packet that send "hello world" to the iOS app:

FF 55 11 00 42 01 00 00 01 'h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'l' 'd' CRC


ACK messages follows this format:

02 XX XX 00 42
or 41 XX XX 00 43

where XX XX is the frame number of the frame to ack.
We can see that the last byte is the type of the frame to ack.

It should be possible to change the baudrate that is used, as this accessory claims to be able to go up to 115200 bps but we did not figure out how yet.

Application

Knowing all this, we then can open a serial bus between an iOS app and any other UART interface without the need to register it to the MFI program.

The only requirement is to have a MFI accessory with a lightning connector of type Serial that will authenticate himself to the iOS system. Until we find a way to crack the way the authentication is done on the serial bus, we cannot bypass this requirement.

We wrote a program (serial_mitm) that runs on an Arduino and allows to make a Man-In-The-Middle attack on the serial bus. It let the authentified accessory speaks freely to the iDevice, but once there are data from an iOS app, it redirects them to the unauthentified device. When this third device responds, the arduino packs it in a correct frame for the iDevice to accept it and forward it to the app.

There are another program (acc_id_spoof) that let the Arduino speaks over the ACC_ID pin and identifies himself as a genuine Serial connector. For now, as we are forced to used and MFI accessory, we can let the accessory's connector do this job but later it could serve to build an all-in-one accessory that does not need MFI to speaks to an iDevice.

How it is built

Materials:
  1. a CableJive dockXtender
  2. an MFI accessory
  3. an Arduino Mega (as we need at least 3 UART)


The CableJive cable is an extension cable for the Lightning connector (so it has a male connector at one end, and a female one at the other end):
https://blog.freedelity.be/images/stories/lightning/cablejive.jpg

It will help us to hijack the wires between an accessory and an iDevice by opening it and directly connect us to its wires.
https://blog.freedelity.be/images/stories/lightning/cablejive_unwrapped.jpg
You could also directly cut off the wires to plug them where you want. But doing like in the picture allowed us to let an accessory communicate with the Apple device and sniff the communication.

Here is one mapping between the CableJive wires and the Lightning pins (remember, there are two possible mappings, and that's the iDevice that will determine the one you're using):
  1. black wire connects to the GND pin
  2. red wire connects to the Host Power pin
  3. shiny orange wire connects to the ACC_ID pin
  4. shiny blue wire connects to the ACC_PWR pin
  5. green wire connects to the Data 1 pin
  6. white wire connects to the Data 2 pin
  7. blue wire connects to the Data 3 pin
  8. brown wire connects to the Data 4 pin


We then unmount an MFI accessory to get its Lightning connector and access the pins it uses to communicate. In our case, it uses four pins: Power (ACC_ID actually, but used for power), GND, Data 1 and Data 2. But it should be quite the same for other accessories, just determine the mapping before removing the lightning connector :wink:

https://blog.freedelity.be/images/stories/lightning/accessory_unmounted.jpg

We then connect the data pair of the accessory to one UART of the Arduino, and the data pair of the Lightning cable to another UART (in our code we connect UART1 to the iDevice, and UART2 to the accessory).
Beware that the UART channels on the Arduino use 5V for the high voltage while the serial channel on the Lightning use 3.3V, we have to downscale the voltage of TX1 and TX2 pins of the Arduino (RX pins can be left as is as 3.3V is high enough to be detected as a logic one). You can use a level shifter circuit for that, but a simple resistor divider will do the trick for the prototype :wink:

Connect also ground to your accessory and 3.3V through a push-button to power it up when it is necessary.

https://blog.freedelity.be/images/stories/lightning/breadboard_serial_mitm.png

We then plug the Lightning connector of the accessory to the female end of the CableJive, and then after (this order is important) plug the other end to the iDevice:
https://blog.freedelity.be/images/stories/lightning/connector_in_cablejive.jpg
It's this connector that will set the lightning orientation, so plug it in a way that matches the wires you are using. To determine if it is correctly inserted, cut off the useless ACC_PWR wire (if you follow our orientation, it is the shiny blue wire), and then unplug/replug the CableJive on the iDevice port. If the connector is not correctly inserted, you will see an alert dialog after about ten seconds telling that the cable or accessory is bad.

Now, we can compile and upload the program to the Arduino (instructions are on the code repository).
Then we have to power up the accessory to let it authenticate itself to the system. You can power it off just after as it will not take part in the communication anymore.

In the computer connected to the Arduino through USB, you can listen and send bytes to the Arduino by reading or writing the file /dev/ttyACM0 (change it to the one your system has assigned to the Arduino).

First you need to tell that the serial bus is 56700-8-N-1, for that you can type:
stty -F /dev/ttyACM0 57600 cs8 raw

You can then read bytes that would have been sent to the accessory by doing:
cat /dev/ttyACM0

And to send bytes to the Arduino, you can type:
echo "Some text" > /dev/ttyACM0


You can use our simple iOS app to send bytes from the iDevice.

Demo



Conclusion
We managed to find a way to open a serial communication bus between an iOS app and a device that does not have to comply with the MFI program.

It still needs a MFI accessory to initiate the communication but it can certainly be useful for hobbyists that want to build custom accessories for iPhones and iPads or for companies that cannot afford to enter the MFI program for low batches of devices.

There are still plenty things to improve :
  1. How can we change the baudrate to have better throughput ?
  2. What is the process of authentication done in the serial bus and how could it be hacked so that we can build standalone custom accessories ?
  3. Would it be possible to take advantage of USB-type Lightning connectors for any kind of device or is it restricted to some USB classes as speaker or keyboards ?
  4. Would it be possible to multiplex two Lightning connectors of different types in order to use them simultaneously ? It will let us finally debug our apps while an accessory use the lightning port.
  5. ...


We are sharing our work in hope it will be useful for anyone and that some enthusiats will take the project further :smile:
All the code is available on github, and we are open to any modification request !
Publié le 08/04/2015 @ 19:00:00 Dans Chroniques
Juin 2010, ma femme enceinte jusqu'au cou, nous lancions commercialement le projet Freedelity sur les rails. Deux geeks qui trouvaient l'idée bonne d'utiliser cette carte à puce pour en remplacer d'autres, et des dizaines d'autres qui nous répétaient que les consommateurs n'accepteraient pas si facilement.

Plein de naïveté, mais pas sans préparation tout de même, nous débutions la vente avec nos 2 premiers convaincus, convaincus que l'idée était bonne et acceptaient de venir nous épauler pour vendre le produit en arpentant les rues. Et la réalité du lancement n'était pas aussi simple que la théorie, en 2010 nous avons certes réussi à trouver nos premiers clients mais les inscriptions plafonnaient elles à 7k (7.000!) consommateurs sur 6 mois.

Et pourtant, cela nous semblait être déjà un gros succès, car nous arrivions en quelques mois à peine à dépasser d'autres systèmes qui ne totalisaient que quelques milliers d'inscrits. Les mois se suivirent, et à force de nombreux efforts et malgré les nombreuses défaites nous avons continué à croire en cette idée, à tel point qu'en moins de 2 ans nous avions totalisé 500k inscrits. Oui, un demi million, un chiffre déjà extraordinaire, que peu d'autres systèmes ont atteint ce jour.

Et cette semaine, nous dépassons un nouveau cap important, 2 millions, 2.000.000 de consommateurs uniques qui ont un jour ou l'autre passé leur carte dans un lecteur de Freedelity. Si l'on comptabilise le nombre de ventes que cela représente sur la plateforme à ce jour, on peut facilement penser que plus de belges ont dorénavant sorti leur eID pour gagner des points sur Freedelity que pour payer leurs impôts. J'avoue ne pas disposer de chiffres exacts à ce sujet, mais je suis certain que nous disputons actuellement la tête du peloton des applications qui utilisent l'eID en Belgique, coudes à coudes aux applications officielles. Et après tout, n'est-ce pas plus sympathique comme geste? :wink:

Je profite donc de ce moment important pour Freedelity pour faire un petit retour sur le blog, et de remercier nos familles qui nous ont supporté, nos amis, notre équipe, nos actionnaires, nos clients, nos partenaires et bien sûr tous les belges sans qui rien de ceci ne serait possible. On se donne rendez-vous pour un billet sur les 3, ou les 4 millions de consommateurs? A votre avis, 3 millions en 2015 ou 2016?

Sébastien
Publié le 05/11/2014 @ 22:00:00 Dans Chroniques
Cette dernière décennie, en me promenant dans diverses structures, je n'ai pu que constater souvent une situation très similaire. L'IT, service transversal au service des autres, n'a de cesse de tenter de se rendre indispensable. Pourquoi?

On pense bien sûr à la sécurité, car l'IT rime souvent avec les limitations des accès sur les postes clients. Pour éviter les virus, pour éviter qu'un employé passe sa journée à surfer plutôt que de travailler. La confiance entre l'IT et les utilisateurs lambda est souvent faible.

Mais au final, ce n'est pas ce qui me choque. Non, ce qui me choque, c'est quand il y a des applications développées en interne. De base, dans ces situations, un informaticien semble considérer qu'un responsable marketing n'est pas capable de comprendre la technique, et qu'il doit toujours passer par un informaticien pour accéder à ses données. Je stigmatise? Pas si sûr.

Concrètement?

Prenez le secteur du retail, qui ne diffère souvent pas des autres mais que nous rencontrons régulièrement pour le moment. Vous disposez d'une base de consommateurs, et vous avez envie de pouvoir envoyer un email à toutes les femmes inscrites ces 30 derniers jours. Comment faire? Une fois la campagne décidée, vous allez devoir envoyer un mail ou une demande au service IT pour demander l'export. Une fois le fichier reçu, vous avez oublié de demander la date de naissance car vous vouliez confirmer cette information avec les consommateurs. Vous redemandez donc au service IT, qui, débordé, finira par répondre après une semaine. 2 semaines plus tard, vous pouvez enfin lancer votre action.

Cela, c'est en interne, en externe le tout est encore plus complexe souvent, et facturable à souhait car un humain devra lire votre mail, écrire le script, et vous répondre. Frustrant vous avez dit? Du protectionnisme je dirais plutôt...

C'est probablement un acte inconscient, qui mélange protectionnisme et manque de confiance, mais le service informatique préférera garder le contrôle absolu sur ce que l'on peut faire réellement de la base, la manipuler, y accéder, en considérant parfois que le marketing ne devrait pas réaliser certaines opérations. Avec les années, la frustration accumulée par les autres services se ressentira dans l'ambiance entre les services, considérant au final que le service informatique n'est pas capable de fournir les services souhaités en interne, et cela limitera aussi bien les développements internes par manque de temps que par certitude des dirigeants que l'interne n'est pas, souvent à tort, capable de répondre à leurs besoins.

Les investissements dans l'informatique ont été nombreux ces dernières années pour automatiser certaines tâches, mais dans cette automatisation il manque souvent une dernière étape d'interfaces pour les autres services disposer des outils nécessaires pour fonctionner de manière autonome. La réduction de personnel ferait-elle, au final, peur à l'IT?

Je n'aime pas ce moto

Depuis toujours, j'ai préféré essayer d'expliquer à mes proches comment dominer la technologie, comment être autonome pour régler la télévision, pour réparer son PC d'une panne simple en donnant autant que possibles les clés de ce qu'ils utilisent et une marche à suivre simple pour ne pas dépendre de l'informaticien "tout/trop puissant".

Sur Freedelity, nous avons tenté de reprendre le même esprit, proposer des outils qui permettent aux clients de faire tout ce dont ils ont envie sans jamais devoir nous le demander. Leur donner les possibilités de consulter les statistiques dont ils ont envie en cliquant simplement, de récupérer tout ou partie de leur base avec une série de filtres user friendly pour pouvoir l'exploiter, l'analyser sur Excel si ils en ont envie, ou la fournir à un autre prestataire. Et in fine d'offrir au marketing les outils dont ils ont besoin pour communiquer par différents moyens de leur propre chef. Chose qu'au final, non seulement l'IT mais les boîtes de communications essaient de réduire au minimum pour se garantir un revenu confortable.

N'oubliez jamais que les utilisateurs ne sont pas idiots, ils sont tout aussi capables si on leur donne les outils adéquats de savoir ce dont ils ont besoin pour leur action, et préfèrent de loin avoir une certaine autonomie que de toujours demander à une tierce personne de réaliser le travail. C'est plus efficace, plus rentable, et nettement moins frustrant. Et après tout, ceci n'est qu'une question de respect de son utilisateur...
... 
Copyright © Freedelity SA, tous droits réservés