Cher journal,
Il y a un an, je n'aurais pas imaginé en arriver là. Onze mois ont passé depuis que j'ai commencé à penser à ce projet. Onze mois de développement, d'apprentissage de C/C++, des techniques de rendu graphique, de la programmation multi-plateformes, soit au final plus de temps passé sur ce projet que je ne l'avais prévu. Mais ce projet a bel et bien abouti !
Quel projet ? Eh bien, je viens de placer sur le CVS de gnuplot [1] un nouveau terminal interactif, dont la partie "interface graphique" est implémentée grâce à wxWidgets [2] , et la partie "rendu" grâce à cairo [3] et pango [4].
[1] http://www.gnuplot.info
[2] http://www.wxwidgets.org
[3] http://www.cairographics.org
[4] http://www.pango.org
gnuplot est un logiciel en ligne de commandes pour tracer des courbes de fonctions mathématiques ou de données expérimentales, en 2D ou en 3D, éventuellement sous forme d'histogrammes, etc. Il est doté de multiples "terminaux" qui correspondent chacun à un format de sortie : png, jpeg, postcript, svg, ou un rendu dans un fenêtre interactive capable de zoomer sur une courbe, de faire tourner une surface, etc.
Les terminaux interactifs de la version stable de gnuplot sont implémentés nativement : il y en a un basé sur X11, un autre sur Windows, un autre sur PM
(l'API d'OS/2), un autre sur Aquaterm (une API pour MacOS). Ils sont tous indépendants, et implémentent tous à peu près le même ensemble de fonctions. À part le terminal basé sur Aquaterm, aucun n'utilise d'antialiasing pour les courbes, donc le rendu paraît assez archaïque. Le terminal basé sur X11 n'utilise pas non plus d'antialiasing pour les polices...
Mais revenons à la situation il y a onze mois. Je vais essayer d'expliquer ce qui s'est passé pendant tout ce temps, des fois que ça inspire d'autres têtes brûlées !
Il y a onze mois, donc, je réflechissais à une éventuelle participation à un projet de logiciel libre.
Il y a onze mois, je ne connaissais que peu de choses concernant le C/C++ et encore moins à propos de la programmation d'interfaces graphiques. Mes connaissances se limitaient à la programmation web (html, php, mysql), "pour le fun", et à la programmation orientée mathématiques avec Maple.
Il y a onze mois, j'utilisais gnuplot pour quelques projets scientifiques (je suis en Master de physique fondamentale à l'École Normale Supérieure), et j'appréciais ses capacités, mais constatait son apparence relativement en retrait, comme mentionné plus haut.
Et puis voilà, je me suis lancé ! J'ai écrit aux développeurs de gnuplot, via leur liste de diffusion, pour annoncer mon intention de travailler sur un nouveau terminal. Ma première idée était de créer un terminal plus accessible, autrement dit où les propriétés interactives seraient plus évidentes pour un nouvel utilisateur. Il m'avait en effet fallu plusieurs mois avant de me rendre compte que le clic droit avec la souris activait le zoom !
Les réactions ont été relativement froides. "Je ne vois pas trop l'intérêt d'ajouter plus d'interactivité", m'a-t-on dit par exemple. Par contre, l'idée d'un code multi-plateformes a séduit. "Je serais très heureux d'avoir le même terminal sous Windows et sous Linux", m'a dit un autre développeur. Bon, pour avoir matière à discussion, je n'avais plus qu'à commencer à coder !
J'ai appris sur le tas. Je me suis d'abord entraîné sur les exemples fournis avec wxWidgets. Puis j'ai appris comment faire cohabiter le C et le C++ dans un projet, comment se servir des autotools, et j'ai abouti après deux mois environ à un premier résultat fonctionnel. Le résultat en lui-même n'était pas transcendant, mais j'avais déjà appris énormément ! Et les quelques questions que je posais aux développeurs de gnuplot ne restaient pas sans réponse.
Étape suivante : peaufiner ! C'est ce qui m'a occupé depuis septembre dernier jusqu'à ces dernières semaines. Au passage, pas mal de changements ont eu
lieu dans le fonctionnement global de ce que j'avais écrit. J'ai séparé la partie "interface graphique" et la partie "rendu" du graphe. En effet, le rendu méritait plus d'attention que ce que me permettait de faire wxWidgets. J'ai finalement choisi d'utiliser le couple cairo + pango, qui fournit une solide base pour faire du rendu 2D multi-plateformes et de qualité. Le premier objectif était de positionner le texte correctement sur le graphe. Pango renvoit très précisément la taille de la chaîne de la caractères telle qu'elle va apparaître à l'écran. Parfait ! Au passage, cairo trace lignes et polygones avec antialiasing et ça change tout !
Enfin, pas tout de suite, parce qu'il m'a fallu maîtriser les subtilités de l'antialiasing :
Comment tracer 'y=x' comme une diagonale parfaite, qui ne "danse" pas ? En effet, gnuplot échantillonne la fonction y=f(x), et renvoit des coordonnées entières puisqu'on trace sur une grille de pixels. Oui, mais avec l'antialiasing, on a une précision effective inférieure au pixel ! La solution : faire croire à gnuplot que je trace sur une surface plus grande, en multipliant toutes les coordonnées par 10
environ.
Oui, mais je me retrouve avec des lignes horizontales et verticales qui bavent sur plusieurs pixels. Comment tracer des axes d'abscisse et d'ordonnée "nets" ? Eh bien, en détectant les lignes horizontales et verticales, et en les traçant de force alignées sur la grille de pixels.
Enfin, les algorithmes d'antialiasing font que des polygones censés être adjacents apparaissent finalement avec un "joint" sur leur arête commune. C'est dommage, alors j'écris à la liste de diffusion de cairo, on me propose plusieurs
solutions, aucune n'est triviale, mais au final l'une d'entre elles est relativement simple et efficace. Ouf !
Ah, j'allais oublier un autre problème qui m'a occupé pas mal de temps... l' UTF-8 ! En effet, pango ne trace que de l'utf-8. Ok, on dispose de librairies sachant transformer une chaîne de caractères depuis un encodage quelconque vers de l'utf-8. Mais il reste un gros problème : la police "Symbol". Elle peut être utilisée dans gnuplot pour écrire des légendes avec des symboles mathématiques ou des caractères grecs. Tout ça est superflu dans un système complètement unicode, mais pour assurer la compatibilité avec des anciens scripts, il me faut m'assurer que "Symbol" peut être utilisée. Or, si on choisit cette police avec mon nouveau terminal, pango ne trace rien du tout ! D'où vient le problème, me direz-vous ? Eh bien, par exemple, cette police suppose que le caractère 'a' correpond à la lette grecque 'alpha'. Or, pour pango en particulier et pour l'unicode en général, un 'a' est un 'a', et un 'alpha' est un 'alpha'. Point. Comment s'en sortir ? Après de nombreuses recherches bredouilles avec notre google préféré, et après avoir réfléchi quelques temps, j'ai finalement écrit une fonction qui fait "manuellement" la conversion depuis l'encodage "Symbol" vers l'unicode, et ... ça marche ! Pfiou, je ne suis pas passé loin de tout abandonner !
Et puis il m'a fallu apprendre la programmation avec les threads, les mutex et
compagnie. Et j'oublie encore les signaux, les sigjmp/longjmp, et tout ce que
gnuplot utilise et qui n'était pas compatible au départ avec mon nouveau
code... Et j'en oublie encore sans doute... Mais il faut persévérer !
Il y a quelques jours, j'ai été intégré dans la liste des développeurs de
gnuplot sur sourceforge.net. Après avoir appris les rudiments de CVS, j'ai
envoyé tout mon code avant-hier, soit un patch de 250 ko, qui touche le minimum
possible du code existant de gnuplot, qui contient quelques images PNG et XPM
pour la barre d'outils du nouveau terminal, et surtout plus de 5000 nouvelles
lignes de code !
Et pour couronner le tout, j'ai placé mon code sous double licence : sous la
licence de gnuplot, qui est assurément libre, mais non compatible avec la GPL au
sens de la Free Software Foundation, et sous la GPL, parce que, quitte
à être libre, j'aimerais bien voir gnuplot changer de licence pour la GPL,
alors pourquoi ne pas faire le premier pas moi-même !
Ça fait tout drôle... J'ai pleins de sentiments mitigés et de questions. Je suis heureux d'avoir appris autant, content d'avoir abouti et d'avoir contribué au logiciel libre mais, en même temps, est-ce que j'aurais pu utiliser tout ce temps pour autre chose de plus important ? Est-ce que ça va être un travail rentable dans la durée pour gnuplot ? Combien de temps vais-je devoir passer pour corriger les bugs, rajouter les fonctionnalités auxquelles je pense encore, etc. ?
En bref, c'est une page qui se tourne !
Combien sont prêts à passer de l'autre côté du miroir, et de se lancer dans un projet de ce genre, à plus ou moins long terme ? Je n'en sais rien. Probablement un nombre conséquent l'a déjà fait, étant donné l'état actuel du logiciel libre. J'aimerais voir plus de personnes faire ce pas, en tout cas je l'ai fait, et malgré les questions métaphysiques que je me pose, je ne regrette pas !
Merci à toi, cher journal, d'avoir accueilli ces pensées, et merci à toi, lecteur, de m'avoir lu.
# Bravo
Posté par Ph Husson (site web personnel) . Évalué à 10.
Arriver à travailler 11mois en n'ayant quasiement aucune connaissance et avoir ca comme premier projet bravo, la je penses que tu es tres bien parti dans le monde du libre:)
Sinon tu t'inquiete de l'interet de ce que t'as fait, et bien je peux te dire que y a beaucoup de monde a mon avis qui utilies gnuplot et qui ne sont pas contre changer cette vieille GUI X11!
Sinon si tu veux découvrir encore un peu sans trop chambouler tout, tu peux aider à porter kde en Qt4, ou alors pour Phonon, en fait tu pourais faire beaucoup de choses avec ta perseverance je penses :)
[^] # Re: Bravo
Posté par Pinaraf . Évalué à 2.
Par exemple un correcteur de grammaire libre ça serait super...
[^] # Re: Bravo
Posté par Funix (site web personnel, Mastodon) . Évalué à 4.
https://www.funix.org mettez un manchot dans votre PC
[^] # Re: Bravo
Posté par tipote . Évalué à 2.
Concernant cairo et pango, ils sont à la base de gtk+, donc je ne m'inquiète pas outre mesure.
Et quant à wxWidgets, c'est vrai que c'est moins répandu. Sur UNIX, wxWidgets est construit sur gtk+, donc il se révèle relativement accessible. Sous Windows, je m'en suis sorti avec MinGW sans trop de soucis (à part que c'est long).
Je me suis d'ailleurs longtemps demandé si je n'aillais pas utiliser gtk au lieu de wxWidgets.
Avantage de wxWidgets : implémenté nativement sous Windows et MacOS
Avantage de Gtk+ : c'est écrit en C, comme le reste de gnuplot
[^] # Re: Bravo
Posté par Funix (site web personnel, Mastodon) . Évalué à 1.
https://www.funix.org mettez un manchot dans votre PC
[^] # Re: Bravo
Posté par Vador Dark (site web personnel) . Évalué à 3.
Quel est l'intérêt de travailler directement sur un système temps réel? Je veux dire, je veux bien qu'on "mette au point" des programmes temps réels, pour les embarquer. Mais de là à équiper les pc des employés d'OS temps réels...
[^] # Re: Bravo
Posté par Funix (site web personnel, Mastodon) . Évalué à 2.
https://www.funix.org mettez un manchot dans votre PC
[^] # Re: Bravo
Posté par Christophe Merlet (site web personnel) . Évalué à 3.
Gnuplot redevient un outil présentable :)
Cependant, wxWidgets me parait être une dépendance bien lourde. gtk+ fonctionne déjà en natif sous Linux et Windows. wxWidgets me parait donc superflue. Sous Linux seule vlc l'utilise encore :(
De plus, a court terme, gtk+ supportera aussi parfaitement MacOSX, mais c'est moins important vu que MacOSX a déjà une interface antialiasé.
# fellicitation
Posté par fabien . Évalué à 5.
tu parles de tout ce que tu as fait, je suis impatien de voir tout ca, il serait possible de voire des screenshots ?
[^] # Re: fellicitation
Posté par tipote . Évalué à 10.
http://tipote.free.fr/wxt19.png
[^] # Re: fellicitation
Posté par snt . Évalué à 2.
[^] # Re: fellicitation
Posté par fabien . Évalué à 1.
bon, et donc ca y est ? tes modifs ont été acceptés dans la banche principale de gnuplot ?
ca veux dire que la prochaine version sera avec tes modifs ?
[^] # Re: fellicitation
Posté par tipote . Évalué à 1.
Par contre, je n'ai aucune idée de la date de sortie de la prochaine version ! gnuplot ne vit pas dans le monde des logiciels au cycle de sortie de 6 mois...
# en bref c'est une page qui se tourne
Posté par BAud (site web personnel) . Évalué à 0.
m'enfin t'es libre, c'est toujours agréable de voir que ce qu'on a fait est utilisable par d'autres.
si tu as envie de passer à d'autres applications (sans pour autant rentrer forcément dans les développements), tu peux regarder du côté de :
http://cookerspot.tuxfamily.org/wikka.php?wakka=CompileProgr(...)
déjà ce serait tester les applis (s'il y en a de ton domaine...) d'en faire pour chacune une première doc' d'exemple (qui pourra aller sur wikipedia par la suite....), puis ensuite - de manière standard - tester / packager pour la distrib' de ton choix.
# Bravo !
Posté par patrick_g (site web personnel) . Évalué à 10.
Tu m'excusera mais moi ce que je retiens de ton journal c'est que pour faire une vraie contribution au libre il faut être un brillant normalien, manger du C/C++ à haute dose au petit déjeuner, maitriser les redoutables autotools, dompter des engins aussi complexes que Cairo ou Pango, rigoler à la face des algorithmes d'antialiasing, savoir s'expliquer techniquement en anglais sur les mailings lists et, pour finir en beauté, se plonger dans la programmation multithreads.
Je suis très qu'admiratif devant ton travail mais pour le simple mortel que je suis je crois que je vais continuer avec mes quelques pauvres bug reports...en étant juste un poil plus déprimé...
[^] # Re: Bravo !
Posté par Anonyme . Évalué à 3.
Mais il ne faut jamais oublier que contribuer au libre, c'est une question de motivation, bon nombre de fois j'ai essayé de me lancer, mais je décroche très souvent au moindre soucis technique un peu galère qui me détourne de mon objectif principal. Pourtant régler les problèmes à la con c'est quelque chose que je fait très bien dans le cadre de mon travail, ou il y a encore peu, pendant mes études.
C'est très bête, mais éplucher des tonnes de docs pour trouver les bonnes solutions à mes problèmes est quelque chose que je fait trèèès bien pour le travail - j'ai du temps alloué pour, ainsi que des objectifs à atteindre. Mais je n'arrive pas a le faire pour mes projets - tous avortés - persos, et je suis sur que c'est le cas d'un bon paquet de moules que l'on trouve sur le net. C'est très frustrant, et on se sent un peu comme une merde.
Enfin, disons que j'attends mon heure, le jour ou je n'aurais rien a faire sur deux ou trois jours d'affilé, et que je me lancerais, que ca marchera comme je veux pendant suffisament de temps pour que l'investissement passé me pousse à me forcer à batailler sur les galères jusqu'au bout ... l'enjeu final étant que lorsque l'on maitrise un bout de code qui intéresse du monde (bug report/demande de fonctionalité) on devient la meilleure personne pour répondre aux besoins, et la satisfaction, le plaisir intellectuel à contribuer explose.
Enfin les divers témoignages que j'ai pu lire m'ont porté a croire que cela se passe en général ainsi.
(il ne faut pas oublier que le développeur qui arrive à faire fonctionner du code dégage un bon coup d'hormones de statisfaction - l'explosion du "ouéé ca marche, shuis trop fort" - ces hormones, qui sont, notez le bien, souvent synthétisées par le cerveau après de la prise de drogues dures :) )
[^] # Re: Bravo !
Posté par patrick_g (site web personnel) . Évalué à 8.
Perso pour ressentir cette explosion de plaisir j'utilise une autre méthode que l'informatique mais bon...
[^] # Re: Bravo !
Posté par tipote . Évalué à 7.
Je regrette maintenant d'avoir mentionné ça ! Je crois que ça fausse le jugement : j'aime beaucoup l'informatique mais ce n'est pas du tout ce que je fais pour mes études.
> manger du C/C++ à haute dose au petit déjeuner, maitriser les redoutables autotools, dompter des engins aussi complexes que Cairo ou Pango, rigoler à la face des algorithmes d'antialiasing, savoir s'expliquer techniquement en anglais sur les mailings lists et, pour finir en beauté, se plonger dans la programmation multithreads
Listé comme ça, c'est vrai que ça peut paraître décourageant. Mais c'est un constat, j'ai eu à m'habituer à ces différents aspects. Par contre, au début on ne se rend pas du tout compte de tout ça, et c'est pour ça qu'on arrive à se lancer ! Par la suite, quand on réalise l'étendue du travail à faire et qu'il n'y a pas que du pré-maché, c'est là que la motivation est vraiment éprouvée.
> je crois que je vais continuer avec mes quelques pauvres bug reports...en étant juste un poil plus déprimé...
Alors là, je suis vraiment désolé, c'est pas du tout ce que je voulais ! Je vois la communauté du logiciel libre comme une association de passionnés, comme des modélistes par exemple. Chacun fait un petit boût, certains ont plus de temps à consacrer à leur hobby, certains sont doués pour une tâche particulière (construire un nouveau modèle réduit, apprendre aux autres à piloter), tous participent à l'entretien des locaux, certains s'occupent de communiquer sur les activités du club. Au final, tout le monde a sa place, et il n'y a pas de hiérarchie.
# Enorme
Posté par JoeltheLion (site web personnel) . Évalué à 9.
Ensuite tu as évité l'erreur qui consiste à tout refaire soi même et tu as attaqué sans peur des libs comme cairo et pango, une fois de plus je dis bravo...
Finalement, un grand merci, et j'ai hâte de voir les nouveaux rpms arriver sur ma fedora. Franchement, ça fait chaud au coeur une annonce comme ça, je me disais justement ces derniers jours qu'il ne paraissait pas y avoir de nombreux vrais contributeurs sur linuxfr, alors ça fait vraiment plaisir!
# Roxitude !
Posté par Guillaume Knispel . Évalué à 10.
# Merci
Posté par Infernal Quack (site web personnel) . Évalué à 4.
Félicitation et merci pour ce projet.
L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire
# Congrats !
Posté par nullisimo . Évalué à 1.
J'aimerais rebondir sur tes interrogations. Il y a plusieurs types de contributions au libre, pas forcement bases sur des competences techniques, qu'ont peut mettre dans 2 categories: les contributions a long et a court termes. Ca parait "bete", mais en fonction de la fonctionnalite ajoutee, meme si elle est techniquement simple, cette derniere peut entrainer son contributeur dans l'engrenage de la contribution. C'est pas un mal, mais il faut comprendre les 3 points de vue.
Pour le projet, du sang neuf est un gage de perenite, et l'acces au repository est un gage de confiance. Confiance qui implique un minimum de responsabilite, le collegue ne sera pas forcement content de committer des fix sur un code qu'il ne connait pas, si cela arrive la mort de la fonctionnalite en decoulera.
Les utilisateurs aussi poussent au vice ;-) En effet quand tu as contribue quelque chose qui sert beaucoup, on va te demander un minimum de support. C'est valorisant au debut, mais parfois c'est pesant surtout quand ta vie personnelle evolue (boulot prenant, un mariage, un enfant, des problemes de sante, l'envie d'aller voir ailleurs...). Les utilisateurs ne sont pas obliges le savoir non plus. C'est frustant de ne pas trouver le temps.
Dernier point important, la place qu'on se donne dans le projet. Plus on va etre present plus, on va etre solicite. Faire l'autruche de temps en temps est prejudiciable, meme si ca sert de soupapes de securite a la salubrite de son esprit. Et parfois, il faut reconnaitre qu'on a ni le temps ni l'envie de continuer. C'est pas un mal, mais voila, c'est la vie. Et d'un coup, on est plus personne, on rejoint la longue liste des anonymes ayant contribue au projet ;-)
Ce sont ces points qui freinent une evenutelle contribution : La dependance face au projet.
Aucune contribution n'est un perte de temps, si tu l'as fait c'est que pour toi c'etait important, personnellement et pour le projet. Il ne faut pas oublier que les contributions doivent rester "pour le fun". On fait ca avant pour se faire plaisir.
# "ca sert a rien"
Posté par Sylvestre Ledru (site web personnel) . Évalué à 1.
[^] # Re: "ca sert a rien"
Posté par tipote . Évalué à 3.
Il avait raison dans une large mesure : dans le contexte, je parlais d'améliorer l'interactivité du terminal. Or, il se trouve que gnuplot a déjà un mécanisme de raccourcis clavier très puissant (c'est la commande bind), mais c'est juste difficile à deviner pour le nouvel utilisateur !
Par rapport à l'interactivité du terminal X11, je n'ai fait que rajouter une barre d'outils dont 5 icônes sur les 8 font ce que des touches clavier font déjà.
Parmi les 3 icones restants, le premier copie le "plot" vers le presse-papier, ce que le terminal X11 fait automatiquement à chaque plot ! Un autre affiche une fenêtre du genre "A propos", avec une ou deux phrases pour diriger l'utilisateur vers le système d'aide de gnuplot. Le dernier affiche une fenêtre de configuration, où on peut désactiver l'antialiasing, ajuster le comportement du terminal (prendre le focus à chaque plot, ne pas quitter à la fin d'un script, etc.). La seule vraie nouveauté est la façon dont ces réglages sont gardés en mémoire pour les prochaines utilisations. Grâce à wxWidgets, un fichier .quelquechose ou la base de registres sous Windows s'en occupe, et l'utilisateur n'a rien à faire de particulier. Avec le terminal X11, il falait bidouiller avec les .Xressources pour modifier ce genre de comportement et le garder en mémoire.
[^] # Re: "ca sert a rien"
Posté par tipote . Évalué à 8.
Pendant le développement, il a été le premier à me faire remarquer que l'antialiasing accentue les défauts sur les droites qui dansent à cause des coordonnées entières. C'était finalement constuctif, puisque j'ai trouvé comment l'éviter, et le rendu est alors incontestablement meilleur, sur n'importe quelle courbe.
Enfin, juste après la copie du code sur le CVS, il s'est attaqué à la compilation sous Windows, pour constater que ce n'est pas évident.
Il joue bien son rôle, et ce genre de critiques est constructif quand elles sont exprimées avec tact !
[^] # Re: "ca sert a rien"
Posté par Sylvestre Ledru (site web personnel) . Évalué à 2.
c'est toujours intéressant de voir comme ses modifications sont accueillis par les mainteneurs d'un projet.
# Merci !
Posté par tipote . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.