vendredi 10 juillet 2009

Fin de projet SCADE

La fin d'une mission, ou d'un projet, c'est toujours une bonne occasion de faire le point. Je viens de terminer tout récemment une mission de quelques mois en tant que développeur logiciel, en SCADE, pour un système embarqué sur avion. Cette mission a été plutôt enrichissante sur plusieurs points.



SCADE

SCADE est un environnement de développement propriétaire édité par Esterel, et basé sur le langage Lustre. Il cible principalement les applications dites "critiques", dans des domaines divers comme le ferroviaire, le nucléaire, le spatial... et bien sûr l'aéronautique.
Ce que les gens du milieu appellent un peu pompeusement de la "spécification formelle", j'aurais tendance à l'appeler du "codage graphique" (pour un certain nombre de raisons, les ingénieurs systèmes apprécient peu le terme "code"...). En effet il s'agit ici non pas de coder avec des fichiers textes, mais directement avec une représentation graphique (c'est cette représentation, qui se veut le pendant visuel de la spécification textuelle, que d'aucun nomme la "spécification formelle"). Par la suite, cette représentation graphique est convertie en langage Lustre (langage de programmation textuel, "classique"), celui-ci étant à son tour interprété afin de générer le code C (ou Ada, au choix) qui sera finalement executé sur cible.

Alors en pratique, à quoi ça ressemble ? Pour des raisons évidentes de confidentialité, je n'ai pas d'images de mon projet sous la main, mais en gros c'est un espèce d'hybride entre des représentations de fonctions logiques (notation américaine), de machines à état, et de certains schémas UML. Un exemple de chez Esterel ici (machine à état en haut,"workflow" en bas).

N'ayant jamais utilisé ce type d'outil avant, j'avoue que l'adaptation se fait assez rapidement, même si certains aspects restent déroutants (la représentation des machines à états est à mon avis assez peu intuitive par exemple), et si certains côtés sont un peu frustrants (gestion des types...).
Par contre, clairement l'outil possède des avantages sur du codage manuel normal :
  • Tout l'aspect concurrent et synchrone est épargné au développeur, évitant de nombreuses erreurs
  • Abstraction également de la gestion de la mémoire (ce qui n'est bien sûr pas le cas en C ou en Ada - de longues heures de debug gagnées...)
  • Représentation du code sous une forme lisible par quelqu'un ne sachant pas coder (un ingénieur système par exemple)
  • Annulation du besoin de vérification manuelle sur de nombreux points (revue du code généré notamment)

DO-178B

C'est mon second projet dans ce que les commerciaux aiment appeler "un contexte de DO-178B". En pratique, la DO-178B, est une norme aéronautique pour le développement d'applications critiques (le plus souvent embarquées sur avion). C'est une norme très sévère qui imposent de nombreuses règles pour la conception et le développement logiciel. Notamment :

  • La gestion de configuration obligatoire
  • La traçabilité "parfaite" entre les spécification et le code
  • Les différents aspects de la validation et vérification (revue de code, indépendance entre le codeur et le testeur, couverture des tests...)
Bizarrement, on s'habitue... Quand j'ai découvert cette norme, j'ai plus eu l'impression de la subir que d'en profiter, mais là, ayant participé à la mise en place du process de validation (l'ensemble des règles et documents pour les tests, entre autres), je dois avouer que travailler dans un cadre très strict a ses avantages. De bonnes pratiques sont obligatoires au niveau de la traçabilité par exemple : "Quel bout de code correspond à une spec donnée ?". Ou encore : "Jusqu'à quel point dois-je tester mes fonctions ?", etc...


Au niveau dev...

C'est la première fois que je me retrouvais seul, en milieu pro, à prendre en charge le développement complet d'un soft. C'est un peu flippant au début, surtout quand on a été habitué à avoir des gars très bons techniquement à côté de soi, mais c'est aussi extrêmement enrichissant.
En particulier, le fait de devoir faire soi-même des choix au niveau de l'architecture du logiciel, des conventions techniques, du design, etc... c'est l'une des parties les plus intéressantes du développement (l'implémentation est sympa aussi, hein !).

Sans trop rentrer dans les détails techniques (qui seraient de toute façon une redite de pas mal de principes de base de conception logicielle), voici ce que j'en ai retenu :
  • Les spécifications, quand elles sont écrites par quelqu'un d'autre qu'un codeur, sont forcément en décalage par rapport aux réels besoins, et par rapport à leur mise en oeuvre. Ce qui veut dire que celui qui code doit participer, et influencer au maximum cette phase de spécification. En gros : participer à cette expression des besoins plutôt que la subir ensuite.
  • Avant même de réfléchir à la façon d'implémenter les fonctions demandées, identifier les problèmes à venir, d'un point de vue software (pas d'un point de vue système, ou métier), qui se posent et proposer une solution. Par exemple dans mon cas : grand nombre de variables en entrée et en sortie => création de façades ; uniquement des variables booléennes => créations de types structurés utilisés dans les interfaces de chaque fonction ; besoin temporaire de certains modes de fonctionnement => design pattern Strategy (non, il n'y a pas de POO dans SCADE, pour autant ça reste applicable) et séggrégation des fonctions par mode ; etc...
  • Essayer de piquer les bonnes pratiques des langages modernes et/ou fonctionnels : pas de variables globales, éviter tant que possible les effets de bord, composer ses fonctions, etc...
  • Le typage, c'est la vie.
  • Communiquer au maximum : "Mon code est dans tel état là, maintenant.", "Telle partie sera disponible le tant.", "On va avoir des problèmes à tel niveau sur telle spec.", "Je suis en retard par rapport au planning à cause de tel problème.", etc... et de façon systématique et quotidienne. Cela permet d'éviter bien des mauvaises surprises.
  • Séparer ce qui change de ce qui ne change pas (formulation honteusement pompé à Russ Olsen)
  • Et les classiques : KISS, DRY, YAGNI, etc...

credits : photo de nacelle par Eric E Johnson

mardi 23 juin 2009

Les promesses de la programmation fonctionnelle

Disclaimer : Je me permets un post cours et un peu dans l'urgence pour vous proposer un document qui risque de ne pas être éternellement disponible librement... Si le lien ci-dessous ne vous permet pas d'accéder à la version PDF (ici) de cet article, c'est qu'il est trop tard... Désolé.

Juste un petit message pour signaler la publication récente d'un article (scientifique) qui me semble intéressant, à propos de programmation fonctionnelle :

The Promises of Functional Programming,
de Konrad Hinsen (CNRS Orléans)
L'auteur axe sa réflexion autour des qualités de ce type de langages, s'attardant sur la famille "LISP - Clojure" (dans laquelle il inclut implicitement Erlang, pour ceux qui se demanderaient où le placer...) et "ML" ; à savoir robustesse et compacité du code et surtout facilité de parallélisation, un aspect aujourd'hui crucial en calcul scientifique (domaine de l'auteur).

J'espère reparler rapidement ici de programmation fonctionnelle, mais sous un angle un peu particulier, puisque je ne pratique aucun langage fonctionnel à proprement parler...

Bonne lecture !

mercredi 1 avril 2009

Algorithme naïf de cryptage d'entrée

Je vous propose aujourd'hui un petit algorithme dans le domaine de la cryptographie, implémenté en Ruby. Comme vous allez le voir, il s'agit d'un algorithme à clef secrète générée aléatoirement au moment du chiffrement. Cette méthode est assez peu intéressante pour la plupart des applications de cryptage (transfert de message notamment) de par le fait que la clef doit être transmise afin que le destinataire puisse décrypter le message. Dans ce cadre, on utilise plus volontiers la cryptographie asymétrique (RSA, etc...), ou, pour des raisons de performances, une méthode symétrique dont la clef est cryptée de façon asymétrique.


En revanche, cet algorithme me semble utilisable pour un autre genre d'applications : de façon locale, afin de crypter une réception de donnée par exemple.

Contexte

Plusieurs hypothèses tout d'abord. La donnée à recevoir peut être accédée par morceaux (bits, lettres, chiffres, lignes, pages, etc...). On ne connait pas à priori sa taille. On suppose également que l'on peut pareillement accéder à un nombre important de données similaires.



Principe : Se fondre dans la masse

Le coeur de la méthode consiste à noyer l'information que l'on souhaite recevoir (notée A dans la suite, data dans le code) la recevant par morceaux, au milieu d'une foule d'autres informations similaires, de façon aléatoire.
Pour cela, on construit des "cycles" de taille aléatoire, dont seuls certains index (aléatoires eux-aussi) contiennent des parts de données intéressantes. La clé consiste en la liste des cycles utilisées (plus simplement, la liste des couples [occurences de part de A, taille du cycle]).

Le code

Dans mon implémentation en Ruby, j'applique l'algorithme à un tableau. L'input dummies correspond donc à une liste de données. La sortie est la paire [données cryptée, clé]

Cryptage :



A noter que je clone l'entrée data afin que la méthode soit non destructive sur celle-ci.

Décryptage :



On décrypte par morceau correspondant chacun à un cycle de la clef.

Exemple :

Pour tester cette méthode :



Ce qui donne un résultat du genre (pour rappel, la clef est profondément aléatoire...) de celui-ci.


Conclusion

Encore une fois, il s'agit d'une méthode naïve, à utilité limitée (je suis un grand débutant en crypto). Cependant, pour un usage local, elle me semble adaptée, bien que probablement peu performante en terme de vitesse (celle-ci étant conditionnée par l'ampleur des cycles et le nombre d'occurrences par cycle, ici en dur).
J'ai du mal à me figurer de grosses failles dans cet algorithme, si ce n'est pour ce qui est de l'utilisation de la randomisation : 1/ sa complexité étant dans l'absolue aléatoire, elle ne peut être calculée que par majoration dans le meilleur des cas (le meilleur des cas en crypto étant en fait le pire des cas en algorithmique), 2/ des failles existent sur des implémentations standards des méthodes random (présence de cycles, etc... Des méthodes plus abouties existent cependant, notamment celles utilisant des propriétés physiques du matériel informatique, comme la température par exemple).

Notes :
1/ Crédit photo : Jan Chipcase
2/ Ceci n'est pas un poisson d'Avril. J'aime pas cette tradition de clampes.

vendredi 27 mars 2009

Comment utiliser Twitter ?

Vu l'énorme buzz du moment sur le service web Twitter, et les questions que j'entends fréquemment sur celui-ci, il me parait utile d'expliquer le plus simplement possible ce qu'est Twitter, et comment l'utiliser.


Qu'est-ce que Twitter ?

Le terme "Twitter" désigne plusieurs choses : un service web, le site web correspondant et la start-up (entreprise) le gérant/possédant. Je reviendrai sur la différence site / service web un peu plus loin.

Twitter permet de publier des "tweets" (gazouillis en Anglais. Twitter veut donc dire "gazouilleur", d'où les images de piafs du site). Ceux-ci correspondent à des "textes" de 140 caractères maximum, pouvant comporter des liens. Dans une certaine mesure, cela ressemble au "statut" sur FaceBook ("What are you doing ?" - la nouvelle interface de FaceBook s'inspire d'ailleurs de celle de Twitter), ou à l'"état" en messagerie instantané. Un exemple typique en Français (par Genma - vous noterez l'humour, en cette période d'HADOPI...) :

"Une mère insensée" de Christine Albanel (Auteur) en vente, sur Amazon : http://tinyurl.com/cvjvpo De la bonne lecture, en livre de chevet ?

Mais comme on dit, "Dans l'espace, personne ne vous entendra crier". Twitter permet donc de "suivre" d'autres utilisateurs et donc d'être suivis par d'autres utilisateurs. Basiquement, cela signifie que vous verrez leurs tweets (ou mise à jour) et inversement, par ordre chronologique.
Il y a de nombreuses fonctionnalités associées au suivi : blocage d'utilisateurs intempestifs, tweets privés, tweets adressés à une ou plusieurs utilisateurs en particulier, etc... J'y reviendrai plus tard. Twitter permet également dadresser des messages privés directement à un utilisateur (direct message) : pour cela, celui-ci doit déjà vous suivre, ceci afin d'éviter le spam.

Twitter est donc un outil de réseau social plutôt qu'un réseau social au sens strict (comme FaceBook ou LinkedIn). Personnellement, je le vois comme un nouveau mode de communication.
La différence entre site web et service web réside dans le fait que ceux-ci sont découplés. Plus simplement : rien ne vous oblige à utiliser le site web de Twitter pour tweeter, afficher vos tweets et/ou suivre d'autres personnes. Il existe en effet de nombreux moyens d'utiliser ce service : pléthore de logiciels tiers, plugins pour navigateurs, widgets et autres services web. Twitter en propose une liste non exhaustive ici. Dans la colonne de droite de ce blog, vous pouvez par exemple lire mes derniers tweets. Il est également possible de tweeter par SMS via son téléphone.


A quoi sert Twitter ?


Difficile d'être objectif sur ce point, tant les critiques du service peuvent être dythirambiques ou assassines.
Twitter est un outil de communication avant tout. Ce qui est intéressant, c'est qu'il peut être utilisé de nombreuses façons, pour des objectifs divers.
L'une des principales attaques contre Twitter consiste à dire que : "Dire ce que l'on est en train de faire est à la fois narcissique, impudique et contre-productif." (je résume volontairement).
Pour autant, je vous propose dans la suite quelques "modes" d'utilisation de Twitter qui tentent démontrer le contraire, après avoir décrit les quelques "normes d'utilisations".


Comment tweeter ?

Voici quelques normes courantes d'utilisation de Twitter :

  • RT signifie "ReTweet" : lorsque l'on lit un tweet intéressant et que l'on souhaite lui faire écho, il suffit de le copier et de le tweeter à son tour. Pour cela, on utilise cette syntaxe, avec "source" l'utilisateur du tweet de départ :
RT @source Un tweet très intéressant, sans doute avec un lien.
  • @user : dans un tweet, mettre @ devant le nom d'un utilisateur, sans espace, permet de mettre automatiquement un lien vers son profil. En particulier, lorsque l'on adresse un tweet à une personne , (pour répondre à son dernier tweet par exemple) le tweet doit commencer par ceci. Exemple :
@toto197 Moi aussi j'ai adoré ce bouquin, même si la fin est un peu abrupte.
  • #keyword : lorsque l'on souhaite que son tweet soit référencé dans certains moteurs de recherche et/ou puisse être classifié automatiquement dans une catégorie donnée par d'autres services, sites ou logiciels, on utilise le signe # devant le mot-clé employé, sans espace. Par exemple :
Tous à la manif contre #hadopi !
  • OH pour OverHead : moins fréquent, cela signifie que vous tweeter quelque chose que vous avez entendu. Exemple :
OH Ingenicono va licencier 1 milliard de consultants.



Comment utiliser Twitter : quelques "modes" d'utilisation

Liste non exhaustive, mais illustrant, à mon sens, les possibilités offertes par ce service, avec quelques outils, et exemples de tweets (à titre purement informatif, et non contractuels).

Microblogging : ma vie, mon œuvre, mon cµl

What ?

Grand classique du microblogging que l'on méprise tous (et qu'on est pourtant si nombreux à pratiquer...), il s'agit stricto sensu de tweeter ce que l'on est en train de faire, ou d'une manière plus large, ce qui nous arrive IRL (dans la "vraie" vie quoi...). Bien qu'assez inintéressant, il y a des cas, ou celà permet de rester en contact (d'une certaine façon, à chacun de juger) avec sa famille et ses amis. Aussi, on peut utiliser Twitter comme un IRC/MSN moins invasif.

How ?

Les bons outils pour cela sont (a priori : je pratique assez peu ce "mode") un bon petit pluggin pour son navigateur, histoire d'éviter de passer par le site, voire Flock, et tinypic pour partager ses photos (photos de sa vie, son oeuvre, etc...), et un bon forfait de SMS... A la limite, un logiciel tiers avec notifications (genre TweetDeck) pour une utilisation type instant messaging avec beaucoup de followers/followings. Passer en mode privé (c'est à dire n'autoriser que certainss followers) est une option s'il s'agit uniquement de rester en contact avec des proches IRL.

Like ?

  • Arrive à l'aéroport.
  • Bah, le café est pas bon !
  • Vais faire caca LOL
  • @sabrinette256 kikoo twa !

Microblogging : partage

What ?

Déjà plus intéressant, on peut utiliser Twitter comme un flux de partage et/ou tumblelog (comme Tumblr par exemple) ; c'est à dire pour partager ses liens web : lectures, images, vidéos, etc... ou ses propres oeuvres.

How ?

Peu de besoins finalement pour ce mode là : tinyurl pour raccourcir ses liens, tinypic pour loader ses images et vidéos et pourquoi un script du type "Tweet This", tweetant automatiquement la page courante de votre navigateur.

Like ?


Coworker

What ?

Application professionnelle : avoir un état de l'activité de ses collègues de travail. Ne riez pas, dans certains domaines, je pense que celà peut être extrêmement utile, et contrairement à ce qu'on pourrait croire, un gain de productivité. Effectivement, il est parfois vital de savoir sur quelle tâche sont vos collègues. Par ailleurs, je pense qu'on peut facilement imaginer un script parsant automatisant les tweets, et créant une ébauche de relevé d'activité (j'en reparlerai sans doute dans un prochain post).

How ?

Mode privé surtout (le monde n'a pas besoin de savoir, et dans ce contexte, il est contreproductif de suivre quelqu'un d'autre que vos collègues). Eventuellement un notifier discret ?

Like ?

  • Bug n°256 corrigé
  • J'attaque la spec IHM-93
  • En réunion client jusqu'à 16H
  • @jdupont il y a un soucis dans la 3° partie de ton rapport
  • Je pars voir l'expert dans 30 min. Pas de question sur le nouveau process ?

Commerce 2.0

What ?

Pas mal d'entreprises commencent à utiliser Twitter pour diffuser des infos, faire des annonces, et même avoir un retour sur leur dernier "produit" ou encore lancer des micro-sondages.

How ?

Les entreprises peuvent assez facilement développer/se payer des scripts ou autres bots tweetant automatiquement leurs infos. WeFollow par exemple, leur permet de se référencer facilement et d'augmenter leur visibilité. Cependant, il est nécessaire que celles-ci comprennent que Twitter n'est pas un média à sens unique, comme peut l'être la télévision par exemple : l'outil perd de son intérêt s'il est uniquement employé pour diffuser, et qu'aucun retour n'est pris en compte.
Par exemple, l'un des développeurs du logiciel Flock utilise régulièrement Twitter pour demander leur avis à ses followers sur les fonctionnalités qu'ils désirent dans le logiciel, comment celles-ci doivent se présenter / s'utiliser, etc... Il a ainsi un retour direct et synthétique (140 caractères...) d'un nombre important d'utilisateurs.

Like ?

  • Promo au magasin à partir de demain sur les chaussures rouges !
  • Notre nouveau modèle de netbook 2 Go sortira finalement courant Avril
  • Participez au concours d'IndusBidule : http://indusbidule.fr/concours/toto
  • Notre équipe IT cherche un nouveau responsable media : http://recruttruc/offre/244
  • Hausse de notre action de 7.8% : http://www.tousdanslesbourses.com/blague

Event Media

What ?

Twitter est un très bon outil pour les professionnels de l'évènementiel. Il permet rapidement d'informer de son dernier évènement : concert, festival, exposition, conférence, etc...

How ?

Ici encore pour le professionnel, les scripts et un bon référencement sont les bienvenus. Rien de particulier, si ce n'est que des liens restent nécessaires pour détaillé le tweet.

Like ?

  • Concert de Lyne la Coquine le 4 à Limoges au Grand Vase : http://llc-music.fr/concerts
  • Plus que quelques places pour l'opéra de Whessenfyerstrauss à Marseille le 12 Juin : http://...
  • Finalement, le jeune talent Elvis Presley n'assurera pas ces dates en France à partir du 1er Avril. Pour tout remboursement, contactez http://...

News

What ?

Les grands acteurs du monde de l'information se mettent à Twitter : CNN, BBC, The Guardian Tech, etc... En général, ils proposent des brèves, et des liens vers les articles de leurs sites respectifs. Personnellement, je ne trouve pas encore un intérêt majeur à ce mode là : il réinvente le flux RSS en moins pratique, sans apporter énormément de plus value.

How ?

Pour le follower, un logiciel tiers du type de TweetDeck, permettant de trier les tweets, semble approprié s'il suit plusieurs de ces sources : en effet, le nombre de tweets peut être important, et éventuellement noyer ses autres contacts.

Like ?


Lazy Web

What ?

Ce que j'appelle le "Lazy Web" (litéralement "Web paresseux") est la méthode consistant à demander une information aux autres, sur le web, plutôt que de la rechercher comme un grand garçon (ou une grande fille, ou un grand robot que s'il est sage il pourra jouer à pong). Autant je déteste passablement les gens en abusant sur les forums ("Hé, comment on fé pour désinstaller un logicielle sous L1nux ?" - il faut toujours qu'il y ait une bonne âme (aussi appelée un pigeon) pour répondre à ce genre de topic honteux), autant je dois reconnaître que sur Twitter, c'est un peu différent. D'abord parce que le tweet en question va polluer beaucoup moins longtemps la liste de vos followers que sur un forum ou autre. Ensuite parce que d'une certaine façon, vous vous adressez généralement à moins de personnes. Ensuite, parce que si c'est fait intelligemment, ça peut être efficace.

How ?

Pas d'outils particuliers pour cette utilisation. A noter que contrairement aux modes précédents, il ne saurait ici s'agir d'un mode d'utilisation de Twitter à part entière : qui vous suivra si vous ne faites que poser des questions ? Attention à ne pas en abuser donc...

Like ?

  • Je me tate entre l'achat d'un eeePC et d'un Aspire One : des avis ?
  • Quelle galère pour compiler tel logiciel sous Window$ : c'est normal, ou il faut carrément que je le compile sous Nix en croisé ?
  • Question au peuple : Gmail est mort aussi chez vous ?

Buzz Surfer

What ?

Twitter permet de s'informer des préoccupations des gens l'utilisant, quasiment en temps réel. Pour ceux qui sont accros à la nouveauté, au buzz (comme on dit chez les djeunz) et pour les beta-testeurs et early-adopters de tout poil, c'est une aubaine car certains outils sont vraiment efficaces pour ce faire.

How ?

Principalement ici : l'outil de recherche de Twitter, TwitterSearch. Celui-ci permet d'afficher en temps réel les tweets contenant un mot-clef. Il informe également des sujets du moment. Grâce à l'API très ouverte de Twitter, on voit également apparaître des outils communautaires très intéressantes, comme API's VS Hadopi.
C'est dans ce genre d'utilisation que les mots-clés (avec # devant) et les retweets prennent tous leur sens : référencement, phénomène d'écho, etc...

Like ?

  • Cuil is really a good... nah, just kidding...

Autres...

Bien d'autres utilisations sont possibles : communauté, jeux (on en reparlera), spam, bots, etc...

A chacun d'utiliser le service comme il l'entend, mais toujours avec moins de 140 caractères.

--------

Les commentaires sont ouverts pour toute question.
Je reparlerai très certainement de Twitter dans de prochains posts.