Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/public/lib.urlhandlers.php on line 503

Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/clearbricks/common/lib.http.php on line 222

Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/clearbricks/common/lib.http.php on line 224

Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/public/lib.urlhandlers.php on line 65

Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/clearbricks/common/lib.http.php on line 247
Embedded weblog - informatique 2014-05-14T10:00:05+02:00 Gilles Blanc urn:md5:b402c09b50e67198753bdd4269dc5b19 Dotclear de l'option informatique au lycée urn:md5:cc0e5cda95af02e0eb63e5b73a0b21c9 2012-09-14T21:55:00+01:00 Gilles Blanc informatique enseignement <p>Le besoin d'un nombre de caractères supérieur à 140 sort ce blog du frigo.</p> <p>J'ai commencé l'informatique très tôt, à 7 ans (comme un certain nombre de geeks), sur Atari ST, avec du Basic (petite pensée pour <a href="http://en.wikiquote.org/wiki/Edsger_W._Dijkstra">Dijkstra</a>). Je n'ai pas fait grand chose, à vrai dire, ma vraie passion était ailleurs, dans l'électronique et la robotique. Au collège, dans le cours de techno, divisé en plusieurs activités durant l'année (la période électronique où l'on construit l'amplificateur sonore, la période de dessin où l'on se demande ce que l'on fiche... Et la période d'informatique), le professeur de techno (quand j'y pense, j'en ai eu quatre, mais une seule année m'a vraiment marqué, à ce niveau) s'est entrepris de nous former à l'informatique. Il y avait les vieux PC dans une salle dédiée mais standard, et des PC neufs dans une salle coffre-fort ; les premiers équipés de DOS, les seconds de Win3.1 — à l'époque, je ne comprenais pas pourquoi on travaillait déjà sur ces vieilles bouses alors que mon Atari était largement supérieur. Le cours ? Je me souviens avoir passé 1h30 à recopier un programme en Basic (encore !... Du Qbasic cette fois, il me semble), pour faire une bannière rotative. On ne nous avait pas vraiment expliqué comment "ça marchait", ni l'algorithmique. L'ennui total.</p> <p>En revanche, lorsque je fus en 4ème, à la maison, on changea l'Atari pour un PC, 2Ghz, 2Go de disque dur, 32Mo de RAM (quoique, je crois qu'au début il devait y en avoir 16, on l'a boosté plus tard, pour que Win98 puisse fonctionner). Une bête de course, un truc de fou. C'est l'époque où tout les gens de la classe moyenne "éclairée" (pas ceux qui se demandaient encore à quoi pouvait bien servir un tel engin) commençaient sérieusement à s'équiper. Et mon paternel passa à VB3, ce sur quoi je suivi, avant de migrer vers VB6 assez rapidement — moi aussi (en revanche, il passa aussi rapidement au C, mais là, moi non : le lycée, beaucoup de boulot, le livre pour apprendre le Borland qui devenait très, très gros). J'ai donc fait du Visual Basic durant plusieurs années, et j'ai appris par moi-même, avec l'aide Microsoft fournie (il faut imaginer que VB3, c'était quelque chose comme 21 disquettes pour l'installation), et un bouquin sur VB5 (on n'avait pas pu trouver mieux, même à Marseille, il fallait faire 10km pour le trouver).</p> <p>Alors au lycée (lycée Thiers de Marseille, je précise — élèves sur-sélectionnés), quand j'ai vu l'option informatique, naturellement, je l'ai prise. J'avais d'autres options, en plus de la section européenne, et notamment la TSA (je ne sais plus comment ça s'appelle à présent, ces Techniques des Systèmes Automatisés, l'électrotechnique en somme). Déception, cependant : loin de programmer, nous avons appris à manier Word, puis Excel. Ça m'a bien resservi, mais c'était un mode d'apprentissage de secrétaire, pas d'informaticien. La programmation, c'était par soi-même sur la calculatrice, la TI-85 (puis la 89, ah, quelle puissance !). Cependant, en 1ère, les choses ont changé : de la programmation, enfin ! Un cours de deux heures par semaine, en deux fois une heure. La première le lundi de 17h30 à 18h30 (soit après les trois à quatre heures de cours de l'après-midi, et les quatre à cinq du matin), parce qu'horaire commun à toutes les 1ères, une quarantaine de personnes, ensuite divisées en deux groupes, entre midi et deux cette fois, pour les TPs — alors que l'autre heure était pour la théorie. Programmation en Pascal. À la fin de l'année, j'ai pu faire un serpent et d'autres trucs amusants. En VB, j'étais pourtant allé beaucoup plus loin question résultat, mais on ne manipule pas de tableaux, en VB (c'est possible, évidemment, mais on n'y est pas vraiment encouragé, on peut largement s'en passer par les truchements du langage). C'était un prof de maths reconverti qui enseignait, je crois, mais il ne devait faire que ça dans le lycée, d'ailleurs il me semble que c'était un autre prof de maths qui faisait faire les TPs (les deux ayant la quarantaine).</p> <p>C'est cet autre prof de maths qui s'occupait de l'option informatique en Terminale. Et puis on nous a obligé choisir au bout de quelques semaines : soit informatique, soit TI (technologie industrielle, la suite de la TSA en changeant le nom à partir de la 1ère) ; avec le même horaire du mardi de 17h00 à 19h00 (plus un mercredi aprem entier de temps à autre pour la TI, puisque c'était censé être 3 heures par semaine), pour rendre les deux options impossible à cumuler. Nous étions deux à avoir gardé les deux options. Nous avons tous les deux choisi de garder la TI et d'abandonner l'informatique. Je me souviens très bien des raisons de ce choix : on apprenait au final mieux par nous-même à programmer, alors qu'en TI, on s'éclatait, on apprenait un nombre démentiel de choses.</p> <p>En informatique, le prof de maths ne nous a jamais expliqué comment marche une machine. En TI, les profs étaient des ingénieurs reconvertis, ils savaient de quoi ils parlaient, ils avaient une approche pratique forte, on avait envie d'apprendre le métier d'ingénieur. Pour suivre le cours de TI, il fallait avoir choisi l'option dès la 2nde et ne jamais avoir lâché (on était 120 en 2nde, plus que 20 en Terminale — et en section européenne, de 80 on était passé à 15) ; en informatique, on pouvait commencer l'option en Terminale (même s'il valait bien mieux avoir déjà pris l'option en 1ère), ce qui impliquait que le prof devait recommencer par les bases. En informatique, il fallait rendre un projet franchement simple noté par le prof, et les bonnes notes pleuvaient assez gratuitement ; en TI, il y avait une vraie épreuve écrite de trois heures sur des problématiques d'ingénieur, c'était du costaud (et j'ai tout de même eu 20).</p> <p>En prépa, le problème s'est de nouveau posé : nous avons tous commencé par la SI (Sciences de l'ingénieur), et on nous a ensuite donné le choix, au bout de quelques semaines (peut-être un trimestre), de basculer sur l'option informatique (choix à faire pour les deux ans, aucun retour en arrière possible, un seul cours de test en info pour se décider). Cette option étant dispensée par mon prof de maths à l'ensemble des trois classes MPSI et trois MP, en transversal, ce qui collectait une quarantaine d'élèves au final de chaque niveau (sur 150). En SI, c'était un ingénieur, formé en école d'ingénieur et devenu spécialement prof de SI pour les prépas, qui dispensait le cours. Mais j'en ai eu un peu marre, ayant déjà fait une partie — la plus intéressante — en TI, et la matière étant assez pourrie de calculs encore plus approximatifs qu'en cours de physique (ce n'est pas peu dire...). J'ai donc opté pour l'informatique, et j'y ai fait des choses assez passionnantes, comme reconstruire la logique avec trois états, pour une application à l'informatique quantique, et ce en DS de quatre heures. On y a appris le CamL et on a fait du Mapple — j'ai très largement préféré le CamL. J'ai même poussé la logique jusqu'au bout en prenant le TIPE d'informatique, ce que seule une quinzaine de personnes ont fait. J'ai mené un projet de deux ans sur les algorithmes génétiques, et j'ai codé un voyageur du commerce. En CamL ? Non, en VB6. En deux ans, deux fois deux heures de cours par semaine, nous n'avons jamais fait de OCamL, ni géré d'affichage graphique. Ça laisse rêveur l'ingénieur informatique que je suis devenu par la suite...</p> <p>Choisir l'informatique comme option puis en TIPE, c'était se fermer des écoles, notamment Centrale et les Mines, nous avait-on prévenu. Tout simplement parce que les quotas sur ces épreuves ne reflétaient pas la proportion d'étudiants partagés entre informatique et SI — et pourtant, il n'y avait pas grand monde en informatique, ce truc un peu nouveau dont un ne savait pas trop quoi faire (en 2002 : l'ordinateur n'existant que depuis 50 ans, il faut comprendre, n'est-ce pas ? Pendant ce temps-là, au MIT et à Berkeley...). Certaines écoles faisaient clairement de la discrimination négative forte envers ceux qui avaient choisi de se spécialiser en informatique. Ayant royalement raté ma prépa, j'ai même poussé le vice encore plus loin : j'ai fait l'EPITA, l'école des geeks, encore malaimée à l'époque (on lui refusait la CTI avec une force assez démentielle : les romanichels, vous savez ?).</p> <p>Et pour la première fois de ma vie, j'ai eu des profs d'informatique spécialisés en informatique, des vrais informaticiens, pas des recyclés. Au début, on m'a demandé de faire la pré-rentrée, et je n'ai pas compris pourquoi, ayant fait tellement de spécialisation et de bidouillage par moi-même ; c'était finalement loin d'être inutile. À la rentrée et dans les 15 jours qui ont suivi (la fameuse piscine...), j'ai pris conscience du gouffre démentiel qui me séparait de la vraie maîtrise de l'outil informatique. Les 15 jours suivant, j'en ai appris plus que durant toute ma vie jusque-là.</p> <p>Alors <a href="http://m.lexpansion.com/high-tech/ce-qu-il-faut-savoir-sur-l-isn-la-nouvelle-matiere-de-terminale-s_330452.html">quand je vois qu'on réinvente</a> une option informatique au lycée, pour les Terminale S pour le moment, avec quelques heures (deux par semaine), où les professeurs sont des matheux, des biologistes ou des physiciens qu'on a formé le temps d'un été à l'INRIA, eh bien je suis TRÈS partagé. C'est bien, il y a un effort, dans la réinvention de cette option qui existait DÉJÀ il y a 10 ans, et que l'on avait sauvagement et injustement supprimé (il faut dire qu'il n'y avait pas grand monde, en France, qui la proposait, et que personne n'y comprenait rien...). Mais on revient à la case départ, celle dont je suis issu. Et on l'aura compris, à la lumière de mon parcours, je suis très sceptique.</p> <p>Les professeurs de TI et de SI sont de vrais ingénieurs, pas des reconvertis. Mais l'informatique est toujours considéré d'une telle manière qu'elle n'accède pas au statut de matière, c'est une activité qu'on peut confier à des gens qui bidouillent le week-end et que l'on va former durant 24 heures par un chercheur dans son laboratoire (certes, c'est l'INRIA, mais quand même). On va parler d'éthique sur Facebook et de programmation objet, de neutralité des réseaux et d'allocation mémoire (non, en vrai d'algorithmie pour faire des additions, j'en suis tout excité). Le tout en 70 heures au mieux dans l'année (et en tout, puisque pour terminales uniquement), dans un lycée sur cinq, parce que surprise !, on n'a pas trouvé assez de profs volontaires à recycler. Du bon sentiment, il y en a. C'est mieux ficelé qu'avant, il y a même un manuel (mais on utilisait très bien un très bon bouquin sur Pascal à l'époque, ou "l'option informatique en classe prépa" aussi). Mais franchement, je suis dubitatif. Ce n'est pas avec de l'enthousiasme qu'on réussit les choses : c'est nécessaire, mais loin d'être suffisant.</p> <p>Je suis professeur en informatique depuis maintenant cinq ans. J'ai été étudiant pendant trois. Il y a une énorme différence en école d'ingénieur par rapport à la prépa et la fac (hormis les sections "professionnalisante" — les autres sont des sections à chômeurs, a contrario, ou à docteurs-pour-la-fac, ce qui revient assez souvent au même) : en école d'ingénieur, les cours "pratiques" (et ils sont nombreux) sont dispensés par des professionnels, et souvent pas n'importe qui, parce que pour s'adapter aux agendas en journée il vaut mieux être indépendant, ce qui implique d'avoir les épaules très solides pour trouver du boulot par sa seule réputation dans le milieu. Et je peux vous dire que les écoles d'ingénieur ne paient pas beaucoup (dans l'absolu, ce n'est pas mauvais, mais une fois que l'on prend en compte le déplacement pour quelques heures à peine, la préparation parce que le nombre d'heures et le niveau des étudiants n'est jamais le même d'une école à l'autre, la remise à jour des slides pour cause d'évolution de la matière, et la correction de copies au mieux payées au lance pierre, c'est tout à coup beaucoup moins bien...). Eh bien on le fait parce qu'on aime ça, parce qu'on aime former (et potentiellement pour étoffer son propre réseau, petit piou-piou deviendra grand).</p> <p>Je suis prêt, par amour et dévotion à l'informatique, à aller me faire payer au lance-pierre (mais pas trop non plus, faut pas déconner, et merci de défiscaliser) dans un lycée pas trop éloigné de chez moi, pour filer deux ou trois heures de cours par semaine (si ça peut prendre une journée, c'est mieux pour la facturation). Je suis certain que l'on peut trouver des professeurs d'écoles d'ingénieur qui bossent dans des labos pour les dépêcher une journée en lycée. Ou des vieux informaticiens qui ont tout vu dans leur vie et qui pourraient finir leurs carrières à transmettre leur savoir et leur expérience (ce sont mes préférés, j'en connais un bon nombre, je les adore, les écoles d'ingénieurs savent très bien les récupérer d'ailleurs).</p> <p>Je suis persuadé qu'il y a de meilleures solutions que de recycler de gentils professeurs qui ne doivent même pas imaginer les efforts colossaux qu'il faut faire pour être un informaticien brillant (et ce même si je sais très bien que RMS était prof de physique à la base). On demande un niveau bac+4 dans une discipline pour y enseigner, après avoir passé le CAPES, ou mieux, l'Agreg. On embauche déjà des ingénieurs pour dispenser des cours de TI/SI. Mais en informatique, non. Certes on manque d'informaticiens, mais c'est un problème de poule et d'oeuf, à force d'avoir considéré la discipline comme celle de pestiférés, de sous-ingénieurs, voilà où nous en sommes arrivé. Il faut donc investir, et d'ici cinq à sept ans (le temps de terminer le bac+5), on verra des résultats qui viendront nourrir naturellement la machine. Ça, ce serait un vrai effort !</p> <p>À la place, on va prendre de gentils amateurs, saupoudrer un peu de tout et n'importe quoi, pour faire les mêmes erreurs qu'il y a dix ans. Alors je vais regarder mon art être encore une fois bafoué (avec de bons sentiments, cette fois), et très probablement échouer dans la mission annoncée. Et on pleurera encore.</p> <p><em>Disclaimer : je suis une Cassandre assez efficace.</em></p> inepties du web urn:md5:e64712ccb48be3b85eae77f3d93c1ac8 2011-01-20T18:51:00+01:00 gblanc informatique troll <p>Je me demande comment la RATP arrive à ne pas rediriger "ratp.fr" vers "www.ratp.fr". Même moi j'y arrive sur mon site web, ce n'est qu'une pauvre directive Apache !&nbsp;De la même manière, j'ai essayé d'accéder au site web de la banque en ligne ING : "ing-direct.com" n'est pas déposé, il faut bien rentrer "ing-direct.fr" ! Et ce genre de cas, pour l'un comme l'autre, n'est pas rare. C'est à se demander à quoi pensent les prestataires informatiques ! (surtout à une époque où l'on se rend enfin compte que le système d'URL est un non-sens pour l'utilisateur lambda, avec une&nbsp;ambiguïté&nbsp;accrue depuis que Firefox a mis en place un raccourci vers Google "j'ai de la chance" dans sa barre d'adresse)</p> <p>Pour rappel, Linagora fait aussi (et presque surtout, ces temps-ci) du Web : je vous promets (d'autant que ça ne m'engage à rien, en tant que membre d'une équipe totalement disjointe du LinStudio) de fouetter personnellement mes gentils collègues s'il s'avère qu'ils ont mis en place un site ficelé à moitié de la sorte.</p> <p>Parce qu'avant même de penser beau et pratique (déjà, quand ça y pense... Il faut voir le site web de l'opéra de Paris pour comprendre comment on peut flamber quelques centaines de milliers d'Euros pour rien...), il faut déjà penser à ce que ce soit... accessible !</p> <p>Le bon sens : je devrais mettre ça en qualité première distinctive sur mon CV, tiens (avant l'orthographe).</p> <p><br /><br />PS: il doit être vendredi dans une partie du monde, je m'arroge donc le droit de troller par anticipation</p> Arbeit macht frei urn:md5:e59918d653b3ebe5dabb1c987c2051f4 2010-12-23T18:23:00+01:00 gblanc informatique das Kapital <p>Il paraît que l'on compare Foxconn à un <a href="http://www.lavie.fr/actualite/monde/dans-l-enfer-du-high-tech-chinois-23-12-2010-12724_5.php" hreflang="fr">camp de concentration</a>. "Vous ne verrez plus votre iPhone comme avant". Il est clair, lorsque l'on voit ces images, que l'on peut se poser des questions quant à la viabilité du modèle chinois. Si ce genre de pratiques est ancré dans leur histoire, la mondialisation finira forcément pas assimiler les comportements (un seul syndicat ferait l'affaire... surtout s'il est communiste !). Apparemment, les grilles aux fenêtres des cités-dortoirs sont déjà là pour empêcher les suicides...</p> <p>Je reste donc fort circonspect, d'autant que c'est le mini-capitaliste taïwannais, via HTC, qui concentre l'intelligence sur les smartphones... en sous-traitant aux <a href="http://www.abaxia.com/" hreflang="fr">français</a>, <a href="http://www.htc.com/fr/press.aspx?id=132642&amp;lang=1033" hreflang="fr">rachetés</a> en juin (ce qui permettra certainement de concentrer les efforts sur leurs produits, comprendre couper les pattes à m$). En bref, la fuite de l'intelligence d'étude des smartphones, je n'y crois que moyennement ; à moins qu'un décalage ne s'opère ("si le Bangladesh augmente son coût du travail, on délocalisera en Indonésie... Ce type de rencontre rendrait gauchiste 90% des parlementaires français...", dirait une Boutin avec son rapport inutile sur son <a href="http://www.missionboutin.fr/rubrique/historique.php" hreflang="fr">site web</a> introuvable) : les Chinois feraient du soft, les Indonésiens le matériel. J'y crois assez peu : 300.000 personnes d'une usine-ville à recycler, ça ne se fait pas en deux coups de cuiller à pot.</p> <p><br /><strong>addendum:</strong> amusant, juste après avoir publié, je tombe sur cet <a href="http://www.ft.com/cms/s/0/f38e08ce-0e84-11e0-b9f1-00144feabdc0.html#axzz18xGUESBS" hreflang="fr">article du Financial Times</a>, "China’s growth model labelled ‘unsustainable’"&nbsp;:</p> <blockquote><p>In his editorial, Mr Yu described a lack of innovation and creativity as the Chinese economy’s “Achilles heel” and lamented the inefficient use of capital, as reflected by the country’s investment rate of more than 50 per cent.</p> </blockquote> le micro-USB : gloire et décadence urn:md5:9444c8e0c8a99cb8f200576ad046349a 2010-12-16T17:04:00+01:00 gblanc informatique das Kapitalembarqué <blockquote><p>Après l'article 3, insérer un article additionnel ainsi rédigé :</p> <p>À compter du 1er juin 2011, tout téléphone portable mis en vente sur le marché est équipé d'une prise standard pour sa recharge.</p> <p>Un décret précise la norme technique européenne retenue.</p> <p>Objet</p> <p>Le chargeur d'un téléphone portable est un bien durable qui doit pouvoir être réutilisé. Cet amendement vise ainsi à éviter le gâchis que tout le monde constate aujourd'hui du fait de l'impossibilité de réutiliser son chargeur lors de l'acquisition d'un nouveau téléphone portable. L'amendement prévoit qu'un décret précise la norme technique européenne retenue. Il pourrait s'agir de la norme micro‑USB comme le préconise l'UCS (universel charging solution).</p> </blockquote> <p>Cet <a href="http://www.senat.fr/amendements/2009-2010/676/Amdt_1.html" hreflang="fr">amendement socialiste</a> m'a rappelé à mon devoir de blogueur : cela fait un bout de temps que je devais vous parler de la norme micro-USB sur les téléphones portables. L'informatique libre promeut les standards des <a href="http://formats-ouverts.org" hreflang="fr">formats ouverts</a>. Dans le même esprit, le matériel doit aussi répondre à cette problématique des formats propriétaires omniprésents dans l'embarqué. Au niveau des microprocesseurs, par exemple, nous savons bien que l'obscurantisme recule, et que ARM ou TI font des efforts remarquables et louables. Mais au niveau des intégrateurs, c'est tout autre chose. N'avez-vous jamais assisté à cette scène d'un collègue de bureau affolé cherchant partout un chargeur pour son téléphone, avec sa fiche bien spécifique, dans l'espoir de pouvoir recharger à temps pour recevoir LE coup de fil ultra-important d'un client ?</p> <p>Nokia, BlackBerry, Motorola, Alcatel, tous avaient jusqu'à il y a peu des formats de chargeurs différents (plats ou ronds), et parfois même entre deux terminaux du même constructeur (courant avec les Nokia), les fiches s'avéraient incompatibles. Et puis la situation a changé : il y a trois ans, mon Motorola V9 avait déjà du micro-USB ; à présent, mon HTC Desire aussi. Tous les constructeurs se sont mis d'accord, la situation ne pouvait plus perdurer : à l'usage, elle est totalement absurde ; pire,&nbsp;économiquement, c'est contre-productif ! Tous ? Non, évidemment, BlackBerry (à confirmer) et surtout, surtout, les rois de l'incompatibilité totale, Apple résistent toujours.</p> <p>Cet été, de retour de vacances, je me suis aperçu que j'avais oublié mon chargeur micro-USB, en fait composé d'un adaptateur (que j'avais laissé chez moi, c'est déjà ça) sur lequel vient se ficher le câble USB/micro-USB (que j'avais donc oublié ; ayant simultanément, pas de chance, laissé mon ancien chargeur pour Motorola et son câble de communication à ma mômon). Le drame, au bout de 48h : plus de batterie. Je pars donc en quête d'un câble standardisé, USB/micro-USB, tout ce qu'il y a de plus bête...</p> <p>Quel ne fut pas mon désarrois en constatant que cela relève de la quête du Saint-Graal ! Version Monty Python absurde : Orange, SFR, la FNAC, je fais le tour de la Défense, jusqu'au Chinois planqué à côté d'Auchan (j'espère qu'on a pensé à castrer l'architecte du Quatre Temps, ce centre commercial est une insulte à l'intelligence), rien de rien, ils ont tous le même fournisseur (me dit-on à la FNAC du CNIT), aucun n'a plus de câble depuis un bon mois (deux mois, selon certains). Les vendeurs mettent aussi beaucoup de temps à comprendre de quoi il en retourne : les chargeurs de portable avec fiches propriétaires (essentiellement : Apple, BB, Samsung), ça ils ont, pas de problème. Mais le standard correspondant à au moins 3/4 des téléphones vendus depuis deux ans, ils n'ont pas... Au final, claquant 35€ pour un chargeur simple (donc pas de câble de communication), j'ai dû me résigner à me faire voler, d'autant qu'il ne restait plus que 2 exemplaires planqués dans une boutique SFR (30 minutes pour arriver à trouver le bestiaux, heureusement la vendeuse était jolie).</p> <p>Alors, comment diable en arrive-t-on là ? Mystère... En tout cas, le législateur a effectivement une occasion de forcer un standard, éviter du gâchis (très à la mode, où le numérique et l'environnement se rejoignent, un coup à revoir NKM) et rendre la situation enfin rationnelle. Finalement, cet amendement a été retiré (pas pu trouver pourquoi). C'est bien dommage.</p> joyeux nanniversaire urn:md5:d423b99d79b9dcca5ab4f5d81514bb3b 2010-10-04T16:28:00+02:00 gblanc informatique logiciel libre <p>Aujourd'hui, ce sont les 25 ans de la FSF. Eh oui, déjà...</p> RTS2010 urn:md5:0bc02826955096c78bb3e63ed9274f3c 2010-04-08T16:43:00+02:00 gblanc informatique embarquésalon <p>Très bon cru pour cette session 2010 du salon RTS. Certes la période des années 2000 est définitivement résolue, et le hall 8 de la porte de Versailles pour être rempli fait toujours appel aux pendants M2M (communications de Machine à Machine) et Display (composants d'affichage). Les grands stands privatifs d'exposition ont disparu, mais les groupes étrangers de matériel ont fait leur apparition ; note pour les Chinois : de grands sourire et l'air avenant sont nécessaire en Europe ! Déjà que l'on présage avec appréhension une séance d'Anglais baragouiné pas bien constructive, la bonne vieille méthode de la jolie communicante a aussi toujours son succès ; même si son taux a très fortement décru aussi. Petite aparté sur la parité : c'est hautement catastrophique, dans les allées, dans les salons, sur les stands (où c'est forcément beaucoup mieux), c'est juste pire qu'avant ; compter à la louche 5% de représentation. Autre disparition aussi : les quelques rares sociétés de service (je pense notamment à Teamlog, l'année dernière, qui avait une jolie démo sur son stand, pas assez aguicheur à mon avis) ; je n'en ai compté qu'une seule, proposant de l'offshoring en Tunisie. Mais dans l'ensemble, c'est une sacrée réussite, et il faut saluer le travail d'organisation de Francis Mantes (rapidement croisé, l'appareil photo à la main).</p> <p>Comme d'habitude, WindRiver avait l'entrée du salon, et NI le stand le plus grouillant de T-shirts corporate devant des démos attirantes : le pendule inversé existe donc bien en dehors des TDs Matlab de cours d'automatique... À ce propos, Matlab n'était pas présent cette année, donc Polyspace non plus, et son concurrent Coverty ne s'est pas plus déplacé (adieu le goodie de l'année !) ; ne restait plus que Emenda, comme micro-société distributrice de solutions de logiciels de couverture de code. Des cartes électroniques sont suspendues ou sous cloche un peu partout, et l'on compte presqu'autant d'Atom que d'ARM, même si à la discussion, c'est toujours les Anglais qui gagnent. À ce petit jeu, WindRiver reste tout autant agnostique que pour le non-choix entre Moblin (Intel) et Android (Google) : on se rappelle qu'ils ont été rachetés par Intel au moment où ils nous parlent de la prochaine génération d'Atom dans les cartons (Morse, si mes souvenirs sont bons). Rachetés aussi et disposant cette fois d'un stand indépendant, contrairement à deux ans auparavant où ils squattaient Neomore (toujours présents, non loin d'Anticyp), Trolltech devenu Nokia (la marque norvégienne s'est totalement effacée, mais les bureaux n'ont pas déménagé en Finlande) faisait figurer les deux même Français expatriés, et présentant une solution Qt 4.6 au succès largement plus important : voilà un rachat qui a eu du bon pour eux. Leur conférence, à 13h, le second jour du salon, a aussi connu un franc succès -- cependant, les informations réellement trépidantes ont été un peu absentes, surtout lorsqu'on apprend que le projet <a hreflang="en" href="http://meego.com/">MeeGo</a>, fusion de Moblin et Maemo mais sur du Qt, est très très loin d'être prêt).</p> <p>L'intéraction sur les stands était fort constructives, et si aucune affaire immédiate n'a pu être rapportée -- nous sommes sur un salon de vendeurs, c'est assez logique, il faudrait son propre stand pour cela, et je ne suis pas bien certain, vu le succès des fournisseurs de service, de la pertinence par rapport au public industriel assez prudent --, des partenariats très intéressants sont clairement à attendre. L'avenir dira. On constate par ailleurs le problème récurrent de mauvaise vision des "partenaires" (ou concurrents, plutôt) entre eux, tout clairsemés qu'ils sont au quatre coins de la France, si ce n'est du monde, et ne navigant pas eux-mêmes dans les allées -- à l'exception de quelques uns, par ailleurs très notables. Passons à la page publicité pour ceux à qui j'ai promis de parler ici, parce qu'ils le méritent, parce qu'ils m'ont fort bien accueilli, ou parce qu'ils m'ont fortement intéressé.</p> <p>Tout d'abord, un petit erratum pour Greenhills (à l'équipe toujours aussi sympathique), puisque dans mon <a hreflang="fr" href="http://gillesblanc.com/weblog/post/2009/04/06/salons-RTS-et-Solutions-Linux-09">précédent compte-rendu</a> j'avais totalement fourché sur un paragraphe, à présent corrigé ; je précise au passage que seul le Pape est infaillible (sous certaines conditions, qui plus est), et je peux donc écrire des bêtises scandaleuses, que vous pouvez me pointer en commentaire ou par mail (ceci dit, s'en rappeler un an plus tard était impressionnant de la part de Serge Plagnol !). Ensuite, je voudrais attirer votre attention sur un jeune entrepreneur ayant réalisé (en <a hreflang="fr" href="http://gillesblanc.com/weblog/post/2009/09/01/le-serpent-et-le-troll">PyQt</a> !) un logiciel de création de Linux embarqué du même nom que la distribution ainsi obtenu : <a hreflang="en" href="http://yaeld.fr/">Yaeld</a> (Yet Another Embedded Linux Distribution : on est geek ou on ne l'est pas). Basé sur OpenEmbedded, l'interface est extrêmement intuitive, et permet de paramétrer très finement le projet sur-mesure. Reste à sortir une version définitive du projet (très prochainement, si ce n'est déjà fait) et à arriver à le commercialiser : c'est-à-dire à se faire connaître (j'y participe) et à convaincre qu'un tel outil fait facilement gagner une semaine de production et quelques arrachages de cheveux, soit de quoi justifier un investissement de quelques milliers d'Euros. Je souhaite bonne chance à notre héros breton Thomas Jourdan. Enfin, un petit mot sur <a hreflang="en" href="http://www.tecwec.org/">AcidOS</a> (attention : site moche), micro-kernel très innovant, écrit from scratch sur un modèle L4 mais bien plus optimisé (en se débarrassant de la couche POSIX), pouvant relancer des services à la volée en faisant migrer la mémoire virtuelle : en cas de détection d'instabilité ou de faille de sécurité (ce sont des anciens de Hackademy, m'a-t-on dit), le service kernel (en mode protégé) peut être ainsi relancé à chaud au prix d'une interruption de service imperceptible. Quand on sait qu'à la manière d'OKL4, un service peut être une paravirtualisation de Linux, voilà qui est tout à coup extrêmement intéressant ! (en outre était présente sur le stand à l'ambiance fort sympathique, la plus agréable des expertes en café qu'il m'ait été donné de rencontrer)</p> <p>La seconde journée était consacrée pour ma part (et celles de beaucoup d'autres !) aux conférences de la journée spéciale Linux Embarqué. Un compte-rendu est donc à venir dans un prochain billet. Le temps que je rajoute une licence à mes slides, pour commencer...</p> dolosif arrière urn:md5:36da1cf258433009dc1e1e90c835c41c 2010-03-12T18:57:00+01:00 gblanc informatique chez la concurrence <p>Une technique très SSIIène consiste en la vente d'un projet sous-évalué, puis en la signature d'avenants au fur-et-à-mesure, surtout quand le client est dos au mur et ne peut plus reculer, qui s'accumulent jusqu'à faire exploser le budget initial. Technique célèbre, qui est évidemment le mal. Ne serait-ce que parce que la réputation du métier en pâtis. On pourrait d'ailleurs se demander si c'est la baisse des tarifs acceptables par les clients (longtemps plumés, dans les années 80/90 -- si vous saviez combien a coûté le site web de Radio France, et encore pas la totalité, c'est à pleurer -- c'est que ce sont nos impôts...) qui a entrainé ce genre de techniques contestables pour se rattraper (faire croire que ce n'est pas cher alors que oui, ça l'est vraiment), ou si c'est la concurrence entre sociétés proposant du service informatique, tirant toujours plus bas les prix (et donc les salaires -- problème connexe : un ingénieur mal payé est un ingénieur démotivé, faudrait-il toujours se rappeler ; et un ingénieur démotivé travaille plus lentement et produit plus d'erreurs), qui a pour effet de fausser ladite concurrence en annonçant des prix qui ne sont pas les bons dès le départ. Ou peut-être est-ce dû à une mauvaise émulation des deux phénomènes.</p> <p>C'est en tout cas une dérive clairement constatée, qui en fait part d'un fait tout bête : les engagements contractuels portant sur du résultat (et non du moyen) nécessitent une estimation et une vision qui est rarement la bonne dès le départ (évidemment on fait ce que l'on peut, mais la boule de cristal est hors de prix chez Swarovsky® !), et qui est donc sujette à évolution (sachant que les cas litigieux ne sont pas rares : j'ai un ami informaticien fraichement retraité qui ne s'occupait plus que de ça à la fin de sa carrière, notamment sur la ligne 14 Meteor du métro parisien, où ça a pas mal chauffé paraît-il) ; on sait aussi que l'on fait généralement son beurre sur les avenants (ne serait-ce que parce que la phase d'avant-vente est inutile ou réduite à son maximum, et que l'expertise à faire valoir sur le produit est évidente). Il n'empêche que les (très) gros projets peuvent déraper, et ce de manière <a hreflang="fr" href="http://www.politique.net/2009020404-outil-informatique-3-milliards-d-euros.htm">spectaculaire</a>.</p> <p>Rappelons encore : l'ingénieur a un devoir de conseil, et a fortiori la société qui l'embauche. Question de bonne ou de mauvaise foi. Les <a hreflang="fr" href="http://www.legalis.net/article.php3?id_article=2866">11 millions d'Euros de condamnation</a> d'IBM (première instance, appel évidemment interjeté, mais en tout cas une exécution provisoire ordonnée, donc les 11 millions doivent être versés, avec tout ce que ça implique en terme de trésorerie) tendraient à mettre un frein sérieux à ce genre de pratiques, qualifiées "manoeuvres dolosives" (rappelez-vous de vos cours de droit, différence dol/vol -- le dol est la tromperie, la fraude, ce qui implique d'avoir su dès le départ mais de n'avoir rien dit pour en tirer profit, dans notre affaire). C'est sûr que doubler une facture de 7,3 millions et le temps de réalisation en cours de route, avec tout un tas d'inconvénients très impactant sur la société cliente, ça fait vraiment mal. À noter aussi que la MAIF s'est plainte au TGI, et non au <a hreflang="fr" href="http://fr.wikipedia.org/wiki/Tribunal_de_commerce_%28France%29#Comp.C3.A9tence_du_tribunal">tribunal de commerce</a> (je me demande pourquoi, en fait, puisque Niort en possède un ; va falloir que je demande à <a hreflang="fr" href="http://mben.fr/">notre juriste</a>). Je partage en tout cas <a hreflang="fr" href="http://pro.01net.com/editorial/513812/ibm-condamne-dans-un-contentieux-qui-l-opposait-a-la-maif/">l'analyse</a> de l'experte de 01 (encadré tout en bas).</p> <p><br /><br /><em>Au passage, un peu de </em><a style="font-style: italic;" hreflang="fr" href="http://www.asso-etud.unige.ch/adepsy/doc/linguistique_historique.pdf">linguistique historique</a><em>, histoire d'expliquer le titre (il me semblait bien que le Littré n'allait pas au bout des choses entre dolus pour <a hreflang="fr" href="http://francois.gannaz.free.fr/Littre/xmlittre.php?requete=dol&amp;submit=Rechercher">dol</a>, et dolorem pour <a hreflang="fr" href="http://francois.gannaz.free.fr/Littre/xmlittre.php?requete=douleur&amp;submit=Rechercher">douleur</a> -- quelqu'un a un Alain Rey sous la main ?) :</em></p> <p><blockquote><p><em>En latin classique, la notion de deuil fait partie du sémantisme de dolor. Cicéron, de Oratorio, 2, 199 : "Par mon discours, je ravivais la douleur (dolorem), de ceux qui avaient à pleurer des parents."</em><br style="font-style: italic;"><em>Ainsi dolus est une simple variante de dolor. Pourquoi apparaît-il ? Cela s'explique probablement par des considérations formelles et sémantiques :</em><br style="font-style: italic;"><em>- forme : le paradigme de dolor renferme une forme ambiguë : le génitif pluriel dolorum. Une réinterprétation permet le changement à dolus.</em><br style="font-style: italic;"><em>- sens : il y a des exemples limites : dolus : mal, malice; mal s'apparente à douleur.</em><br style="font-style: italic;"><em>L'exemple ambigu remonte au Ier ap., dans la Thébaïde de Stace, 5, 117-119, qui fait allusion aux crimes des Danaïdes qui tuèrent leur mari avec la complicité de leur père qualifié de "la‘tus (riche) dolorum (ruse et deuil)." La ramification au dédoublement lexical se produit à l'époque du latin tardif. La comparaison des langues romanes joue un rôle. L'histoire d'une langue particulière s'appuie aussi sur l'histoire des langues du même groupe.</em></p> </blockquote></p> acceptable values urn:md5:0e2c7522fed265227cb3d05bc6290e34 2010-03-11T11:38:00+01:00 gblanc informatique code of the day <code>}<br /><br />static int<br />dacmdsizesysctl(SYSCTL_HANDLER_ARGS)<br />{<br />&nbsp;&nbsp;&nbsp; int error, value;<br /><br />&nbsp;&nbsp;&nbsp; value = *(int *)arg1;<br /><br />&nbsp;&nbsp;&nbsp; error = sysctl_handle_int(oidp, &amp;value, 0, req);<br /><br />&nbsp;&nbsp;&nbsp; if ((error != 0)<br />&nbsp;&nbsp;&nbsp; &nbsp;|| (req-&gt;newptr == NULL))<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (error);<br /><br />&nbsp;&nbsp;&nbsp; /*<br />&nbsp;&nbsp;&nbsp; &nbsp;* Acceptable values here are 6, 10, 12 or 16.<br />&nbsp;&nbsp;&nbsp; &nbsp;*/<br />&nbsp;&nbsp;&nbsp; if (value &lt; 6)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value = 6;<br />&nbsp;&nbsp;&nbsp; else if ((value &gt; 6)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (value &lt;= 10))<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value = 10;<br />&nbsp;&nbsp;&nbsp; else if ((value &gt; 10)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (value &lt;= 12))<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value = 12;<br />&nbsp;&nbsp;&nbsp; else if (value &gt; 12)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value = 16;<br /><br />&nbsp;&nbsp;&nbsp; *(int *)arg1 = value;<br /><br />&nbsp;&nbsp;&nbsp; return (0);<br />}<br /><br />static cam_status<br />daregister(struct cam_periph *periph, void *arg) </code> <p>Au moins, ça ne manque pas d'originalité. Je vous ai mis ce qu'il y autour afin de bien se rendre compte du vide intersidéral de commentaires utiles autour de ce fabuleux effet de bord sur une variable récupérée par macro, et transvasée de manière bien folklorique (dommage que le traitement ne soit pas fait par masques de bits, tout de même !). Autour de la ligne 1010 du driver SCSI de <a hreflang="en" href="http://www.freebsd.org/cgi/cvsweb.cgi/%7Echeckout%7E/src/sys/cam/scsi/scsi_da.c?rev=1.236.2.9;content-type=text%2Fplain">freebsd</a>.</p> le vendredi c'est permis urn:md5:df1b32022cf1b31f633e3aff9aae0c4c 2010-03-05T16:35:00+01:00 gblanc informatique humourtroll <p><a hreflang="en" href="http://blog.bumblebeelabs.com/the-5-guerrilla-user-test/">The $5 Guerrilla User Test</a> est un article proprement hilarant mais on ne peut plus sérieux : il expose une manière simple de tester ses créations logicielles sans avoir à embaucher un crétin, ou quelqu'un qui "pense crétin" afin de rendre le programme <del>"idiot-proof"</del> "user-proof". L'idée de base est qu'en réalité, l'utilisateur n'est pas stupide, il est juste distrait en permanence, et ne porte pas attention à ce qu'il fait (OK, il y en a qui sont <a hreflang="en" href="http://thelede.blogs.nytimes.com/2010/03/03/israeli-raid-canceled-after-facebook-leak/">vraiment stupides</a>, mais gardons foi en l'humanité -- c'est notre vivier de clientèle potentielle après tout). Embaucher un fonctionnel pensant stupide n'est donc pas la bonne solution : la seule chose que cela va créer, c'est une interface ultra-simplifiée qui ne fera pas ce qui est attendu, et deviendra à terme une insulte à l'intelligence (<a hreflang="en" href="http://mail.gnome.org/archives/usability/2005-December/msg00021.html">ça me rappelle</a>...). En revanche, le "$5 guerrilla user test" propose d'aller voir de vrais gens de tous les jours, mais dans un état entre la concentration et la distraction.</p> <p>Pour cela, il suffit d'aller dans le bar d'en face (pour nous : le Washington ou le Bowler ; faudra se re-renseigner après le déménagement), et d'aller vers la bonne personne qui semble ouverte pour tester le logiciel (l'article propose tout un tas d'astuce pour repérer les bonnes personnes -- personnellement j'aurais plutôt tendance à aller vers la gent féminine, mais je n'aime pas beaucoup les blondes), pour lui proposer une bière en l'échange du test (d'où les 5$ -- notez que la bière vient en récompense après, logique, ce qui implique de choisir une personne déjà "installée"). La technique d'approche est aussi longuement exposée (retours d'expérience en commentaires, aussi). Les résultats sont paraît-il exceptionnels. À quand des sessions de Linshare ou d'OBM dans les bars ? (on pourrait installer une distributeur de bières sur le stand de solution Linux, sinon... Je suis sûr d'emporter l'adhésion de beaucoup de geeks linagoriens)</p> <p><br /><em><strong>disclaimer:</strong> l'auteur de ce billet ne boit que du lait fraise ; à consommer avec modération, l'abus de génie logiciel est mauvais pour la santé</em></p> <p><em><strong>update 10 minutes plus tard:</strong> on me fait déjà remarquer qu'en France, surtout à Paris, ce serait plutôt autour de 8€ le test (le cours de la bière est bien supérieur)<br /></em></p> money drain urn:md5:eac3555d26b62baf7e95c2f3a4131975 2010-03-03T12:43:00+01:00 gblanc informatique das Kapitalpresse <p>Très bon article des échos : <a hreflang="fr" href="http://www.lesechos.fr/info/hightec/020381514097.htm">"Start-up informatiques : razzia sur les pépites"</a>. Après le brain drain qui prive le pays de ses brillants cerveaux (sur mon nouveau compte linkedIn, je vois du Citrix à Cambridge, du VMWare à SF, mais je connaissais déjà du Microsoft à Redmond, et j'en passe -- c'est d'ailleurs comme ça, à mon avis, que la promotion de Génie Industriel de l'EPITA a surpassé en terme de salaires les autres filières, il ne faut pas se le cacher : allez simplement voir les salaires de techniques chez ARM outre-manche), tandis que c'est l'État qui paie la formation, l'inquiétude peut légitiment se porter sur les multiples rachats de start-ups françaises, par les américains principalement. C'était le cas d'ailleurs de la société d'un ami, dans la téléphonie mobile, par Microsoft (c'est lui qui bosse à présent à Redmond). Ça été aussi le cas de Trango Virtual Processor, où j'ai travaillé, par VMWare ; et avant ça de Mobivillage, où j'ai été stagiaire, par un groupe géant japonais (en 2004, pourtant, mais la téléphonie mobile, c'est impressionnant là-bas). L'année dernière, on notait sur le salon RTS le rachat de Polyspace par Mathworks (notons qu'avec un nom anglophone, ça facilite d'autant la mondialisation -- et ses effets secondaires de "concentration"). Quant à Business Object... (couic, dans l'oeuf !)</p> <p>Des start-ups, j'en connais aussi. Et l'investissement par levée de fonds, je connais indirectement, soit en observant du côté des entreprises, soit en discutant avec l'un de mes amis (qui effectivement investit encore plus depuis la loi TEPA). Généralement, c'est un gouffre : des millions d'Euros en entrée, pas grand chose en sortie. Pourtant, il faut bien évoluer, l'innovation est une absolue nécessité. J'avoue ne pas bien voir comment résoudre la situation. Un pacte PME acté par une loi ("investissement" des grandes société obligatoire dans les petites) peut effectivement sembler pertinent (après tout, on se bat pour des bouts de ficèles quand les grands groupes dégagent des bénéfices extraordinaires, sur des marchés souvent étrangers ou publics...). À entendre Daniel Glazman, par exemple (disruptive innovation : in English, again), les formalités, le poids de l'administration, entravent grandement la productivité (et donc l'innovation) seule (d'un autre côté, c'est notre identité nationale !). J'avoue être assez pessimiste d'une manière générale sur l'entrepreneuriat à l'heure actuelle ; d'ailleurs je pense que toutes les sociétés rachetées ne faisaient pas un sou de bénéfice (ah, les levées de fonds à 2 ou 4 millions d'Euro, malgré la collection de projets estampillés "Européens" ou les CIR à en pleuvoir...). Vraiment, je ne vois pas. Mais de la technologie qui s'en va à l'étranger (même en restant sur le sol national), ce n'est jamais très bon signe.</p> <p><em>(c'est quelque part une sécurité à Linagora : je sais qu'on ne se vendra jamais, question d'hommes)</em></p> slides de la conférence GCC par Basile Starynkevitch urn:md5:bf086c2a8616961e6eb72454cee20c9d 2010-02-25T19:06:00+01:00 gblanc informatique programmation <p>Basile Starynkevitch avait <a hreflang="fr" href="http://gillesblanc.com/weblog/post/2008/11/19/GCC-everywhere">déjà donné</a> une conférence pour Parinux il y a deux ans ; il est revenu ce 12 janvier dernier à l'espace rue de la Bourdonnais donner une conférence sur son même sujet de prédilection, le compilateur libre <strong>gcc</strong>. Sous une optique propren car il est le développeur d'un outil d'analyse de code MELT, greffon de gcc, consistant un langage de programmation pouvant être greffé à du code compilé par gcc pour effectuer de l'analyse (type tests unitaires, ça me semble très utile en tout cas dans le cadre de la certification logicielle) ; MELT est un langage complet, et le greffon MELT est codé en MELT. <a href="http://www.parinux.org/content/conference-gcc-mardi-12-janvier-2010">Ses slides sont disponibles</a>, et je vous invite à les consulter (en réalité, deux tiers de conférence, soit 1h30, ont été consacrés à gcc en général). On constatera ainsi le franc parler de l'un des 2000 développeurs de gcc de par le monde, notamment à propos des préjugés sur le C ou l'assembleur.</p> commentaire expiatoire du jour urn:md5:858a2d1c813f18cad56acba5abc0b4db 2010-01-25T17:48:00+01:00 gblanc informatique code of the day <p>Il ne faudrait pas que cela devienne une habitude, mais comment m'empêcher, chers lecteurs, de vous faire partager ce commentaire d'excuse d'une mauvaise foi évidente ? (<a hreflang="fr" href="http://www.google.com/codesearch/p?hl=fr#EKZaOgYQHwo/unstable/sources/gaim_gaim.cvs.sourceforge.net__20050904.tar.gz%7C1tXPiNJXXQk/gaim/src/dbus-server.c&amp;q=gaim&amp;d=5&amp;l=343">trouvé là</a>)<br /><br /><code>GHashTable *gaim_dbus_iter_hash_table(DBusMessageIter *iter, DBusError *error) {<br />&nbsp;&nbsp;&nbsp; GHashTable *hash;<br /><br />&nbsp;&nbsp;&nbsp; /* we do not need to destroy strings because they are part of the message */<br />&nbsp;&nbsp;&nbsp; hash = g_hash_table_new(g_str_hash, g_str_equal);<br /><br />&nbsp;&nbsp;&nbsp; do {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *key, *value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBusMessageIter subiter;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_DICT_ENTRY)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto error;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* With all due respect to Dijkstra,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this goto is for exception<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handling, and it is ok because it<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avoids duplication of the code<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responsible for destroying the hash<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.&nbsp; Exceptional instructions<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for exceptional situations. */<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbus_message_iter_recurse(iter, &amp;subiter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!gaim_dbus_message_iter_get_args(&amp;subiter, error,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBUS_TYPE_STRING, &amp;key,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBUS_TYPE_STRING, &amp;value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBUS_TYPE_INVALID))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto error;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* same here */<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_hash_table_insert(hash, key, value);<br />&nbsp;&nbsp;&nbsp; } while (dbus_message_iter_next(iter));<br /><br />&nbsp;&nbsp;&nbsp; return hash;<br /><br />&nbsp;error:<br />&nbsp;&nbsp;&nbsp; g_hash_table_destroy(hash);<br />&nbsp;&nbsp;&nbsp; return NULL;<br />}</code></p> <p><strong><em>add:</em></strong> Et juste en dessous, le scandale :</p> <p><code>#include "dbus-bindings.c"<br /><br />void *gaim_dbus_get_handle(void) {<br />&nbsp;&nbsp;&nbsp; static int handle;<br /><br />&nbsp;&nbsp;&nbsp; return &amp;handle;<br />}</code></p> le code geekesque du jour urn:md5:c6b0f32b6991b1dfca141982c3363c09 2010-01-18T11:32:00+01:00 gblanc informatique code of the day <pre><code><code><span class="hl kwb">static void</span><br /><span class="hl kwd">to_be_or_not_to_be</span> <span class="hl sym">(</span><span class="hl kwb">void</span><span class="hl sym">)</span><br /><span class="hl sym">{</span><br /> <span class="hl com">/*</span><br /><span class="hl com"> * If all of the options that control our policy are disabled, then we</span><br /><span class="hl com"> * have no point in living. Save the user some memory and exit.</span><br /><span class="hl com"> */</span><br /> <span class="hl com">/* you used to say live and let live... */</span><br /> gboolean live <span class="hl sym">=</span> FALSE<span class="hl sym">;</span><br /> <span class="hl kwb">size_t</span> i<span class="hl sym">;</span><br /><br /> <span class="hl com">/* ...but in this ever changing world in which we live in... */</span><br /> <span class="hl kwa">for</span> <span class="hl sym">(</span>i <span class="hl sym">=</span> <span class="hl num">0</span><span class="hl sym">;</span> i <span class="hl sym">&lt;</span> <span class="hl kwd">G_N_ELEMENTS</span> <span class="hl sym">(</span>gvm_settings<span class="hl sym">) &amp;&amp; !</span>live<span class="hl sym">;</span> i<span class="hl sym">++) {</span><br /> <span class="hl kwa">if</span> <span class="hl sym">(</span>gvm_settings<span class="hl sym">[</span>i<span class="hl sym">].</span>type <span class="hl sym">==</span> TYPE_BOOL<span class="hl sym">)</span><br /> live <span class="hl sym">= *((</span><span class="hl kwb">int</span> <span class="hl sym">*)</span> gvm_settings<span class="hl sym">[</span>i<span class="hl sym">].</span>var<span class="hl sym">);</span><br /> <span class="hl sym">}</span><br /><br /> <span class="hl com">/* makes you give it a cry... */</span><br /> <span class="hl kwa">if</span> <span class="hl sym">(!</span>live<span class="hl sym">) {</span><br /> <span class="hl kwd">dbg</span> <span class="hl sym">(</span><span class="hl str">"daemon exit: live and let die</span><span class="hl esc"> </span><span class="hl str">"</span><span class="hl sym">);</span><br /> <span class="hl kwd">exit</span> <span class="hl sym">(</span>EXIT_SUCCESS<span class="hl sym">);</span><br /> <span class="hl sym">}</span><br /><span class="hl sym">}</span></code></code></pre><p>Toi aussi, amuse-toi à compter les références dans ce morceau <a hreflang="C" href="http://git.gnome.org/browse/gnome-volume-manager/tree/src/manager.c">de code</a>...</p> man of the day urn:md5:19caefad51b0ea44e5d2c4c3518044f1 2010-01-07T11:18:00+01:00 gblanc informatique programmation <p><blockquote><p>struct hostent *gethostbyaddr(const void *<ins>addr</ins>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; socklen_t <ins>len</ins>, int <ins>type</ins>);<br /><br />The gethostbyaddr() function returns a structure of type <ins>hostent</ins> for the given host address <ins>addr</ins> of length <ins>len</ins> and type <ins>type</ins>.&nbsp; Valid address types are <strong>AF_INET</strong> and <strong>AF_INET6</strong>.&nbsp; The host address argument is&nbsp; a&nbsp; pointer&nbsp; to struct a of&nbsp; a&nbsp; type depending on the address type, for example a <ins>struct in_addr *</ins> (<em>probably</em> obtained via a call to <strong>inet_addr</strong>(3)) for address type <strong>AF_INET</strong>.</p> </blockquote></p> <p>Les italiques sont de moi. Bon bein pour réimplémenter le bousin, je sens que ça va être fun...</p> Python et OpenOffice.org urn:md5:9d409f0713485ece1f755432fb36bedb 2009-12-16T12:05:00+01:00 gblanc informatique programmation <p>Je me rends compte avec effroi que j'ai oublié d'écrire ce billet promis à un ami : c'est qu'il a rencontré des soucis de création de fichiers Excel dans une application Python devant faire du reporting. Problématique déjà rencontrée au sein de l'équipe embarqué, la solution a consisté en l'utilisation de <a hreflang="en" href="http://wiki.services.openoffice.org/wiki/Python">PyUno</a>, le binding Python-OpenOffice.org (et ça tombe bien, puisqu'on propose aussi des migrations sur la suite bureautique libre). La bonne nouvelle, c'est que l'on peut trouver des <a hreflang="en" href="http://wiki.services.openoffice.org/wiki/PyUNO_samples">exemples</a> et autres <a hreflang="en" href="http://udk.openoffice.org/python/python-bridge.html">documentations très complètes</a> (je ne vais donc pas m'amuser à tout reprendre) ; la mauvaise est qu'il faut savoir deux ou trois choses pour que ça marche dans la vie réelle (ou alors l'information importante est un peu perdue).</p> <p>En premier lieu, il faut veiller à ce que votre environnement soit correct. D'une part, bien vérifier que la version de PyUno correspond à la bonne version de Python et de OOo que vous utilisez (sous Linux, les distributions assurent l'homogénéité, mais il en va autrement sous windows). Ensuite, mettre en place les bonnes variables d'environnement (évidemment, si PYTHONPATH est déjà défini, on concatène avec des ":" sous Linux, mais des ";" sous Windows qui ne fait jamais rien comme les autres -- il faut assumer son péché originel de "C:\" et les ambigüité consécutives). Sous Linux, cela se résume à :</p> <p><code>export PYTHONPATH=:/usr/lib/ooo3/basis3.0/program/</code></p> <p>Sous Windows en revanche, il faut définir (vous savez, en passant par le panneau de conf, "Système", onglet "Avancé", bouton "Variables d'environnement" -- mais puisqu'on vous dit que c'est simple et intuitif !) PYTHONPATH&nbsp; à "C:\Program Files\OpenOffice.org 3\Basis\Program" et URE_BOOTSTRAP à "file:///C:/program%20File/OpenOffice.org%203/program/fundamental.ini" (bug documenté).</p> <p>On peut à présent dans son code python faire un magnifique :</p> <p><code>import uno</code></p> <p>Et ça marche (rappel : on peut try-catcher des import sous Python, histoire de faire des messages d'erreur sexy au cas où l'environnement ne serait pas d'équerre, par exemple).</p> <p>Arrive la subtilité de fonctionnement : PyUno s'adresse à un OOo en train de tourner via socket à travers une API, il n'utilise pas l'API de OOo directement ! Il faut donc avoir un serveur OOo qui tourne. Pour cela, il existe deux méthodes : avec ou sans l'option "-invisible" (notons aussi "-headless" qui fait la même chose mais sans avoir besoin de display -- explications <a hreflang="en" href="http://blogs.linux.ie/caolan/2007/05/04/headless-ooo/">par là</a> --, et "-nologo" pour un lancement sans logo à l'affichage). Avec, nous obtenons un démon, c'est-à-dire que OOo est lancé sans fenêtre visible. Si on l'omet, une fenêtre "standard" (en apparence) s'ouvre. On pourrait penser qu'il suffit alors de lancer le serveur au démarrage de la machine, et de l'adresser ensuite. En fait c'est une erreur (attention, le passage qui suit ne convient pas aux âmes sensibles et aux enfants) : si l'on ouvre une fenêtre OOo alors que l'option "invisible" était invoqué, puis qu'on la ferme, le serveur disparaît aussi ; et de même, si l'on ferme la fenêtre-serveur (sans l'option "invisible"), le serveur aussi se ferme. C'est très, très stupide et contre-intuitif (de mémoire, j'ai eu le même problème avec "-headless"). Résultat des courses : mieux vaut lancer le serveur OOo à la volée, quand on en a besoin (au pire, si le serveur tourne déjà, c'est automatiquement détecté, aucun risque de doublon). Pour cela, rien ne vaut une fonction Python à appeler plus tard.</p> <p><code>&nbsp;&nbsp;&nbsp; def ooo_start(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """ start OOo in server mode """<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if os.name == "nt":<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prog = 'start "" "C:\Program Files\OpenOffice.org 3\program\soffice.exe" -invisible -accept="socket,host=localhost,port=2002;urp;"'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prog = 'soffice -invisible -accept="socket,host=localhost,port=2002;urp;"'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if os.system(prog) == 0:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.wait_time(5)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return True<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return False</code></p> <p>Comme on peut le constater, cette procédure gère à la fois Windows et le reste du monde (en l'occurrence Linux, c'est bien connu). La partie optionnelle "accept=..." définit l'état de serveur par socket et l'hôte et le port. La commande Python "os.system" utilise "system" de la libC pour lancer l'application, et si cela réussit, on attend 5 secondes le temps que ça se lance (oui, gruik, je sais, mais ça marche et il n'y a pas trop le choix, puisque ça rend la main alors que ce n'est pas encore opérationnel). Il ne reste alors plus qu'à mettre en oeuvre :</p> <p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not self.ooo_start():<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local = uno.getComponentContext()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resolver = local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)</code></p> <p>Comme on peut le constater, la succession de commandes est ésotérique, mais la bonne nouvelle est qu'il ne s'agit pas forcément de comprendre ce que l'on fait. À ce niveau, on est connecté à notre serveur PyUno, et l'idée va être maintenant de créer un document que l'on va manipuler. Par exemple, le document /home/gblanc/Documents/example.xls :</p> <p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document = desktop.loadComponentFromURL("file:///home/gblanc/Documents/example.xls" ,"_blank", 0, ())</code></p> <p>L'idée pourrait être, pour un rapport, de copier un fichier-template à l'aide de "shutil.copyfile" et d'ouvrir la copie. Je rappelle aussi les fonctionnalités portables de manipulation de fichiers que l'on trouve dans "<a hreflang="en" href="http://docs.python.org/library/os.path.html">os.path</a>" (qu'il s'agit d'importer auparavant) : os.path.join, os.path.basename, os.path.realpath, etc. On a vu au dessus que l'URL du document à ouvrir a été retravaillée : en effet, "file://" a été ajouté ; quiconque a déjà navigué en local avec Firefox se dit qu'il a déjà vu ce genre de syntaxe. Et que sous Windows, ça va devenir plus complexe : il va en effet falloir ajouter un "/" devant, remplacer les espaces par des "%20" (comme sous le ouèbe avant l'invention des IRL), et changer les "\" en "/" (toujours pareil, assumer les conneries des développeurs sous-doués de Microsoft des années 80). Ce qui donne au final, en prenant notre hypothèse que "fineName" contient un chemin standard de fichier (tel que retourné par une boîte de dialogue Qt, au hasard) :</p> <p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if os.name == "nt":<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileName = "/" + os.path.realpath(fileName).replace(" ", "%20").replace('\\', '/')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileName = os.path.realpath(fileName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document = desktop.loadComponentFromURL("file://" + fileName, "_blank", 0, ())</code></p> <p>Notre variable "document" est donc à présent notre document de travail sur lequel on va pouvoir agir (remarque : notre fileName se terminant par ".xls", ".ods" ou assimilé, c'est Calc qui est lancé automatiquement par OOo). À ce niveau-là, je ne saurais que trop recommander d'entrer les commandes précédentes sur un iPython, et d'utiliser la tabulation pour constater à quel point l'API est aussi riche que labyrinthique, et qu'un outil d'autocomplétion et de documentation (souvent absente) peut nous être utile. L'API est calquée en réalité (m'a-t-on affirmé) sur celle des macros. D'un autre côté, ai-je une tête à faire des macros sous OOo ?? (en revanche, nous avons ça à Linagora, mais ce n'est pas moi qui m'en occuperait, n'est-ce pas ?). Bref, quelques fonctions utiles :</p> <p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.Sheets.getByIndex(0).getCellByPosition(0, 0).setString("du texte")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.Sheets.getByIndex(0).getCellByPosition(0, 1).setValue(42)</code></p> <p>Trois remarques : d'abord dans une feuille Excel (ou ods), se déplacer plutôt par "Sheets.getByIndex" plutôt qu'en appelant le raccourci du nom de l'onglet, histoire de pouvoir s'en sortir le jour où un gus renommera l'onglet du modèle. Ensuite, "getCellByPosition" se déplace selon le même système de coordonnées que sur une matrice. Enfin, il faut différencier "setString" qui ajoute du texte (qui peut être un chiffre) de "setValue" qui ajoute un nombre à la cellule : pour faire des calculs, par exemple, c'est "setValue" qu'il faut utiliser, sinon le résultat est juste catastrophique (et lorsqu'on n'est pas au courant, pour débuguer, on reste un peu bête).</p> <p>Comme on peut s'en apercevoir lorsqu'on entre beaucoup de valeurs (plus d'une centaine, disons), c'est franchement super-lent comme traitements. Rassurez-vous : toute usine à gaz aura les mêmes problèmes, inutile de pester. On peut rendre en revanche la chose plus intéractive pour l'utilisateur, qui devant son écran et au lieu de se tourner les pouces (ou jouer au démineur) pourra voir les jolies valeurs être entrées auto-magiquement, <del>ce qui est toujours ulta-sex et donne l'impression au client d'avoir payer une appli qui poutre</del>. Pour cela, il existe dans notre document une sous-classe "controller" qui va permettre d'en prendre le contrôle (on l'aura deviné) :</p> <p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controller = document.getCurrentController()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controller.setActiveSheet(document.Sheets.getByIndex(1))</code></p> <p>Et paf que ça change l'onglet de la feuille Excel (ou Ods, etc, bref Calc) dans notre OOo Calc ! C'est juste beau.</p> <p>Il s'agit à présent que toutes les données ont été entrées de sauver le document (sinon, il est perdu, ce serait bête) :</p> <p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.store()</code></p> <p>On peut aussi faire un :</p> <p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.dispose()</code></p> <p>Mais cela ferme la fenêtre et le serveur, ce qui peut être regrettable lorsqu'il s'agit de vérifier qu'un rapport a été bien rempli comme il convient (cf notre problématique initiale).</p> <p>Voilà c'est tout (ouf !). Aucun plantage n'a jamais été signalé ni constaté, et aucune mouette n'a été blessé (ni mordu par un serpent). Vous avez économisé une licence de l'affreux concurrent Microsoft Office (qui dispose d'un binding Python crassouillet sous windows ; et d'une méthode par ActiveX sinon, il me semble, mais c'est gore, n'est-ce pas ?), vous avez un code portable, sans passer par cette horreur de Perl et son API Excel (qui a le mérite d'exister, mais le problème intrinsèque de Perl, c'est que ça existe tout court), et grâce à ce tutoriel, c'est d'une simplicité relative (sinon, contactez notre zélé commercial Cédric Ravalec, il se fera une joie de vous proposer de l'AT dans la demi-heure). C'est beau.</p> le code qui fait mal aux yeux du jour urn:md5:69cb7b5d65a9068de1ae7fb57c1692f9 2009-12-02T11:56:00+01:00 gblanc informatique code of the dayprogrammation <p>J'en reste sur le postérieur : il n'y a pas de fonction sleep en Javascript (gare à celui qui me demande ce que je fiche avec un truc pareil !). En cherchant sur le net, <a hreflang="fr" href="http://www.xorax.info/blog/programmation/103-sleep-wait-pause-javascript.html">on trouve</a> des solutions de callback scabreuse, et une vieille méthode, qui comment dire, bref...</p> <p><code>function sleep(time){<br />&nbsp;&nbsp;&nbsp;&nbsp; var start = date.getTime();<br />&nbsp;&nbsp;&nbsp;&nbsp; while(start+time &gt; date.getTime()) true;<br />&nbsp;&nbsp;&nbsp;&nbsp; return;<br /> }</code></p> <p>J'espère que vous ne venez pas de manger. Ça ferait presque penser aux vieux temps du nop en asm pour occuper le CPU. On est en 2009, un langage de programmation ne propose pas de moyen de faire une pause autre que d'occuper 100% des ressources du CPU en attente active ; après demande aux webeux linagoriens, incrédule, confirmation a été donnée. Tout à coup, une citation de Linus Torvalds m'est revenue :</p> <p><blockquote><p>Modern PCs are horrible. ACPI is a complete design disaster in every way. But we're kind of stuck with it. If any Intel people are listening to this and you had anything to do with ACPI, shoot yourself now, before you reproduce.</p> </blockquote></p> <p>J'en pense de même pour les créateurs du Javascript...</p> decreasing the size of the distribution [OpenBSD] urn:md5:f3cfe212c42c9220ac3000910f3241dd 2009-10-26T17:21:00+01:00 gblanc informatique bsdembarqué <p>Voilà qu'aujourd'hui, sur la ML d'<strong>OpenBSD</strong>, quelqu'un cherche à <a style="font-weight: bold;" hreflang="en" href="http://www.nabble.com/decreasing-the-size-of-the-distribution-td26052871.html">faire baisser la taille d'OpenBSD</a> tout en gardant les <strong>fonctionnalités (réseaux)</strong> dont il a besoin. C'est trivial sous Linux, mais avec le poisson qui pique, c'est une autre affaire. Comme toujours sur cette mailing list, le pauvre se fait gentiment éconduire ; florilège :</p> <blockquote><p>I'd suggest spending the additional ~$2 for the 1GB flash and not to mess with anything!</p> </blockquote> <blockquote><p>Lastly if you do build a little shrip frankensystem, asking for help here isn't going to get a lotof sympathy. &nbsp;You'll be on your own.</p> </blockquote> <blockquote><p>If you have to ask, you shouldn't be doing it. &nbsp;Why would you possibly&nbsp; need to get smaller than the baseXX, etcXX and manXX sets? &nbsp;These easily&nbsp; fit on a few hundered MB. &nbsp;What modern flash disk won't fit this?</p> </blockquote> <p>Ah ces barbus, ils sont formidables, et toujours au fait de ce qui se passe dans la vraie vie de tous les jours. Soit le monde de l'<strong>embarqué</strong>, où il n'est guère décent de proposer une distribution de 512Mo qui embarque les pages man autant que le fabuleux répertoire /usr/share/misc/, qui pour 7,2Mo propose la liste complète des aéroports dans le monde (fichier <em>airports</em>), ou les codes postaux aux États-Unis (<em>zipcodes</em>) ; bon, je suis méchant, il faut garder à tout prix <em>terminfo.db</em> (3,0Mo), mais on peut bazarder <em>termcap.db</em> (2,7Mo).</p> <p>Il existe deux projets qui se proposent cependant de passer outre la religion inflexible du "touche à rien" (un autre concept de la geek-attitude) : <a hreflang="en" href="http://www.nmedia.net/flashdist/">flashdist</a> et <a hreflang="en" href="http://www.soekris.com/">soekris</a> (il y eut aussi <a hreflang="en" href="http://www.mindrot.org/projects/flashboot/">flashboot</a>). Mais voilà : basées sur des scripts qui copient les fichiers nécessaires à la nouvelle distribution réduite depuis le système de fichier de la distribution courante vers un répertoire donné (avant de l'intégrer dans un master), leur méthode est clairement de type top-down. Pour du <strong>bottom-up</strong>, c'est-à-dire de la compilation des sources pour obtenir le firmware (ou le master, à savoir le firmware plus le bootloader et d'autres partoches qui servent à stocker par exemple de gros fichiers, ce qui en soit justifie de réduire la taille de la distrib' -- qui pèse plus de 250Mo quand on ne met que le package "base", celui qui contient tellement peu de choses réellement utiles qu'on est rapidement embêté), j'ai bien peur que ce soit une autre <a hreflang="en" href="http://www.openbsd.org/faq/faq5.html#WhySrc">paire de manches</a>.</p> <blockquote><p> <strong>5.2 - Why do I need to compile the system from source?</strong> <br />Actually, you very possibly do not.<br />Some reasons why NOT to build from source:<br />&nbsp;&nbsp;&nbsp;&nbsp; * Compiling your own system as a way of upgrading it is not supported.<br />&nbsp;&nbsp;&nbsp;&nbsp; * You will NOT get better system performance by compiling your own system.<br />&nbsp;&nbsp;&nbsp;&nbsp; * Changing compiler options is more likely to break your system than to improve it.</p> </blockquote> <p>Et c'est sans compter le système de mise à jour assez rudimentaire (euphémisme) du firmware proposé par nos deux <a hreflang="en" href="http://256.com/gray/docs/soekris_openbsd_diskless/">solutions</a> :</p> <blockquote><p>You now need to take the image file and write it to your compact flash device using dd. Make sure you are using the correct device otherwise you can blow away your hard-disk or other devices. <br />&nbsp;dd if=image_cf of=/dev/??? bs=1k</p> </blockquote> <p><em>(pour faire bref : tu démontes ton serveur, tu enlèves la compact flash, tu la branches dans ton adaptateur universel, et après tu ne te trompes surtout pas de device où copier comme un gros cochon, sinon tu risques de flinguer des trucs pas bons, style ton disque dur -- c'est super industriel comme procédé, je me vois bien proposer ça à un client)</em></p> <p>Oh, il y a des recettes pour faire ça dans son garage, mais pour des applications industrielles, ça reste assez vague. <a hreflang="en" href="http://onlamp.com/pub/a/bsd/2004/03/11/Big_Scary_Daemons.html">"Homemade Embedded BSD Systems"</a> et <a hreflang="en" href="http://www.kernel-panic.it/openbsd/embedded/">"Embedded OpenBSD"</a> sont dans le genre de bonnes intros, mais on est loin du compte.</p> <p>Ou alors, <strong>il y a Linagora</strong>. Et en plus, vous ne serez même pas mal accueilli (et on s'étonne que je n'aie jamais laissé de messages sur cette ML...). Et en plus, le firmware peut être mis à jour à chaud, et on peut revenir en arrière en un clin d'oeil. Et en plus... Ah ah, il faut garder des surprises !&nbsp; :)</p> oui, non, 42 urn:md5:d67c9d88e3b8cf5e01378de2e3f6c150 2009-10-23T16:50:00+02:00 gblanc informatique chez la concurrencehumour <p>PgAdmin, version windows (oui, je sais, mais le client est roi -- oui, je sais aussi), m'afficha un jour ce message :</p> <img style="margin: 0 auto; display: block;" alt="" src="http://gillesblanc.com/public/gblanc.blogs.linagora.com/pictures/pgadmin_astuce.png" /> <p>Je ne compris point sa portée jusqu'à ce message de windaube 2003 serveur, alors que je faisais un glisser-déplacer depuis le gestionnaire de fichiers vers le bureau :</p> <p><img alt="" src="http://gillesblanc.com/public/gblanc.blogs.linagora.com/pictures/oui_non.png" /></p> <p>Voilà un abyme de perplexité dans lequel je fus sans ménagement jeté. Oui, non ? 42 !</p> <p>(il semblerait qu'il faille interpréter ce message selon : "je veux copier/déplacer" / "je ne veux pas" ; et qu'on ne vienne pas me demander à quoi ça sert !)</p> encart publicitaire urn:md5:6ea5ac1e82e2649a025dee15ef3fa4a7 2009-10-21T11:38:00+02:00 gblanc informatique chez la concurrencerâlage <p><blockquote><p>Vos produits éditoriaux en «&nbsp;24h&nbsp;» et «&nbsp;4 à 8 jours&nbsp;» seront expédiés en une seule fois entre le 29/10/2009 et le 31/10/2009.</p> </blockquote></p> <p>Votre site web a la polio (par exemple, un bouton "ajouter" qui fait un submit sur plusieurs champs dont certains cachés puisque sur des onglet en javascript, de telle sorte que si l'on s'était trompé de champs et que l'on en a rempli plusieurs avant de cliquer sur le bouton, il ne se passe rien de bon, tout en restant silencieux), et vous avez besoin d'aide pour sa refonte ? On peut vous aider...</p> <p>(autrement, il y a des prestataires, parfois, qui ne méritent pas de s'approcher à moins de 200 mètres d'un ordinateur)</p> le code de la soirée urn:md5:c25076c8601175a506f5b229405e544a 2009-09-17T16:54:00+02:00 gblanc informatique programmation <p><code>_colorline = ['#%02x%02x%02x' % (25+((r+10)%11)*23,5+((g+1)%11)*20,25+((b+4)%11)*23) for r in range(11) for g in range(11) for b in range(11) ]</code></p> <p>(c'est dans OpenERP)</p> <p>(et c'est du Python)</p>