Archive

Archives pour la catégorie ‘Informatique’

Back to code : MPR

Si vous me connaissez, le titre vous a peut-être mis la puce à l’oreille.

En effet je me suis remis à coder, après des mois et des mois d’abstinence, alors que je faisais principalement de la photo. Non je ne vais pas devenir photographe pro : ma vocation est dans l’informatique, mes compétences principales aussi.

Bien évidemment je continue la photo comme hobby, mais j’ai recentré mes priorités. J’ai des rêves, j’ai des idées. Je rêve un jour de pouvoir les concrétiser. Hélas, ca demande du temps, beaucoup de temps. Je suis intraitable sur la partie « réalisation technique » et je ne supporte pas le travail mal fait, instable et peu fiable. Je suis un maniaque de la complétion et je ne peux pas imaginer qu’une de mes réalisations ne fasse pas au moins le café (les geeks comprendront).

Je me suis donc remis sur un projet fondamental qui végétait depuis trop longtemps, la brique de base de tous mes projets rêvés, celle qui selon moi est indispensable : MPR. MPR pour Meta-Portable Runtime (et non pas multi-purpose room) se veut être une couche d’abstraction pas simplement au dessus du système, mais carrément au dessus des bibliothèques system-dependant ou simplement fondamentales.

Prenons un exemple. Il est selon moi inconcevable de développer un logiciel quelconque s’il n’est pas multilingue dès le  départ. Qui dit « multilingue » dit « utilisation de strings Unicode ». Quelle implémentation de strings Unicode semble solide et multi-plateforme ? Celle d’IBM peut-être : ICU. Oui mais voilà, si un jour ICU n’est plus supporté ? Si un jour ICU pose fondamentalement un problème dans son utilisation ? Si un jour sa licence change et qu’ICU devient proprio ? Si je veux porter mon appli sur une plateforme totalement exotique (prenons la PlayStation 1 pas exemple) alors qu’ICU ne la prend pas en charge ?

Dans ce cas, je vais devoir utiliser autre chose qu’ICU pour cette plateforme, voire me désolidariser entièrement d’ICU. La première solution semble être la moins douloureuse, mais quid des interfaces de cette bibliothèque qui sont utilisées partout dans le projet à porter ? Il faut repasser sur tout ? Tout modifier ?

C’est la que se situe MPR. Si l’application est développée au dessus de MPR, celle-ci fait office de couche d’abstraction et dissocie le code important (le logiciel) des interfaces des bibliothèques utilisées (les bibliothèques système, les strings Unicode, etc…).

Une fois que l’on a compris ca, on se rend compte de l’immensité du projet MPR, mais surtout du nombre incroyable d’interfaces à écrire pour tout abstraire. Ne parlons même pas de la documentation. C’est beaucoup trop long, surtout compte tenue de la verbosité du C++. Je travaille donc actuellement sur un générateur de C++ qui parse en entrée un fichier ayant une syntaxe plus simple et bien moins verbeuse pour en sortir du beau C++ bien rangé, optimisé et documenté.

MPR devrait (je pense) être rendue publique dans quelques temps sous une première forme ne gérant que quelques fonctionnalités indispensables (strings Unicode, fichiers et streams, interfaçage avec Python, threads), et ce sous une licence permissive (genre BSD ou quelque chose de proche).

Je mettrai surement de temps en temps des bouts de code ici, histoire d’avoir des avis. Stay tuned ;)

Categories: Informatique, Programmation Tags: ,

Your account is disconnected.

14:20:08 – Your account is disconnected.
14:21:13 – Your account is disconnected.
14:26:39 – Your account is disconnected.
14:27:22 – Your account is disconnected.
15:29:14 – Your account is disconnected.
15:29:57 – Your account is disconnected.
15:45:56 – Your account is disconnected.
15:46:27 – Your account is disconnected.
15:47:38 – Your account is disconnected.
15:48:04 – Your account is disconnected.
15:48:58 – Your account is disconnected.
15:59:52 – Your account is disconnected.
16:01:12 – Your account is disconnected.
16:04:18 – Your account is disconnected.
16:16:58 – Your account is disconnected.
16:17:33 – Your account is disconnected.
16:32:42 – Your account is disconnected.
16:34:02 – Your account is disconnected.
17:12:26 – Your account is disconnected.
17:13:54 – Your account is disconnected.
17:19:50 – Your account is disconnected.
17:20:33 – Your account is disconnected.
17:26:56 – Your account is disconnected.
17:27:36 – Your account is disconnected.
17:29:29 – Your account is disconnected.
17:33:55 – Your account is disconnected.
17:35:23 – Your account is disconnected.
17:39:17 – Your account is disconnected.

Merci qui ? Merci Free !!

28 dé-synchros de Freebox depuis 3 heures 30, soit ~7,2 dé-synchros par heure. Une dé-syncho toutes les 7,1 minutes en moyenne (avec 2 minutes de perdues pour re-synchro à chaque fois)… et j’ai vu pire ces derniers jours…

Je m’excuse (ou plutôt je n’excuse pas mon FAI) pour toutes ces décos/reco qui durent depuis deux semaines et qui doivent pousser certaines personnes au suicide à force de voir et/ou d’entendre les notifications de leur messagerie instantanée.

Je suis en train de passer chez SFR (du côté obscur de la Force qui soutient Hadopi/Loppsi) pour bénéficier de l’offre fibre optique 100/50 Mbps. Bien évidemment ils ont repoussé la date d’inscription, histoire de me faire poireauter plus que nécessaire (3 semaines pour débloquer le débit d’une ligne déjà active, bravo d’avance SFR !!) donc vous devrez supporter ca encore pendant j’espère au maximum une semaine.

Categories: Informatique, Réseaux Tags: , , ,

Sujet simplifié de la bistromathique

Plusieurs personnes me contactent (comme tous les ans, je trouve ca rigolo) pour avoir des infos sur la bistromathique. Aujourd’hui, au milieu des Tek1 en panique, j’ai eu un étudiant en commerce qui m’a demandé plus de renseignements sur le  sujet de la bistro. Histoire que ca profite à tout le monde je vais répondre ici :

Alors, la bistro c’est pas un programme très simple à faire, du moins ca ne se code pas en une soirée. C’est demandé à des Epitech 1ère puis 2è année et des Epita 1ère année d’ingénierie. Ca demande de l’acharnement (chercher continuellement à faire plus performant, plus rapide, etc…). J’ai passé un mois dessus en me concentrant quasi à plein temps pour arriver à un truc fonctionnel et rapide.

Globalement il s’agit de faire une calculatrice qui fonctionne sur des nombres très grands (des millions de caractères) et sur toutes les bases jusqu’à 255 si je me souviens bien.

On prend un gros fichier en paramètre du programme avec un grand calcul, genre 123451821*4894/(12354+4813) , mais avec des nombres bien plus grands et des milliers d’opérations (genre on a des fichiers de plusieurs gigas à traiter) et on doit trouver le résultat le plus rapidement possible.

C’est à coder en C pur, C99 autorisé, toutes optimisations du compilateur autorisées aussi.

On doit donc tout d’abord lire le fichier d’input pour le stocker en ram, puis le parser (avec les 5 operations +-*/% et les deux parenthèses). On doit bien évidemment gérer les priorités. Une fois ceci fait, il faut résoudre le calcul et l’afficher (ou l’enregistrer dans un fichier).

Voila pour le sujet, bonne chance si vous voulez travailler dessus. C’est un projet passionnant et extrêmement formateur, mais il demande un peu de temps et de recherches.

Bistromathique

J’avais fait un bel article sur mon ancien blog, avec toutes les idées que j’avais eues à la fin du projet d’Ing1 : Bistromathique. Comme plusieurs personnes m’ont demandé des infos sur le projet, je vais refaire cet article ici à partir des bribes trouvées dans la base de données que j’ai gardée.

Nous avons planché sur plusieurs projets en langage C depuis le début de l’année, mais un seul a réellement retenu mon attention : il s’agit de la Bistromathique. Qu’est ce que cela ? Il s’agit d’une calculatrice capable de travailler sur des grandes bases (ici on a implémenté jusqu’à la base 249) et sur des nombres entiers signés potentiellement infinis (nous nous sommes limités à une expression ayant pour taille maximale 4 294 967 295 caractères).

J’ai commencé par travailler sur une représentation en tableaux de caractères (tableaux d’entiers 8 bits non signés : des unsigned char* sur archi 32 bits), en implémentant l’addition, la soustraction et la multiplication scolaire, ainsi qu’un algorithme proche de celui de Knuth pour la division et le modulo. J’ai utilisé les tableaux en Big Endian pour faciliter les opérations commençant sur les poids faibles, et pour éliminer rapidement les 0 non-significatifs. De plus, le décalage à gauche étant plus souvent utilisé que le décalage à droite, cette représentation de chiffres était doublement intéressante.

Ma première grosse optimisation a été de récupérer les buffers déjà alloués pour les stocker dans une chaine de buffers vides. Mine de rien, j’ai multiplié par au moins 50 la vitesse de ma bistro avec cette astuce ! En effet, j’allouais pour chaque opérande de mon expression, ce qui faisait des milliers de mallocs ! Grâce à cette technique, sans même me casser la tête à trier les buffers vides dans la liste chainée, je suis descendu entre 10 et 25 mallocs sur tout le programme ! (Mes tests étaient composés d’expressions de 10 Mo et d’opérandes de 1 ko à 10 ko.)

J’ai ensuite transformé le programme pour qu’il utilise des tableaux d’entiers 32 bits non signés (unsigned long* ou unsigned int* sur archi 32 bits) et j’ai adapté l’addition et la soustraction. Voyant que les résultats étaient plus lents sur ceux-ci, j’ai abandonné cette voie de recherche (mauvaise pioche, j’aurais du continuer) : en effet, cette implémentation nécessite 3 parcours linéaires pour les additions et soustractions, mais accélère considérablement les multiplications !

Ensuite, pour accélérer ma multiplication, j’ai travaillé sur l’algorithme de Karatsuba. Malgré mes efforts sur la gestion mémoire, je n’ai pas pu empêcher l’allocation de deux structures de nombres et des chaines de caractères les accompagnant à chaque récursion de l’algorithme, ce qui a multiplié par 12 le nombre d’appels systèmes de mon programme sur mes tests. La conséquence de cela a été qu’en utilisant Karatsuba plutôt que la multiplication naïve, je doublais le temps de calcul.

Pressé par le temps, je me suis rabattu sur une optimisation de la multiplication naïve en utilisant seulement pour elle la représentation en tableaux d’unsigned long. Le gros point faible est qu’à chaque multiplication, je fais trois conversions : deux pour passer les deux opérandes en unsigned long*, et une pour repasser le résultat en unsigned char*. Malgré cela, mes résultats sur la multiplication naïve on été fulgurants (division par 9 à 18 du temps de calcul)

J’ai ensuite été contraint à rendre mon travail, timeout projet oblige.

Mes idées restantes si j’avais encore eu du temps :

  • Repasser entièrement sur des tableaux d’unsigned long, tellement plus rapides pour les opérations complexes (multiplication, division et modulo).
  • Retravailler Karatsuba notamment en allouant sur la pile plutôt que sur le tas à l’aide des tableaux dynamiques apportés par le C99 auquel nous avions droit
  • Trouver une astuce pour calculer rapidement l’heuristique de mon algorithme de Knuth modifié avec la nouvelle représentation des nombres.
  • Pouvoir gérer l’expression originale comme un buffer utilisable, donc pour cela déterminer les parties d’expression traitées pour utiliser cet espace mémoire obsolète : celui-ci était alloué à 10 Mo minimum, ca aurait été un gain considérable !
  • Permettre deux représentations de nombres en parallèle avec conversion éventuelle selon le type d’opération à effectuer pour accélérer les calculs type addition/soustraction seulement lorsque les opérandes viennent de l’expression originale)

Au final, je peux dire que ce projet m’a énormément appris, tant sur la gestion mémoire que sur de nouveaux algos (parseur LL d’expression mathématique, Karatsuba, Knuth…) ou sur l’expérience du debug (maintenant je ne peux plus travailler en C sans Valgrind tellement c’est utile).

Note : Je ne peux pas donner mon code source ici, simplement parce que d’autres épitéens ont des chances de tomber sur cette page alors qu’ils ont le projet à coder. Si certaines personnes veulent voir mon travail, qu’elles me contactent.

Nouveaux travers de Seven

Eh oui, le système est tout neuf et on va retrouver tous les bugs rigolos. Je suis en train d’écrire ce billet et il m’en arrive un nouveau à propos de la copie de fichiers qui déconne.

Chapitre 1 : les 0 éléments restants à copier.

En effet, je fais un gros backup de mon dossier d’images qui contient très majoritairement mes photos (182 Go, 53 842 fichiers) et ce gros neuneu de Seven m’annonce une copie de 9 372 éléments, finissant bien évidemment avec une barre de progression pleine, 0 éléments restants à copier en continuant pourtant son travail de copie…

Au bout de 20 secondes il pige son erreur, seulement à moitié et finit par me mettre une barre de non-progression (celle qui indique qu’il sait pas vraiment où il en est).

Cerise sur le gateau : il fait chuter constamment la vitesse de transfert (il était à plus de 20 Mo/s au début ; le temps d’écrire ce pavé, il est tombé à 7.91, 7.88, 7.79…). Il est pourtant évident vue la vitesse de copie des images qu’il va bien plus vite qu’indiqué, et à vitesse constante…

seven-1

seven-2Pitoyable…

Chapitre 2 : je ne partagerai pas MON imprimante !

Autre souci : le partage d’imprimantes. On va encore taper sur Petit mou cette fois-ci. Voyez plutôt :

Mon PC fixe est maintenant sous Seven. Le système a détecté lors de l’install que je pouvais gérer le 64 bits donc il s’est installé dans ce mode. Les drivers sont donc aussi dans la mesure du possible en 64 bits, comme c’est le cas pour mon imprimante.

Eh oui seulement le portable de ma mère, lui, tourne sous un bon vieil XP 32 bits, et il peut pas charger le driver via le réseau pour installer mon imprimante (en réseau, c’est le but du partage d’imprimante) car il cherche un driver 32 bits ; Seven ne possèdant que la version 64.

Cherchons un peu, on trouve dans « Périphériques et imprimantes » mon imprimante (vrai !). De là, on saute sur les propriétés de l’imprimante et on trouve un magnifique onglet gris nommé « Partage ». En bas, on voit un superbe bouton intitulé « Pilotes supplémentaires… ». Ca sent bon le succès tout ca !… mais je tiens à vous rassurer : si j’écris ca dans les travers de Seven c’est qu’il y a un… travers.

seven-5

Clicouillons donc… On me propose d’installer en plus du pilote x64 un pilote Itanium dont je n’ai rien à faie et un pilote  x86 ! Joie ! On coche et valide… Bim ! « Veuillez fournir un pilote d’imprimante ». Avec un bouton « Parcourir ». Il veut un fichier INF. Rien que ca…

seven-3

seven-4

Bien évidemment, chez Canon, ils te filent un exécutable bien empaqueté, tout joli, qui fait le boulot à ta place, vérifie lors de son exécution le type de système que tu as pour t’installer uniquement le bon driver sur ta bécane (x64 dans mon cas) et rien d’autre… Je fais comment pour installer mon driver x86 moi ?

Cher lecteur, si tu as une idée, elle est la bienvenue car je n’ai pour l’instant pas trouvé de réponse à cette question.

Windows 7

J’en avais marre de ce vieux XP qui traînait sur mon ordi fixe, qui bugguait toujours, dont les applications lançaient toujours ces énervantes fenêtres avec la grosse croix rouge qui fait « Bong ! », qui refusait une fois sur deux de s’éteindre après que je le lui aie demandé… Bref après presque neuf ans de (presque) bons et loyaux (hum…) services, j’ai fini par dire au revoir au dinosaure.

Vista avait été une catastrophe chez moi. A peine installé, j’étais revenu sur ce bon vieil XP qui tournait à peu près et ne me demandait pas 20 confirmations pour installer Visual Studio.

_Vous êtes sur ?

_ Oui !

_ Sur de vrai sur ?

_ OUI !!

_ Nan mais y’a ptet quelqu’un qui signe son document « Petit Mou Corp. » qui veut vous faire du mal ! Vous voulez vraiment installer « Petit Mou Studio Visuel 2008 » ? Ca semble louche…

_ OUI !! Bordel !

_ Et cet outil de « Petit Mou Inc. » qui doit s’installer avec ?

_ Raaaah !!

Maintenant Seven est sorti, et il faut bien le dire, Seven est quand même bien plus abouti que Vista (qui a dit « on sort enfin de la bêta ? »).

Le nouveau thème est beau, plein de petits trucs pratiques ont été rajoutés à l’UI pour que ca soit agréable à utiliser. Ca rame pas trop, on se paye même le luxe que ca soit a peu près fluide ! Incroyable.

M’enfin, depuis deux jours que je tourne dessus je peux déjà poser quelques griefs (le monde n’est pas parfait, ou plutôt si il était parfait alors que Windows existait, je me poserais de vraies questions…) :

  • Ca a ramé/freezé quelques fois, mais pas plus qu’XP. On reste donc dans un système Microsoft (on a les pieds sur terre quand même…)
  • Je dois dire adieu à ma webcam Philips Toucam Pro 2 qui a le malheur d’avoir été conçue par un constructeur (Philips pour ne pas le dénoncer) qui, en plus de ne pas savoir coder un driver sans le faire segfault 9 fois sur 10, se fout de ses client en n’assurant pas de compatibilité de ses produits et chez qui je ne suis pas prêt de racheter quoi que ce soit.
  • la gestion du tri-écran déconne presque à tous les coups, à moins que ca soit les drivers nVidia qui soient toujours pas au point. Bref, quand ça démarre, il faut toujours qu’un des écrans (et toujours le même) ne sorte pas de sa veille. Faut dire que c’est un écran Philips (combo !). J’ai peut être vraiment la poisse…
  • Mon scanner a pas l’air d’avoir un driver qui fonctionne. Je dois me repencher dessus mais ca sent mauvais. C’est pas un scanner Philips au moins… quoique c’est un Agfa… qui a aussi décidé d’arrêter les scanners…

Sinon ca fait bizarre d’être sur un système 64 bits, avec des applis qui tournent en 32 et d’autres en 64. Le truc le plus bizarre dans tout ça c’est l’organisation foireuse des logiciels dans le système : un dossier « C:\Program Files » (nommé immondément Programmes) qui sert pour toutes les applis qui sont comme le système, en 64 bits, et un autre « C:\Program Files (x86) » pour tout ce qui est 32 bits…

On a aussi cette distinction cheloue dans « C:\Users\Ornthalas\AppData » où on trouve les dossiers :

  • Local
  • LocalLow
  • Roaming

Il va falloir se faire à cette nouvelle architecture…

Pour l’instant je croise les doigts. Les petits problèmes de drivers viennent gâcher le plaisir mais au moins je suis à jour sur un système plus réactif, sécu et propre que le précédent.

Nouveau blog (encore un)

Hop, un nouveau blog pour remplacer l’antiquité bugguée qui était la avant…

J’ai décidé que je parlerais de tout et de rien ici, du dernier troll en cours ou encore de ma dernière photo foirée. Quentin a beau me dire que je vais abandonner, que ca sert à rien d’écrire… juste que parfois ça fait du bien de se défouler, même si j’ai mieux à faire que de perdre mon temps à écrire des conneries ici.

Alors, à toute personne qui cherche à se renseigner sur ma personne, à voir si je suis une personne correcte à embaucher pour un poste à responsabilités très cher et très bien : si j’écris mes conneries ici c’est justement pour éviter de perdre mon temps à les déblatérer trop devant de vrais gens dans la vraie vie. Ne m’en voulez-pas pour ca, ca ne fait pas de moi une personne moins valuable, embauchez-moi toujours, je le vaux surement ! :D

Categories: Informatique Tags: