Chibi-nah::bloghttps://blog.chibi-nah.fr/2024-03-16T00:00:00+01:00Des geekeries, de la MAO, de tout et de rien…Mise à jour du firmware UEFI sur un mini PC Minis Forum UM773 SE2024-03-16T00:00:00+01:002024-03-16T00:00:00+01:00alextag:blog.chibi-nah.fr,2024-03-16:/mise-a-jour-uefi-minisforum-um773se<div class="section" id="la-machine">
<h2>La machine</h2>
<p>Il s'agit d'un mini PC, vendu par Minis Forum, série Venus, à base d'APU AMD Ryzen 7 7735HS et un chipset Radeon 680M intégré.</p>
<p>Vous voyez le Steam Deck ? Ben, ça, en version fixe, et plus performant.</p>
<p>La machine est vendue soit nue (barebone) sans RAM ni disque …</p></div><div class="section" id="la-machine">
<h2>La machine</h2>
<p>Il s'agit d'un mini PC, vendu par Minis Forum, série Venus, à base d'APU AMD Ryzen 7 7735HS et un chipset Radeon 680M intégré.</p>
<p>Vous voyez le Steam Deck ? Ben, ça, en version fixe, et plus performant.</p>
<p>La machine est vendue soit nue (barebone) sans RAM ni disque dur 2,5" ni SSD M2 NVMe 2280, soit avec RAM et SSD et un Windows 11 préinstallé.</p>
<p>Bien entendu, j'ai pris la version nue :)</p>
</div>
<div class="section" id="probleme">
<h2>Problème</h2>
<p>Jusqu'à récemment, pour mettre à jour le firmware UEFI (injustement appelé BIOS, y compris par moi-même, alors qu'il s'agit de technologies et de principes complètement différents), il fallait passer par Windows, seul un exécutable était fourni.</p>
<p>Maintenant, un exécutable et une archive zip sont proposés.</p>
</div>
<div class="section" id="preparation-de-la-mise-a-jour">
<h2>Préparation de la mise à jour</h2>
<p>Télécharger l'archive sur le site de Minis Forum</p>
<img alt="" src="images/minisforum-um773se/site-minisforum.png" />
<p><a class="reference external" href="https://minisforum.com/new/support?lang=en#/support/page/download/58">https://minisforum.com/new/support?lang=en#/support/page/download/58</a></p>
<p>L'archive (datant du 2023-11-30) contient les fichiers suivants :</p>
<ul class="simple">
<li>AfuEfix64.efi</li>
<li>checksum.txt</li>
<li>F7BFD115.rom</li>
<li>Flash.nsh</li>
<li>Release_Note.txt</li>
<li>WIN_F7BFD_BIOS_V1.15.exe</li>
</ul>
<p>Outre la présence de l'exécutable pour Windows, noter la présence d'un fichier efi (exécutable), un script EFI (.nsh) et le firmware (.rom).</p>
<p>Il faudra un shell EFI. Celui-ci peut être absent sur la partition EFI.</p>
<p>Monter la partition EFI dans /boot, si ce n'est déjà fait.</p>
<p>Le mini PC chez moi fonctionnant sous ArchLinux, le plus simple fut d'installer le paquet edk2-shell.</p>
<p><a class="reference external" href="https://archlinux.org/packages/extra/any/edk2-shell/">https://archlinux.org/packages/extra/any/edk2-shell/</a></p>
<p>Une fois le paquet installé, il faut copier le fichier /usr/share/edk2-shell/x64/Shell.efi dans /boot (à la racine).</p>
<p>Créer un répertoire appelé “BIOS-Update” (oui, j'ai écrit BIOS et non UEFI) dans /boot.</p>
<p>Copier dans ce répertoire le contenu de l'archive zip, ou a minima AfuEfix64.efi, checksum.txt, F7BFD115.rom et Flash.nsh.</p>
</div>
<div class="section" id="mise-a-jour-du-firmware">
<h2>Mise à jour du firmware</h2>
<p>Redémarrer le PC.</p>
<p>Entrer dans le BIOS, soit via une entrée GRUB ou rEFInd.</p>
<img alt="" src="images/minisforum-um773se/refind.jpg" />
<p>Une fois dans Aptio Setup, aller dans Save & Exit, puis sous Boot Override, sélectionner Launch EFI Shell from filesystem device.</p>
<img alt="" src="images/minisforum-um773se/aptio-launch-efi-shell.jpg" />
<p>Le shell se lance.</p>
<img alt="" src="images/minisforum-um773se/efi-shell-1.jpg" />
<p>Attendre quelques secondes, que le prompt arrive.</p>
<img alt="" src="images/minisforum-um773se/efi-shell-2.jpg" />
<p>À l'écran, Mapping Table présente les partitions trouvées. Celle qui nous intéresse est la partition EFI, ici FS0: (alias BLK1:), qui est la première partition sur un disque SATA (/Sata.../HD(1, GPT)).</p>
<p>Taper alors</p>
<pre class="literal-block">
FS0:
</pre>
<p>pour accéder à la partition (si vous avez connu MS-DOS, et les commandes A: ou C:, c'est <em>exactement</em> la même chose ici).</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Ne faites pas comme moi, ne tapez pas cd FS0:</p>
</div>
<img alt="" src="images/minisforum-um773se/efi-shell-3.jpg" />
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">utiliser la commande ls pour lister les fichiers et répertoires.</p>
</div>
<p>Entrer dans le répertoire BIOS-Update</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">utiliser la touche tabulation pour utiliser l'auto-remplissage.</p>
</div>
<img alt="" src="images/minisforum-um773se/efi-shell-4.jpg" />
<p>Taper enfin Flash.nsh, et valider.</p>
<p>La mise à jour du firmware se lance. Plus qu'à laisser tourner pendant un moment (c'est très lent). Il y en a pour bien 5 minutes.</p>
<img alt="" src="images/minisforum-um773se/efi-update.jpg" />
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Pendant la mise à jour et lors du redémarrage où l'écran sera noir pendant un moment, NE PAS ÉTEINDRE OU DÉBRANCHER LA MACHINE !</p>
</div>
<p>La signature Secure Boot peut être réinitialisée. Dans ce cas, le message d'erreur suivant apparaîtra :</p>
<img alt="" src="images/minisforum-um773se/secure-boot-error.jpg" />
<p>Appuyez sur Entrée pour entrer dans Aptio.</p>
<p>Aller dans Security, puis Secure Boot.</p>
<img alt="" src="images/minisforum-um773se/aptio-security.jpg" />
<p>Changer les paramètres dans Secure Boot (désactiver, ou resélectionner le fichier EFI pour validation Secure Boot. Dans mon cas, j'ai désactivé).</p>
<img alt="" src="images/minisforum-um773se/aptio-secure-boot.jpg" />
<p>Sortir (echap) puis aller dans Save & Exit, et sauvegarder les modifications.</p>
<img alt="" src="images/minisforum-um773se/aptio-save.jpg" />
<p>La machine redamarre, et l'écran sera noir pendant un moment. Puis la machine redémarrera à nouveau.</p>
<p>La mise à jour est terminée.</p>
</div>
<div class="section" id="en-video">
<h2>En vidéo</h2>
<video controls>
<source src="https://blog.chibi-nah.fr/images/minisforum-um773se/minisForum-update-efi.mp4" type="video/mp4">
</video><p>Lien vers la vidéo :<a class="reference external" href="https://blog.chibi-nah.fr/images/minisforum-um773se/minisForum-update-efi.mp4">https://blog.chibi-nah.fr/images/minisforum-um773se/minisForum-update-efi.mp4</a></p>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>La possibilité de mettre à jour le firmware, indépendamment du système d'exploitation est vraiment agréable. Pas besoin d'utiliser un système live avec un environnement PE ou similaire, avec les problèmes de stabilité qui peuvent arriver</p>
<p>J'ai une mise à jour qui a échoué avec un environnement de ce type. J'ai pu relancer le flashage dans la foulée et ça a réussi, mais grosse frayeur sur le coup.</p>
</div>
Mise en production2024-01-12T00:00:00+01:002024-01-12T00:00:00+01:00alextag:blog.chibi-nah.fr,2024-01-12:/mise-en-production<p>Mise en production, ou le mythe du vendredi.</p>
<p>Nous sommes vendredi, c'est le moment de troller^Wécrire un article sérieux</p>
<p>Je vois souvent revenir la même phrase, répétée partout, sans explication logique : « On ne met pas en production le vendredi ».</p>
<p>Pourquoi c'est absurde ? C'est simple :</p>
<ul class="simple">
<li>on ne met pas en …</li></ul><p>Mise en production, ou le mythe du vendredi.</p>
<p>Nous sommes vendredi, c'est le moment de troller^Wécrire un article sérieux</p>
<p>Je vois souvent revenir la même phrase, répétée partout, sans explication logique : « On ne met pas en production le vendredi ».</p>
<p>Pourquoi c'est absurde ? C'est simple :</p>
<ul class="simple">
<li>on ne met pas en production le vendredi sinon ça gâche le samedi, parce qu'on va passer toute la soirée, nuit pour tenter de réparer (enfin, agraver la situation) ;</li>
<li>il y a toujours des problèmes le vendredi ;</li>
<li>le vendredi, c'est trolldi ;</li>
<li>les équipes en astreinte détestent devoir intervenir le week-end suite à une mise à jour cassée ;</li>
<li>tester, c'est douter ;</li>
<li>il faut corriger les erreurs de mise en production.</li>
</ul>
<p>Si on pousse le raisonnement :</p>
<ul class="simple">
<li>on ne doit pas mettre en prod le vendredi parce que cela gâche le week-end ;</li>
<li>on ne doit pas mettre en prod le lundi parce qu'on rentre le week-end (et on a fait la fête jusqu'à tard dimanche soir) ;</li>
<li>on ne doit pas mettre en prod le mercredi, parce que l'après-midi, il faut amener les enfants à leurs clubs, activités sportives et ou culturelles ;</li>
<li>on ne met pas en prod le week-end.</li>
</ul>
<p>Du coup, on ne peut faire une mise en prod que le mardi ou le jeudi.</p>
<p>Faut arrêter les conneries.</p>
<p>Les raisons qui font qu'une mise en prod échoue sont diverses :</p>
<ul class="simple">
<li>cas non documenté ;</li>
<li>pas de test en recette/environnement de test dédié (ou pas de recette ou recette ne correspondant pas à la production) ;</li>
<li>pas de procédure de mise à jour écrite et fonctionnelle ;</li>
<li>procédure de mise à jour non respectée, ou * prestataire (chargé d'appliquer les mises à jour) ne respectant pas la documentation de mise à jour ;</li>
<li>DBA du prestataire qui surveille sa montre et éteint son laptop en plein milieu de l'exécution d'un script SQL de mise à jour et part « parce qu'il est 17h30 et j'ai fini ma journée ».</li>
</ul>
<p>Toute ressemblance avec des faits réels ne sont pas du tout fortuits.</p>
<p>Pour les cas non documentés, c'est rare, mais cela arrive (GPO/WSUS en environnement Windows qui bloque). En général, l'adminsys (ou la DSI) arrive à s'en sortir. Un document de retour d'expérience est alors écrit et la documentation avec ce cas est mise à jour.</p>
<p>Pas de test en recette ou environnement de test dédié. C'est comme sauter en parachute sans vérifier que le parachute est bon, ou que l'on ait pas de parachute. Ça peut passer, mais en cas d'échec…</p>
<p>Pas de procédure écrite et fonctionnelle.</p>
<pre class="literal-block">
– On fait quoi pour appliquer la mise à jour ?
– Je sais pas.
– Il est où le serveur ?
– Je sais pas.
– Ça veut dire quoi “Production” ?
– Je sais pas.
</pre>
<p>Procédure de mise à jour non respectée, ou comment ne pas faire confiance à un prestataire qui fait la mise à jour sans tenir compte de la documentation, en mode “nan mais je fais comme d'habitude”. Et PAF ! Le serveur de production tombe. Client : pas content. Moi : pas content.</p>
<pre class="literal-block">
– Je comprends pas, c'est marqué dans la doc qu'il faut supprimer des fichiers. Bon, c'est pas grave, on va juste renommer en fichier-old.ext. Qu'est-ce qu'il peut se passer de mal ?
– Tiens, le service ne fonctionne plus. Bon, c'est la faute du fournisseur, hein. Bon, pause café.
</pre>
<p>Ici, c'est rigolo quand les extensions sont en .so ou .dll
Conflit de .so ou .dll >.<</p>
<pre class="literal-block">
– Bon, il est 17h30. J'ai fini ma journée.
</pre>
<p>DBA du prestataire qui coupe son PC en plein milieu d'une mise à jour et part (en mode rien à battre!). Prod pdantée.
Le lendemain, grosse enguelade, blame, facturation d'une demi-journée supplémentaire en support, application du PRA et reprise de la mise à jour.</p>
<p>(la boîte en question n'existe plus...)</p>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Documenter. Tester. Déployer.</p>
</div>
Bilan de 20232023-12-28T00:00:00+01:002023-12-28T00:00:00+01:00alextag:blog.chibi-nah.fr,2023-12-28:/bilan-2023<p>L'année 2023 s'achève, faisons le bilan de l'année.</p>
<p>Tout d'abord, mes meilleurs vœux pour la nouvelle année.</p>
<div class="section" id="bilan-general">
<h2>Bilan général</h2>
<div class="section" id="au-niveau-associatif">
<h3>Au niveau associatif</h3>
<p>L'association LDN a été dissoute lors de la dernière AGE, fin septembre. <a class="reference external" href="https://ldn-fai.net/association-dissoute/">https://ldn-fai.net/association-dissoute/</a></p>
</div>
<div class="section" id="au-niveau-en-ligne">
<h3>Au niveau En ligne</h3>
<p>Maintenance habituelle, peu d'articles (5) publiés cette année …</p></div></div><p>L'année 2023 s'achève, faisons le bilan de l'année.</p>
<p>Tout d'abord, mes meilleurs vœux pour la nouvelle année.</p>
<div class="section" id="bilan-general">
<h2>Bilan général</h2>
<div class="section" id="au-niveau-associatif">
<h3>Au niveau associatif</h3>
<p>L'association LDN a été dissoute lors de la dernière AGE, fin septembre. <a class="reference external" href="https://ldn-fai.net/association-dissoute/">https://ldn-fai.net/association-dissoute/</a></p>
</div>
<div class="section" id="au-niveau-en-ligne">
<h3>Au niveau En ligne</h3>
<p>Maintenance habituelle, peu d'articles (5) publiés cette année (bilan 2022 exclu). Quelques MercrediFictions ajoutées sur mon gopher.</p>
<p>Ajout de quelques vidéos sur PeerTube (essentiellement du jeu vidéo).</p>
<p>Une instance Pixelfed a été montée, et l'instance PeerTube sera arrêtée dans les prochains jours. J'explique pourquoi plus bas.</p>
<p>Instance Pixelfed :
<a class="reference external" href="https://pix.nah.re/">https://pix.nah.re/</a></p>
<p>Côté ruffle, ajout de quelques animations flash sur la page dédiée : <a class="reference external" href="https://nah.re/ruffle/">https://nah.re/ruffle/</a></p>
</div>
<div class="section" id="au-niveau-hors-ligne-irl">
<h3>Au niveau Hors ligne/IRL</h3>
<p>Encore deux décès de proches. Deux accidents.</p>
<p>Malade à la fin de l'année (avant les fêtes, truc habituel, traitement habituel).</p>
<p>Quelques mastapéros également cette année :)</p>
<p>Lecture de light novels en anglais et en français (dont Death March in the Parallel World Rhapsody, Kuma Kuma Kuma Bear, La petite faiseuse de livres/Ascendance of a Bookworm, I'm in love with the villainess, I will survive using potions, The Eminence in Shadow, Moi quand je me réincarne en slime, Berserk of Gluttony, la petite princesse et le dragon, Detective AI). Commencé The saint magic. Les carnets de l'apothicaire est prévu mais pas encore commencé. Côté BD et mangas, comme l'an dernier, c'est trop nombreux pour les citer (enfin, je pourrais faire la liste en me basant sur les photos des livres que j'ai acheté).</p>
<p>Par rapport au casque audio acheté l'an dernier (AudioTechnica ATH-M50), j'en suis pleinement satisfait. Utilisé aussi bien avec mon baladeur numérique (xDuoo X3 II, malheureusement plus commercialisé), avec mon Steam Deck, ma Steam Machine (vois plus bas) et mon téléphone, en filaire comme en bluetooth.</p>
<p>En achats notables cette année, quelques trucs.</p>
<p>Un vélo pliant (Décathlon Btwin Fold 500 modèle 2023 en mai, avec lequel j'ai dépassé les 2 000 kilomètres en moins de 8 mois). Quelques défauts, mais c'est à cause d'un ensemble de compromis. La vitesse de pointe est trop basse (à peine 28-30 km/h, 32km/h en forçant), ce qui est vraiment limite en ville. La faute à des roues de 20", malgré un pédalier de 52 et un pignon de 14 (un 54-11 serait mieux). Voir article <a class="reference external" href="https://blog.chibi-nah.fr/retex_decathlon_btwin_fold_500">https://blog.chibi-nah.fr/retex_decathlon_btwin_fold_500</a></p>
<p>À noter : j'ai pu faire la Boucle de la Moselle avec ce vélo.</p>
<p><a class="reference external" href="https://pix.nah.re/p/alex/616607715790733729">https://pix.nah.re/p/alex/616607715790733729</a></p>
<p>Une Steam Machine. En réalité, un NUC/Mini PC, Minisforum UM773SE à base AMD Ryzen 7 7735HS, 16 Go de RAM et un SSD de 500 Go. Plus puissant que le Steam Deck, et tournant également sous ArchLinux/SteamOS3/HoloISO. Voir <a class="reference external" href="https://social.nah.re/@alex/110972289686708485">https://social.nah.re/@alex/110972289686708485</a></p>
<p>Ayant constaté que mon lecteur BluRay (que j'ai depuis quelques années) est compatible, je migre doucement vers les disques UHD.</p>
<p>Quelques Everdrive pour les anciennes consoles (entre 25 et 25 ans d'âge).</p>
<p>Une manette sans fil 8BitDo Pro 2, avec le récepteur SNES.</p>
</div>
</div>
<div class="section" id="dans-ce-qui-etait-prevu-en-2023">
<h2>Dans ce qui était prévu en 2023</h2>
<p>J'avais prévu peu de choses. Juste publier quelques articles de blog. J'ai à peine retouché au projet M. Pour le reste, aucune avancée.</p>
<div class="section" id="migrer-les-services">
<h3>Migrer les services</h3>
<p>Pas d'offre intéressante en 2023. Que des trucs qui ne correspondent pas au besoins. Cependant, voir en 2024 parce que l'arrêt d'un service me permettra de regarder plus en détails ce qui est utilisable.</p>
</div>
<div class="section" id="open-ardilla">
<h3>Open Ardilla</h3>
<p>Pour le coup, ce n'était pas prévu. La migration vers la version 8 de PHP s'est bien passée, excepté 2-3 trucs, dont notamment et surtout Open Ardilla, un aggrégateur de flux rss open source (licence GPL v3). Plus particulièrement ses dépendances, plus maintenues depuis plus d'une décennie.</p>
<p>J'en avais marre de les patcher ad-nauseam, et début 2023, j'ai carrément réécrit une bonne partie du code.</p>
<p>Retrait des fonctionnalités de marque-page (shaarli fait très bien le boulot pour ça), retrait du stockage des url dans une base de données SQL (pour quoi faire ? Autant coller directement la liste dans un fichier de config), utilisation d'une lib open source maintenue pour la gestion des flux RSS. Et c'est tout.</p>
<p>Du coup, le code source est mis en ligne sur gitlab.</p>
<p>Code source de Open Ardilla :
<a class="reference external" href="https://gitlab.com/chibinah/openardilla">https://gitlab.com/chibinah/openardilla</a></p>
<p>Open Ardilla en action :</p>
<p><a class="reference external" href="http://signets.chibi-nah.net/">http://signets.chibi-nah.net/</a></p>
<p>Shaarli :
<a class="reference external" href="https://shaarli.chibi-nah.net/">https://shaarli.chibi-nah.net/</a></p>
</div>
</div>
<div class="section" id="previsions-pour-2024">
<h2>Prévisions pour 2024</h2>
<p>C'est pas compliqué.</p>
<p>Les projets en hiatus le seront toujours.</p>
<p>Peut être quelques séances de karaoké.</p>
<p>Arrêter le service PeerTube et préparer son remplaçant.</p>
<p>Écrire quelques articles de blog.</p>
</div>
<div class="section" id="peertube">
<h2>PeerTube</h2>
<p>C'est quoi cette histoire encore ?</p>
<p>Pour remettre dans le contexte : PeerTube est une solution auto-hébergeable de partage de vidéos. Penser YouTube ou DailyMotion, pas juste un bête logiciel de lecture vidéo basé sur Youtube-DL ou équivalent. Non. Le logiciel qui fait tourner YouTube en lui-même, chose qu'Alphabet cache jalousement (Rien à cacher ? Vraiment ?)...</p>
<p>Le gros problème, c'est que</p>
<ul class="simple">
<li>C'est horriblement lourd</li>
<li>C'est super chiant à déployer (j'ai pas une install standard)</li>
<li>Ça gère pas Apache (avec des arguments ouin ouin on va pas supporter tous les serveurs... sans commentaires)</li>
<li>Toutes les montées en version (même mineures) pètent systématiquement. Ah oui, mais comme on supporte pas Apache, démerdes-toi !</li>
<li>La migration vers la version 6 casse plein de trucs, et il y a plein de trucs à refaire côté config. Là, ça a complètement achevé toute motivation de continuer à maintenir ce service.</li>
<li>La fédération automatique apporte du boulot de modération, surtout pour les comptes spam. (Super d'avoir une notif à 1h du mat et de rallumer le PC pour virer ces spams et les signaler, avant de bloquer l'instance en question parce que pas modérée ou version pas à jour de PeerTube et sans outils de modération)</li>
</ul>
<p>Bref, annoncé le 8 novembre 2023 pour fermeture officielle au 1er janvier 2024</p>
<p><a class="reference external" href="https://social.nah.re/@alex/111371965051449958">https://social.nah.re/@alex/111371965051449958</a></p>
<p>Cependant, couper PeerTube ne veut pas dire qu'il n'y aura plus de vidéos. Je planche sur une petite partie de mon temps libre sur une solution alternative ; soit un truc simple, style gallerie avec la notion de chaînes à la place d'albums, à la Lazygal <a class="reference external" href="http://aeka.chibi-nah.net/~alex/km/">http://aeka.chibi-nah.net/~alex/km/</a> ou similaire ; soit une solution maison à base de Laravel + vidstack, avec gestion des vignettes, multi-résolution, chapitrage, etc...</p>
<p>La seconde solution (partiellement implémentée) est visible sur le lab.</p>
<p><a class="reference external" href="http://lab.chibi-nah.net/">http://lab.chibi-nah.net/</a></p>
</div>
<div class="section" id="conclusion-bilan-de-2023">
<h2>Conclusion bilan de 2023</h2>
<p>Je n'ai plus la motivation de m'impliquer de nouveau dans le monde associatif, même si 2-3 pourrait m'intéresser. Niveau projets, je reprend doucement les trucs open source, quand le boulot me le permet (autrement dit, je ne rentre pas complètement claqué, fatigué, au point de ne plus toucher au PC). Et du vélo. Beaucoup de trajets à vélo.</p>
</div>
<div class="section" id="bilan-jeux-videos">
<h2>Bilan jeux-vidéos</h2>
<p>Place au bilan jeux-vidéos.</p>
<p>Comme l'an dernier, Steam propose une rétrospective. Je me baserai dessus.</p>
<img alt="" src="images/bilan2023/steam2023.png" />
<p><a class="reference external" href="https://store.steampowered.com/yearinreview/76561198012179938/2023">https://store.steampowered.com/yearinreview/76561198012179938/2023</a></p>
<p>34 jeux lancés, 7 nouveaux jeux (achetés dans l'année).</p>
<p>À retenir notamment :</p>
<img alt="" src="images/bilan2023/FF12.jpg" />
<p>Final Fantasy XII ; Gros RPG. Je l'ai sur PS2, en original, donc depuis 2006-2007 (par là). Je l'ai repris sur Steam pour des raisons pratique (et parce que l'émulateur PS2, ça va bien 5 minutes). visuellement amélioré, le mode zodiaque est par contre un truc que j'apprécie peu. Le système de permis est castré par métier, et toute la grille n'est plus accessible. Heureusement qu'un mod existe et permet de remettre la grille complète comme sur la version originale PS2.</p>
<img alt="" src="images/bilan2023/AtelierSophie.jpg" />
<p>Atelier Sophie ; RPG sympa, mais répétitif à la longue. Débloquer une recette, aller cueillir des plantes. Battre quelques monstres. Débloquer une recette, etc.</p>
<img alt="" src="images/bilan2023/ForzaH4.jpg" />
<p>Forza Horizon 4 ; Encore et toujours. Comme l'an dernier. Le croisement improbable entre Forza Motorsports et Midtown Madness avec un zeste de Need for Speed Underground 2. Le bug qui faisait crasher le jeu a été identifié et corrigé.</p>
<img alt="" src="images/bilan2023/FF7.jpg" />
<p>Final Fantasy VII ; Encore et toujours ce RPG datant de 1997.</p>
<img alt="" src="images/bilan2023/Lumines.jpg" />
<p>Lumines Remastered ; La version PC explose la version PSP. 60 fps (et non 30), image plus propre, plus de défis.</p>
<p>Beat Saber ; joué un peu cette année, mais pas tant que ça. Ressortir le matériel VR, pousser les meubles dans le séjour, déplacer le PC, c'est pénible. Du coup, ce fut juste pour la sortie de l'OST 6 que j'ai surtout rejoué à la fin de l'année.</p>
<p>En VR, j'ai aussi joué à Rez, Gal*Gun2 et Synth Riders.</p>
<p>Répartition par type/genre de jeu :</p>
<ul class="simple">
<li>RPG japonais</li>
<li>courses</li>
<li>Réflexion</li>
</ul>
<p>Au niveau temps de jeu</p>
<img alt="" src="images/bilan2023/temps.jpg" />
<p>un gros creux au milieu de l'année et en octobre, correspondant soit au beau temps (rando vélo), soit à une période de crunch au boulot.</p>
<p>Répartition par plate-forme.</p>
<p>Pas de surprise :</p>
<ul class="simple">
<li>Steam Deck : 85%</li>
<li>Linux : 6%</li>
<li>VR : 5%</li>
<li>Windows : 4%</li>
</ul>
<p>Linux, ici, correspondant à mon PC “gamer” (même si je n'aime pas ce terme). Windows n'est quasiment plus utilisé.</p>
<p>À noter : ma Steam Machine est reconnue comme étant un Steam Deck. Les jeux lancés dessus sont donc comptabilisés avec le Deck.</p>
<p>Les jeux hors Steam (GoG, consoles de jeu) ne sont pas comptabilisés ici.</p>
</div>
Decathlon BTwin Fold 5002023-08-11T00:00:00+02:002023-08-11T00:00:00+02:00alextag:blog.chibi-nah.fr,2023-08-11:/retex_decathlon_btwin_fold_500<p>Retour d'expérience sur le vélo pliant Decathlon BTwin Fold 500, modèle 2023, après 4 mois et 900 km parcourus avec.</p>
<img alt="" src="images/btwin500/deplie.jpg" />
<p><em>Photo. Vélo déplié, avec les accessoires ajoutés et non présents d'origine</em></p>
<img alt="" src="images/btwin500/plie.jpg" />
<p><em>Photo. Vélo plié, avec les accessoires ajoutés et non présents d'origine</em></p>
<div class="section" id="le-velo">
<h2>Le vélo</h2>
<p>Le vélo est un vélo pliant …</p></div><p>Retour d'expérience sur le vélo pliant Decathlon BTwin Fold 500, modèle 2023, après 4 mois et 900 km parcourus avec.</p>
<img alt="" src="images/btwin500/deplie.jpg" />
<p><em>Photo. Vélo déplié, avec les accessoires ajoutés et non présents d'origine</em></p>
<img alt="" src="images/btwin500/plie.jpg" />
<p><em>Photo. Vélo plié, avec les accessoires ajoutés et non présents d'origine</em></p>
<div class="section" id="le-velo">
<h2>Le vélo</h2>
<p>Le vélo est un vélo pliant, dont le modèle existe depuis quelques années (voire une décennie) et a évolué au fil du temps.
Ici, il s'agit du modèle 2023.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Il s'agit du modèle sans assistance électrique.</p>
</div>
<p>Caractéristiques :</p>
<ul class="simple">
<li>cadre pliant en aluminium ;</li>
<li>fourche en acier ;</li>
<li>roues de 20 pouces simple paroie et pneus 20" × 1,75 renforcés (mais pas increvables) ;</li>
<li>selle avec graduations et rail pour empêcher sa rotation ;</li>
<li>garde boue ;</li>
<li>pédales pliantes ;</li>
<li>béquille sur le cadre côté gauche ;</li>
<li>catadioptres sur roues, pédales, à l'avant et à l'arrière, et éclairage d'origine (phare avant et feu arrière) ;</li>
<li>dérailleur Shimano 7 vitesses (commande par poignée tournante au guidon) ;</li>
<li>plateau fixe 52 dents, pignons 14-36 ;</li>
<li>support avant pour attacher un sac ou une besace (vendue à part) ;</li>
<li>poids annoncé (sans accessoires) : 12,8 kg.</li>
</ul>
<p>À noter : le vélo étant neuf, celui-ci est marqué, identifié et enregistré. Le but n'étant pas d'en empêcher le vol mais de contacter la ou le propriétaire du vélo quand celui-ci est retrouvé.</p>
</div>
<div class="section" id="les-points-negatifs">
<h2>Les points négatifs</h2>
<p>Je ne vais pas lister les points positifs (c'est dans la section “En pratique”), mais les quelques points négatifs/désagréables.</p>
<ul class="simple">
<li>développement moyen/limité, mais du au diamètre des roues ;</li>
<li>système de fixation/maintien en position pliée très fragile (développé plus bas) ;</li>
<li>selle qui a tendance à glisser/descendre (nettoyage/graissage du système de fermeture à prévoir), problème constaté sur la génération précédente ;</li>
<li>phare avant mal orienté (n'éclaire pas la route parce que orienté parallèle au sol et non incliné vers le bas) ;</li>
<li>système d'attachement du phare avant qui a cassé au bout de 10 minutes (languette plastique qui n'a pas tenu) ;</li>
<li>feu arrière un peu trop haut (situé sous la selle).</li>
<li>une fois plié, le poids est assez mal réparti, et le vélo à tendance à tomber côté guidon, la petite béquille centrale (qui n'est pas une poignée contrairement à ce que j'ai pu lire) est positionnée sous le cadre et est fixe.</li>
</ul>
</div>
<div class="section" id="en-pratique">
<h2>En pratique</h2>
<p>Au niveau maniabilité, comparé à un vélo de location (type vélib) ou un VTT, c'est le jour et la nuit. Léger, extrêmement maniable, plutôt confortable malgré l'absence de suspension (les trous et les nids de poule se font cependant bien sentir), et permet de bonnes accélérations, malgré une vitesse de pointe limitée (25-28 km/h facilement atteignable, difficile de monter au delà de 33 km/h).</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Penser à gonfler les pneus à 4 bar.</p>
</div>
<p>Le rendement est moyen, limité par les roues de 20", malgré le plateau de 52 dents et le petit pignon de 14 dents. Après, ce n'est pas un vélo de course mais un vélo de ville, mais je n'aurais rien contre un plateau de 54 et un pignon de 11 pour rouler plus aisément au milieu de la circulation.</p>
<p>Le dérailleur Shimano est un dérailleur classique, avec les mêmes défauts rencontrés sur d'autres vélos. Pour passer sur les petits pignons, il faut en sauter un. Par exemple, pour passer du 6 au 7e, revenir sur le 5e pignon et sauter sur le 7e. Tenter de passer du 6 au 7e directement ne s'effectue pas de manière systématique (ça finit par passer au bout d'un moment).</p>
<p>La selle graduée est vraiment pratique au moment de déplier le vélo. Pas besoin de faire une marque, d'utiliser un cordon ou un élément de plastique pour retrouver la hauteur de la selle.</p>
<p>Les pneus renforcés, gonflés à une pression de 4 bar, ne sont pas à 100% increvables. Je l'ai constaté au bout de 560 km, un bout de verre a réussi à se coincer dans le pneu de la roue arrière, et au bout de quelques centaines de mètres a percé la chambre à air. Heureusement que je me déplace systématiquement avec une trousse à outils, j'ai pu réparer sur place. À noter : il n'y a pas de système d'attache rapide sur les roues, ce sont des écrous de 15.</p>
<p>Venant d'un vélo à dérailleur moyeu (vélo courte location type vélib), il m'a fallu un peu de temps pour me réhabituer à un dérailleur pignons. Changer les vitesses en pédalant, anticiper l'arrêt à un feu et changer les vitesses avant l'arrêt. Sur un dérailleur moyeu, le changement de vitesse se fait SANS pédaler, et est donc possible à l'arrêt.</p>
<p>En multi-modal, le vélo est accepté plié dans les TER et certains autobus (urbain). En général, ce n'est pas accepté en autocar. Je n'ai pas essayé dans un intercité ou dans un TGV.</p>
<p>Pour plier ou déplier le vélo, une fois que l'on a pris l'habitude, cela se fait en moins de 15 secondes.</p>
<p>Cependant, une fois plié, il ne faut pas s'attendre à avoir un vélo extrêmement compact comme un Brommie britannique (et coûtant 4× plus cher). Une fois plié, les dimensions sont 78 cm de long, 66 cm de haut et 44 cm de large.</p>
</div>
<div class="section" id="accessoires-ajoutes">
<h2>Accessoires ajoutés</h2>
<p>Le vélo est vendu avec quelques accessoires d'origine (listés dans la section “Le vélo”). À des fins pratiques, j'ai ajouté :</p>
<ul class="simple">
<li>un rétroviseur à gauche (vraiment utile en milieu urbain) ;</li>
<li>un compteur vélo filaire basique (5 fonctions) ;</li>
<li>un porte-bagage (pas encore utilisé avec des sacoches, pour le moment, plutôt utilisé pour trimballer l'antivol si nécessaire) ;</li>
<li>un combiné catadioptre/feu arrière, attaché sur le porte-bagage. Vient en complément du feu arrière d'origine.</li>
</ul>
<p>Indépendant des accessoires, mais nécessaire :</p>
<ul class="simple">
<li>un casque de vélo (pas obligatoire en France, mais recommandé) ;</li>
<li>des lunettes de soleil ;</li>
<li>des gants (qui m'ont sauvé les mains lors d'une chute à vélo) ;</li>
<li>un sac à dos (le mieux serait une sacoche sur porte-bagage, mais porte-bagage pas en stock à ce moment là).</li>
</ul>
<p>Sac à dos dans lequel j'ai mis :</p>
<ul class="simple">
<li>une trousse à outils (divers clefs, attaches rapides, chiffons, démonte pneus (je fais sans en général, mais ça peut servir) et outils, kit de réparation/rustine) ;</li>
<li>un kit de premiers secours (trousse rouge) ;</li>
<li>une petite pompe à vélo.</li>
</ul>
</div>
<div class="section" id="systeme-de-fixation">
<h2>Système de fixation</h2>
<p>L'un des principaux points noirs de ce vélo. Le système de fixation est extrêmement mal foutu. Voilà pourquoi :</p>
<p>Au niveau de la roue avant, il y a une plaque métallique fixe. Rien d'extraordinaire</p>
<p>Au niveau du cadre, côté gauche, un aimant néodyme, monté sur une tige et un ressort. Pourquoi pas.</p>
<p>SAUF qu'au lieu d'utiliser un aimant néodyme percé, et passer une tête de boulon à tête fraisée à travers cet aimant, l'aimant utilisé est plein, et est enmanché en force dans un élément métallique, et un filetage tout fin est présent sur ce support. Une vis, avec une rondelle et un ressort complète ce système de fixation.</p>
<p>Bien entendu, ce système a cassé au bout d'une semaine, avec l'aimant resté collé contre la plaque métallique et le reste accroché au cadre. Ce problème est généralement remonté dans les avis sur ce vélo.</p>
<img alt="" src="images/btwin500/fixation-origine.jpg" />
<p><em>Photo. Le système de fixation qui a cassé.</em></p>
<p>Le vélo, une fois plié, mais ne restant pas en place étant absolument ingérable, j'ai donc bricolé un système de fixation différent, mais gardant le même principe (un aimant).</p>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Le système de fixation montré ci-dessous n'est pas d'origine. Ce système n’est ni validé ni approuvé par le fabricant et par le vendeur (Decathlon).</p>
</div>
<p>Cependant, contrairement au système d’origine qui a cassé au bout d’une semaine, mon bricolage tient, et cela fait plus de trois mois qu’il encaisse 8 à 14 pliages par jour, 5 jours par semaine. Et s’il casse, je sais comment réparer.</p>
<p>Et accessoirement, ça m’a coûté moins cher que la pièce de rechange.</p>
<img alt="" src="images/btwin500/fixation-pieces.jpg" />
<p><em>Photo. Pièces nécessaire pour le nouveau système de fixation. Les aimants ne sont pas sur la photo parce que déjà utilisés.</em></p>
<p>Sur l’emplacement d’origine, j’ai mis deux aimants néodyme ronds percés/chanfreinés de diamètre 18mm (résistance 3,5 kg à la traction), fix-o-moll trouvés à Ler%%-%%%lin, un boulon à tête fraisée en diamètre 4mm et 30 mm de long (trouvé en sachet jaune par 15 avec rondelles et écrous, même boutique), quelques rondelles et écrous pour maintenir les aimants en position fixe.</p>
<img alt="" src="images/btwin500/fixation-details.jpg" />
<p><em>Photo. Nouveau système en place.</em></p>
<p>Quand le vélo est plié, les aimants collent à la plaque métallique placé sur la roue avant (système d’origine), et maintient le vélo fermé.</p>
<img alt="" src="images/btwin500/fixation-nouveau.jpg" />
<p><em>Photo. Vélo replié et maintenu en place.</em></p>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Pour des raison pratique, je voulais passer sur un vélo pliant. Le fait de pouvoir le prendre avec moi au bureau et le laisser à côté de moi fait que je n'ai pas à m'embêter avec un antivol ou à le laisser dans l'espace vélo (pris d'assaut les beaux jours) ou de le laisser en extérieur. Idem, étant relativement compact, il ne prend que peu de place chez moi.</p>
<p>Cependant, il y a un ensemble de compromis à faire, la compacticité ne peut se faire sans contrepartie.</p>
</div>
Rocksmith 2014 remastered et Roland Rubix 222023-03-26T00:00:00+01:002023-03-26T00:00:00+01:00alextag:blog.chibi-nah.fr,2023-03-26:/rocksmith_2014_roland_rubix<p>Ou comment jouer à Rocksmith 2014 en utilisant l'interface audio Roland Rubix 22.</p>
<p>Rien de très compliqué, mais il m'a fallu quelques tatonnements pour arriver au bon résultat.</p>
<p>TL;DR (EN): Install the Roland ASIO drivers; install the RS ASIO mod; open the Rubix Control Panel, in the Buffer Settings …</p><p>Ou comment jouer à Rocksmith 2014 en utilisant l'interface audio Roland Rubix 22.</p>
<p>Rien de très compliqué, mais il m'a fallu quelques tatonnements pour arriver au bon résultat.</p>
<p>TL;DR (EN): Install the Roland ASIO drivers; install the RS ASIO mod; open the Rubix Control Panel, in the Buffer Settings tab select USB Streaming Mode 1 and then restart the game.</p>
<p>Trop long, flemme de lire (FR) : Installer les pilotes Roland ASIO, installer le mod RS ASIO, ouvrir le <cite>Rubix Contror Panel</cite>, aller dans l'onglet <cite>Buffer Settings</cite>, sélectionner le mode 1 pour <cite>USB Streaming Mode</cite> et relancer le jeu.</p>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Ceci est inutile avec Rocksmith Plus, cette interface audio est gérée nativement.</p>
</div>
<div class="section" id="prerequis">
<h2>Prérequis</h2>
<p>Il faut plusieurs trucs :</p>
<ul class="simple">
<li>Rocksmith 2014 Remastered (version Steam ici) ;</li>
<li>Une interface audio Roland Rubix 22 ou 24 (ici, 22) ;</li>
<li>Une guitare ou basse électrique;</li>
<li>Un câble jack ;</li>
<li>Une connexion Internet (il faudra télécharger des trucs).</li>
</ul>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Ceci a été testé avec Windows 10 22H2.</p>
</div>
</div>
<div class="section" id="rocksmith-2014">
<h2>Rocksmith 2014</h2>
<p>Successeur de Rocksmith 2011, ce jeu ressemble à Guitar Hero ou Rockband, avec une différence principale : on n'utilise pas une guitare en plastique Playschool, mais une vraie guitare branchée sur le PC ou console, via une interface USB intégrant un câble jack.</p>
<img alt="" src="images/rocksmith/rocksmith2.jpg" />
<p>Capture d'écran du jeu. Partie en cours.</p>
<p>En plus du mode chanson, des mini-jeux, appelés guitarcade sont présents, pour maitriser les éléments de base, comme comment gratter les cordes, jouer la bonne case au bon moment, jouer les accords… en plus de cours explicatifs en vidéo et quelques exercices de base, à connaître pour pouvoir bien profiter du jeu. Le test en vidéo à la fin de l'article montre l'un de ces mini-jeux.</p>
<p>Revenons à l'interface USB.</p>
<img alt="" src="images/rocksmith/realtonecable.jpg" />
<p>Appelé Real Tone Cable, et vivement recommandé par le jeu, cette interface basique n'est pas obligatoire pour jouer, un mod (un patch) externe a été écrit pour pouvoir utiliser n'importe quelle carte son ou interface audio compatible ASIO. Il existe aussi une autre option (utiliser un micro simple) mais je ne la détaillerai pas (RS ASIO étant nettement supérieur).</p>
</div>
<div class="section" id="roland-rubix">
<h2>Roland Rubix</h2>
<p>Interface audio USB de Roland (gros fabricant de matériel audio/son/instruments de musique/synthétiseurs), la Rubix se décline en plusieurs versions, avec différentes entrées/sorties.</p>
<p>Ici, c'est une Rubix 22, modèle de base, avec 2 entrées audio et 2 sorties audio (monitoring) + sortie casque et deux connecteurs MIDI (IN et OUT).</p>
<p>L'essentiel étant que la carte ait une entrée instrument Hi-Z Haute Impédance et permettant donc de brancher directement une guitare électrique.</p>
<img alt="" src="images/rocksmith/rubix22.jpg" />
<p>Image de l'interface audio. Source: Site Roland.</p>
<p>Côté caractéristiques, lisez n'importe quel test. Le seul truc à retenir éventuellement, c'est que cette interface audio faible latence monte jusqu'à 192 kHz/24 bits, et se branche en USB 2, via un câble USB type B.</p>
<p>Les pilotes se trouvent ici :</p>
<p><a class="reference external" href="https://www.roland.com/global/support/by_product/rubix22/updates_drivers/">https://www.roland.com/global/support/by_product/rubix22/updates_drivers/</a></p>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p>Brancher la guitare sur l'entrée 1L et activer le mode Hi-Z en appuyant sur le bouton Hi-Z.</p>
<p class="last">BAISSER TOUS LES POTARDS/VOLUMES AVANT DE BRANCHER LA GUITARE !!!!!</p>
</div>
<p>Monter ensuite le volume d'entrée SENS 1L. Gratter fortement la guitare, régler jusqu'à être à la limite de l'apparition du voyant rouge (il doit rester vert). La position 12h ou 1h donne de bons résultats chez moi.</p>
</div>
<div class="section" id="rs-asio">
<h2>RS ASIO</h2>
<p><a class="reference external" href="https://github.com/mdias/rs_asio">https://github.com/mdias/rs_asio</a></p>
<p>Pour pouvoir utiliser ce mod, il suffit de télécharger la dernière release (RS ASIO 0.6.3 ici), de copier les trois fichiers <cite>avrt.dll</cite>, <cite>RS_ASIO.dll</cite> et <cite>RS_ASIO.ini</cite> dans le répertoire Rocksmith2014, à côté de rocksmith2014.exe</p>
<img alt="" src="images/rocksmith/files.png" />
</div>
<div class="section" id="configuration">
<h2>Configuration</h2>
<p>Lancer les paramètres Sons Windows, ouvrir les propriétés de l’interface audio et sélectionner 48 000 Hz 16 bits pour l'entrée et pour la sortie. C'est le format imposé par Rocksmith.</p>
<p>Son -> Lecture -> Hauts-parleurs Roland Rubix 22 -> Propriétés</p>
<img alt="" src="images/rocksmith/settings1.png" />
<p>Onglet <cite>Enhancements</cite>, tout désactiver.</p>
<img alt="" src="images/rocksmith/settings2.png" />
<p>Onglet <cite>Statistiques avancées</cite>, sélectionner 16 bits, 48000 Hz (Qualité DVD)</p>
<p>Son -> Enregistrement -> Ligne Roland Rubix 22 -> Propriétés</p>
<img alt="" src="images/rocksmith/settings3.png" />
<p>Onglet <cite>Enhancements</cite>, tout désactiver.</p>
<img alt="" src="images/rocksmith/settings4.png" />
<p>Onglet <cite>Statistiques avancées</cite>, sélectionner 16 bits, 48000 Hz (Qualité DVD)</p>
<p>Lancer l'outil Roland Rubix Control Panel (depuis le menu Démarrer).</p>
<img alt="" src="images/rocksmith/rubix-control-panel.png" />
<p>Dans l'onglet <cite>Buffer Settings</cite>, sous USB Streaming Mode, sélectionner 1</p>
<p>Lancer au moins une fois Rocksmith pour que RS ASIO prépare le fichier de paramétrage. Fermer Rocksmith.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Laissez l'entrée sur <cite>Real tone cable</cite></p>
</div>
<img alt="" src="images/rocksmith/rocksmith.jpg" />
<p>Ouvrir le fichier RS_ASIO.ini, et modifier comme suit si nécessaire :</p>
<div class="highlight"><pre><span></span><span class="c1"># for "EnableWasapiOutputs" you can use -1 to have a message prompting</span>
<span class="c1"># to use either WASAPI or ASIO for output every time you boot the game</span>
<span class="k">[Config]</span>
<span class="na">EnableWasapiOutputs</span><span class="o">=</span><span class="s">0</span>
<span class="na">EnableWasapiInputs</span><span class="o">=</span><span class="s">0</span>
<span class="na">EnableAsio</span><span class="o">=</span><span class="s">1</span>
<span class="k">[Asio]</span>
<span class="c1">; available buffer size modes:</span>
<span class="c1">; driver - respect buffer size setting set in the driver</span>
<span class="c1">; host - use a buffer size as close as possible as that requested by the host application</span>
<span class="c1">; custom - use the buffer size specified in CustomBufferSize field</span>
<span class="na">BufferSizeMode</span><span class="o">=</span><span class="s">custom</span>
<span class="na">CustomBufferSize</span><span class="o">=</span><span class="s">4</span>
<span class="c1"># if your game hangs or crashes on exit, try setting "EnableRefCountHack" to true.</span>
<span class="c1"># when blank or invalid, the value of "EnableRefCountHack" will be interpreted as</span>
<span class="c1"># true if RS ASIO detects the usage of Asio4All.</span>
<span class="c1"># the same applies for all inputs.</span>
<span class="k">[Asio.Output]</span>
<span class="na">Driver</span><span class="o">=</span><span class="s">Roland Rubix</span>
<span class="na">BaseChannel</span><span class="o">=</span><span class="s">0</span>
<span class="na">AltBaseChannel</span><span class="o">=</span>
<span class="na">EnableSoftwareEndpointVolumeControl</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnableSoftwareMasterVolumeControl</span><span class="o">=</span><span class="s">1</span>
<span class="na">SoftwareMasterVolumePercent</span><span class="o">=</span><span class="s">100</span>
<span class="na">EnableRefCountHack</span><span class="o">=</span>
<span class="k">[Asio.Input.0]</span>
<span class="na">Driver</span><span class="o">=</span><span class="s">Roland Rubix</span>
<span class="na">Channel</span><span class="o">=</span><span class="s">0</span>
<span class="na">EnableSoftwareEndpointVolumeControl</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnableSoftwareMasterVolumeControl</span><span class="o">=</span><span class="s">1</span>
<span class="na">SoftwareMasterVolumePercent</span><span class="o">=</span><span class="s">100</span>
<span class="na">EnableRefCountHack</span><span class="o">=</span>
<span class="k">[Asio.Input.1]</span>
<span class="na">Driver</span><span class="o">=</span>
<span class="na">Channel</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnableSoftwareEndpointVolumeControl</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnableSoftwareMasterVolumeControl</span><span class="o">=</span><span class="s">1</span>
<span class="na">SoftwareMasterVolumePercent</span><span class="o">=</span><span class="s">100</span>
<span class="na">EnableRefCountHack</span><span class="o">=</span>
<span class="k">[Asio.Input.Mic]</span>
<span class="na">Driver</span><span class="o">=</span>
<span class="na">Channel</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnableSoftwareEndpointVolumeControl</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnableSoftwareMasterVolumeControl</span><span class="o">=</span><span class="s">1</span>
<span class="na">SoftwareMasterVolumePercent</span><span class="o">=</span><span class="s">100</span>
<span class="na">EnableRefCountHack</span><span class="o">=</span>
</pre></div>
<p>Juste à titre indicatif, mon fichier Rocksmith.ini contient ceci :</p>
<div class="highlight"><pre><span></span><span class="k">[Audio]</span>
<span class="na">EnableMicrophone</span><span class="o">=</span><span class="s">1</span>
<span class="na">ExclusiveMode</span><span class="o">=</span><span class="s">1</span>
<span class="na">LatencyBuffer</span><span class="o">=</span><span class="s">1</span>
<span class="na">ForceDefaultPlaybackDevice</span><span class="o">=</span>
<span class="na">ForceWDM</span><span class="o">=</span><span class="s">0</span>
<span class="na">ForceDirectXSink</span><span class="o">=</span><span class="s">0</span>
<span class="na">DumpAudioLog</span><span class="o">=</span><span class="s">0</span>
<span class="na">MaxOutputBufferSize</span><span class="o">=</span><span class="s">0</span>
<span class="na">RealToneCableOnly</span><span class="o">=</span><span class="s">0</span>
<span class="na">MonoToStereoChannel</span><span class="o">=</span><span class="s">0</span>
<span class="na">Win32UltraLowLatencyMode</span><span class="o">=</span><span class="s">1</span>
<span class="k">[Renderer.Win32]</span>
<span class="na">ShowGamepadUI</span><span class="o">=</span><span class="s">1</span>
<span class="na">ScreenWidth</span><span class="o">=</span><span class="s">1920</span>
<span class="na">ScreenHeight</span><span class="o">=</span><span class="s">1080</span>
<span class="na">Fullscreen</span><span class="o">=</span><span class="s">1</span>
<span class="na">VisualQuality</span><span class="o">=</span><span class="s">2</span>
<span class="na">RenderingWidth</span><span class="o">=</span><span class="s">0</span>
<span class="na">RenderingHeight</span><span class="o">=</span><span class="s">0</span>
<span class="na">EnablePostEffects</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnableShadows</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnableHighResScope</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnableDepthOfField</span><span class="o">=</span><span class="s">1</span>
<span class="na">EnablePerPixelLighting</span><span class="o">=</span><span class="s">1</span>
<span class="na">MsaaSamples</span><span class="o">=</span><span class="s">4</span>
<span class="na">DisableBrowser</span><span class="o">=</span><span class="s">1</span>
<span class="k">[Net]</span>
<span class="na">UseProxy</span><span class="o">=</span><span class="s">1</span>
<span class="k">[Global]</span>
<span class="na">Version</span><span class="o">=</span><span class="s">1</span>
</pre></div>
<p>Lancer le jeu.</p>
<p>Le son devrait sortir via la carte Rubix (contrainte imposée par ASIO, même interface audio pour l'entrée et la sortie).</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Penser à brancher un casque ou des enceintes sur la carte audio Roland Rubix.</p>
</div>
<p>Si tout est bon, on doit arriver à ceci. Résultat en vidéo :</p>
<iframe title="Guitarcade - String Skip Saloon (RockSmith 2014 Remastered)" src="https://tube.nah.re/videos/embed/da6f97b6-d2e2-4df4-a757-895b2ff96ccb" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups" width="560" frameborder="0" height="315"></iframe></div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>En suivant ces instructions, cela devrait fonctionner correctement. En tout cas, <cite>Chez moi, ça marche !</cite> :)</p>
</div>
Pour votre confort, ce blog utilise ces technologies avancées : NoJS, NoAds, NoCDN et NoCookie2023-02-26T00:00:00+01:002023-02-26T00:00:00+01:00alextag:blog.chibi-nah.fr,2023-02-26:/pour-votre-confort<div class="section" id="introduction">
<h2>Introduction</h2>
<p>Vous avez sans doute (ou pas) remarqué cette phrase au bas de ce blog : « Pour votre confort, ce blog utilise ces technologies avancées : NoJS, NoAds, NoCDN et NoCookie. »</p>
<p>Concrètement, qu'est-ce que cela signifie ?</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Certaines explications seront volontairement simplifiées pour que cela soit plus facile à comprendre.</p>
</div>
</div>
<div class="section" id="site-statique-vs-site-dynamique">
<h2>Site statique …</h2></div><div class="section" id="introduction">
<h2>Introduction</h2>
<p>Vous avez sans doute (ou pas) remarqué cette phrase au bas de ce blog : « Pour votre confort, ce blog utilise ces technologies avancées : NoJS, NoAds, NoCDN et NoCookie. »</p>
<p>Concrètement, qu'est-ce que cela signifie ?</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Certaines explications seront volontairement simplifiées pour que cela soit plus facile à comprendre.</p>
</div>
</div>
<div class="section" id="site-statique-vs-site-dynamique">
<h2>Site statique vs. site dynamique</h2>
<p>Revenons un peu en arrière. En 2020, j'ai changé de moteur de CMS (le logiciel qui génère ce blog), pour passer sur un générateur de site statique.</p>
<ul class="simple">
<li>site statique : site dont le contenu est généré une seule fois et mis à disposition directe. Pratique pour un site dont le contenu ne change que très peu. À opposer à site dynamique.</li>
<li>site dynamique : site dont le contenu est créé de manière dynamique, lorsque l'on veut consulter une page. Cela permet de modifier complètement le contenu sans à avoir à recréer toute la page à la main. Pratique pour un site dont le contenu change sans arrêt, comme un journal, ou dont ce qui doit s'afficher sur la page est complètement imprévisible (comme un moteur de recherche ou un site météorologique).</li>
</ul>
<p>Ces deux approches ont leur avantages et leurs inconvénients.</p>
<p>L'ancien blog utilisait un générateur de site dynamique.</p>
<p>Avantage : possibilité d'éditer ou d'ajouter du contenu depuis n'importe où, possibilité d'ajouter des commentaires (vu la quantité de spam reçu dessus, c'était pas non plus le meilleur truc).</p>
<p>Cependant, un générateur de site dynamique est plus compliqué à faire fonctionner, parce que du code doit être exécuté côté serveur (pour construire la page) avant de le fournir au navigateur web. Un affichage d'une page signifie une génération complète de cette page, et ce, à chaque demande.</p>
<p>Admettons qu'une page d'un site web dynamique ait 1 000 vues dans la journée. Cette page devra être générée 1 000 fois. Systématiquement. À chaque affichage. Pour limiter cela, on peut ajouter un peu plus de complexité pour mettre en cache (générer la page dynamique comme une page statique) et ne mettre à disposition que cette page qui ne sera générée qu'une seule fois dans la journée.</p>
<p>De plus, pour éditer du contenu, il faut ajouter de la gestion de comptes.</p>
<p>Notamment des comptes admin (gestion du site) et rédaction (pour rédiger le contenu).</p>
<p>Comment différencier un compte anonyme d'un compte authentifié ? Il faut que le service sache qui est connecté.</p>
<p>Pour cela, on utilise un cookie (un fichier texte contenant des informations utilisées par le serveur pour déterminer qui est connecté avec quel compte).</p>
<p>Éditer du contenu, c'est bien. Faciliter la rédaction, c'est mieux.</p>
<p>Du coup, on ajoute du code côté navigateur (javascript), qui va alors proposer de voir en temps réel le contenu au cours de sa rédaction, simplifier l'application du texte en <strong>gras</strong>, en <em>italique</em>, et plus.</p>
<p>Ça devient très vite lourd. Parce qu'il faut :</p>
<ul class="simple">
<li>un logiciel/service pour exécuter du code côté serveur (par exemple PHP) ;</li>
<li>un logiciel/service pour stocker les données (par exemple MariaDB/MySQL) ;</li>
<li>un logiciel/service pour mettre à disposition à un navigateur web les différentes ressources (contenu, images, style, …), par exemple Apache httpd, nginx, lighttpd… ;</li>
<li>un logiciel/service s'exécutant côté navigateur pour pouvoir rédiger du contenu ;</li>
<li>s'assurer que tout fonctionne correctement, sans problème de performances, en appliquant les correctifs de sécurité, et veiller à ce que rien ne tombe en rade lors d'une mise à jour (c'est arrivé à plusieurs reprises).</li>
</ul>
<p>Pour un site personnel, s'occuper de tous ces problèmes, c'est long et pénible sur la durée.</p>
<p>On peut passer par des plate-formes ou des sites s'occupant de tous ces problèmes, moyennant paiement direct, en euros, dollar, yen… ou en grattant un maximum de données possible (qui est venu, quand, comment, via qui, google ? facebook ?, qu'est-ce qu'il/elle lit, centre d'intérêt ?)</p>
<p>En 2020, je me suis posé ces questions, et j'ai fini par déterminer qu'un site statique serait plus adapté à mes propres besoins au niveau blog.</p>
</div>
<div class="section" id="le-blog">
<h2>Le blog</h2>
<p>Mes contraintes étaient simples :</p>
<ul class="simple">
<li>contenu statique généré une seule fois ;</li>
<li>abandon des commentaires ;</li>
<li>pas de partie administration/rédaction ;</li>
<li>avoir le site le plus simple possible.</li>
</ul>
<p>Avec ces éléments, on peut donc retirer :</p>
<ul class="simple">
<li>le logiciel/service pour stocker les données ;</li>
<li>le logiciel/service pour exécuter du code côté serveur ;</li>
<li>le logiciel/service s'exécutant côté navigateur pour pouvoir rédiger du contenu.</li>
</ul>
<p>Il ne reste donc plus que :</p>
<ul class="simple">
<li>un logiciel/service pour mettre à disposition à un navigateur web les différentes ressources.</li>
</ul>
<p>Arrivé ici, cela simplifie pas mal la gestion côté serveur.</p>
<p>Cependant, on n'a pas résolu le problème. On n'a fait que le déplacer. Où ça ? Sur mon ordinateur :</p>
<ul class="simple">
<li>Je dois toujours pouvoir rédiger du contenu (comme celui-ci en cours de rédaction) ;</li>
<li>Les différents articles doivent être stockés quelque part ;</li>
<li>Un logiciel doit s'exécuter pour transformer les différents articles en pages différentes d'un site web.</li>
</ul>
<p>Le blog étant généré avec le logiciel Pelican. Plus précisément, c'est un CMS, pour Content Management System, ou système de gestion de contenus.</p>
<p>Ce logiciel impose une structure pour rédiger les articles :</p>
<ul class="simple">
<li>une certaine organisation pour les répertoires, dont ceux pour les articles, ceux pour le style, ceux pour le template ou patron de conception qui va permettre de générer les différentes pages… ;</li>
<li>un fichier texte par article, articles rédigés dans un langage de mise en forme adapté comme Markdown ou RestructuredText.</li>
</ul>
<p>Cela impose une petite gymnastique mentale au début, et après 2-3 erreurs, on arrive à générer quelques pages simples.</p>
<p>L'import des anciens articles étant relativement compliqué (et j'en ai déjà parlé par le passé), je ne m'étendrai pas dessus.</p>
<p>cf. <a class="reference external" href="https://blog.chibi-nah.fr/nouvelles-du-blog-2020">https://blog.chibi-nah.fr/nouvelles-du-blog-2020</a> et <a class="reference external" href="https://blog.chibi-nah.fr/nouveau-blog-2020">https://blog.chibi-nah.fr/nouveau-blog-2020</a></p>
<p>Une fois les articles écrits et passé à la moulinette via pelican, j'obtiens des pages html (en fait, un site web complet) tout prêt. Ne reste qu'à copier tous ces fichiers sur un site pour le rendre accessible.</p>
<p>Bien entendu, j'ai automatisé ces tâches de passage à la moulinette et copie sur le site :D</p>
<p>Du coup, pas de contenu dynamique, pas besoin de suivre les comptes. Cela me permet donc de retirer les cookies et javascript.</p>
<p>Donc :</p>
<ul class="simple">
<li>noJS (pas de javascript) ;</li>
<li>NoCookie (pas de cookies).</li>
</ul>
</div>
<div class="section" id="la-publicite">
<h2>La publicité</h2>
<p>Sujet toujours épineux entre les personnes payant un service d'hébergement pour le blog mais souhaitant que cela revienne le moins cher possible, ou les hébergements “gratuits” mais affichant de la publicité (sur Internet, il y a toujours quelqu'un qui paie), et ceux voulant gagner un maximum d'argent sans faire le moindre effort…</p>
<p>Ne souhaitant toujours pas monnayer le contenu (aucun intérêt, pas de recherche de « sponsors » ni de création d'articles escroclic), il n'y a pas de publicité.</p>
<p>Donc :</p>
<ul class="simple">
<li>NoAds (Pas de publicité).</li>
</ul>
</div>
<div class="section" id="le-contenu-distribue">
<h2>Le contenu distribué</h2>
<p>Ou comment mettre les ressources essentielles chez quelqu'un d'autre.</p>
<p>Le contenu distribué, ou Content Delivery Network, à la base, cela semblait partir d'une bonne idée.</p>
<p>Plutôt que de stocker toujours les mêmes fichiers sur différents sites, autant les stocker au même endroit. Par exemple, si un site sur cent utilise la même ressource, comme le fichier LaLibSuperÀLaModeVersion3.14.js, alors si on le stocke sur un site spécialisé, le CDN, ce fichier sera chargé une seule fois et sera réutilisé (parce que stocké en local/mis en cache dans le navigateur) et ne sera plus à re-télécharger par la suite.</p>
<p>Dans la pratique…</p>
<ul class="simple">
<li>il y a presque autant de versions différentes des fichiers ressources que de site web (la version 1.14, la version 1.15, la version 2.03, la version 3.14, 3.145…</li>
<li>les ressources étant centralisées en un seul point, cela permet de suivre facilement où sont les gens (quand le navigateur interroge le CDN, il est en fait assez bavard), et par extension, si ce site tombe en panne, les ressources ne sont plus disponibles. Dans le meilleur des cas, ça ne fait que perturber l'affichage. La plupart du temps, le site ne fonctionne pas.</li>
</ul>
<p>Au niveau des ressources, outre les fichiers javascript (déjà évoqué plus haut), c'est aussi pas mal utilisé pour les polices de caractères (souvent hébergées chez Alphabet, notamment sa filiale publicitaire qu'est Google).</p>
<p>Ne souhaitant pas participer à cette masquarade qu'est le CDN (accessoirement, qui est plutôt limite voire illégal vis-à-vis du RGPD en Europe), on va se passer de ce genre de “service”.</p>
<p>Donc :</p>
<ul class="simple">
<li>NoCDN (Pas de CDN).</li>
</ul>
</div>
<div class="section" id="au-final">
<h2>Au final</h2>
<p>En fait, pas de technologie avancée, juste différents choix technologiques pour me simplifier la vie (et celle des personnes visitant le site), en n'utilisant pas des technologies qui sont ici inutiles.</p>
<p>Si je récapitule :</p>
<ul class="simple">
<li>NoJS, pas de javascript ;</li>
<li>NoAds, pas de publicité ;</li>
<li>NoCDN, pas de CDN ;</li>
<li>NoCookie, pas de cookies.</li>
</ul>
</div>
<div class="section" id="une-derniere-chose">
<h2>Une dernière chose</h2>
<p>En fait deux :</p>
<ul class="simple">
<li>Certaines pages ont des vidéos intégrées. Il s'agit soit d'une simple balise video html5, soit d'un cadre pointant vers mon instance PeerTube, s'exécutant en dehors du blog ;</li>
<li>L'affichage avec un thème clair ou sombre dépend du navigateur web, et de l'utilisation « intelligente » des feuilles de style (MediaQueries).</li>
</ul>
</div>
<div class="section" id="pour-aller-plus-loin">
<h2>Pour aller plus loin</h2>
<p>En fait, on peut très bien avoir un blog gé(né)ré différement. Voir par exemple Gemini <a class="reference external" href="https://geminiquickst.art/">https://geminiquickst.art/</a> (article en anglais), <a class="reference external" href="https://ploum.net/gemini-le-protocole-du-slow-web/index.html">https://ploum.net/gemini-le-protocole-du-slow-web/index.html</a> (article en français), voire gopher (pour les personnes plus expérimentées).</p>
</div>
Réparation d'un casque AKG Q7012023-02-11T00:00:00+01:002023-02-11T00:00:00+01:00alextag:blog.chibi-nah.fr,2023-02-11:/reparation-casque-akg-q701<div class="section" id="introduction">
<h2>Introduction</h2>
<img alt="" src="images/akg-q701/akg-q701.jpg" />
<p>Cela fait un paquet d'années (voire une dizaine d'années) que j'ai un casque AKG Q701. Rien à redire au niveau du son, sur sa forme, son poids et son système de suspension. Juste un bémol sur les bourelets sur la partie du cuir reposant sur la tête, ça devient …</p></div><div class="section" id="introduction">
<h2>Introduction</h2>
<img alt="" src="images/akg-q701/akg-q701.jpg" />
<p>Cela fait un paquet d'années (voire une dizaine d'années) que j'ai un casque AKG Q701. Rien à redire au niveau du son, sur sa forme, son poids et son système de suspension. Juste un bémol sur les bourelets sur la partie du cuir reposant sur la tête, ça devient inconfortable au bout d'un moment. C'est l'un des seuls reproches qui est fait à ce casque.</p>
<p>Enfin. Rien à redire… jusqu'à il y a quelques mois…</p>
<p>L'ayant délaissé et rangé dans un tiroir, et utilisant le Beyerdynamic DT770 PRO puis le AudioTechnica ATH-M50xBT2 (que j'utilise énormément en ce moment), en le ressortant il y a peu, je me suis rendu compte que les élastiques maintenant le casque en position "basse" étaient complètement détendus, ne maintenant plus du tout la suspension en place.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Cette procédure de réparation devrait être similaire pour les casque AKG K701, Q701, K702, K612 et K712. Ne pas hésiter à consulter le site officiel AKG et de télécharger le manuel de service.</p>
</div>
<p>Le K701 et le Q701 étant similaires (la différence étant surtout au niveau coloris différents et câble détachable comme sur le K702), on va partir du manuel de service du K701.</p>
<p>Sur la page du casque</p>
<p><a class="reference external" href="https://www.akg.com/Headphones/Professional%20Headphones/K701.html">https://www.akg.com/Headphones/Professional%20Headphones/K701.html</a></p>
<p>Aller dans Specs & Support, puis dans Documents & Downloads. Et enfin, Service Manual (EN). La première page montre un éclaté du casque, permettant de comprendre rapidement comment il est construit et comment le démonter.</p>
<p>Éclaté du casque. Source : AKG</p>
<img alt="" src="images/akg-q701/akg-k701-eclate.jpg" />
<p>La procédure de démontage est décrite dans les grandes lignes, page 3, et également comment changer l'élastique.</p>
<p>Le problème, c'est que je n'ai pas réussi à retirer le bouton de verrouillage (knob numéroté 7 sur l'éclaté), parce qu'il faut pousser les 4 pattes de verrouillage et le pousser en même temps.</p>
<p><a class="reference external" href="https://social.nah.re/@alex/109842905666694097">https://social.nah.re/@alex/109842905666694097</a></p>
<p>J'ai abandonné cette approche et me suis inspiré de cet article, mais en procédant différement.</p>
<p><a class="reference external" href="https://www.head-fi.org/threads/akg-k701-q701-k702-k712-headband-elastic-quick-fix.796604/">https://www.head-fi.org/threads/akg-k701-q701-k702-k712-headband-elastic-quick-fix.796604/</a></p>
</div>
<div class="section" id="materiel-necessaire">
<h2>Matériel nécessaire</h2>
<img alt="" src="images/akg-q701/materiel.jpg" />
<ul class="simple">
<li>Un casque AKG K701, Q701, K702 ou similaire à réparer;</li>
<li>Deux tournevis cruciforme (J'ai plus les références, elles sont effacées, mais ça doit être du PH00, PH0, PH1, un truc comme ça) ;</li>
<li>(vivement recommandé) Un médiator de guitare (en plastique, j'ai utilisé un 0.46 mm) ;</li>
<li>Une paire de tweezer à pointes fines ;</li>
<li>Des élastiques (j'ai une boîte d'élastiques de taille diverses acheté à pas cher au Cora du coin) ;</li>
<li>Une paire de ciseaux.</li>
</ul>
</div>
<div class="section" id="demontage">
<h2>Démontage</h2>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">PRENDRE SON TEMPS LORS DU DÉMONTAGE ! FAIRE TRÈS ATTENTION, LES FILS SONT ASSEZ FRAGILES À L'INTÉRIEUR DU CASQUE !</p>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p>Les photos sont là à titre d'illustration.</p>
<p class="last">Les élastiques ont déjà été changés ici et sont bleus. Ne pas en tenir compte.</p>
</div>
<p>Commencer par retirer le câble si celui-ci est détachable.</p>
<img alt="" src="images/akg-q701/etape1.jpg" />
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Faire attention à bien presser le bouton de déverrouillage du connecteur mini XLR avant d'essayer de retirer le câble. Surtout ne pas forcer !</p>
</div>
<p>Retirer ensuite les coussinets en velours.</p>
<img alt="" src="images/akg-q701/etape2.jpg" />
<p>Faire une légère rotation dans le sens inverse des aiguilles d'une montre. Le coussinet devrait faire un léger clic et peut être retiré facilement.</p>
<img alt="" src="images/akg-q701/etape3.jpg" />
<p>Retirer la mousse. Bien regarder son positionnement, ça servira pour le remontage.</p>
<p>Les deux coussinets et mousses retirées, on arrive à ça :</p>
<img alt="" src="images/akg-q701/etape4.jpg" />
<p>On va s'attaquer au côté gauche, parce que le plus chiant à cause de son connecteur XLR et des fils soudés.</p>
<p>On va utiliser les tweezers. Cet objet là :</p>
<img alt="" src="images/akg-q701/tweezers.jpg" />
<p>Introduire les pointes des tweezers dans la petite grille.</p>
<img alt="" src="images/akg-q701/etape5.jpg" />
<p>Pour vous aider sur où les positionner, cette image devrait vous aider (indice : viser les espaces vides) :</p>
<img alt="" src="images/akg-q701/etape9.jpg" />
<p>Faire une légère rotation dans le sens inverse des aiguilles d'une montre pour déverrouiller la petite grille. Il y a 3 clips en plastique à l'intérieur.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Cette étape est délicate, et la grille est un peu dure à déverrouiller. Prendre son temps.</p>
</div>
<img alt="" src="images/akg-q701/etape6.jpg" />
<p>Avec la pointe des tweezers, soulever délicatement la grille. Si celle-ci est correctement déverrouillée, elle devrait se décrocher facilement.</p>
<img alt="" src="images/akg-q701/etape7.jpg" />
<p>Retirer les deux vis cruciforme. Ne pas les égarer, elles sont toutes petites.</p>
<img alt="" src="images/akg-q701/etape8.jpg" />
<p>Avec un médiator, soulever délicatement pour déclipser le capot extérieur du casque. Faire le tour avec.</p>
<img alt="" src="images/akg-q701/etape10.jpg" />
<p>Soulever légèrement le bas du capot. Faire attention aux fils.</p>
<img alt="" src="images/akg-q701/etape11.jpg" />
<p>Déclipser la suspension. Un côté à la fois, avec les doigs.</p>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Ne pas utiliser de tournevis !</p>
</div>
<img alt="" src="images/akg-q701/etape12.jpg" />
<p>Une fois la suspension déclipsée, on devrait arriver à ça :</p>
<img alt="" src="images/akg-q701/etape13.jpg" />
<p>Retirer la grosse vis noire. La placer avec les deux petites vis retirées plus tôt.</p>
<img alt="" src="images/akg-q701/etape14.jpg" />
<p>Déclipser la partie coulissante de la suspension.</p>
<img alt="" src="images/akg-q701/etape15.jpg" />
<img alt="" src="images/akg-q701/etape15-2.jpg" />
<p>Retirer l'élastique d'origine et couper la partie bloquée dans la partie coulissante.</p>
<img alt="" src="images/akg-q701/etape15-3.jpg" />
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Sur cette photo, le logo CE (pièce n°3 sur l'éclaté du casque) est manquant. C'est normal, cette photo a été prise lors de ma tentative de réparation précédente, où j'ai abandonné l'approche originelle. Sur la photo, le bouton de verrouillage métallique (pièce n°7 sur l'éclaté du casque) bloquant tout le montant est juste impossible à retirer avec mon matériel actuel.</p>
</div>
<p>Élastiques d'origine, une fois coupés.</p>
<img alt="" src="images/akg-q701/elastiques.jpg" />
<p>Passer le nouvel élastique dans la pièce coulissante.</p>
<img alt="" src="images/akg-q701/etape16.jpg" />
<p>Passer l'autre extrémité de l'élastique dans le support noir au bas de la suspension.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Bien passer l'élastique dans les picots.</p>
</div>
<img alt="" src="images/akg-q701/etape17.jpg" />
<img alt="" src="images/akg-q701/etape17-2.jpg" />
<p>Passer ensuite l'élastique dans le picot du dessus, sur le support noir au bas de la suspension.</p>
<img alt="" src="images/akg-q701/etape18.jpg" />
<img alt="" src="images/akg-q701/etape18-2.jpg" />
<img alt="" src="images/akg-q701/etape18-3.jpg" />
<p>Visser la pièce noire au bas de la suspension sur l'écouteur.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Il s'agit de la photo du dessus. Je n'ai pas repris de photo pour cette étape, ce qui explique pourquoi la pièce coulissante est clipsée sur la suspension.</p>
</div>
<img alt="" src="images/akg-q701/etape14.jpg" />
<p>On peut reclipser la pièce coulissante sur la suspension</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">faites-le AVANT et non après, comme je l'ai fait sur la photo</p>
</div>
<img alt="" src="images/akg-q701/etape20.jpg" />
<p>Avant de clipser le capot extérieur sur la suspension, vérifier que les élastiques passent bien dans les trous prévus à cet effet.</p>
<img alt="" src="images/akg-q701/etape19.jpg" />
<p>Visser les deux petites vis.</p>
<img alt="" src="images/akg-q701/etape8.jpg" />
<p>Vérifier que la suspension fonctionne correctement. Position basse (relâchée) et position haute (tirée)</p>
<img alt="" src="images/akg-q701/etape21.jpg" />
<img alt="" src="images/akg-q701/etape21-2.jpg" />
<p>Brancher le câble (si détachable), et vérifier que les deux hauts-parleurs fonctionnent toujours.</p>
<img alt="" src="images/akg-q701/etape22.jpg" />
<p>Si c'est bon, remettre la petite grille en place.</p>
<img alt="" src="images/akg-q701/etape6.jpg" />
<p>Avec les tweezers, tourner légèrement la grille dans le sens horaire.</p>
<img alt="" src="images/akg-q701/etape5.jpg" />
<p>La réparation est terminée pour le côté gauche.</p>
<img alt="" src="images/akg-q701/etape23.jpg" />
<p>Procéder de même pour le côté droit.</p>
<p>Une fois terminé, ne pas oublier de remettre la mousse en place</p>
<img alt="" src="images/akg-q701/etape3.jpg" />
<p>Puis les coussinets. Les positionner, chercher la position où ils vont s'enfoncer légerement puis tourner dans le sens horaire pour les verrouiller.</p>
<img alt="" src="images/akg-q701/etape2.jpg" />
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Cette méthode de réparation n'est pas très difficile, on garde une partie de l'esthétique d'origine, même si ce n'est pas parfait.</p>
<p>L'essentiel, c'est que le système de suspension refonctionne.</p>
<p>Ayant utilisé des élastiques basiques, je ne sais pas si cela tiendra longtemps. On verra avec le temps.</p>
</div>
Thèmes et SailfishOS2023-02-04T00:00:00+01:002023-02-04T00:00:00+01:00alextag:blog.chibi-nah.fr,2023-02-04:/themes-et-sailfishos<p>Thèmes et SailfishOS, plus quelques autres trucs.</p>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Cet article est encore en mode rédaction !</p>
</div>
<img alt="" src="images/sfos/xperiaXA2.jpg" />
<p>J'ai migré sur SailfishOS lors de mon dernier changement de téléphone mobile (Sony Xperia XA2), avec une licence Sailfish X, pour plusieurs raisons :</p>
<ul class="simple">
<li>Pas Google ;</li>
<li>Pas Apple ;</li>
<li>Développé en Europe ;</li>
<li>GNU/Linux natif et non …</li></ul><p>Thèmes et SailfishOS, plus quelques autres trucs.</p>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Cet article est encore en mode rédaction !</p>
</div>
<img alt="" src="images/sfos/xperiaXA2.jpg" />
<p>J'ai migré sur SailfishOS lors de mon dernier changement de téléphone mobile (Sony Xperia XA2), avec une licence Sailfish X, pour plusieurs raisons :</p>
<ul class="simple">
<li>Pas Google ;</li>
<li>Pas Apple ;</li>
<li>Développé en Europe ;</li>
<li>GNU/Linux natif et non un truc bancal avec un noyau Linux patché à mort, avec une lib pas compatible glib, un environnement complètement verrouillé ;</li>
<li>Pas de rootage ou hacks immondes pour avoir un accès root (c'est supporté nativement) ;</li>
<li>Partiellement Open-source (oui, Android AOSP est aussi partiellement Open-Source, en mode, lis le code mais ne modifie pas) ;</li>
<li>Wayland qui fonctionne ! ;</li>
<li>Pulse-Audio qui fonctionne aussi (incroyable !) ;</li>
<li>QT5.6 (ok, en fait, une vieille version plus du tout à jour et datant de 2013, et impossible de migrer, parce que The QT Company a changé de licence, et Jolla est bloqué partiellement à cause de cela) ;</li>
<li>Pas Google ;</li>
<li>Terminal avec un vrai système GNU/Linux, bash, python, perl… ;</li>
<li>Briques open-source ;</li>
<li>Systemd (qui fait maintenant partie du paysage) ;</li>
<li>ssh natif (penser à activer le mode développeur) ;</li>
<li>rpm (+ zypper, plus proche de Suse Linux voire Fedora que de Debian) ;</li>
<li>Héritage de MER/Meego ;</li>
<li>Interface uniformisée et cohérente ;</li>
<li>Utilisation par gestes logiques et cohérents ;</li>
<li>Vrai multitâches ;</li>
<li>Pas Google ;</li>
<li>(avec une licence Sailfish X et complètement facultatif) Conteneur LXC pour faire fonctionner un Android 11 AOSP (oui, un conteneur LXC sur un téléphone mobile). Peut être utile pour un truc chiant comme une application de validation de la banque (DSP2), à condition d'utiliser des trucs comme MicroG.</li>
</ul>
<p>Je l'utilise au quotidien (c'est mon téléphone principal, mon vieux Galaxy Note 2 me sert de téléphone de secours, avec une ligne Free à 2€ dessus).</p>
<p>Loin d'être parfait, je pourrais faire une liste de reproches (également lié au XA2).</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Faire la liste des trucs embêtants et chiants.</p>
</div>
<p>Le principal problème que je rencontre, c'est au niveau du style. Je n'aime, mais alors, absolument pas du tout, le style de Sailfish OS, notamment et surtout le thème d'icônes.</p>
<img alt="" src="images/sfos/JollaTheme.jpg" />
<p>Thème par défaut.</p>
<img alt="" src="images/sfos/N9ishTheme.jpg" />
<p>Thème N9ish, rappelant fortement le thème du Nokia N9.</p>
<p>Par le passé, il y avait un outil appelé “sailfishos-uithemer”, qui permettait de changer facilement de thème d'icônes, de police de caractère, de sons.</p>
<p>Un thème, contrairement à une ambiance, peut correspondre à un pack d'icônes, par exemple n9ish, ou un pack contenant une police de caractère ou un pack de sons, par exemple nokia-pure.</p>
<p>Thème n9ish :</p>
<p><a class="reference external" href="https://openrepos.net/content/speactra/n9ish-icons">https://openrepos.net/content/speactra/n9ish-icons</a>
<a class="reference external" href="https://github.com/speactra/harbour-themepack-n9ish">https://github.com/speactra/harbour-themepack-n9ish</a></p>
<div class="section" id="ambiances">
<h2>Ambiances</h2>
<p>Attention : ne pas confondre un thème avec une Ambiance. Les Ambiances sont gérées nativement et consistent en :</p>
<ul class="simple">
<li>un fond d'écran, dans une taille bien définie (et qui est assez pénible d'ailleurs) ;</li>
<li>une couleur principale, qui sera utilisée partout (sur le clavier, sur les icônes dans le menu supérieur, en sélection et j'en passe) ;</li>
<li>un ensemble d'action, comme changer le volume des sonneries et notifications, changer les tonalités, donc les sons à jouer en cas d'appel, réception d'un message, d'un courriel, etc.</li>
</ul>
<p>Une ambiance se paramètre comme ceci :</p>
<img alt="" src="images/sfos/ambiance.jpg" />
<p>Quelques exemples d'ambiances :</p>
<img alt="" src="images/sfos/ambianceM87.jpg" />
<img alt="" src="images/sfos/ambianceNep.jpg" />
<img alt="" src="images/sfos/ambianceR.jpg" />
<img alt="" src="images/sfos/ambianceYN.jpg" />
</div>
<div class="section" id="sailfishos-uithemer">
<h2>sailfishos-uithemer</h2>
<img alt="" src="images/sfos/uiThemer.jpg" />
<img alt="" src="images/sfos/n9ish.jpg" />
<img alt="" src="images/sfos/NokiaPure.jpg" />
<p>Le principal problème de sailfishos-uithemer, c'est que son code source et ses dépendances, notamment harbour-themepacksupport, ne sont plus disponibles.
Enfin, sailfishos-uithemer l'est en passant par le site Archive·org. Malheuseusement, ce n'est pas le cas pour harbour-themepacksupport.</p>
<p>L'une des solutions serait de récupérer les fichiers présents sur un téléphone ayant l'application déployée et de repackager dans un fichier rpm ?</p>
<p>C'est faisable facilement via la commande “rpmrebuild” (penser à l'installer avant toute chose).</p>
<p>Commençons par ouvrir un terminal (je suis sous GNU/Linux, adaptez si vous êtes sous Windows ou Mac)</p>
<pre class="literal-block">
ssh kasumi
Last login: Fri Feb 3 23:54:32 2023 from [masqué]
,---
| Sailfish OS 4.5.0.16 (Struven ketju)
'---
[nemo@Kasumi ~]$
</pre>
<p>kasumi étant le nom de mon téléphone, j'ai bien entendu une entrée dans mon .ssh/config</p>
<p>Tout d'abord, retrouvons le nom exact du paquet. Ça devrait contenir “theme”.</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ rpm -qa |grep them
jolla-ambient-sound-theme-0.1.0-1.2.2.jolla.noarch
sound-theme-freedesktop-0.8+git1-1.6.2.jolla.noarch
harbour-themepack-n9ish-0.0.2-1.armv7hl
harbour-themepack-nokia-pure-0.0.2-2.noarch
harbour-themepacksupport-0.8.13-4.noarch
sailfishos-uithemer-2.2.1-3.armv7hl
[nemo@Kasumi ~]$
</pre>
<p>Le nom du paquet est bien “sailfishos-uithemer”.</p>
<p>Regardons rapidement les détails</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ rpm -qi sailfishos-uithemer
Name : sailfishos-uithemer
Version : 2.2.1
Release : 3
Architecture: armv7hl
Install Date: mar. 29 sept. 2020 23:34:47 CEST
Group : Qt/Qt
Size : 692208
License : GPLv3
Signature : (none)
Source RPM : sailfishos-uithemer-2.2.1-3.src.rpm
Build Date : sam. 14 déc. 2019 21:26:25 CET
Build Host : localhost.localdomain
Packager : fravaccaro <fravaccaro@[masqué pour limiter le spam]>
URL : https://github.com/uithemer/sailfishos-uithemer
Summary : UI Themer
Description :
Enables customization of icons, fonts and pixel density in Sailfish OS.
[nemo@Kasumi ~]$
</pre>
<p>Et ses dépendances :</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ rpm -qR sailfishos-uithemer
/bin/sh
/bin/sh
harbour-themepacksupport >= 0.8.11-1
ld-linux-armhf.so.3
ld-linux-armhf.so.3(GLIBC_2.4)
libQt5Core.so.5
libQt5Core.so.5(Qt_5)
libQt5Gui.so.5
libQt5Gui.so.5(Qt_5)
libQt5Qml.so.5
libQt5Qml.so.5(Qt_5)
libQt5Quick.so.5
libQt5Quick.so.5(Qt_5)
libc.so.6
libc.so.6(GLIBC_2.4)
libgcc_s.so.1
libgcc_s.so.1(GCC_3.5)
libsailfishapp.so.1
libstdc++.so.6
libstdc++.so.6(CXXABI_1.3)
libstdc++.so.6(CXXABI_ARM_1.3.3)
libstdc++.so.6(GLIBCXX_3.4)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
sailfish-version >= 2.1.4
[nemo@Kasumi ~]$
</pre>
<p>Spoiler : La dépendance à “harbour-themepacksupport” va être pénible à gérer.</p>
<p>On peut maintenant essayer de recréer le paquet rpm.</p>
<p>Essayer…</p>
<p>parce que, en fait…</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ rpmrebuild sailfishos-uithemer
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
S.5....T. /usr/share/applications/sailfishos-uithemer.desktop
SM5....T. /usr/share/icons/hicolor/108x108/apps/sailfishos-uithemer.png
SM5....T. /usr/share/icons/hicolor/128x128/apps/sailfishos-uithemer.png
SM5....T. /usr/share/icons/hicolor/172x172/apps/sailfishos-uithemer.png
SM5....T. /usr/share/icons/hicolor/256x256/apps/sailfishos-uithemer.png
SM5....T. /usr/share/icons/hicolor/86x86/apps/sailfishos-uithemer.png
manque /usr/share/sailfishos-uithemer/scripts/sailfishos-uithemer.txt
Do you want to continue ? (y/N) Y
Do you want to change release number ? (y/N)
attention : Ne peut canoniser le nom d'hôte : Kasumi
erreur : Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.8537/my_root/usr/share/sailfishos-uithemer/scripts/sailfishos-uithemer.txt
Ne peut canoniser le nom d'hôte : Kasumi
Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.8537/my_root/usr/share/sailfishos-uithemer/scripts/sailfishos-uithemer.txt
/usr/lib/rpmrebuild/rpmrebuild.sh: ERROR: package 'sailfishos-uithemer' build failed
[nemo@Kasumi ~]$
</pre>
<p>Autant les fichiers modifiés, ce n'est pas forcément un problème. Sauf que là, en fait, il manque un fichier >.<</p>
<p>Le fichier “sailfishos-uithemer.txt” n'a pas été trouvé. Échec de la reconstruction du paquet.</p>
<p>Comment résoudre ce problème ?</p>
<p><a class="reference external" href="https://web.archive.org/web/20200901180418/https://github.com/uithemer/sailfishos-uithemer">https://web.archive.org/web/20200901180418/https://github.com/uithemer/sailfishos-uithemer</a></p>
<p>Ici, c'est « relativement » simple. Ayant pu télécharger le code source de “sailfishos-uithemer", et le fichier manquant se trouvant dans “scripts/”, j'ai « juste » eu à le transférer sur le téléphone puis à le déplacer dans “/usr/share/sailfishos-uithemer/scripts“</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ sudo cp sailfishos-uithemer.txt /usr/share/sailfishos-uithemer/scripts/
Mot de passe :
[nemo@Kasumi ~]
</pre>
<p>Réessayons…</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ rpmrebuild sailfishos-uithemer
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
S.5....T. /usr/share/applications/sailfishos-uithemer.desktop
SM5....T. /usr/share/icons/hicolor/108x108/apps/sailfishos-uithemer.png
SM5....T. /usr/share/icons/hicolor/128x128/apps/sailfishos-uithemer.png
SM5....T. /usr/share/icons/hicolor/172x172/apps/sailfishos-uithemer.png
SM5....T. /usr/share/icons/hicolor/256x256/apps/sailfishos-uithemer.png
SM5....T. /usr/share/icons/hicolor/86x86/apps/sailfishos-uithemer.png
.M.....T. /usr/share/sailfishos-uithemer/scripts/sailfishos-uithemer.txt
Do you want to continue ? (y/N) Y
Do you want to change release number ? (y/N)
attention : Ne peut canoniser le nom d'hôte : Kasumi
result: /home/nemo/rpmbuild/RPMS/armv7hl/sailfishos-uithemer-2.2.1-3.armv7hl.rpm
[nemo@Kasumi ~]$
</pre>
<p>Bon, le paquet a pu être recréé.</p>
<div class="section" id="harbour-themepack-nokia-pure">
<h3>harbour-themepack-nokia-pure</h3>
<p>Passons ensuite au paquet “harbour-themepack-nokia-pure-0.0.2-2.noarch” (parce que n'existant plus dans Openrepos)</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ rpmrebuild harbour-themepack-nokia-pure
attention : Ne peut canoniser le nom d'hôte : Kasumi
result: /home/nemo/rpmbuild/RPMS/noarch/harbour-themepack-nokia-pure-0.0.2-2.noarch.rpm
[nemo@Kasumi ~]$
</pre>
<p>Pas de surprise, ça a recréé sans souci le paquet à la première tentative.</p>
<p>Maintenant, passons au paquet le plus pénible…</p>
</div>
<div class="section" id="harbour-themepacksupport">
<h3>harbour-themepacksupport</h3>
<p>Le code source n'est pas disponible sur archive·org, et n'existe plus non plus côté github (enfin, j'ai trouvé une version beaucoup plus ancienne et ne correspondant pas aux fichiers).</p>
<p>D'abord, regardons les informations :</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ rpm -qi harbour-themepacksupport
Name : harbour-themepacksupport
Version : 0.8.13
Release : 4
Architecture: noarch
Install Date: mar. 29 sept. 2020 23:34:35 CEST
Group : System/Tools
Size : 98384
License : GPLv3
Signature : (none)
Source RPM : harbour-themepacksupport-0.8.13-4.src.rpm
Build Date : sam. 24 août 2019 20:19:50 CEST
Build Host : x3400
Packager : fravaccaro <fravaccaro@[masqué pour limiter le spam]]>
Vendor : fravaccaro
URL : https://github.com/uithemer/themepacksupport-sailfishos
Summary : Theme pack support
Description :
Theme pack support for Sailfish OS.
[nemo@Kasumi ~]$
</pre>
<p>Bon, tentons de recréer le paquet rpm…</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ rpmrebuild harbour-themepacksupport
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
.M....... /usr/share/harbour-themepacksupport/apply_adpi.sh
.M....... /usr/share/harbour-themepacksupport/autoupdate-menu.sh
.......T. /usr/share/harbour-themepacksupport/config.cfg
.M....... /usr/share/harbour-themepacksupport/ddensity-menu.sh
S.5....T. /usr/share/harbour-themepacksupport/device-model
.M....... /usr/share/harbour-themepacksupport/disable-autoupdate.sh
.M....... /usr/share/harbour-themepacksupport/disable-dpi.sh
.M....... /usr/share/harbour-themepacksupport/disable-servicesu.sh
.M....... /usr/share/harbour-themepacksupport/enable-autoupdate.sh
.M....... /usr/share/harbour-themepacksupport/enable-dpi.sh
.M....... /usr/share/harbour-themepacksupport/font-backup.sh
.M....... /usr/share/harbour-themepacksupport/font-menu.sh
.M....... /usr/share/harbour-themepacksupport/font-restore.sh
.M....... /usr/share/harbour-themepacksupport/font-run.sh
.M....... /usr/share/harbour-themepacksupport/graphic-backup.sh
.M....... /usr/share/harbour-themepacksupport/graphic-menu.sh
.M....... /usr/share/harbour-themepacksupport/graphic-restore.sh
.M....... /usr/share/harbour-themepacksupport/graphic-run.sh
manque /usr/share/harbour-themepacksupport/harbour-themepacksupport.desktop
manque /usr/share/harbour-themepacksupport/harbour-themepacksupport.png
.M....... /usr/share/harbour-themepacksupport/icon-backup.sh
.M....... /usr/share/harbour-themepacksupport/icon-menu.sh
.M....... /usr/share/harbour-themepacksupport/icon-reinstall.sh
.M....... /usr/share/harbour-themepacksupport/icon-restore.sh
.M....... /usr/share/harbour-themepacksupport/icon-run.sh
S.5....T. /usr/share/harbour-themepacksupport/icon-z
.M....... /usr/share/harbour-themepacksupport/ocr.sh
.M....... /usr/share/harbour-themepacksupport/ocr_su.sh
.M....... /usr/share/harbour-themepacksupport/restore_adpi.sh
.M....... /usr/share/harbour-themepacksupport/restore_dpr.sh
.M....... /usr/share/harbour-themepacksupport/restore_iz.sh
manque /usr/share/harbour-themepacksupport/service/10-themepacksupport.conf
.M....... /usr/share/harbour-themepacksupport/service/apkicons.sh
.M....... /usr/share/harbour-themepacksupport/service/run.sh
manque /usr/share/harbour-themepacksupport/service/themepacksupport-autoupdate.service
manque /usr/share/harbour-themepacksupport/service/themepacksupport-autoupdate.timer
manque /usr/share/harbour-themepacksupport/service/themepacksupport-systemupgrade.service
.M....... /usr/share/harbour-themepacksupport/sound-backup.sh
.M....... /usr/share/harbour-themepacksupport/sound-menu.sh
.M....... /usr/share/harbour-themepacksupport/sound-restore.sh
.M....... /usr/share/harbour-themepacksupport/sound-run.sh
.M....... /usr/share/harbour-themepacksupport/systemupgrade-service.sh
.M....... /usr/share/harbour-themepacksupport/themepacksupport.sh
.M....... /usr/share/harbour-themepacksupport/tools-menu.sh
Do you want to continue ? (y/N) Y
Do you want to change release number ? (y/N)
attention : Ne peut canoniser le nom d'hôte : Kasumi
erreur : Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/harbour-themepacksupport.desktop
erreur : Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/harbour-themepacksupport.png
erreur : Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/service/10-themepacksupport.conf
erreur : Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/service/themepacksupport-autoupdate.service
erreur : Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/service/themepacksupport-autoupdate.timer
erreur : Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/service/themepacksupport-systemupgrade.service
Ne peut canoniser le nom d'hôte : Kasumi
Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/harbour-themepacksupport.desktop
Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/harbour-themepacksupport.png
Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/service/10-themepacksupport.conf
Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/service/themepacksupport-autoupdate.service
Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/service/themepacksupport-autoupdate.timer
Fichier non trouvé : /home/nemo/.tmp/rpmrebuild.6506/my_root/usr/share/harbour-themepacksupport/service/themepacksupport-systemupgrade.service
/usr/lib/rpmrebuild/rpmrebuild.sh: ERROR: package 'harbour-themepacksupport' build failed
[nemo@Kasumi ~]$
</pre>
<p>Bon, je m'y attendais un peu… échec.</p>
<p>Fichiers manquants :</p>
<ul class="simple">
<li>/usr/share/harbour-themepacksupport/harbour-themepacksupport.desktop</li>
<li>/usr/share/harbour-themepacksupport/harbour-themepacksupport.png</li>
<li>/usr/share/harbour-themepacksupport/service/10-themepacksupport.conf</li>
<li>/usr/share/harbour-themepacksupport/service/themepacksupport-autoupdate.service</li>
<li>/usr/share/harbour-themepacksupport/service/themepacksupport-autoupdate.timer</li>
<li>/usr/share/harbour-themepacksupport/service/themepacksupport-systemupgrade.service</li>
</ul>
<p>Arborescence complète :</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ tree -I backup /usr/share/harbour-themepacksupport
/usr/share/harbour-themepacksupport
├── apply_adpi.sh
├── autoupdate-menu.sh
├── config.cfg
├── config.shlib
├── ddensity-menu.sh
├── device-model
├── disable-autoupdate.sh
├── disable-dpi.sh
├── disable-servicesu.sh
├── droiddpi-current
├── enable-autoupdate.sh
├── enable-dpi.sh
├── enable-servicesu.sh
├── font-backup.sh
├── font-current
├── font-menu.sh
├── font-reinstall.sh
├── font-restore.sh
├── font-run.sh
├── graphic-backup.sh
├── graphic-current
├── graphic-menu.sh
├── graphic-restore.sh
├── graphic-run.sh
├── iconapply-menu.sh
├── icon-backup.sh
├── icon-current
├── icon-menu.sh
├── icon-overlay.sh
├── icon-reinstall.sh
├── icon-restore.sh
├── icon-run.sh
├── icon-z
├── install_dependencies.sh
├── install_imagemagick.sh
├── LICENSE
├── ocr.sh
├── ocr_su.sh
├── restore_adpi.sh
├── restore_dpr.sh
├── restore_iz.sh
├── service
│ ├── apkicons.sh
│ ├── hours
│ └── run.sh
├── size_droid
├── size_native
├── sound-backup.sh
├── sound-current
├── sound-menu.sh
├── sound-reinstall.sh
├── sound-restore.sh
├── sound-run.sh
├── systemupgrade-service.sh
├── themepacksupport.sh
├── tmp
├── tools-iconbackup.sh
├── tools-iconrestore.sh
└── tools-menu.sh
2 directories, 57 files
[nemo@Kasumi ~]$
</pre>
<p>Pour le moment, je suis bloqué là.</p>
<p>Je pourrais ou bien créer des fichiers vides, ce qui génèrerait le paquet (avec des avertissements comme quoi les fichiers ont été modifiés).</p>
<p>Sinon, copier les scripts, les lire, les comprendre, et créer un nouveau paquet avec le minimum requis.</p>
<p>Ou sinon, comme ma principale utilisation, c'est juste déployer un thème d'icônes et une police de caractères, écrire juste un script qui fait ça…</p>
</div>
</div>
<div class="section" id="layout-bepo">
<h2>Layout BÉPO</h2>
<img alt="" src="images/sfos/bepo1.jpg" />
<p>L'ayant récupéré depuis le site bépo.fr <a class="reference external" href="https://bepo.fr/wiki/SailfishOS">https://bepo.fr/wiki/SailfishOS</a> et les instructions sur la page étant claires, je ne vais pas les répéter ici.</p>
<p>Sauf que, le passage à la version 4.5 de SailfishOS a cassé la disposition bépo. Les touches point, virgule et apostrophe ne sont plus accessibles.</p>
<p>J'ai donc modifié le fichier bepo.qml, notamment la déclaration de la rangée du bas :</p>
<pre class="literal-block">
KeyboardRow {
splitIndex: 4
SymbolKey {
implicitWidth: symbolKeyWidthNarrow
}
CharacterKey {
caption: ".";
captionShifted: "…";
implicitWidth: punctuationKeyWidth;
fixedWidth: !splitActive;
}
ContextAwareCommaKey {
implicitWidth: punctuationKeyWidth
}
SpacebarKey {}
SpacebarKey {
active: splitActive;
languageLabel: ""
}
CharacterKey {
caption: "’";
captionShifted: "'";
implicitWidth: punctuationKeyWidth;
fixedWidth: !splitActive
}
EnterKey {}
}
</pre>
<p>Le fichier complet est disponible ici : <a class="reference external" href="https://aeka.chibi-nah.net/~alex/brol/bepo.qml">https://aeka.chibi-nah.net/~alex/brol/bepo.qml</a></p>
<p>Une fois copié, il peut être nécessaire de redémarrer maliit-server (le service clavier virtuel).</p>
<p>Soit passer par Réglages -> Utilitaires. Sous « Écran d'accueil », tapoter sur le bouton « Redémarrer ».</p>
<p>Soit via le terminal : “systemctl --user restart maliit-server” (merci <a class="reference external" href="https://tooting.ch/@pherjung">https://tooting.ch/@pherjung</a> pour l'astuce)</p>
<pre class="literal-block">
[nemo@Kasumi ~]$ systemctl --user restart maliit-server
[nemo@Kasumi ~]$ systemctl --user status maliit-server
● maliit-server.service - The Maliit server
Loaded: loaded (/usr/lib/systemd/user/maliit-server.service; disabled; vendor preset: enabled)
Active: active (running) since Sat 2023-02-04 02:01:57 CET; 4s ago
Main PID: 17912 (invoker)
CGroup: /user.slice/user-100000.slice/user@100000.service/maliit-server.service
└─17912 /usr/bin/invoker --type=qt5 /usr/bin/maliit-server
févr. 04 02:01:57 Kasumi systemd[5219]: Starting The Maliit server...
févr. 04 02:01:57 Kasumi systemd[5219]: Started The Maliit server.
févr. 04 02:01:57 Kasumi invoker[17912]: WARNING: bool MIMPluginManagerPrivate::loadPlugin(const QDir&, const QString&) Error loading plugin from "/usr/lib/maliit/plugins/libmaliit-keyboard-plugin.so" "The shared library was not found."
févr. 04 02:01:58 Kasumi invoker[17912]: WARNING: invalid inputhandler for Xt9InputHandler.qml, forcing paste input handler
févr. 04 02:01:59 Kasumi invoker[17912]: WARNING: invalid inputhandler for , forcing paste input handler
févr. 04 02:01:59 Kasumi invoker[17912]: WARNING: Image file path failed to resolve for "graphic-system-gradient?#e6000c"
févr. 04 02:01:59 Kasumi invoker[17912]: WARNING: file:///usr/share/maliit/plugins/com/jolla/custom_emoji/EmojiRemorse.qml:130:5: QML Image: Failed to get image from provider: image://theme/graphic-system-gradient?#e6000c
[nemo@Kasumi ~]$
</pre>
<p>Une fois redémarré, l'affichage des touches est correct.</p>
<img alt="" src="images/sfos/bepo2.jpg" />
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p>Une excellente remarque qui m’a été faite par courriel. La touche “W” n'est pas affichée. C'est le comportement de cette disposition bépo à cause de certaines limitations.</p>
<p>C'est indiqué tout en bas de la page de cette disposition :</p>
<p><a class="reference external" href="https://bepo.fr/wiki/SailfishOS">https://bepo.fr/wiki/SailfishOS</a></p>
<p>-> Considérations : “"W" n'est pas visible, il est associé au "V". De la même manière, Ç → C, Ê → E, À → A, etc.”</p>
<p class="last">Du coup, pour pouvoir taper la lettre "W", il suffit de faire un appui long sur la touche "V".</p>
</div>
</div>
<div class="section" id="pixel-ratio">
<h2>pixel-ratio</h2>
<p>Par défaut, le ratio pour l'affichage ne me convient pas du tout. Le texte est trop gros. Et dans Réglages -> Affichage, on ne peut que agrandir le texte. Pas le réduire.</p>
<img alt="" src="images/sfos/fontSize.jpg" />
<p>Comme ce n'est plus faisable via sailfishos-uithemer (cela fonctionnait avant), je procède différemment.</p>
<p>M'étant basé sur les informations disponibles ici : <a class="reference external" href="https://forum.sailfishos.org/t/ui-themer-missing-from-openrepos/2457/63">https://forum.sailfishos.org/t/ui-themer-missing-from-openrepos/2457/63</a></p>
<p>j'ai fini par écrire un script tout simple pour automatiser les manipulations.</p>
<p>dans ~, j'ai un fichier “silica-configs.txt”, et un script “theme-pixel-ratio”</p>
<p>Contenu de “silica-configs.txt” :</p>
<pre class="literal-block">
[desktop/sailfish/silica]
theme_pixel_ratio=1.50
theme_icon_subdir='z1.75'
</pre>
<p>Contenu de theme-pixel-ratio</p>
<pre class="literal-block">
#!/bin/bash
cp /home/nemo/silica-configs.txt /etc/dconf/db/vendor.d/silica-configs.txt
dconf compile /etc/dconf/db/vendor.new /etc/dconf/db/vendor.d
mv /etc/dconf/db/vendor /etc/dconf/db/vendor.bak
mv /etc/dconf/db/vendor.new /etc/dconf/db/vendor
echo "Redémarrer le téléphone pour que le nouveau ratio soit pris en compte"
</pre>
<p>Tout ce que j'ai à faire une fois une mise à jour de SailfishOS terminée, c'est de lancer l'application terminal, et de taper :</p>
<pre class="literal-block">
sudo ./theme-pixel-ratio
</pre>
<p>Quand le message « Redémarrer le téléphone pour que le nouveau ratio soit pris en compte » apparaît, je n'ai plus qu'à redémarrer le téléphone pour que cela soit pris en compte.</p>
<p>--</p>
<p>C'est tout pour le moment.</p>
</div>
Bilan de 20222023-01-08T00:00:00+01:002023-01-08T00:00:00+01:00alextag:blog.chibi-nah.fr,2023-01-08:/bilan-2022<p>L'année 2022 s'est écoulée. Il est temps de faire un bilan.</p>
<p>Tout d'abord, mes meilleurs vœux pour la nouvelle année.</p>
<div class="section" id="bilan-general">
<h2>Bilan général</h2>
<div class="section" id="au-niveau-associatif">
<h3>Au niveau associatif</h3>
<p>Rien de neuf. Quelques annonces pour LDN, notamment l'arrêt des services.</p>
</div>
<div class="section" id="au-niveau-en-ligne">
<h3>Au niveau En ligne</h3>
<p>Maintenance habituelle, ajouts de trucs sur mon serveur gopher, d'articles …</p></div></div><p>L'année 2022 s'est écoulée. Il est temps de faire un bilan.</p>
<p>Tout d'abord, mes meilleurs vœux pour la nouvelle année.</p>
<div class="section" id="bilan-general">
<h2>Bilan général</h2>
<div class="section" id="au-niveau-associatif">
<h3>Au niveau associatif</h3>
<p>Rien de neuf. Quelques annonces pour LDN, notamment l'arrêt des services.</p>
</div>
<div class="section" id="au-niveau-en-ligne">
<h3>Au niveau En ligne</h3>
<p>Maintenance habituelle, ajouts de trucs sur mon serveur gopher, d'articles sur le blog (peu en fait), mise à jour d'articles déjà en ligne.</p>
</div>
<div class="section" id="au-niveau-hors-ligne-irl">
<h3>Au niveau Hors ligne/IRL</h3>
<p>Encore des décès dans l'entourage à la fin de l'année, et moi-même malade (pour changer). Rien de grave, juste un truc de saison (pas COVID-19).</p>
<p>Par rapport à l'événement indiqué dans le bilan de l'an dernier, c'est toujours pas passé émotionnellement. Je craque encore par moment. Moins qu'avant.</p>
<p>Quelques mastapéros cette année :)</p>
<p>Quelques changements également pour les jeux. Voir plus bas le récapitulatif jeux vidéo.</p>
<p>Pour le reste, lecture de light novels en anglais et en français (notamment Death March in the Parallel World Rhapsody, Kuma Kuma Kuma Bear, La petite faiseuse de livres/Ascendance of a Bookworm, I'm in love with the villainess), de BD et de mangas (trop nombreux pour les citer).</p>
<p>Et j'ai finalement craqué et ai acheté un nouveau casque audio (AudioTechnica ATH-M50, version bluetooth), et ce, malgré les différentes réserves que j'avais vis-à-vis des codecs audio utilisés par le Bluetooth. Cependant, avec mon DAP proposant un codec de "haute qualité" et supporté par le casque, ça passe. Et au pire des cas, je peux toujours le brancher en filaire.</p>
</div>
</div>
<div class="section" id="dans-ce-qui-etait-prevu-pour-2022">
<h2>Dans ce qui était prévu pour 2022</h2>
<p>J'avais prévu peu de choses, des trucs réalistes.</p>
<div class="section" id="client-km-pour-sailfishos">
<h3>Client KM pour SailfishOS</h3>
<p>C'est toujours au point mort. Reprise doucement des karaokés à la fin de l'année. Mais rien de plus.</p>
</div>
<div class="section" id="projet-v">
<h3>Projet V</h3>
<p>Au point mort. Pas le moral pour.</p>
</div>
<div class="section" id="projet-e">
<h3>Projet E</h3>
<p>Un proto réalisé avec un esp8266. Pas eu la motivation pour avancer dessus.</p>
</div>
<div class="section" id="projet-m">
<h3>Projet M</h3>
<p>Annoncé sur le blog, avec le routage effectué. Cependant, je pense changer d'approche et passer à du mini jack (3,5 mm) et non plus à du connecteur DIN, ce pour respecter les nouvelles instructions du MMA, donc TRS MIDI A (MIDI Standard).</p>
<p><a class="reference external" href="https://www.midi.org/midi-articles/updated-how-to-make-your-own-3-5mm-mini-stereo-trs-to-midi-5-pin-din-cables">https://www.midi.org/midi-articles/updated-how-to-make-your-own-3-5mm-mini-stereo-trs-to-midi-5-pin-din-cables</a></p>
<p>Du coup, repasser sur le schéma, changer les connecteurs, et refaire le routage. J'hésite en même temps à passer en CMS au lieu d'utiliser du traversant. Tout du moins pour le 6N137 et le 74HC14.</p>
</div>
<div class="section" id="blog">
<h3>Blog</h3>
<p>Quelques articles publiés, fancy index avec Apache httpd, nginx et lighttpd, Valhalla, support pour webcam notamment. Mise à jour des articles Cell Broadcast et détournement de logiciel (ou comment dessiner avec LibreOffice Calc).</p>
<p>Un article de blog supprimé et une page de doc également supprimée. Vu le comportement néfaste/toxique du CommunityManager/PublicRelationship de Raspberry Pi vis-à-vis de la communauté (makers, hackers, etc), je ne veux plus faire partie de cette communauté et continuer de les supporter. Qu'ils restent sur le marché de l'industrie qu'ils ont privilégiés. Moi, je suis passé à autre chose.</p>
</div>
<div class="section" id="migrer-les-services-sur-un-nouveau-serveur">
<h3>Migrer les services sur un nouveau serveur</h3>
<p>Non effectué. Hausse des prix des serveurs dédiés, du coup, c'est pas pour le moment.</p>
</div>
</div>
<div class="section" id="previsions-pour-2023">
<h2>Prévisions pour 2023</h2>
<p>Tout comme pour 2022, je ne vais pas m'avancer dans des trucs irréalisables.</p>
<div class="section" id="client-km-pour-sailfishos-1">
<h3>Client KM pour SailfishOS</h3>
<p>Je ne pense pas avancer dessus. Toutefois, refaire quelques séances de karaoké.</p>
</div>
<div class="section" id="projet-v-1">
<h3>Projet V</h3>
<p>Sera encore en hiatus.</p>
</div>
<div class="section" id="projet-e-1">
<h3>Projet E</h3>
<p>Probablement pareil.</p>
</div>
<div class="section" id="projet-m-1">
<h3>Projet M</h3>
<p>Refaire le circuit. Voir plus haut.</p>
</div>
<div class="section" id="blog-1">
<h3>Blog</h3>
<p>Comme d'hab, rédiger de nouveaux articles.</p>
</div>
<div class="section" id="migrer-les-services-sur-un-nouveau-serveur-1">
<h3>Migrer les services sur un nouveau serveur</h3>
<p>À moins de voir une baisse de prix de manière générale (parce que l'inflation en Europe est… sans commentaires), pas prévu pour cette année.</p>
</div>
</div>
<div class="section" id="conclusion-bilan-de-2022">
<h2>Conclusion bilan de 2022</h2>
<p>Bilan encore mitigé pour 2022. Pas vraiment d'avancée sur les différents projets.</p>
</div>
<div class="section" id="bilan-jeux-videos">
<h2>Bilan jeux-vidéos</h2>
<p>Maintenant, place à un second bilan, côté jeux vidéos.</p>
<p>Là, ce fut facile. Steam proposant une rétrospective, je vais me baser (en grande partie) dessus.</p>
<p><a class="reference external" href="https://store.steampowered.com/replay/76561198012179938/2022">https://store.steampowered.com/replay/76561198012179938/2022</a></p>
<p>46 jeux lancés, dont 12 nouveaux (achats de l'année).</p>
<img alt="" src="images/bilan2022/steam1.png" />
<p>À retenir notamment :</p>
<img alt="" src="images/bilan2022/stray.jpg" />
<p>Stray ; un jeux d'exploration où on incarne un chat, se promenant dans un univers post-apocalyptique.</p>
<p>Miauler, faire ses griffes sur des tapis ou des meubles, se frotter contre les jambes, sauter, escalader des objets, en faire tomber, dormir.</p>
<p>Pas excessivement long, bien réalisé, visuellement joli. Par contre, j'ai détesté les espèces de crabe de tête (cf. Half-Life) présents à certaines étapes, requis pour l'histoire pour ajouter de la tension.</p>
<img alt="" src="images/bilan2022/talesOfBerseria.jpg" />
<p>Tales of Berseria ; j'avais décroché il y a un moment. Je l'ai recommencé. Enfin, j'y ai surtout joué en octobre.</p>
<img alt="" src="images/bilan2022/beatSaber.jpg" />
<p>Beat Saber ; joué pendant les huit premiers mois de l'année, et plus rien entre septembre et décembre. La faute essentiellement à un emploi du temps surchargé, et où j'ai plutôt tendance à rentrer et ne pas toucher au PC. Enfin, pas exactement. Détails du pourquoi plus bas.</p>
<img alt="" src="images/bilan2022/woff.jpg" />
<p>World of Final Fantasy ; un genre de Pokémon mais dans l'univers Final Fantasy. Plein de références aux univers des FF dans ce jeu. Joué surtout entre septembre et novembre.</p>
<img alt="" src="images/bilan2022/LegoStarWars.jpg" />
<p>Lego Star Wars - The complete Saga ; des legos, dans l'univers SW, enfin, épisodes 1-6.</p>
<img alt="" src="images/bilan2022/ForzaHorizon4.jpg" />
<p>Forza Horizon 4 ; j'y avais joué pas mal pendant le confinement via le Microsoft Game Pass (un nom comme ça). Et comme je n'avais pas renouvelé l'abonnement, j'avais arrêté d'y jouer. Je l'ai repris en version Steam.</p>
<p>Globalement, c'est une version 100% arcade, un mélange de Forza Motorsports et de Midtown Madness, avec un rien de Need for Speed Underground 2. Cela se déroule dans une représentation assez vaste du Royaume-Uni, notamment de l'Écosse. Plusieurs lieux emblématiques sont présents, avec la gestion de la météo, pluie, tombée du jour, de la nuit, et les 4 saisons. Après, l'approche « Festival », on aime ou on aime pas. Personnellement, j'adhère moyen, mais bon, je ne fais que peu les courses proposées, préférant plutôt les nombreux défis (photographier telle type de voiture dans un lieu spécifique, battre un record de vitesse, drifter sur une portion spécifique), et de nouveau, jouer aux Lego via le DLC spécifique.</p>
<p>Pourquoi Forza Horizon 4 et non le 5 ? Peu de différences entre les deux, le 4 étant au Royaume-Uni et le 5 au Mexique. Toujours dans le même esprit de « Parce que la vie est une fête ».</p>
<img alt="" src="images/bilan2022/GalGunDoublePeace.jpg" />
<img alt="" src="images/bilan2022/GalGun2.jpg" />
<img alt="" src="images/bilan2022/RezInfinite.jpg" />
<p>Gal*Gun et Rez ; des rails shooter, où il faut repousser des filles trop attirées par le protagoniste dans le premier, et tirer sur des vaisseaux sur le second.</p>
<img alt="" src="images/bilan2022/returnToMonkeyIsland.jpg" />
<p>Return to Monkey Island ; avis plutôt mitigé en fait. Autant la direction artistique, que j'ai lu comme étant décriée, ne m'a pas tellement choqué (d'ailleurs, chaque Monkey Island a eu une direction artistique différente), autant certaines énigmes sont… illogique et tordues (je n'ai d'ailleurs pas réussi à en résoudre une, malgré les astuces intégrées au jeu) et de ce fait, pas pu le finir.</p>
<p>J'ai laissé tomber pour le moment.</p>
<img alt="" src="images/bilan2022/BlueReflection.jpg" />
<p>Blue Reflection ; autre J-RPG que j'ai relancé récemment, cette fois, le jeu tournant sans aucun problème (plus de vidéos non lues et qui plantent le jeu).</p>
<img alt="" src="images/bilan2022/Aokana.jpg" />
<p>Aokana ~ Four Rythms Across the Blue ; Visual Novel (roman graphique) que j'ai relancé et re-fini quelques routes.</p>
<img alt="" src="images/bilan2022/Anarcute.jpg" />
<p>Anarcute ; simulateur de manifestation et d'émeutes (surtout d'émeutes en fait), du point de vue des émeutiers. Rigolo 10 minutes (en gros juste le temps de faire une map), mais je me lasse rapidement.</p>
<img alt="" src="images/bilan2022/cyberpunk2077.jpg" />
<p>Cyberpunk 2077 ; The Witcher dans un univers cyberpunk. Pas encore fini.</p>
<p>En résumé, pour les genres de jeu :</p>
<img alt="" src="images/bilan2022/steam2.png" />
<p>Donc :</p>
<ul class="simple">
<li>Chats ;</li>
<li>Rail Shooter ;</li>
<li>LEGO ;</li>
<li>VR ;</li>
<li>Pointer et Cliquer</li>
<li>RPG japonais</li>
</ul>
<p>Au niveau temps de jeu :</p>
<img alt="" src="images/bilan2022/steam3.png" />
<p>Pourquoi ça a explosé en septembre et octobre ? Il y a une explication logique et rationnelle. J'ai dit plus haut que le soir, je n'ai plus la motivation de rallumer le PC, ce n'est pas exactement vrai.</p>
<p>Si on regarde la répartition par plate-forme :</p>
<img alt="" src="images/bilan2022/steam4.png" />
<ul class="simple">
<li>5% sous Windows ;</li>
<li>17% sous GNU/Linux ;</li>
<li>18% en VR ;</li>
<li>60% avec le Steam Deck.</li>
</ul>
<img alt="" src="images/bilan2022/steamDeck.gif" />
<p>Oui, Steam Deck, modèle 64 Go. Précommandé début 2022 suite à un moment d'agacement sur l'absence de disponibilité/visibilité de carte graphique. Reçu début septembre. C'est ça ce qui explique la répartition bizarre des temps de jeu, et le fait que je n'allume quasiment plus le PC.</p>
<p>Cf. fil déballage sur le Fediverse :</p>
<p><a class="reference external" href="https://social.nah.re/@alex/108945654104754394">https://social.nah.re/@alex/108945654104754394</a></p>
<p>Globalement, une bonne console portable, pardon, un PC portable planqué dans un boîtier de console portable et tournant sous GNU/Linux, plus particulièrement SteamOS 3 basé sur ArchLinux.
Assez grosse mais avec une excellente prise en mains, compatible avec presque tous les jeux cités plus haut. Mode jeu par défaut, et tout comme les Steam Machine, on a accès au mode Bureau (maintenant KDE Plasma et non plus Gnome comme dans les anciennes versions de SteamOS).</p>
<p>Presque.</p>
<p>Excepté Forza Horizon 4, qui a un bug ultra-pénible. En effet, pour une raison inconnue, le jeu perd la "manette" connectée et plante ou gèle aussitôt. Encore plus pénible quand cela arrive toutes les 5-10-20 minutes, en jeu, dans un menu, sur l'écran titre, de manière aléatoire.
Entre ça et un bug dans le jeu qui fait qu'il plante régulièrement également sous Windows si on a le malheur d'avoir une carte Nvidia et un pilote à jour… pas un jeu que je recommanderais en fait.</p>
<p>Pour Le Donjon de Naheulbeuk - l'amulette du désordre, Sunrider - Mask of Arcadius et The Battle for Wesnoth, malheureusement, les textes sont trop petits et sont illisibles. Le dock (fabricant tiers, Valve n'avait pas encore sorti le sien) est juste obligatoire pour afficher l'image sur moniteur externe ; et là, sur un 24" en 1920×1080, c'est nickel.</p>
<p>Côté émulation, ça émule un peu tout et n'importe quoi, Atari 2600, Nes, Snes, N64, Game Cube, Wii, Game Boy/color/advance, PlayStation 1, 2, 3, PSP, Sega MegaDrive, Master System, Dreamcast/Naomi. Je n'ai pas vraiment testé le reste.</p>
<p>Pour le côté débile, j'ai intallé l'environnement SteamVR et ai testé avec Rez Infinite en mode VR. Ça fonctionne, mais c'est pas vraiment optimisé pour.</p>
<p>Bref, un excellent investissement, permettant de jouer presque n'importe où, mais dont le prix des accessoires (micro SD de 256 puis 512 Go, Dock…) font que la facture monte très vite.</p>
<p>En résumé : une bonne année côté jeux vidéo :)</p>
</div>
Détournement de logiciel2022-08-17T00:00:00+02:002012-06-23T00:00:00+02:00alextag:blog.chibi-nah.fr,2022-08-17:/detournement-de-logiciel<p><strong>Article mis à jour en 2022</strong></p>
<p>Certains logiciels peuvent être utilisés d'une manière pas forcément prévue par les développeurs (quoique). En voici la preuve…</p>
<p>Par exemple, Microsoft Excel ou Open/Libre Office Calc sont des tableurs/grapheurs, utilisés la plupart du temps pour faire de la manipulation de nombres et …</p><p><strong>Article mis à jour en 2022</strong></p>
<p>Certains logiciels peuvent être utilisés d'une manière pas forcément prévue par les développeurs (quoique). En voici la preuve…</p>
<p>Par exemple, Microsoft Excel ou Open/Libre Office Calc sont des tableurs/grapheurs, utilisés la plupart du temps pour faire de la manipulation de nombres et pour tracer des courbes <sup id="sf-detournement-de-logiciel-1-back"><a href="#sf-detournement-de-logiciel-1" class="simple-footnote" title="on me dit dans l'oreillette que des outils de stats sont quand même plus efficace">1</a></sup>.</p>
<p>Cependant, rien n'empêche d'utiliser ce genre d'outils pour dessiner…</p>
<p>En effet, en redimensionnant les cellules pour qu'elles soient carrées, on arrive à ça :</p>
<img alt="" src="/images/detournement/template.png">
<p>Libre Office Calc avec les cellules redimensionnées.</p>
<p>Avec un peu de temps libre, on peut s'amuser à dessiner un nyan-cat (<a class="reference external" href="http://nyan.cat">http://nyan.cat</a>) (un mème internet) :</p>
<img alt="" src="/images/detournement/nyan-calc.png">
<p>Un nyan cat dessiné dans Libre Office Calc</p>
<p>Avec <strong>BEAUCOUP</strong> de temps libre, on peut s'amuser à ça :</p>
<img alt="" src="/images/detournement/pokemon_jaune.png">
<p>L'écran du jeu GameBoy Pokémon pokemon_jaune</p>
<img alt="" src="/images/detournement/pika.png">
<p>Détail sur l'un des pikachu, tiré de l'écran du jeu</p>
<p>Je laisse LibreOffice indiquer le temps d'édition total :</p>
<img alt="" src="/images/detournement/edition.png">
<p>Temps total de l'édition : 17 heures 8 minutes…</p>
<p><strong>Petit up du 4 avril 2015 :</strong> les fichiers au format ods (OpenOffice/LibreOffice) sont désormais en ligne.</p>
<p>Nyan-calc.ods : <a class="reference external" href="https://blog.chibi-nah.fr/images/detournement/nyan-calc.ods">https://blog.chibi-nah.fr/images/detournement/nyan-calc.ods</a>
Pika.ods : <a class="reference external" href="https://blog.chibi-nah.fr/images/detournement/pika.ods">https://blog.chibi-nah.fr/images/detournement/pika.ods</a></p>
<p><strong>Mise à jour au 17 août 2022</strong></p>
<p>J'ai profité d'un peu de temps libre (et devant surtout me changer les idées), pour ouvrir LibreOffice Calc, et dessiner… CalcCaptor Sakura.</p>
<img alt="" src="/images/detournement/CalcCaptorSakura.png">
<p>CalcCaptor_Sakura.ods : <a class="reference external" href="https://blog.chibi-nah.fr/images/detournement/CalcCaptor_Sakura.ods">https://blog.chibi-nah.fr/images/detournement/CalcCaptor_Sakura.ods</a></p>
<ol class="simple-footnotes"><li id="sf-detournement-de-logiciel-1">on me dit dans l'oreillette que des outils de stats sont quand même plus efficace <a href="#sf-detournement-de-logiciel-1-back" class="simple-footnote-back">↩</a></li></ol>Cell broadcast2022-07-31T00:00:00+02:002021-04-24T00:00:00+02:00alextag:blog.chibi-nah.fr,2022-07-31:/cell-broadcast<p>Cell broadcast, ou la diffusion d'alerte via le réseau GSM.</p>
<p>TL;DR</p>
<p>Ça fonctionne avec tout téléphone mobile, même tout simple (non "smart"), tout opérateur, sans connexion Internet, sans GPS, et situé dans une zone couverte par (au moins) une antenne.</p>
<p>Edit 31 juillet 2022 : En fait non, en France …</p><p>Cell broadcast, ou la diffusion d'alerte via le réseau GSM.</p>
<p>TL;DR</p>
<p>Ça fonctionne avec tout téléphone mobile, même tout simple (non "smart"), tout opérateur, sans connexion Internet, sans GPS, et situé dans une zone couverte par (au moins) une antenne.</p>
<p>Edit 31 juillet 2022 : En fait non, en France, cela ne fonctionnera que pour les mobiles connectés en 4G et (plus tard) en 5G. Pour les mobiles d'ancienne génération (2G, 3G), une autre solution sera utilisée.</p>
<div class="section" id="pourquoi-alerter">
<h2>Pourquoi alerter ?</h2>
<p>Tenir informé de la population d'un risque imminent (séisme, tsunami), en cours (incendie, pollution de l'air) est primordial, afin de limiter au maximum les expositions au danger.</p>
</div>
<div class="section" id="comment-alerter">
<h2>Comment alerter ?</h2>
<p>En France, un ensemble d'outils, appelé SAIP (Système d'Alerte et d'Information aux Populations<sup id="sf-cell-broadcast-1-back"><a href="#sf-cell-broadcast-1" class="simple-footnote" title="Si je n'avais pas vérifié, j'aurais écrit « à la Population »">1</a></sup>) est en place. Les alertes peuvent être déclenchées par les services du ministère de l'intérieur (préfet, cellules de gestion de crise), par les services de secours (SDIS Services Départementaux d'Incendie et de Secours, les pompiers, donc), la municipalité (maire) et les services des armées.</p>
<p>Plus d'informations : <a class="reference external" href="https://www.interieur.gouv.fr/Alerte/Alerte-ORSEC/Qu-est-ce-que-le-SAIP">https://www.interieur.gouv.fr/Alerte/Alerte-ORSEC/Qu-est-ce-que-le-SAIP</a></p>
<div class="section" id="la-sirene">
<h3>La sirène</h3>
<p>Le système le plus simple pour alerter est la sirène. Cependant, ce système informe juste de la présence d'un danger. Aucune information concernant ce danger, les risques ou la nature ne peut être véhiculé par ce système.</p>
<p>À noter : afin de vérifier le bon fonctionnement de la sirène, un test est fait le premier mercredi de chaque mois, à midi.</p>
<p>À noter : il y a plus de 2 000 sirènes en France. Source : interieur.gouv.fr</p>
</div>
<div class="section" id="les-medias">
<h3>Les médias</h3>
<p>Les médias dits « traditionnels », comme les journaux papiers, la télévision et la radio, sont utilisés pour la diffusion d'alertes. Des spots TV/Radio notamment lors d'alerte enlèvement furent déjà utilisés par le passé.
Pour les journaux, le délai entre l'annonce et la publication (journal disponible) est plutôt important, ce qui rend ce support non adapté dans des situations d'urgence (attentat, accident industriel grave, alerte incendie…)</p>
<p>Même si ce ne sont pas des médias à proprement parler, certains systèmes d'affichage, comme les panneaux informatifs autoroutiers ou municipaux peuvent également être utilisés pour la diffusion d'alertes.</p>
</div>
<div class="section" id="les-applications-smart">
<h3>Les applications « smart »</h3>
<p>Parmi les autres méthodes, il y a la mode du « smart », qui, comme son nom l'indique, consiste à utiliser des méthodes stupides, avec des technologies absolument pas fiables, sur lesquels les notions de « environnement dégradé » et « réseau saturé » sont simplement oubliés.
Gros avantage, cela permet de signer de gros chèques avec de gros éditeurs (300 000€)<sup id="sf-cell-broadcast-2-back"><a href="#sf-cell-broadcast-2" class="simple-footnote" title="Ce qui fut facturé pour « alerte attentat ».">2</a></sup>.</p>
<p>L'application pour téléphone mobile tournant sur iOS ou Android, s'appelant SAIP (pourquoi faire compliqué), ou « alerte attentat », fut une de ces méthodes « smart ».
En pratique, cette application fonctionnait tellement mal que le gouvernement a abandonné le projet et la maintenance de l'application.
Les griefs retenus furent :</p>
<ul class="simple">
<li>nécessite un téléphone compatible ;</li>
<li>nécessite un abonnement Internet fonctionnel ET activé sur le téléphone ;</li>
<li>doit fonctionner en permanence (en arrière plan) ;</li>
<li>le système de géolocalisation (GPS) doit être actif et la position connue par le téléphone ;</li>
<li>le faible déploiement de l'application (seulement 900 000 installations).</li>
</ul>
<p>En pratique, l'application fonctionnait très mal. Les alertes émises ne concernaient pas forcément la bonne zone, ou alors, avec des délais trop long (2 heures entre l'émission de l'alerte lors de l'attaque à Nice en juillet 2016 et la réception sur les téléphones). Voire, n'arrivaient pas du tout (attaque du Super U à Trèbes).</p>
</div>
<div class="section" id="les-reseau-sociaux">
<h3>Les réseau sociaux</h3>
<p>Suite à ces échecs, le gouvernement a concentré ses efforts de communication, notamment sur Facebook et Twitter.
L'utilisation de Safety Check de Facebook (déjà ultra intrusif au niveau vie privée) ne fait que renforcer le pouvoir de Facebook (encore plus de données fiables, donc valant encore plus cher sur le site web publicitaire avec ses milliards d'abonnés).</p>
<p>Après, le gouvernement préfère les GAFAM aux entreprises locales… rien de nouveau.</p>
</div>
<div class="section" id="la-diffusion-cellulaire">
<h3>La diffusion cellulaire</h3>
<p>Et enfin (et le but de cet article), la méthode qui est mise en place depuis une voire deux décennies dans d'autres pays : la diffusion cellulaire (Cell Broadcast).</p>
<p>La diffusion des alertes de ce type est simple : l'alerte est envoyée à tout téléphone "visible" ou "connecté" à une antenne relais, peu importe le type de téléphone (mobile classique ou débilophone<sup id="sf-cell-broadcast-3-back"><a href="#sf-cell-broadcast-3" class="simple-footnote" title="un "smart"phone n'est pas intelligent. Il est juste stupide, mais connecté à Internet.">3</a></sup>), peu importe le type d'abonnement (actif ou non) ou la nationalité du constructeur ou de la personne en possession du-dit téléphone.</p>
<p>Gros avantage de cette technologie :</p>
<ul class="simple">
<li>complètement indépendant du type de téléphone ou de son système d'exploitation ;</li>
<li>ne nécessite pas l'utilisation du GPS (qui peut mettre jusqu'à 12-25 minutes suivant les conditions pour télécharger les éphémérides satellites) ;</li>
<li>ne nécessite pas de connexion Internet ;</li>
<li>prévu pour fonctionner sur un réseau dégradé ou saturé.</li>
</ul>
<p>Ce dernier point est important.</p>
<p>En cas de séisme, accident technologique (penser Seveso) ou coupures majeures au niveau énergie (électricité) ou réseau (télécom), le premier service pris d'assaut est le réseau téléphonique, qui devient rapidement saturé (appels aux services de secours, ou appels des/aux proches pour rassurer ou non par rapport à la situation).</p>
<p>À noter : dans ces conditions, les stations de radioamateurs peuvent être utilisées pour transmettre les messages de secours<sup id="sf-cell-broadcast-4-back"><a href="#sf-cell-broadcast-4" class="simple-footnote" title="Fédération nationale des radioamateurs au service de la sécurité civile.">4</a></sup>.</p>
<p>Du coup, pour alerter la population sur une zone géographique précise, il faut et il suffit d'envoyer un message d'alerte aux antennes (relais) présentes sur cette zone, ces antennes étant fixes et leur position connue.</p>
</div>
</div>
<div class="section" id="en-pratique">
<h2>En pratique</h2>
<p>Pour des raisons de simplification, je parlerai ici de Cell Broadcast pour les SMS-CB (spécification GSM 03.41) et de SMS pour les SMS-PP (spécification GSM 03.40). Ces spécifications sont disponibles sur le site de l'ETSI.</p>
<p>La diffusion cellulaire fonctionne en mode uni-directionnel, de l'antenne (voire plusieurs antennes) vers le téléphone (downlink), en mode diffusion (broadcast), donc sans cibler un téléphone en particulier<sup id="sf-cell-broadcast-5-back"><a href="#sf-cell-broadcast-5" class="simple-footnote" title="Ce qui est le contraire d'un appel téléphonique ou l'envoi d'un SMS : le téléphone est ciblé, la diffusion se fait dans les deux sens, montant (téléphone -> antenne relais) et descendant (antenne relais vers téléphone).">5</a></sup>. Tous les téléphones allumés présents dans la zone recevront alors le même message, quasiment en même temps.</p>
<p>Pourquoi ce mode broadcast ? Tout simplement parce qu'envoyer un SMS (en mode classique donc), pour chaque téléphone situé dans une zone, c'est long et lent<sup id="sf-cell-broadcast-6-back"><a href="#sf-cell-broadcast-6" class="simple-footnote" title="À noter : ce reproche a également été fait par certains services de secours, médecins ou ambulanciers, qui utilisent toujours un pager compatible POCSAG/Tattoo/e*message, parce que non seulement la diffusion est plus rapide, mais également parce que c'est accepté dans les lieux où les téléphones mobiles doivent être éteints. Et oui, les pagers sont toujours utilisé en 2021, mais plus du tout par le grand-public, pour des raisons de coût et de contraintes.">6</a></sup>.</p>
<p>Admettons que dans une zone urbaine, il y ait 1 000 téléphones allumés et vus par une antenne (c'est pour l'exemple), cela signifie qu'il faut alors envoyer 1 000 SMS, un par téléphone. Et chaque téléphone doit alors envoyer un acquitement en retour (peu importe la classe du SMS, même en classe 0 SMS Flash). Donc 1 000 acquitements. Et si un SMS n'a pas pu être délivré, le réseau retente a nouveau, pendant un certain temps.
Si le réseau est saturé ou partiellement inutilisable pendant une catastrophe, les SMS non reçus seraient réexpédiés, saturant encore plus<sup id="sf-cell-broadcast-7-back"><a href="#sf-cell-broadcast-7" class="simple-footnote" title="façon de parler.">7</a></sup> le réseau.</p>
<p>En mode broadcast, ces problèmes n'existent pas. Tous les téléphones recoivent le même message en même temps (penser réception radio FM/DAB ou réception télévision TNT, où tous les dispositifs de réception ou assimilés orientés vers la même antenne reçoivent la station ou la chaîne en même temps).</p>
<p>Le SMS-CB dispose d'un canal dédié à la diffusion de messages d'urgence (CBCH Cell Broadcast CHannel), et cela a été défini dans les spécifications de la norme GSM phase 2 (2G) en 1995<sup id="sf-cell-broadcast-8-back"><a href="#sf-cell-broadcast-8" class="simple-footnote" title="ETSI GSM 05.02 Multiplexing and Multiple Access on the Radio Path (version 3.8.0 release 95 phase 1 ~ Radio Sub - system Link Control), section 3.3.5 Cell broadcast channel (CBCH) (gsmts_0502sv030800p.pdf).">8</a></sup>.</p>
<p>Un message peut occuper 82 octets (donc 93 caractères, parce que l'encodage des caractères est sur 7 bits et non 8), et on peut envoyer jusqu'à 15 pages de 82 octets pour former un message complet (1 395 caractères maximum en théorie). Un message peut être répété un certain nombre de fois (jusqu'à 2 880 fois, donc répété toutes les 30 secondes pendant 24 heures), ou indéfiniment jusqu'à ce que l'instruction d'arrêt de l'envoi ne soit envoyé vers les antennes.</p>
<p>Pour plus de détails, lire la spécification GSM 03.41<sup id="sf-cell-broadcast-9-back"><a href="#sf-cell-broadcast-9" class="simple-footnote" title="Cette doc est complète et compréhensible, cependant, un minimum de connaissances en réseau/télécom peut être requis pour vraiment tout comprendre.">9</a></sup> sur le site de l'ETSI (European Telecommunications Standards Institute).</p>
<p>La première démonstration de cette technologie a eu lieu à Paris, en 1997.</p>
</div>
<div class="section" id="et-en-france">
<h2>Et en France ?</h2>
<p>Aussi absurde que cela puisse paraître, cette technologie pourtant simple et normalisée, n'est pas active/présente en France (à l'heure de la rédaction de cet article, 24 avril 2021). Non pas pour des raisons techniques, mais pour des raisons politiques et financières (l'argument habituel du qui doit payer ? L'opérateur téléphonique ? L'opérateur d'antenne<sup id="sf-cell-broadcast-10-back"><a href="#sf-cell-broadcast-10" class="simple-footnote" title="Les antennes, ça coûte cher à déployer et à maintenir, du coup, certains opérateurs ont vendu les antennes et équipement associé à des entreprises spécialisées.">10</a></sup> ? Le gouvernement ?).</p>
<p>Cependant, le gouvernement a annoncé il y a quelques mois, que cette technologie devrait être (enfin !) déployée entre juillet 2021 et juin 2022, dans toute la France<sup id="sf-cell-broadcast-11-back"><a href="#sf-cell-broadcast-11" class="simple-footnote" title="https://www.lemonde.fr/planete/article/2020/09/24/la-france-va-s-equiper-d-un-systeme-d-alerte-a-la-population-par-telephone-mobile-d-ici-a-2022_6053473_3244.html">11</a></sup>.</p>
<p>Cela nécessitera l'activation de cette option dans les paramètres du téléphone<sup id="sf-cell-broadcast-12-back"><a href="#sf-cell-broadcast-12" class="simple-footnote" title="Une option que j'active systématiquement sur mes téléphones, et ce, depuis 2006.">12</a></sup>, parce que désactivé par défaut.</p>
<img alt="" src="images/smscb/smscb.png">
<p>Capture d'écran d'un téléphone Android (version 6/LineageOS), montrant les paramètres de diffusion cellulaire (cell broadcast).</p>
</div>
<div class="section" id="en-2022">
<h2>En 2022</h2>
<p>Article mis à jour le 31 juillet 2022.</p>
<p>La diffusion cellulaire, appelée FR-ALERT a été déployé au niveau national fin juin 2022, et vient en complément des solutions d'alerte déjà présentes.</p>
<p><a class="reference external" href="https://www.interieur.gouv.fr/Le-ministere/Securite-civile/Nos-missions/L-alerte-et-l-information-des-populations/Dispositif-FR-Alert">https://www.interieur.gouv.fr/Le-ministere/Securite-civile/Nos-missions/L-alerte-et-l-information-des-populations/Dispositif-FR-Alert</a></p>
<p><a class="reference external" href="https://www.service-public.fr/particuliers/actualites/A15732">https://www.service-public.fr/particuliers/actualites/A15732</a></p>
<p>Cependant, la diffusion cellulaire n'est active que sur les réseaux mobiles 4G.</p>
<p>Pour les mobiles d'ancienne génération, la diffusion des messages d'alerte se fera par SMS géolocalisé, avec des temps de diffusion nettement plus longs. Cette solution n'est pas encore déployée (second semestre 2022).</p>
<p>Pour les réseaux mobiles 5G, ça sera déployé dans le futur.</p>
<p>--</p>
</div>
<ol class="simple-footnotes"><li id="sf-cell-broadcast-1">Si je n'avais pas vérifié, j'aurais écrit « à la Population » <a href="#sf-cell-broadcast-1-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-2">Ce qui fut facturé pour « alerte attentat ». <a href="#sf-cell-broadcast-2-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-3">un "smart"phone n'est pas intelligent. Il est juste stupide, mais connecté à Internet. <a href="#sf-cell-broadcast-3-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-4">Fédération nationale des radioamateurs au service de la sécurité civile. <a href="#sf-cell-broadcast-4-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-5">Ce qui est le contraire d'un appel téléphonique ou l'envoi d'un SMS : le téléphone est ciblé, la diffusion se fait dans les deux sens, montant (téléphone -> antenne relais) et descendant (antenne relais vers téléphone). <a href="#sf-cell-broadcast-5-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-6">À noter : ce reproche a également été fait par certains services de secours, médecins ou ambulanciers, qui utilisent toujours un pager compatible POCSAG/Tattoo/e*message, parce que non seulement la diffusion est plus rapide, mais également parce que c'est accepté dans les lieux où les téléphones mobiles doivent être éteints. Et oui, les pagers sont toujours utilisé en 2021, mais plus du tout par le grand-public, pour des raisons de coût et de contraintes. <a href="#sf-cell-broadcast-6-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-7">façon de parler. <a href="#sf-cell-broadcast-7-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-8">ETSI GSM 05.02 Multiplexing and Multiple Access on the Radio Path (version 3.8.0 release 95 phase 1 ~ Radio Sub - system Link Control), section 3.3.5 Cell broadcast channel (CBCH) (gsmts_0502sv030800p.pdf). <a href="#sf-cell-broadcast-8-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-9">Cette doc est complète et compréhensible, cependant, un minimum de connaissances en réseau/télécom peut être requis pour vraiment tout comprendre. <a href="#sf-cell-broadcast-9-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-10">Les antennes, ça coûte cher à déployer et à maintenir, du coup, certains opérateurs ont vendu les antennes et équipement associé à des entreprises spécialisées. <a href="#sf-cell-broadcast-10-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-11">https://www.lemonde.fr/planete/article/2020/09/24/la-france-va-s-equiper-d-un-systeme-d-alerte-a-la-population-par-telephone-mobile-d-ici-a-2022_6053473_3244.html <a href="#sf-cell-broadcast-11-back" class="simple-footnote-back">↩</a></li><li id="sf-cell-broadcast-12">Une option que j'active systématiquement sur mes téléphones, et ce, depuis 2006. <a href="#sf-cell-broadcast-12-back" class="simple-footnote-back">↩</a></li></ol>Fancy index, version lighttpd2022-05-19T00:00:00+02:002022-05-19T00:00:00+02:00alextag:blog.chibi-nah.fr,2022-05-19:/fancy-index-lighttpd<div class="section" id="introduction">
<h2>Introduction</h2>
<p>Après les listings de fichiers customisés avec Apache httpd et nginx, qu'en est-il de lighttpd ?</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Le site web fonctionnant avec Apache, il n'y aura pas de démos non plus.</p>
</div>
<p>Avec lighttpd, le module permettant d'afficher la liste des fichiers est <cite>mod_dirlisting</cite>. Ce module gère non seulement la génération …</p></div><div class="section" id="introduction">
<h2>Introduction</h2>
<p>Après les listings de fichiers customisés avec Apache httpd et nginx, qu'en est-il de lighttpd ?</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Le site web fonctionnant avec Apache, il n'y aura pas de démos non plus.</p>
</div>
<p>Avec lighttpd, le module permettant d'afficher la liste des fichiers est <cite>mod_dirlisting</cite>. Ce module gère non seulement la génération de la liste des fichiers mais propose également quelques modifications possibles côté affichage. Cependant, le côté personnalisable étant assez limité (dixit la doc), la doc officielle recommande d'utiliser plutôt php ou python pour avoir plus de possibilités au niveau modifications/personnalisation/customisation… nous verrons ici que <cite>mod_dirlisting</cite> est amplement suffisant.</p>
<p><a class="reference external" href="https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModDirlisting">https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModDirlisting</a></p>
</div>
<div class="section" id="sans-fancy-index">
<h2>Sans Fancy Index</h2>
<p>Dans la configuration du vhost, il suffit d'ajouter <cite>dir-listing.activate = "enable"</cite>.</p>
<p>Simple et sobre.</p>
<img alt="" src="images/fancyindex-lighttpd/demo1.png" />
<p>Configuration de lighttpd :</p>
<div class="highlight"><pre><span></span>$HTTP["host"] =~ "localhost" {
server.document-root = "/srv/demo/lighttpd"
dir-listing.encoding = "utf-8"
dir-listing.activate = "enable"
}
</pre></div>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Redémarrer le service lighttpd après chaque modification du fichier de configuration.</p>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Ici, le fichier de configuration du site est /etc/lighttpd/conf-enabled/001-demo.conf</p>
</div>
</div>
<div class="section" id="avec-fancy-index">
<h2>Avec Fancy Index</h2>
<p>Alors, là, ça va être très différent de Apache httpd et nginx. En effet, il n'y a pas de paramètre pour activer Fancy Index. En fait, c'est « déjà » activé par défaut. Par contre, si on désactive <cite>dir-listing.auto-layout</cite>, voici ce que l'on obtient :</p>
<img alt="" src="images/fancyindex-lighttpd/demo2.png" />
<div class="highlight"><pre><span></span>$HTTP["host"] =~ "localhost" {
server.document-root = "/srv/demo/lighttpd"
dir-listing.encoding = "utf-8"
dir-listing.activate = "enable"
dir-listing.auto-layout = "disable"
}
</pre></div>
<p>En fait, désactiver auto-layout permet de définir soi-même son code html</p>
</div>
<div class="section" id="options-d-affichage">
<h2>Options d'affichage</h2>
<p>La liste étant assez longue, on ne va pas tout énumérer. Se référer à la page de documentation officielle sur le site de lighttpd :</p>
<p><a class="reference external" href="https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModDirlisting">https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModDirlisting</a></p>
<p>On va se contenter de l'essentiel :</p>
<ul class="simple">
<li><cite>dir-listing.activate</cite> : activer le listing des fichiers et répertoires.</li>
<li><cite>dir-listing.hide-dotfiles</cite> : masquer les fichiers commençant par un point. Activé par défaut.</li>
<li><cite>dir-listing.external-css</cite> : spécifie une feuille de style à charger.</li>
<li><cite>dir-listing.encoding</cite> : encodage des fichiers par défaut. Dans les exemples plus haut, j'ai indiqué <cite>utf-8</cite>.</li>
<li><cite>dir-listing.show-readme</cite> : permet d'afficher le contenu de README.txt après le listing. À noter : on peut spécifier un fichier autre que README.txt</li>
<li><cite>dir-listing.hide-readme-file</cite> : masque le fichier README.txt. Désactivé par défaut.</li>
<li><cite>dir-listing.show-header</cite> : permet d'afficher le contenu de HEADER.txt avant le listing. À noter : on peut spécifier un fichier autre que HEADER.txt</li>
<li><cite>dir-listing.hide-header-file</cite> : masque le fichier HEADER.txt. Désactivé par défaut.</li>
<li><cite>dir-listing.set-footer</cite> : permet d'afficher une chaîne de caractères. Par défaut, c'est <cite>"<PACKAGE_NAME>/<PACKAGE_VERSION>"</cite>, ce qui affiche <cite>lighttpd/1.4.64</cite>.</li>
<li><cite>dir-listing.encode-header</cite> : permet d'afficher tel-quel (sans interpréter) le code html présent dans HEADER.txt. Pour rendre interprétable par le navigateur web le code HTML écrit, il faut passer ce paramètre à <cite>disable</cite>.</li>
<li><cite>dir-listing.encode-readme</cite> : permet d'afficher tel-quel (sans interpréter) le code html présent dans README.txt. Pour rendre interprétable par le navigateur web le code HTML écrit, il faut passer ce paramètre à <cite>disable</cite>.</li>
<li><cite>dir-listing.auto-layout</cite> : permet de désactiver le template html par défaut de lighttpd. Cela permet d'utiliser du contenu html complet pour header et readme.</li>
</ul>
</div>
<div class="section" id="ajouter-des-icones">
<h2>Ajouter des icônes</h2>
<p>Les icônes utilisées ici pour l'exemple proviennent du thème Red Dot Black Plasma <a class="reference external" href="https://github.com/L4ki/Red-Dot-Black-Plasma-Themes">https://github.com/L4ki/Red-Dot-Black-Plasma-Themes</a></p>
<p>Créer un répertoire icons, faire une petite sélection d'icônes, les appeler</p>
<ul class="simple">
<li>archive.svg</li>
<li>cue.svg</li>
<li>flac.svg</li>
<li>folder.svg</li>
<li>image.svg</li>
<li>ogg.svg</li>
<li>text.svg</li>
<li>up.svg</li>
</ul>
<p>Oui, c'est encore du copier/coller de l'article Fancy index (Apache httpd) :)</p>
<p>L'une des différences avec Apache httpd, et c'est commun avec nginx, il n'y a pas d'icônes d'affichées avec lighttpd. Il n'y a pas non plus de directive ou de paramètre pour spécifier des icônes (copier-coller depuis l'article fancy index avec nginx).</p>
<p>Pas grave, on va les ajouter dynamiquement, via une feuille de style :)</p>
<p>Créer un fichier <cite>style.css</cite>, avec ce contenu :</p>
<div class="highlight"><pre><span></span><span class="c">/* style par défaut de lighttpd */</span>
<span class="nt">a</span><span class="o">,</span><span class="w"> </span><span class="nt">a</span><span class="p">:</span><span class="nd">active</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">text-decoration</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="kc">blue</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="p">:</span><span class="nd">visited</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#48468F</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="p">:</span><span class="nd">hover</span><span class="o">,</span><span class="w"> </span><span class="nt">a</span><span class="p">:</span><span class="nd">focus</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">text-decoration</span><span class="p">:</span><span class="w"> </span><span class="kc">underline</span><span class="p">;</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="kc">red</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">body</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="mh">#F5F5F5</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">h2</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">margin-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">table</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">margin-left</span><span class="p">:</span><span class="w"> </span><span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">th</span><span class="o">,</span><span class="w"> </span><span class="nt">td</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">font</span><span class="p">:</span><span class="w"> </span><span class="mi">90</span><span class="kt">%</span><span class="w"> </span><span class="kc">monospace</span><span class="p">;</span>
<span class="w"> </span><span class="k">text-align</span><span class="p">:</span><span class="w"> </span><span class="kc">left</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">th</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">font-weight</span><span class="p">:</span><span class="w"> </span><span class="kc">bold</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding-right</span><span class="p">:</span><span class="w"> </span><span class="mi">14</span><span class="kt">px</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">td</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">padding-right</span><span class="p">:</span><span class="w"> </span><span class="mi">14</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">td</span><span class="p">.</span><span class="nc">s</span><span class="o">,</span><span class="w"> </span><span class="nt">th</span><span class="p">.</span><span class="nc">s</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">text-align</span><span class="p">:</span><span class="w"> </span><span class="kc">right</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">div</span><span class="p">.</span><span class="nc">list</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="kc">white</span><span class="p">;</span>
<span class="w"> </span><span class="k">border-top</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="kt">px</span><span class="w"> </span><span class="kc">solid</span><span class="w"> </span><span class="mh">#646464</span><span class="p">;</span>
<span class="w"> </span><span class="k">border-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="kt">px</span><span class="w"> </span><span class="kc">solid</span><span class="w"> </span><span class="mh">#646464</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding-top</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">14</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">div</span><span class="p">.</span><span class="nc">foot</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">font</span><span class="p">:</span><span class="w"> </span><span class="mi">90</span><span class="kt">%</span><span class="w"> </span><span class="kc">monospace</span><span class="p">;</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#787878</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding-top</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="c">/* icônes */</span>
<span class="nt">a</span><span class="p">::</span><span class="nd">before</span><span class="p">{</span>
<span class="w"> </span><span class="k">content</span><span class="p">:</span><span class="s2">""</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding</span><span class="p">:</span><span class="w"> </span><span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/text.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">"/"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/folder.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">^=</span><span class="s2">".."</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/up.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".cue"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/cue.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".ogg"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/ogg.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".flac"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/flac.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".zip"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/archive.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>C'est long ? Normal. En plus des icônes, j'ai copié-collé la feuille de style par défaut de lighttpd, pour garder le même style d'affichage que celui par défaut.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">On peut ajouter d'autres icônes et extensions, ou utiliser des règles css différentes.</p>
</div>
<p>Dans la configuration du site, ajouter <cite>dir-listing.external-css = "style.css"</cite>, comme ceci :</p>
<div class="highlight"><pre><span></span>$HTTP["host"] =~ "localhost" {
server.document-root = "/srv/demo/lighttpd"
dir-listing.encoding = "utf-8"
dir-listing.activate = "enable"
dir-listing.auto-layout = "enable"
dir-listing.external-css = "style.css"
}
</pre></div>
<p>Résultat ?</p>
<img alt="" src="images/fancyindex-lighttpd/demo3.png" />
<p>On a gardé l'aspect visuel par défaut de lighttpd, tout en ajoutant dynamiquement les icônes voulues.</p>
</div>
<div class="section" id="header-et-readme">
<h2>HEADER et README</h2>
<p>Avant de passer à la section où on change complètement l'affichage, on va regarder ces deux éléments que sont README.txt et HEADER.txt</p>
<p>Créons deux fichiers, un s'appelant <cite>HEADER.txt</cite> et l'autre <cite>README.txt</cite>.</p>
<p>Dans <cite>HEADER.txt</cite>, mettons simplement :</p>
<div class="highlight"><pre><span></span>Je suis HEADER.txt
</pre></div>
<p>Et dans <cite>README.txt</cite> :</p>
<div class="highlight"><pre><span></span>Je suis README.txt
</pre></div>
<p>Modifions la configuration du site, en ajoutant les lignes concernant readme et header :</p>
<div class="highlight"><pre><span></span>$HTTP["host"] =~ "localhost" {
server.document-root = "/srv/demo/lighttpd"
dir-listing.encoding = "utf-8"
dir-listing.activate = "enable"
dir-listing.show-readme = "enable"
dir-listing.hide-readme-file = "enable"
dir-listing.show-header = "enable"
dir-listing.hide-header-file = "enable"
}
</pre></div>
<p>Et enfin, voyons le résultat :</p>
<img alt="" src="images/fancyindex-lighttpd/demo4.png" />
<p>Je suis HEADER.txt est bien affiché au dessus, et Je suis README.txt est bien affiché en dessous du listing.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Pour simplifier cet exemple, je n'ai pas utilisé la feuille de style.</p>
</div>
<div class="section" id="changer-completement-le-style-et-la-presentation">
<h3>Changer complètement le style et la présentation</h3>
<p>On commence à avoir l'habitude, c'est la 3e fois que je fais cette manip.</p>
<p>L'organisation des fichiers est identique à celle dans l'article de nginx.</p>
<p>Organisation des fichiers :</p>
<div class="highlight"><pre><span></span>Démo<span class="w"> </span><span class="m">5</span><span class="w"> </span>$<span class="w"> </span>tree<span class="w"> </span>-a
.
├──<span class="w"> </span>.cover.jpg
├──<span class="w"> </span>.footer.html
├──<span class="w"> </span>.head.html
├──<span class="w"> </span>.icons
│<span class="w"> </span>├──<span class="w"> </span>archive.svg
│<span class="w"> </span>├──<span class="w"> </span>cue.svg
│<span class="w"> </span>├──<span class="w"> </span>flac.svg
│<span class="w"> </span>├──<span class="w"> </span>folder.svg
│<span class="w"> </span>├──<span class="w"> </span>image.svg
│<span class="w"> </span>├──<span class="w"> </span>ogg.svg
│<span class="w"> </span>├──<span class="w"> </span>text.svg
│<span class="w"> </span>└──<span class="w"> </span>up.svg
├──<span class="w"> </span>.style.css
├──<span class="w"> </span>Ys2EMIDI.zip
├──<span class="w"> </span>Ys2-SC8820.cue
├──<span class="w"> </span>Ys2-SC8820.flac
└──<span class="w"> </span>Ys2-SC8820.ogg
<span class="m">1</span><span class="w"> </span>directory,<span class="w"> </span><span class="m">16</span><span class="w"> </span>files
</pre></div>
<p>Le contenu des fichiers <cite>.head.html</cite> et <cite>.footer.html</cite> est identique à la version nginx.</p>
<p>Contenu du fichier <cite>.head.html</cite> :</p>
<div class="highlight"><pre><span></span><span class="cp"><!DOCTYPE html></span>
<span class="p"><</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">"fr"</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"utf-8"</span> <span class="p">/></span>
<span class="p"><</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/css"</span> <span class="na">href</span><span class="o">=</span><span class="s">".style.css"</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">"viewport"</span> <span class="na">content</span><span class="o">=</span><span class="s">"width=device-width, initial-scale=1.0"</span><span class="p">></span>
<span class="p"><</span><span class="nt">title</span><span class="p">></span>ys2<span class="p"></</span><span class="nt">title</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys II Eternal (MIDI) - SC-88Pro - SC-8820<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">".cover.jpg"</span> <span class="p">/></span>
<span class="p"><</span><span class="nt">br</span> <span class="p">/></span>
</pre></div>
<p>Contenu du fichier <cite>.footer.html</cite> :</p>
<div class="highlight"><pre><span></span> <span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys2-SC8820.cue + flac : Version SC-88Pro enregistrée avec un Roland SC-8820. L'ensemble des pistes est dans un seul fichier flac, d'où la nécessité d'utiliser le fichier .cue comme TOC.<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys2-SC8820.ogg : Pareil que la version flac, mais réencodé/compressé en ogg/vorbis. Il faudra modifier le fichier .cue pour indiquer que le fichier audio est le fichier .ogg et non .flac<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>À noter : les nom des titres correspondent aux noms indiqués dans program.txt et ne correspondent pas forcément aux titres des albums.<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys2EMIDI.zip : contient l'ensemble de l'OST au format MIDI. Nécessite un Roland Sound Canvas SC-88, SC-88Pro, SC-8820, SC-8850 ou SC-D70<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">html</span><span class="p">></span>
</pre></div>
<p>la feuille de style contient les modifications spécifiques au formatage de lighttpd pour les icônes et le tableau.</p>
<div class="highlight"><pre><span></span><span class="nt">html</span><span class="w"> </span><span class="p">{</span>
<span class="k">font-family</span><span class="p">:</span><span class="w"> </span><span class="o">-</span><span class="n">apple-system</span><span class="p">,</span><span class="w"> </span><span class="n">BlinkMacSystemFont</span><span class="p">,</span><span class="w"> </span><span class="s2">"Segoe UI"</span><span class="p">,</span><span class="w"> </span><span class="n">Roboto</span><span class="p">,</span><span class="w"> </span><span class="s2">"Helvetica Neue"</span><span class="p">,</span><span class="w"> </span><span class="n">Arial</span><span class="p">,</span><span class="w"> </span><span class="s2">"Noto Sans"</span><span class="p">,</span><span class="w"> </span><span class="kc">sans-serif</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<span class="nt">body</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#4a4a4a</span><span class="p">;</span>
<span class="w"> </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="mh">#e9e9e9</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">text-decoration</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#2c8898</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="p">:</span><span class="nd">hover</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#982c61</span><span class="p">;</span>
<span class="w"> </span><span class="k">text-decoration</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span>
<span class="k">border-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="kc">solid</span><span class="w"> </span><span class="mh">#4a4a4a</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">img</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">height</span><span class="p">:</span><span class="w"> </span><span class="kc">auto</span><span class="p">;</span>
<span class="w"> </span><span class="k">max-width</span><span class="p">:</span><span class="w"> </span><span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
<span class="w"> </span><span class="k">margin-top</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="c">/* lighttpd */</span>
<span class="nt">table</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">margin-left</span><span class="p">:</span><span class="w"> </span><span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">th</span><span class="o">,</span><span class="w"> </span><span class="nt">td</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">text-align</span><span class="p">:</span><span class="w"> </span><span class="kc">left</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">th</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">font-weight</span><span class="p">:</span><span class="w"> </span><span class="kc">bold</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding-right</span><span class="p">:</span><span class="w"> </span><span class="mi">14</span><span class="kt">px</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">td</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">padding-right</span><span class="p">:</span><span class="w"> </span><span class="mi">14</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">td</span><span class="p">.</span><span class="nc">s</span><span class="o">,</span><span class="w"> </span><span class="nt">th</span><span class="p">.</span><span class="nc">s</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">text-align</span><span class="p">:</span><span class="w"> </span><span class="kc">right</span><span class="p">;</span>
<span class="p">}</span>
<span class="c">/* icônes */</span>
<span class="nt">a</span><span class="p">::</span><span class="nd">before</span><span class="p">{</span>
<span class="w"> </span><span class="k">content</span><span class="p">:</span><span class="s2">""</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding</span><span class="p">:</span><span class="w"> </span><span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/text.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">"/"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/folder.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">^=</span><span class="s2">".."</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/up.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".cue"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/cue.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".ogg"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/ogg.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".flac"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/flac.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".zip"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/archive.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="c">/* dark theme */</span>
<span class="p">@</span><span class="k">media</span><span class="w"> </span><span class="o">(</span><span class="nt">prefers-color-scheme</span><span class="o">:</span><span class="w"> </span><span class="nt">dark</span><span class="o">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">body</span><span class="o">,</span><span class="w"> </span><span class="nt">h1</span><span class="o">,</span><span class="w"> </span><span class="nt">h2</span><span class="o">,</span><span class="w"> </span><span class="nt">h3</span><span class="o">,</span><span class="w"> </span><span class="nt">h4</span><span class="o">,</span><span class="w"> </span><span class="nt">h5</span><span class="o">,</span><span class="w"> </span><span class="nt">h6</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#d9d8dc</span><span class="p">;</span>
<span class="w"> </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="mh">#222222</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="nt">a</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#eb99a1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="nt">a</span><span class="p">:</span><span class="nd">hover</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#DA4453</span><span class="p">;</span>
<span class="w"> </span><span class="k">border-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="kc">solid</span><span class="w"> </span><span class="mh">#d9d8dc</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Éditons le fichier de configuration pour indiquer d'utiliser les fichiers <cite>.footer.html</cite> et <cite>.head.html</cite>.</p>
<div class="highlight"><pre><span></span>$HTTP["host"] =~ "localhost" {
server.document-root = "/srv/demo/lighttpd"
dir-listing.encoding = "utf-8"
dir-listing.activate = "enable"
dir-listing.show-readme = ".footer.html"
dir-listing.show-header = ".head.html"
}
</pre></div>
<p>Un redémarrage de lighttpd plus tard, et … oups ! Il y a un problème.</p>
<img alt="" src="images/fancyindex-lighttpd/demo5.png" />
<p>Au lieu d'interpréter le code html de Header et de Footer, le navigateur a affiché le contenu.</p>
<p>Pour rappel, dans la liste des paramètres évoqués plus tôt, il y avait ceux-là :</p>
<ul class="simple">
<li><cite>dir-listing.encode-header</cite> : permet d'afficher tel-quel (sans interpréter) le code html présent dans HEADER.txt. Pour rendre interprétable par le navigateur web le code HTML écrit, il faut passer ce paramètre à <cite>disable</cite>.</li>
<li><cite>dir-listing.encode-readme</cite> : permet d'afficher tel-quel (sans interpréter) le code html présent dans README.txt. Pour rendre interprétable par le navigateur web le code HTML écrit, il faut passer ce paramètre à <cite>disable</cite>.</li>
<li><cite>dir-listing.auto-layout</cite> : permet de désactiver le template html par défaut de lighttpd. Cela permet d'utiliser du contenu html complet pour header et readme.</li>
</ul>
<p>Corrigeons le fichier de configuration.</p>
<div class="highlight"><pre><span></span>$HTTP["host"] =~ "localhost" {
server.document-root = "/srv/demo/lighttpd"
dir-listing.encoding = "utf-8"
dir-listing.activate = "enable"
dir-listing.show-readme = ".footer.html"
dir-listing.show-header = ".head.html"
dir-listing.auto-layout = "disable"
dir-listing.encode-header = "disable"
dir-listing.encode-readme = "disable"
}
</pre></div>
<p>Une fois corrigé, l'affichage est celui attendu, même si légèrement différent de Apache httpd et nginx.</p>
<p>Thème clair</p>
<img alt="" src="images/fancyindex-lighttpd/demo5-2.png" />
<p>Thème sombre</p>
<img alt="" src="images/fancyindex-lighttpd/demo5-dark.png" />
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Tout comme avec Apache httpd et nginx, on peut modifier complètement la présentation d'un listing de fichiers avec lighttpd.</p>
</div>
Fancy index, version nginx2022-05-15T00:00:00+02:002022-05-15T00:00:00+02:00alextag:blog.chibi-nah.fr,2022-05-15:/fancy-index-nginx<div class="section" id="introduction">
<h2>Introduction</h2>
<p>Nous avions vu précédemment comment utiliser fancy-index avec Apache httpd. Voyons maintenant comment procéder avec nginx.</p>
<p>Tout d'abord, nginx ne supporte pas nativement<sup id="sf-fancy-index-nginx-1-back"><a href="#sf-fancy-index-nginx-1" class="simple-footnote" title="Peut être que c'est supporté via un module… flemme de chercher">1</a></sup> les fichiers .htaccess. Le paramétrage de fancy index se fait donc dans le paramétrage du site ou du vhost.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Le site web fonctionnant avec …</p></div></div><div class="section" id="introduction">
<h2>Introduction</h2>
<p>Nous avions vu précédemment comment utiliser fancy-index avec Apache httpd. Voyons maintenant comment procéder avec nginx.</p>
<p>Tout d'abord, nginx ne supporte pas nativement<sup id="sf-fancy-index-nginx-1-back"><a href="#sf-fancy-index-nginx-1" class="simple-footnote" title="Peut être que c'est supporté via un module… flemme de chercher">1</a></sup> les fichiers .htaccess. Le paramétrage de fancy index se fait donc dans le paramétrage du site ou du vhost.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Le site web fonctionnant avec Apache, il n'y aura pas de démos.</p>
</div>
</div>
<div class="section" id="sans-fancy-index">
<h2>Sans Fancy Index</h2>
<p>En utilisant la directive <cite>autoindex on</cite>, la liste des fichiers apparaît alors.</p>
<img alt="" src="images/fancyindex-nginx/demo1.png">
<p>Configuration de nginx :</p>
<div class="highlight"><pre><span></span>server {
listen 80;
listen [::]:80;
charset UTF-8;
location / {
root /srv/demo/nginx;
autoindex on;
}
}
</pre></div>
</div>
<div class="section" id="avec-fancy-index">
<h2>Avec Fancy Index</h2>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Penser à installer le module http-fancyindex. Sous Debian et dérivées, c'est le paquet libnginx-mod-http-fancyindex</p>
</div>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Redémarrer le service nginx après chaque modification du fichier de configuration.</p>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Ici, le fichier de configuration du site est /etc/nginx/sites-enabled/001-demo.conf</p>
</div>
<p>Remplaçons <cite>autoindex</cite> par <cite>fancyindex</cite>.</p>
<p>Configuration de nginx :</p>
<div class="highlight"><pre><span></span>server {
listen 80;
listen [::]:80;
charset UTF-8;
location / {
root /srv/demo/nginx;
fancyindex on;
}
}
</pre></div>
<p>Résultat ?</p>
<img alt="" src="images/fancyindex-nginx/demo2.png">
<p>Le style a effectivement changé, et c'est nettement plus flagrant ici comparé à Apache httpd.</p>
</div>
<div class="section" id="options-de-fancy-index">
<h2>Options de Fancy Index</h2>
<p>Pour la liste de toutes les options, se référer à la page de documentation officielle sur le site nginx :</p>
<p><a class="reference external" href="https://www.nginx.com/resources/wiki/modules/fancy_index/">https://www.nginx.com/resources/wiki/modules/fancy_index/</a></p>
<p>Bon, comparé à Apache httpd, la liste des options est réduite.</p>
<p>Les options sont :</p>
<ul class="simple">
<li><cite>fancyindex</cite> (on|off) : activation/désactivation de fancy index ;</li>
<li><cite>fancyindex_css_href uri</cite> : uri = chemin vers le fichier .css ;</li>
<li><cite>fancyindex_exact_size</cite> (on|off) : affichage précis ou arrondie (au ko, Mo ou Go) de la taille des fichiers ;</li>
<li><cite>fancyindex_footer</cite> uri : chemin vers le fichier .html (cela peut être une URL externe) contenant la partie basse de la page (pied de page) ;</li>
<li><cite>fancyindex_header</cite> : chemin vers le fichier .html (cela peut être une URL externe) contenant la partie haute de la page (entête de page) ;</li>
<li><cite>fancyindex_ignore</cite> fichier1 fichier2 … : liste de fichiers à ne pas afficher dans la liste. Si nginx a été compilé avec le support des expressions régulières (PCRE), il est alors possible d'utiliser des regex pour spécifier la liste des fichiers à ignorer ;</li>
<li><cite>fancyindex_localtime</cite> (on|off) : affichage de l'heure locale ou UTC.</li>
</ul>
</div>
<div class="section" id="ajouter-des-icones">
<h2>Ajouter des icônes</h2>
<p>Les icônes utilisées ici pour l'exemple proviennent du thème Red Dot Black Plasma <a class="reference external" href="https://github.com/L4ki/Red-Dot-Black-Plasma-Themes">https://github.com/L4ki/Red-Dot-Black-Plasma-Themes</a></p>
<p>Créer un répertoire icons, faire une petite sélection d'icônes, les appeler</p>
<ul class="simple">
<li>archive.svg</li>
<li>cue.svg</li>
<li>flac.svg</li>
<li>folder.svg</li>
<li>image.svg</li>
<li>ogg.svg</li>
<li>text.svg</li>
<li>up.svg</li>
</ul>
<p>Oui, c'est du copier/coller de l'article Fancy index (Apache httpd) :)</p>
<p>L'une des différences avec Apache httpd, il n'y a pas d'icônes d'affichées avec nginx. Il n'y a pas non plus de directive ou de paramètre pour spécifier des icônes.</p>
<p>Pas grave, on va les ajouter dynamiquement, via une feuille de style :)</p>
<p>Créer un fichier <cite>style.css</cite>, avec ce contenu :</p>
<div class="highlight"><pre><span></span><span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="p">.</span><span class="nc">link</span><span class="w"> </span><span class="nt">a</span><span class="p">::</span><span class="nd">before</span><span class="p">{</span>
<span class="w"> </span><span class="k">content</span><span class="p">:</span><span class="s2">""</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding</span><span class="p">:</span><span class="w"> </span><span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/text.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">"/"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/folder.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">^=</span><span class="s2">".."</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/up.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".cue"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/cue.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".ogg"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/ogg.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".flac"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/flac.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".zip"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'icons/archive.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">On peut ajouter d'autres icônes et extensions, ou utiliser des règles css différentes.</p>
</div>
<p>Ajouter dans la configuration du site, le paramètre <cite>fancyindex_css_href "style.css";</cite>. Le fichier devrait ressembler à ceci :</p>
<div class="highlight"><pre><span></span>server {
listen 80;
listen [::]:80;
charset UTF-8;
location / {
root /srv/demo/nginx;
fancyindex on;
fancyindex_css_href "style.css";
}
}
</pre></div>
<p>Résultat ?</p>
<img alt="" src="images/fancyindex-nginx/demo3.png">
<div class="section" id="changer-completement-le-style-et-la-presentation">
<h3>Changer complètement le style et la présentation</h3>
<p>Pour les personnes ayant lu l'article fancy index (avec Apache httpd), ce qui suit ne sera pas une surprise. Cela fonctionne quasiment de la même manière. Du coup, je n'entrerai pas dans les détails.</p>
<p>Organisation des fichiers :</p>
<div class="highlight"><pre><span></span>Démo<span class="w"> </span><span class="m">4</span><span class="w"> </span>$<span class="w"> </span>tree<span class="w"> </span>-a
.
├──<span class="w"> </span>.cover.jpg
├──<span class="w"> </span>.footer.html
├──<span class="w"> </span>.head.html
├──<span class="w"> </span>.icons
│<span class="w"> </span>├──<span class="w"> </span>archive.svg
│<span class="w"> </span>├──<span class="w"> </span>cue.svg
│<span class="w"> </span>├──<span class="w"> </span>flac.svg
│<span class="w"> </span>├──<span class="w"> </span>folder.svg
│<span class="w"> </span>├──<span class="w"> </span>image.svg
│<span class="w"> </span>├──<span class="w"> </span>ogg.svg
│<span class="w"> </span>├──<span class="w"> </span>text.svg
│<span class="w"> </span>└──<span class="w"> </span>up.svg
├──<span class="w"> </span>.style.css
├──<span class="w"> </span>Ys2EMIDI.zip
├──<span class="w"> </span>Ys2-SC8820.cue
├──<span class="w"> </span>Ys2-SC8820.flac
└──<span class="w"> </span>Ys2-SC8820.ogg
<span class="m">1</span><span class="w"> </span>directory,<span class="w"> </span><span class="m">16</span><span class="w"> </span>files
</pre></div>
<p>La seule différence ici, c'est l'absence de fichier <cite>.htaccess</cite>.</p>
<p>Le contenu des fichiers <cite>.head.html</cite> et <cite>.footer.html</cite> est identique à la version Apache httpd, excepté un saut de ligne via <cite><br /></cite> après l'image ajouté dans <cite>.head.html</cite>.</p>
<p>Contenu du fichier <cite>.head.html</cite> :</p>
<div class="highlight"><pre><span></span><span class="cp"><!DOCTYPE html></span>
<span class="p"><</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">"fr"</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"utf-8"</span> <span class="p">/></span>
<span class="p"><</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/css"</span> <span class="na">href</span><span class="o">=</span><span class="s">".style.css"</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">"viewport"</span> <span class="na">content</span><span class="o">=</span><span class="s">"width=device-width, initial-scale=1.0"</span><span class="p">></span>
<span class="p"><</span><span class="nt">title</span><span class="p">></span>ys2<span class="p"></</span><span class="nt">title</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys II Eternal (MIDI) - SC-88Pro - SC-8820<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">".cover.jpg"</span> <span class="p">/></span>
<span class="p"><</span><span class="nt">br</span> <span class="p">/></span>
</pre></div>
<p>Contenu du fichier <cite>.footer.html</cite> :</p>
<div class="highlight"><pre><span></span> <span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys2-SC8820.cue + flac : Version SC-88Pro enregistrée avec un Roland SC-8820. L'ensemble des pistes est dans un seul fichier flac, d'où la nécessité d'utiliser le fichier .cue comme TOC.<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys2-SC8820.ogg : Pareil que la version flac, mais réencodé/compressé en ogg/vorbis. Il faudra modifier le fichier .cue pour indiquer que le fichier audio est le fichier .ogg et non .flac<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>À noter : les nom des titres correspondent aux noms indiqués dans program.txt et ne correspondent pas forcément aux titres des albums.<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys2EMIDI.zip : contient l'ensemble de l'OST au format MIDI. Nécessite un Roland Sound Canvas SC-88, SC-88Pro, SC-8820, SC-8850 ou SC-D70<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">html</span><span class="p">></span>
</pre></div>
<p>La feuille de style <cite>.style.css</cite> contient quelques modifications. En effet, il faut ajouter les icônes pour nginx :</p>
<div class="highlight"><pre><span></span><span class="nt">html</span><span class="w"> </span><span class="p">{</span>
<span class="k">font-family</span><span class="p">:</span><span class="w"> </span><span class="o">-</span><span class="n">apple-system</span><span class="p">,</span><span class="w"> </span><span class="n">BlinkMacSystemFont</span><span class="p">,</span><span class="w"> </span><span class="s2">"Segoe UI"</span><span class="p">,</span><span class="w"> </span><span class="n">Roboto</span><span class="p">,</span><span class="w"> </span><span class="s2">"Helvetica Neue"</span><span class="p">,</span><span class="w"> </span><span class="n">Arial</span><span class="p">,</span><span class="w"> </span><span class="s2">"Noto Sans"</span><span class="p">,</span><span class="w"> </span><span class="kc">sans-serif</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<span class="nt">body</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#4a4a4a</span><span class="p">;</span>
<span class="w"> </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="mh">#e9e9e9</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">text-decoration</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#2c8898</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="p">:</span><span class="nd">hover</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#982c61</span><span class="p">;</span>
<span class="w"> </span><span class="k">text-decoration</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span>
<span class="k">border-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="kc">solid</span><span class="w"> </span><span class="mh">#4a4a4a</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">img</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">height</span><span class="p">:</span><span class="w"> </span><span class="kc">auto</span><span class="p">;</span>
<span class="w"> </span><span class="k">max-width</span><span class="p">:</span><span class="w"> </span><span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
<span class="w"> </span><span class="k">margin-top</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="c">/* Icons */</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="p">.</span><span class="nc">link</span><span class="w"> </span><span class="nt">a</span><span class="p">::</span><span class="nd">before</span><span class="p">{</span>
<span class="w"> </span><span class="k">content</span><span class="p">:</span><span class="s2">""</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding</span><span class="p">:</span><span class="w"> </span><span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/text.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">"/"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/folder.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">^=</span><span class="s2">".."</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/up.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".cue"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/cue.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".ogg"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/ogg.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".flac"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/flac.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">#</span><span class="nn">list</span><span class="w"> </span><span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">$=</span><span class="s2">".zip"</span><span class="o">]</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="nb">url</span><span class="p">(</span><span class="s1">'.icons/archive.svg'</span><span class="p">)</span><span class="w"> </span><span class="kc">left</span><span class="w"> </span><span class="kc">center</span><span class="w"> </span><span class="kc">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
<span class="c">/* dark theme */</span>
<span class="p">@</span><span class="k">media</span><span class="w"> </span><span class="o">(</span><span class="nt">prefers-color-scheme</span><span class="o">:</span><span class="w"> </span><span class="nt">dark</span><span class="o">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">body</span><span class="o">,</span><span class="w"> </span><span class="nt">h1</span><span class="o">,</span><span class="w"> </span><span class="nt">h2</span><span class="o">,</span><span class="w"> </span><span class="nt">h3</span><span class="o">,</span><span class="w"> </span><span class="nt">h4</span><span class="o">,</span><span class="w"> </span><span class="nt">h5</span><span class="o">,</span><span class="w"> </span><span class="nt">h6</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#d9d8dc</span><span class="p">;</span>
<span class="w"> </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="mh">#222222</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="nt">a</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#eb99a1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="nt">a</span><span class="p">:</span><span class="nd">hover</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#DA4453</span><span class="p">;</span>
<span class="w"> </span><span class="k">border-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="kc">solid</span><span class="w"> </span><span class="mh">#d9d8dc</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Ajouter dans la configuration du site les paramètres <cite>fancyindex_header</cite> et <cite>fancyindex_footer</cite>. Le fichier devrait ressembler à ceci :</p>
<div class="highlight"><pre><span></span>server {
listen 80;
listen [::]:80;
charset UTF-8;
location / {
root /srv/demo/nginx;
fancyindex on;
fancyindex_css_href ".style.css";
fancyindex_header ".head.html";
fancyindex_footer ".footer.html";
}
}
</pre></div>
<p>La présentation est toutefois un peu différente de celle obtenue avec Apache httpd.</p>
<p>Thème clair</p>
<img alt="" src="images/fancyindex-nginx/demo4.png">
<p>Thème sombre</p>
<img alt="" src="images/fancyindex-nginx/demo4-dark.png">
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Tout comme avec Apache httpd, on peut modifier complètement la présentation d'un listing de fichiers avec nginx.</p>
<p>--</p>
</div>
<ol class="simple-footnotes"><li id="sf-fancy-index-nginx-1">Peut être que c'est supporté via un module… flemme de chercher <a href="#sf-fancy-index-nginx-1-back" class="simple-footnote-back">↩</a></li></ol>Fancy index, ou comment afficher une liste de fichiers de manière classe2022-04-17T00:00:00+02:002022-04-17T00:00:00+02:00alextag:blog.chibi-nah.fr,2022-04-17:/fancy-index<div class="section" id="introduction">
<h2>Introduction</h2>
<p>Il faut dire ce qu'il est. Par défaut, la liste des fichiers et répertoires présentés par Apache httpd<sup id="sf-fancy-index-1-back"><a href="#sf-fancy-index-1" class="simple-footnote" title="httpd est le nom officiel du serveur web de la fondation Apache. Cependant, la plupart des gens, moi-même compris, parlent de Apache et non Apache httpd.">1</a></sup> est vieillot, pas attirant, etc<sup id="sf-fancy-index-2-back"><a href="#sf-fancy-index-2" class="simple-footnote" title="Avis personnel et tout à fait subjectif.">2</a></sup>.</p>
<img alt="" src="images/fancyIndex/demo1.png">
<p>Comment faire pour modifier simplement et facilement cette présentation ?</p>
<p>La solution s'appelle Fancy Index.</p>
<p>Diponible depuis longtemps avec Apache<sup id="sf-fancy-index-3-back"><a href="#sf-fancy-index-3" class="simple-footnote" title="Depuis… bonne question en fait. C'était déjà présent dans la version 1.3, sortie en juin 1998, si j'en crois cette page de documentation : http://users.polytech.unice.fr/~buffa/cours/internet98/apache/apache_1.3b3/htdocs/manual/mod/mod_autoindex.html ">3</a></sup>, c'est une option à …</p></div><div class="section" id="introduction">
<h2>Introduction</h2>
<p>Il faut dire ce qu'il est. Par défaut, la liste des fichiers et répertoires présentés par Apache httpd<sup id="sf-fancy-index-1-back"><a href="#sf-fancy-index-1" class="simple-footnote" title="httpd est le nom officiel du serveur web de la fondation Apache. Cependant, la plupart des gens, moi-même compris, parlent de Apache et non Apache httpd.">1</a></sup> est vieillot, pas attirant, etc<sup id="sf-fancy-index-2-back"><a href="#sf-fancy-index-2" class="simple-footnote" title="Avis personnel et tout à fait subjectif.">2</a></sup>.</p>
<img alt="" src="images/fancyIndex/demo1.png">
<p>Comment faire pour modifier simplement et facilement cette présentation ?</p>
<p>La solution s'appelle Fancy Index.</p>
<p>Diponible depuis longtemps avec Apache<sup id="sf-fancy-index-3-back"><a href="#sf-fancy-index-3" class="simple-footnote" title="Depuis… bonne question en fait. C'était déjà présent dans la version 1.3, sortie en juin 1998, si j'en crois cette page de documentation : http://users.polytech.unice.fr/~buffa/cours/internet98/apache/apache_1.3b3/htdocs/manual/mod/mod_autoindex.html ">3</a></sup>, c'est une option à activer, soit dans la configuration du site (ou du vhost), soit directement dans le répertoire voulu, en modifiant le fichier <cite>.htaccess</cite>.</p>
<p>Dans cet article, on modifiera le fichier <cite>.htaccess</cite> ; cela sera plus simple.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">(corrigé le 23 mai 2022) Le module Fancy Index existe également pour Nginx, et un truc similaire existe pour lighttpd. Deux articles ont été publiés, un pour nginx, l'autre pour lighttpd.</p>
</div>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Toute erreur dans le fichier .htaccess se traduira par une erreur 500. Ne pas hésiter à commenter les lignes sur lesquels on peut avoir un doute en utilisant le symbole #</p>
</div>
<p>Les démos indiquées dans cet article sont accessibles ici :</p>
<p><a class="reference external" href="https://blog.chibi-nah.fr/images/fancy-index/">https://blog.chibi-nah.fr/images/fancy-index/</a></p>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Les fichiers présents sont fictifs, et donnés uniquement pour exemple.</p>
</div>
</div>
<div class="section" id="sans-fancy-index">
<h2>Sans Fancy Index</h2>
<p>Cela se passe de commentaires.</p>
<img alt="" src="images/fancyIndex/demo1.png">
<p>Cette présentation est celle par défaut, que l'on voit un peu partout, sans formatage spécifique.</p>
<p>Exemple réel : <a class="reference external" href="https://blog.chibi-nah.fr/images/fancy-index/Démo%201">Démo 1</a></p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p>Selon la configuration du site, il est possible qu'un message d'erreur apparaisse à la place des fichiers.</p>
<p class="last">Vérifier que la configuration du site a bien l'option <cite>Indexes</cite> activée, sinon créer un fichier <cite>.htaccess</cite> et ajouter dedans <cite>Options +Indexes</cite> dans le répertoire contenant la liste des fichiers à afficher.</p>
</div>
</div>
<div class="section" id="avec-fancy-index">
<h2>Avec Fancy Index</h2>
<p>Créons un fichier <cite>.htaccess</cite> dans le répertoire, et dedans, ajoutons :</p>
<div class="highlight"><pre><span></span>Options +Indexes
IndexOptions +FancyIndexing
</pre></div>
<p>Ici, <cite>IndexOptions +FancyIndexing</cite> sert à activer Fancy Index.</p>
<p>Voyons maintenant le résultat.</p>
<img alt="" src="images/fancyIndex/demo2.png">
<p>Mmm, pas terrible en fait.</p>
<p>La police de caractère et la taille du texte ont un peu changé. Mais c'est tout.</p>
<p>Exemple réel : <a class="reference external" href="https://blog.chibi-nah.fr/images/fancy-index/Démo%202">Démo 2</a></p>
</div>
<div class="section" id="options-de-fancy-index">
<h2>Options de Fancy Index</h2>
<p>Pour la liste de toutes les options, se référer à la page de documentation officielle sur le site Apache httpd :</p>
<p><a class="reference external" href="https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html">https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html</a></p>
<p>Dans cet article, on ne verra pas toutes les options possibles (cela ne présenterait que peu d'intérêt).</p>
<p>Voyons les plus simples et celles qui semblent les plus utiles.</p>
<div class="section" id="changer-les-icones">
<h3>Changer les icônes</h3>
<p>Pour changer les icônes, rien de compliqué. Il faut, des icônes, et modifier le fichier .htaccess.</p>
<p>Les icônes utilisées ici pour l'exemple proviennent du thème Red Dot Black Plasma <a class="reference external" href="https://github.com/L4ki/Red-Dot-Black-Plasma-Themes">https://github.com/L4ki/Red-Dot-Black-Plasma-Themes</a></p>
<p>Créer un répertoire icons, faire une petite sélection d'icônes, les appeler</p>
<ul class="simple">
<li>archive.svg</li>
<li>cue.svg</li>
<li>flac.svg</li>
<li>folder.svg</li>
<li>image.svg</li>
<li>ogg.svg</li>
<li>text.svg</li>
<li>up.svg</li>
</ul>
<p>Ensuite, dans le fichier .htaccess, insérer les lignes suivantes :</p>
<div class="highlight"><pre><span></span>Options +Indexes
IndexOptions +FancyIndexing +FoldersFirst
DefaultIcon icons/text.svg
AddIcon icons/folder.svg ^^DIRECTORY^^
AddIcon icons/up.svg ..
AddIcon icons/cue.svg .cue
AddIcon icons/image.svg .png .jpg .jpeg .svg
AddIcon icons/text.svg .txt
AddIcon icons/archive.svg .zip
AddIcon icons/flac.svg .flac
AddIcon icons/ogg.svg .ogg
</pre></div>
<p>Ici, <cite>+FoldersFirst</cite> indique que l'on veut que les répertoires apparaissent en premier</p>
<p><cite>DefaultIcon`</cite> indique l'icône qui sera utilisée par défaut. Ici, il s'agit de <cite>text.svg</cite>.</p>
<p><cite>AddIcon</cite> indique que l'icône <icons/truc.svg> sera utilisée pour les fichiers dont l'extension se termine par <extension>.</p>
<p>Par exemple <cite>AddIcon icons/cue.svg</cite> sera utilisé pour tous les fichiers <cite>.cue</cite>.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p>On peut utiliser plusieurs extensions pour la même icône.</p>
<p class="last">Par exemple AddIcon icons/image.svg .png .jpg .jpeg .svg</p>
</div>
<p>Cependant, il y a une blague ici. Comment peut-on définir une icône pour les répertoires, vu qu'il n'y a pas d'extension et que le nom du répertoire peut ne pas être connu à l'avance ?</p>
<p>Heureusement, Apache httpd propose la valeur <cite>^^DIRECTORY^^</cite>. Utiliser cette valeur pour l'icône du répertoire.</p>
<p>Voilà ce que cela donne :</p>
<img alt="" src="images/fancyIndex/demo3.png">
<p>Exemple réel : <a class="reference external" href="https://blog.chibi-nah.fr/images/fancy-index/Démo%203">Démo 3</a></p>
</div>
<div class="section" id="changer-completement-le-style-et-la-presentation">
<h3>Changer complètement le style et la présentation</h3>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Attention les yeux !</p>
</div>
<p>Là, on peut voir à quel point on peut complètement changer la présentation de la page.</p>
<p>Contrairement aux exemples précédents, je vais montrer directement le résultat, et après, expliquer comment j'ai fait.</p>
<p>Thème clair</p>
<img alt="" src="images/fancyIndex/demo4.png">
<p>Thème sombre</p>
<img alt="" src="images/fancyIndex/demo4-dark.png">
<p>Le côté rigolo ? Le thème s'adapte en fonction des préférences définies côté navigateur ou côté système d'exploitation<sup id="sf-fancy-index-4-back"><a href="#sf-fancy-index-4" class="simple-footnote" title="En fait, rien de magique, c'est juste une règle CSS 3 qui gère ça.">4</a></sup>.</p>
<p>Exemple réel : <a class="reference external" href="https://blog.chibi-nah.fr/images/fancy-index/Démo%204">Démo 4</a></p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Comme j'utilise ici une feuille de style similaire à celle du blog, le fond et le texte apparaissent de la même couleur sur la capture d'écran et dans la page d'exemple.</p>
</div>
<p>Organisation des fichiers :</p>
<div class="highlight"><pre><span></span>Démo<span class="w"> </span><span class="m">4</span><span class="w"> </span>$<span class="w"> </span>tree<span class="w"> </span>-a
.
├──<span class="w"> </span>.cover.jpg
├──<span class="w"> </span>.footer.html
├──<span class="w"> </span>.head.html
├──<span class="w"> </span>.htaccess
├──<span class="w"> </span>.icons
│<span class="w"> </span>├──<span class="w"> </span>archive.svg
│<span class="w"> </span>├──<span class="w"> </span>cue.svg
│<span class="w"> </span>├──<span class="w"> </span>flac.svg
│<span class="w"> </span>├──<span class="w"> </span>folder.svg
│<span class="w"> </span>├──<span class="w"> </span>image.svg
│<span class="w"> </span>├──<span class="w"> </span>ogg.svg
│<span class="w"> </span>├──<span class="w"> </span>text.svg
│<span class="w"> </span>└──<span class="w"> </span>up.svg
├──<span class="w"> </span>.style.css
├──<span class="w"> </span>Ys2EMIDI.zip
├──<span class="w"> </span>Ys2-SC8820.cue
├──<span class="w"> </span>Ys2-SC8820.flac
└──<span class="w"> </span>Ys2-SC8820.ogg
<span class="m">1</span><span class="w"> </span>directory,<span class="w"> </span><span class="m">17</span><span class="w"> </span>files
</pre></div>
<dl class="docutils">
<dt>Dans le répertoire démo 4, le répertoire contenant les icônes a été nommé <cite>.icons</cite> <sup id="sf-fancy-index-5-back"><a href="#sf-fancy-index-5" class="simple-footnote" title="La présence d'un point devant un fichier ou un répertoire indique sur tout système Unix/Linux que ce fichier ou répertoire doit être caché.">5</a></sup>.</dt>
<dd>Dans ce répertoire, j'ai placé les icônes listées plus haut, même si toutes<sup id="sf-fancy-index-6-back"><a href="#sf-fancy-index-6" class="simple-footnote" title="tourte !">6</a></sup> ne seront pas utilisées.</dd>
</dl>
<p>Ensuite, j'ai créé une feuille de style simple, enregistrée à la racine du répertoire, et nommée <cite>.style.css</cite>.</p>
<div class="highlight"><pre><span></span><span class="nt">html</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">font-family</span><span class="p">:</span><span class="w"> </span><span class="o">-</span><span class="n">apple-system</span><span class="p">,</span><span class="w"> </span><span class="n">BlinkMacSystemFont</span><span class="p">,</span><span class="w"> </span><span class="s2">"Segoe UI"</span><span class="p">,</span><span class="w"> </span><span class="n">Roboto</span><span class="p">,</span><span class="w"> </span><span class="s2">"Helvetica Neue"</span><span class="p">,</span><span class="w"> </span><span class="n">Arial</span><span class="p">,</span><span class="w"> </span><span class="s2">"Noto Sans"</span><span class="p">,</span><span class="w"> </span><span class="kc">sans-serif</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">body</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#4a4a4a</span><span class="p">;</span>
<span class="w"> </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="mh">#e9e9e9</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">text-decoration</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#2c8898</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="p">:</span><span class="nd">hover</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#982c61</span><span class="p">;</span>
<span class="w"> </span><span class="k">text-decoration</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span>
<span class="w"> </span><span class="k">border-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="kc">solid</span><span class="w"> </span><span class="mh">#4a4a4a</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">img</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">height</span><span class="p">:</span><span class="w"> </span><span class="kc">auto</span><span class="p">;</span>
<span class="w"> </span><span class="k">max-width</span><span class="p">:</span><span class="w"> </span><span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
<span class="w"> </span><span class="k">margin-top</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="c">/* dark theme */</span>
<span class="p">@</span><span class="k">media</span><span class="w"> </span><span class="o">(</span><span class="nt">prefers-color-scheme</span><span class="o">:</span><span class="w"> </span><span class="nt">dark</span><span class="o">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">body</span><span class="o">,</span><span class="w"> </span><span class="nt">h1</span><span class="o">,</span><span class="w"> </span><span class="nt">h2</span><span class="o">,</span><span class="w"> </span><span class="nt">h3</span><span class="o">,</span><span class="w"> </span><span class="nt">h4</span><span class="o">,</span><span class="w"> </span><span class="nt">h5</span><span class="o">,</span><span class="w"> </span><span class="nt">h6</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#d9d8dc</span><span class="p">;</span>
<span class="w"> </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="mh">#222222</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="nt">a</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#eb99a1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="nt">a</span><span class="p">:</span><span class="nd">hover</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="mh">#DA4453</span><span class="p">;</span>
<span class="w"> </span><span class="k">border-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="kc">solid</span><span class="w"> </span><span class="mh">#d9d8dc</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Puis, ajout d'une image d'illustration, appelée <cite>.cover.jpg</cite>.</p>
<p>Ensuite, création des deux fichiers html, un appelé <cite>.head.html</cite> contenant la déclaration html, les entête…, et un appelé <cite>.footer.html</cite>, contenant la fin.</p>
<p>Contenu du fichier <cite>.head.html</cite> :</p>
<div class="highlight"><pre><span></span><span class="cp"><!DOCTYPE html></span>
<span class="p"><</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">"fr"</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"utf-8"</span> <span class="p">/></span>
<span class="p"><</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/css"</span> <span class="na">href</span><span class="o">=</span><span class="s">".style.css"</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">"viewport"</span> <span class="na">content</span><span class="o">=</span><span class="s">"width=device-width, initial-scale=1.0"</span><span class="p">></span>
<span class="p"><</span><span class="nt">title</span><span class="p">></span>ys2<span class="p"></</span><span class="nt">title</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys II Eternal (MIDI) - SC-88Pro - SC-8820<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">".cover.jpg"</span> <span class="p">/></span>
</pre></div>
<p>Contenu du fichier <cite>.footer.html</cite> :</p>
<div class="highlight"><pre><span></span> <span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys2-SC8820.cue + flac : Version SC-88Pro enregistrée avec un Roland SC-8820. L'ensemble des pistes est dans un seul fichier flac, d'où la nécessité d'utiliser le fichier .cue comme TOC.<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys2-SC8820.ogg : Pareil que la version flac, mais réencodé/compressé en ogg/vorbis. Il faudra modifier le fichier .cue pour indiquer que le fichier audio est le fichier .ogg et non .flac<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>À noter : les nom des titres correspondent aux noms indiqués dans program.txt et ne correspondent pas forcément aux titres des albums.<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>Ys2EMIDI.zip : contient l'ensemble de l'OST au format MIDI. Nécessite un Roland Sound Canvas SC-88, SC-88Pro, SC-8820, SC-8850 ou SC-D70<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">html</span><span class="p">></span>
</pre></div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Apache httpd insère automatiquement la liste des fichiers entre ces deux fichiers .html. Cela signifie que si on fusionne les deux fichiers html en un seul, le contenu doit être valide.</p>
</div>
<p>Enfin, reste le fichier <cite>.htaccess</cite>.</p>
<div class="highlight"><pre><span></span>Options +Indexes
IndexOptions +FancyIndexing +SuppressColumnSorting +SuppressLastModified +SuppressSize +htmltable +SuppressHTMLPreamble
HeaderName .head.html
ReadmeName .footer.html
IndexIgnore ..
# Icones
DefaultIcon .icons/text.svg
AddIcon .icons/folder.svg ^^DIRECTORY^^
AddIcon .icons/up.svg ..
AddIcon .icons/cue.svg .cue
AddIcon .icons/image.svg .png .jpg .jpeg .svg
AddIcon .icons/text.svg .txt
AddIcon .icons/archive.svg .zip
AddIcon .icons/flac.svg .flac
AddIcon .icons/ogg.svg .ogg
#description
AddDescription "Archive contenant les pistes MIDI" "Ys2EMIDI.zip"
AddDescription "Liste de lecture au format CUE" "Ys2-SC8820.cue"
AddDescription "Fichier audio FLAC" "Ys2-SC8820.flac"
AddDescription "Fichier audio OGG/Vorbis" "Ys2-SC8820.ogg"
</pre></div>
<p>Là, on se rend compte que des éléments ont été ajoutés.</p>
<p>Commençons par <cite>IndexOptions</cite></p>
<ul class="simple">
<li><cite>+SuppressColumnSorting</cite> : retire le tri des colonnes</li>
<li><cite>+SuppressLastModified</cite> : retire la colonne <cite>Date de dernière modification</cite></li>
<li><cite>+SuppressSize</cite> : retire la colonne <cite>taille du fichier</cite></li>
<li><cite>+htmltable</cite> : utilise une vraie table html et non des balises <pre></pre> pour afficher la liste des fichiers</li>
<li><cite>+SuppressHTMLPreamble</cite> : supprime l'entête html générée par Apache</li>
</ul>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Comme il n'y a pas de répertoire ici, l'option <cite>+FoldersFirst</cite> n'a pas été utilisée ici</p>
</div>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">N'oubliez pas le symbole + devant les paramètres pour les activer.</p>
</div>
<p>Ensuite.</p>
<ul class="simple">
<li><cite>HeaderName .head.html</cite> : nom du fichier html, partie du haut.</li>
<li><cite>ReadmeName .footer.html</cite> : nom du fichier html, partie du bas.</li>
<li><cite>IndexIgnore ..</cite> : indique que le répertoire <cite>..</cite> doit être masqué.</li>
</ul>
<p>Concernant les icônes, peu de changements. Seul leur emplacement a été modifié, le répertoire contenant les images s'appelant ici <cite>.icons</cite>.</p>
<p>Et enfin, la description des fichiers.</p>
<p>Prenons par exemple <cite>AddDescription "Archive contenant les pistes MIDI" "Ys2EMIDI.zip"</cite>, ici, "Archive contenant les pistes MIDI" correspond à la description, et "Ys2EMIDI.zip" correspond au nom du fichier.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">On peut utiliser l'extension .zip pour donner la même description à tous les fichiers .zip.</p>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">On peut également décrire des répertoires.</p>
</div>
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Cet article n'a pas la prétention d'être pleinement exhaustif concernant toutes les possibilités offertes par Fancy Index. Cependant, je pense que la démo 4 montre vraiment ce qu'il est possible de faire avec ce module Apache httpd.</p>
<p>--</p>
</div>
<ol class="simple-footnotes"><li id="sf-fancy-index-1">httpd est le nom officiel du serveur web de la fondation Apache. Cependant, la plupart des gens, moi-même compris, parlent de Apache et non Apache httpd. <a href="#sf-fancy-index-1-back" class="simple-footnote-back">↩</a></li><li id="sf-fancy-index-2">Avis personnel et tout à fait subjectif. <a href="#sf-fancy-index-2-back" class="simple-footnote-back">↩</a></li><li id="sf-fancy-index-3">Depuis… bonne question en fait. C'était déjà présent dans la version 1.3, sortie en juin 1998, si j'en crois cette page de documentation : <a class="reference external" href="http://users.polytech.unice.fr/~buffa/cours/internet98/apache/apache_1.3b3/htdocs/manual/mod/mod_autoindex.html">http://users.polytech.unice.fr/~buffa/cours/internet98/apache/apache_1.3b3/htdocs/manual/mod/mod_autoindex.html</a> <a href="#sf-fancy-index-3-back" class="simple-footnote-back">↩</a></li><li id="sf-fancy-index-4">En fait, rien de magique, c'est juste une règle CSS 3 qui gère ça. <a href="#sf-fancy-index-4-back" class="simple-footnote-back">↩</a></li><li id="sf-fancy-index-5">La présence d'un point devant un fichier ou un répertoire indique sur tout système Unix/Linux que ce fichier ou répertoire doit être caché. <a href="#sf-fancy-index-5-back" class="simple-footnote-back">↩</a></li><li id="sf-fancy-index-6">tourte ! <a href="#sf-fancy-index-6-back" class="simple-footnote-back">↩</a></li></ol>Manageo, ou comment vous spammer trop régulièrement avec des messages indésirables2022-03-22T00:00:00+01:002022-03-22T00:00:00+01:00alextag:blog.chibi-nah.fr,2022-03-22:/manageo<p>Ahh, le courriel, ou email pour les non-francophones, ce magnifique outil pour communiquer avec les gens en mode asynchrone et pas en temps réel. Quelle joie ça serait si on était pas innondé de publicités et autres réclames non désirées.</p>
<p>Manageo se présente comme étant une société orientée business, disposant …</p><p>Ahh, le courriel, ou email pour les non-francophones, ce magnifique outil pour communiquer avec les gens en mode asynchrone et pas en temps réel. Quelle joie ça serait si on était pas innondé de publicités et autres réclames non désirées.</p>
<p>Manageo se présente comme étant une société orientée business, disposant de « Liste de courriels issu de sources officielles et mises à jour quotidiennement ».</p>
<p>Le gros problème avec ce genre de vendeur de liste, c'est que les adresses collectées sont souvent en opt-out, sans l'accord explicite des personnes physiques ou morale. Autant c'est plus ou moins légal et toléré pour les entreprises, autant c'est complètement illégal (en France) pour les particuliers.</p>
<p>Si jamais, par malheur, vous détenez un nom de domaine, et que votre adresse de contact publique (accessible pour des raisons légales) est collectée par Manageo, alors, bienvenue en enfer !</p>
<p>Outre le fait d'être innondé par de fausses annonces indiquant que l'on est inscrit d'office sur Amazon et qu'il suffit d'un clic pour se connecter, des annonces de cabinets de recouvrement, des offres de tickets restaurant… et j'en passe.</p>
<p>Manageo se défausse de ses responsabilités, en indiquant qu'ils ne sont que vendeurs de liste, et que c'est leurs clients qui sont fautifs. Admettons. C'est pour cela que tous les messages partent des serveurs de Manageo…</p>
<p>J'oubliais : les liens de désinscription ne sont pas fonctionnels !</p>
<p>Ci-dessous, une petite collection des spams arrivant régulièrement :</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">les liens ont été retirés.</p>
</div>
<hr /><p>Caroline <<a class="reference external" href="mailto:m.michel@mp.aconclue-pro.com">m.michel@mp.aconclue-pro.com</a>></p>
<p>Inscription de <strong>*</strong> à Amazon Business</p>
<p>Bonjour</p>
<p>Connaissez-vous Amazon Business ? Il s’agit du service d’Amazon pour les professionnels et entreprises.</p>
<p>Vous bénéficiez de tarifs négociés pour les professionnels sur des milliers de produits et de la livraison rapide d’Amazon.</p>
<p>Ce service est disponible pour les petites comme pour les grandes entreprises!</p>
<p>Inscrivez votre entreprise sur ce lien, c’est simple et rapide.
Ouverture de compte gratuite
Ce message vous est envoyé par Manageo pour le compte d'Amazon Business.
Si vous ne souhaitez plus recevoir ce type d’e-mail de la part de Manageo, suivez ce lien</p>
<p>Si vous souhaitez gérer vos préférences pour les e-mails directement envoyés par Amazon, suivez ce lien</p>
<hr /><p>Florent <<a class="reference external" href="mailto:m.michel@mp.aconclue-pro.com">m.michel@mp.aconclue-pro.com</a>></p>
<p>Finalisation de votre ouverture de compte Amazon Business</p>
<p>Bonjour,</p>
<p>Nous vous avons adressé cette semaine un message afin de bénéficier gratuitement des offres exclusives réservées aux professionnels.
Sachez que votre compte Amazon Business n'est pas encore actif.</p>
<p>Afin de finaliser votre inscription, suivez ce lien</p>
<p>Ce message vous est envoyé par Manageo pour le compte d'Amazon Business.
Si vous ne souhaitez plus recevoir ce type d’e-mail de la part de Manageo, suivez ce lien</p>
<p>Si vous souhaitez gérer vos préférences pour les e-mails directement envoyés par Amazon, suivez ce lien</p>
<p>Vous pouvez également consulter la politique de protection des données personnelles d’Amazon</p>
<hr /><p>Philippe <<a class="reference external" href="mailto:philippe@man-entreprise.com">philippe@man-entreprise.com</a>></p>
<p><strong>*</strong> votre comptabilité en ligne</p>
<p>Pop Compta
Bonjour,</p>
<p>Le saviez-vous ? <em>Changer d’expert-comptable est plus simple</em> et sécurisé qu’on
ne le croit.</p>
<p>En effet dans le cadre d’un changement, votre ancien et votre nouvel
expert-comptable doivent se mettre en relation pour que la transition se passe
<em>de manière transparente et fluide.</em></p>
<p>Notre logiciel de comptabilité en ligne couplé à un vrai expert-comptable est la
solution idéale pour votre transformation digitale :
- <em>Interlocuteurs dédiés et disponibles</em> pour vous accompagner.
- <em>Prix forfaitaires tout inclus 2x moins chers</em> qu'un cabinet traditionnel.
- <em>Aucun engagement</em> au-delà du mois en cours.
- <em>Forfaits optionnels préétablis</em> pour des coûts maîtrisés.</p>
<p>Comparez notre service et testez notre offre découverte <em>_sans plus attendre ici_</em>.</p>
<p>Pauline M.
Service Client PopCompta</p>
<p>logo popcompta</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Camille L. <<a class="reference external" href="mailto:camille-l@man-entreprise.com">camille-l@man-entreprise.com</a>></p>
<p>Téléchargez notre livre blanc sur le courrier en entreprise</p>
<p>Le courrier : un canal de communication incontournable en entreprise</p>
<p>Quel est l'avenir du courrier ?
Voir la version en ligne
| Ajouter au carnet d'adresses
| Retirer de la liste de diffusion <strong>*</strong></p>
<p>Le courrier : un canal de communication incontournable en entreprise
Le courrier est aujourd’hui le canal de communication préféré des entreprises :</p>
<p>Il est un mode de communication plus percutant qu’un email <#></p>
<p>Il est plus sécurisé que le format électronique <#></p>
<p>/Quel est l’avenir du courrier ? Découvrez-le en 5 prévisions : /
TÉLÉCHARGEZ LE LIVRE BLANC</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Dormane Recouvrement <<a class="reference external" href="mailto:communication.pro@partenaire.manageo.info">communication.pro@partenaire.manageo.info</a>></p>
<p>Livre blanc: les 10 règles pour recouvrer ses impayés</p>
<p>Bonjour ,</p>
<p>Les factures impayées de vos clients pèsent sur votre trésorerie?
Il est temps de réagir en externalisant votre recouvrement !</p>
<p>Découvrez au travers de notre livre blanc, les 10 règles à respecter pour accélérer le recouvrement de vos factures impayées.</p>
<p>Téléchargez le livre blanc</p>
<p>Depuis 1956, le cabinet de recouvrement Dormane met son expertise et son professionnalisme à votre service afin d’accélérer le recouvrement de vos factures et de préserver votre relation client.</p>
<p>Pour plus d’informations ou pour nous confier vos impayés, demandez dès maintenant notre documentation complète
.</p>
<p>A très bientôt
Nicolas – Cabinet Dormane</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service rendez-vous sur cette page</p>
<hr /><p>Cabinet Dormane <<a class="reference external" href="mailto:communication.pro@partenaire.manageo.info">communication.pro@partenaire.manageo.info</a>></p>
<p>Nous recouvrons vos impayés dès 15 euros</p>
<p>Le spécialiste du recouvrement d'impayés, quel que soit le montant En savoir plus</p>
<p>Si vous n'êtes pas intéressé par cette solution,
vous pouvez retirer votre adresse <strong>*</strong></p>
<p>de nos campagnes</p>
<p>Le spécialiste du recouvrement de créances depuis 1956</p>
<p>Le saviez-vous ? Nous gérons aussi les petits impayés !</p>
<p>Le Cabinet Dormane intervient en recouvrement, quel que soit le montant de la créance qui vous est due (à partir de 15 euros).</p>
<p>Zéro risque : vous ne payez rien en avance</p>
<p>Honoraires uniquement sur les sommes récupérées</p>
<p>Action ultra rapide via votre espace client</p>
<p>TÉLÉCHARGEZ LA DOCUMENTATION</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service rendez-vous sur cette page</p>
<hr /><p>Adeline P. <<a class="reference external" href="mailto:adeline-p@man-entreprise.com">adeline-p@man-entreprise.com</a>></p>
<p>Tout sur la protection prud'homale</p>
<p>Le Saviez Vous
Saviez-vous qu'une assurance prud'homale couvre les condamnations ?
Voir la version en ligne
| Ajouter au carnet d'adresses
| Retirer de la liste de diffusion <strong>*</strong></p>
<ul class="simple">
<li>SPÉCIAL DIRIGEANTS -</li>
</ul>
<p>Image
Le saviez-vous ?
Image <</p>
<p><em>Le montant moyen d'une condamnation aux prud’hommes pour un employeur est de
30 000€.</em></p>
<p>Anticipez ce risque, une assurance prud'homale couvre les condamnations.</p>
<p>EN SAVOIR PLUS
Image</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Laurent - Expert Assurance Prud'homale <<a class="reference external" href="mailto:laurent-expert-assurance@man-entreprise.com">laurent-expert-assurance@man-entreprise.com</a>></p>
<p>Vous prévoyez de licencier cette année ?</p>
<p>Corporate
Bonjour</p>
<p>Le risque de prud’homme est l’un des principaux risques financiers d’une
entreprise. Le montant moyen d’une condamnation est de 40 000 euros.</p>
<p><em>Une seule solution pour protéger votre société : l’assurance prud’homale.</em></p>
<p>En cas de prud'homme, cette assurance couvre vos frais de défense et prend en
charge vos condamnations.
Téléchargez notre documentation</p>
<p>N’attendez pas qu’il soit trop tard. <em>Renseignez-vous !</em></p>
<p>corporate_assistance</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Anthony <<a class="reference external" href="mailto:anthony@man-entreprise.com">anthony@man-entreprise.com</a>></p>
<p>vos objets publicitaires</p>
<p>Le saviez-vous ?
Offrez des objets publicitaires exonérés de charges fiscales.
Voir la version en ligne
| Ajouter au carnet d'adresses
| Retirer de la liste de diffusion <strong>*</strong></p>
<p>JR Communication</p>
<p>Des cadeaux publicitaires à l’image des valeurs de votre entreprise</p>
<p>Le saviez-vous ?</p>
<p>77% des français souhaitent recevoir plus d’objets publicitaires</p>
<p>Ca m’intéresse</p>
<p>Découvrez le Top 3 des cadeaux les plus appréciés</p>
<p>stylos / crayons
Stylos / crayons</p>
<p>Sacs et tote bag
Sacs et tote bag</p>
<p>Accessoires de bureau
Accessoires de bureau</p>
<p>En savoir plus</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Christophe <<a class="reference external" href="mailto:christophe@man-entreprise.com">christophe@man-entreprise.com</a>></p>
<p>optimisez vos coûts</p>
<p>Optimisez vos coûts avec notre copieur</p>
<p>minimisez vos dépenses bureautiques
Voir la version en ligne
| Ajouter au carnet d'adresses
| Retirer de la liste de diffusion <strong>*</strong></p>
<p>Optimisez vos coûts
avec notre copieur</p>
<p>VOTRE BUDGET
COPIEUR EST EXCESSIF ?
Optimisez vos loyers jusqu’à 40% d’économie</p>
<p>ÇA M’INTERESSE</p>
<p>Bénéficier d’un AUDIT OFFERT</p>
<p>pour l’optimisation de vos coûts</p>
<p>J’EN PROFITE</p>
<p>» Livraison et installation offertes</p>
<p>» Neuf ou reconditionné</p>
<p>» Rachat de votre contrat actuel</p>
<p>» Maintenance incluse</p>
<p>EN SAVOIR PLUS</p>
<p>NOTRE PARTENAIRE</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Ticket Restaurant <<a class="reference external" href="mailto:m.michel@mp.aconclue-business.fr">m.michel@mp.aconclue-business.fr</a>></p>
<p>Avantages exclusifs réservés à <strong>*</strong></p>
<p>Ces derniers mois, vous avez dû réorganiser le fonctionnement de votre société : télétravail, règles d’hygiène, fermeture de cantine …</p>
<p>Que vos salariés soient de retour sur site ou en télétravail, le Ticket Restaurant® est LA solution flexible pour se restaurer le midi où qu’ils soient.</p>
<p>Découvrez tous les avantages Ticket Restaurant®</p>
<p>Pour plus de facilité, pensez à la Carte Ticket Restaurant® ! Vous commandez vos cartes valables 4 ans et les chargez à distance via votre Espace Client.
Nous les livrons sur site ou au domicile de vos collaborateurs.</p>
<p>Besoin de plus d’information ?</p>
<p>Téléchargez la documentation</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service rendez-vous sur cette page</p>
<hr /><p>Eva de SFR Business <<a class="reference external" href="mailto:eva-de-sfr@power-mta.com">eva-de-sfr@power-mta.com</a>></p>
<p>Eligibilité de <strong>*</strong> à la Fibre</p>
<p>SFR
SFR logo</p>
<p>Bonjour</p>
<p>En cette période de reprise d’activité, il est important d’équiper votre
entreprise d’une connexion internet fiable et performante.</p>
<p>C’est le moment de passer à la Fibre Très Haut Débit !</p>
<p>➜ Testez votre éligiblité à la Fibre</p>
<ul class="simple">
<li>Fibre entreprise jusqu’à 2Gbits/s*</li>
<li>Débit garanti 100Mbits/s symétrique**</li>
<li>IP fixe dédiée</li>
<li>Installation sur site de la Box FIBRE</li>
</ul>
<p>Découvrez nos offres pros</p>
<p>A bientôt,</p>
<p>L’équipe SFR Business
* Selon éligibilité à la fibre mutualisée FTTH
** Débit garanti 100M symétriques en FTTH, 10M symétriques en FTTB et des débits
dédiés FTTO à partir de 4M jusqu’à 1Gbits/s et au-delà sur devis.
Détail et conditions du Service, de ses Options, des prérequis, dans les
conditions contractuelles notamment tarifaires SFR Business disponibles auprès
de votre interlocuteur commercial SFR Business.</p>
<p>© 2021 - SFR Business, marque de la société SFR. Société Française du
Radiotéléphone - SFR - 16 rue du Général Alain de Boissieu - 75015 Paris - SA au
capital de 3 423 265 720 € - RCS Paris 343 059 564 - N° TVA FR 71 343 059 564</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Natacha <<a class="reference external" href="mailto:natacha@power-mta.com">natacha@power-mta.com</a>></p>
<p>Bénéficiez d'un Macbook Air</p>
<p>Neoconnect
Bonjour ,</p>
<p>Paritel a développé <em>NEOCONNECT+</em>, une solution de télécommunications qui
s’adapte à votre entreprise pour vous permettre d’être plus joignable, plus
visible et plus efficient :
✓ Vidéo et audio conférence
✓ Call Jump (bascule d'un terminal vers un autre sans coupure)
✓ Serveur Vocal interactif (SVI)
✓ Service de messagerie instantanée et 100% sécurisée
✓ Et + de 250 fonctionnalités pour améliorer vos échanges et favoriser le travail
collaboratif.</p>
<p>Bénéficiez d’une solution de télécommunications simple d’utilisation, évolutive
et adaptée aux besoins de <strong>*</strong>.</p>
<p><em>Un MacBook air 13 pouces est inclus dans votre offre !*</em>
En savoir plus</p>
<ul class="simple">
<li>MacBook Air 13”, offre réservée aux nouveaux clients. Uniquement sous réserve de remplir les conditions d’éligibilité de l’offre.</li>
</ul>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Antoine <<a class="reference external" href="mailto:antoine@power-mta.com">antoine@power-mta.com</a>></p>
<p>Plus besoin de fournir un téléphone pro à vos salariés</p>
<p>OnOff Business
Bonjour ,</p>
<p>La mise en place du télétravail implique la mise à disposition de matériel
coûteux aux salariés.</p>
<p>Connaissez-vous <em>Onoff Business</em> ?</p>
<p>Grâce à cette application, vous n’avez <em>plus besoin de fournir de téléphones
portables, ni d’abonnements mobiles à vos salariés</em>.</p>
<p>/Comment ça fonctionne ?/
1. Créez gratuitement votre compte pro Onoff Business
2. Attribuez en quelques clics un numéro à vos collaborateurs
3. Les salariés téléchargent l’application et utilisent leur nouveau numéro sur
leur téléphone habituel</p>
<p>Découvrez en vidéo</p>
<p><em>Simple et rapide !</em>
Pour seulement 9 euros / mois par numéro.</p>
<p>Essayez maintenant !</p>
<p>OnOff logo</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Ticket Restaurant <<a class="reference external" href="mailto:m.michel@mp.aconclue-business.fr">m.michel@mp.aconclue-business.fr</a>></p>
<p>Guide fiscal des Ticket Restaurant</p>
<p>Guide fiscal des Ticket Restaurant®</p>
<p>Bonjour ,</p>
<p>Comme de nombreuses entreprises, vous avez été impactés par la crise sanitaire et vous regardez de près votre budget.</p>
<p>Avec Ticket Restaurant®, vous profitez d’avantages fiscaux très avantageux tout en faisant plaisir à vos salariés. C’est LA solution pour faire facilement des économies en 2022 :</p>
<ul class="simple">
<li>100% exonéré de charges sociales et fiscales(1)</li>
<li>Jusqu’à 1 251 euros de revenu supplémentaire(2)</li>
</ul>
<p>Découvrez tous les avantages dont votre entreprise peut bénéficier en suivant ce lien</p>
<p>JE ME RENSEIGNE</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service rendez-vous sur cette page</p>
<hr /><p>Mélanie <<a class="reference external" href="mailto:melanie@power-mta.com">melanie@power-mta.com</a>></p>
<p>La fibre pro sans engagement</p>
<p>Bouygues</p>
<p>Bonjour ,</p>
<p>Avec <em>la fibre entreprise sécurisée</em>, offrez à votre société <strong>*</strong>
la flexibilité, la performance et la fiabilité dont vous avez besoin
pour vous développer :</p>
<ul class="simple">
<li>Très haut débit jusqu’à 1 Gbps</li>
<li>Back-up 4G automatique en cas de coupure</li>
<li>Cybersécurité : protection incluse de votre accès Internet et de vos usages web</li>
</ul>
<p><em>N’attendez plus, nos offres fibre pro sont sans engagement !</em>
JE ME RENSEIGNE</p>
<p>Service disponible en France métropolitaine sous réserve d’éligibilité
technique. Détails et conditions de l’offre disponibles sur demande auprès de
notre service commercial ou de votre conseiller Bouygues Telecom Entreprises.</p>
<p><em>La Fibre Entreprise Sécurisée (FTTH) :</em> très haut débit jusqu'à 1 Gbps en
descendant et jusqu'à 500 Mbps en montant. Norme Wi-Fi 5 (802.11 ac) disponible
avec terminaux (PC et tablettes) compatibles. Routeur multiservice entreprise et
routeur 4G back-up inclus installés et testés. Tarif 99€HT/mois sans engagement
(avec engagement 36 mois 79€HT/mois au lieu de 99€HT/mois jusqu'au 31/12/21)
pour l'accès très haut débit, le service Internet, le service Internet Sécurisé
inclus et le routeur back-up 4G inclus (59€ si non). Frais de mise en service de
150€ par accès seul.</p>
<p><em>Back-up 4G :</em> Bascule automatique sur le réseau 4G du service Internet
exclusivement, en cas d’interruption de l’accès fibre. Service de Cybersécurité
et adresse IP publique non disponibles sur le réseau 4G. Certains services
internet sont susceptibles de subir une coupure lors de bascule sur le réseau 4G.</p>
<p><em>Service supervision proactif inclus</em> comprend la surveillance des flux Internet
de l’entreprise et le déclenchement automatique de ticket d’incident. Horaires
étendus du Support Technique : du lundi au samedi de 8H à 22H. Service de
supervision proactive: notification automatique en Heures Ouvrées, par mail et
SMS en cas d’interruption du service Internet.</p>
<p><em>Bouygues Telecom s’inscrit dans le Plan France Très Haut Débit et déploie son
réseau Fibre optique pour permettre à tous particuliers, entreprises et
administrations d’avoir un accès à Internet dans les meilleures conditions, dans
les grandes villes comme dans les zones plus rurales.</em></p>
<p>Merci de ne pas répondre à ce courrier électronique, il est émis depuis une
adresse technique.</p>
<p>BOUYGUES TELECOM - 37-39 rue Boissière – 75116 PARIS - S.A au capital de 819 698
624,76 € - 397 480 930 R.C.S. Paris</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Kadéos <<a class="reference external" href="mailto:m.michel@mp.aconclue-business.fr">m.michel@mp.aconclue-business.fr</a>></p>
<p>Exonération de charges pour votre société</p>
<p>Bonjour ,</p>
<p>Vous souhaitez augmenter le pouvoir d’achat de vos salariés tout en profitant de 100% d’exonération de charges ?</p>
<p>Offrez des cartes cadeaux Kadéos ! Toutes les entreprises peuvent en profiter, que vous ayez un comité d’entreprise ou pas. Vous bénéficiez ainsi d’une exonération jusqu’à 171 euros par bénéficiaire*.</p>
<p>Rentrée scolaire, Noël, évènements familiaux … les occasions de faire plaisir à vos salariés sont nombreuses !</p>
<p>N’attendez pas !
Commandez dès aujourd’hui vos cartes cadeaux sur ce lien.</p>
<p>Besoin de plus d’informations ?</p>
<p>Renseignez-vous</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service rendez-vous sur cette page</p>
<hr /><p>Julie <<a class="reference external" href="mailto:julie@power-mta.com">julie@power-mta.com</a>></p>
<p>Optez pour la téléphonie collaborative</p>
<p>Keyyo
Bonjour ,</p>
<p>L’accélération du travail en distanciel nous demande de repenser <em>notre
organisation de travail.</em></p>
<p>Pour vous accompagner dans votre évolution, Keyyo a créé <em>le Pack Pro</em>, une
<em>solution de communication professionnelle tout-en-un</em> qui vous permettra
d’échanger simplement et en toute mobilité.
<em>✓ *Appels illimités (France et international)
*✓ *Visioconférence 100% web
*✓ *Messagerie instantanée sécurisée
*✓ *Fonctionnalités de standard simplifiées
Optez pour la *téléphonie collaborative</em> chez <strong>*</strong> et
travaillez efficacement les uns avec les autres !
Ça m’intéresse</p>
<p>Keyyo logo</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Pascal <<a class="reference external" href="mailto:pascal@veml02.com">pascal@veml02.com</a>></p>
<p>votre demande de Chèque Déjeuner</p>
<p>Groupe UP</p>
<p>Moins coûteux qu'une augmentation, optez pour les Chèques Déjeuner !
Voir la version en ligne
| Ajouter au carnet d'adresses
| Retirer de la liste de diffusion</p>
<p><em>84% des salariés</em> considèrent la pause déjeuner comme un des repas les plus
importants dans leur quotidien*
Soutenez le pouvoir d’achat de vos salariés tout en équilibrant votre budget
avec la carte UpDéjeuner !
Plus d’informations</p>
<p>Pourquoi choisir la carte UpDéjeuner ?</p>
<p>Pour respecter les obligations légales et <em>garantir une véritable pause déj</em></p>
<p>Pour proposer un avantage social <em>moins coûteux qu’une augmentation</em></p>
<p>Pour <em>renforcer votre politique sociale</em> et instaurer un bon climat de travail</p>
<p>Pour s’adapter aux nouveaux usages et <em>accélérer votre digitalisation</em></p>
<p>Téléchargez la brochure</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Sandy D. <<a class="reference external" href="mailto:sandy-d@man-entreprise.com">sandy-d@man-entreprise.com</a>></p>
<p>Externalisation de votre recouvrement</p>
<p>BRR
Bonjour ,</p>
<p>Saviez-vous que 40% des dépôts de bilan d’entreprises sont causés par des
impayés clients ?</p>
<p>N’attendez pas qu’il ne soit trop tard. Confiez-nous vos factures impayées, nous
vous assurons <em>un recouvrement rapide des sommes dues.</em></p>
<p>Testez-nous sans engagement</p>
<p>De plus, pour vous aider dans votre recouvrement, nous vous mettons à
disposition notre guide conseil gratuit :
Téléchargez le guide pratique</p>
<p>A bientôt,</p>
<p>L’équipe de recouvrement de créances</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr /><p>Mathilde de Geocoyote <<a class="reference external" href="mailto:mathilde-geocoyote@vme-01.com">mathilde-geocoyote@vme-01.com</a>></p>
<p>Géolocalisation : faites des économies de carburant</p>
<p>GeoCoyote
Bonjour ,</p>
<p>Avec <em>GeoCoyote</em>, <em>optimisez vos trajets</em>, <em>améliorez votre productivité</em> et
<em>réalisez des économies de carburant</em>.</p>
<p>✓ Géolocalisation en temps réel
✓ Gestion de la flotte (alerte entretien automatisées)
✓ Rapports de conduite par collaborateur
✓ Protection contre les vols</p>
<p><em>Découvrez notre solution en vidéo</em></p>
<p>Les bénéfices sont certains : <em>vous faites des économies et vos équipes sont
plus productives !</em></p>
<p>Plus d’infos</p>
<p>A très vite !</p>
<p>Ce message vous est adressé par Manageo.
Pour retirer <strong>*</strong> de la liste de diffusion de ce service
rendez-vous sur cette page</p>
<hr />Valhalla - carte isochrone et calcul d'itinéraire2022-01-23T00:00:00+01:002022-01-23T00:00:00+01:00alextag:blog.chibi-nah.fr,2022-01-23:/valhalla<p><cite>Article écrit le dimanche 12 décembre 2021 puis mis à jour le dimanche 23 janvier 2022</cite></p>
<p>Au sommaire :
<a class="reference internal" href="#contexte">Contexte</a>
<a class="reference internal" href="#valhalla">Valhalla</a>
<a class="reference internal" href="#prerequis">Prérequis</a>
<a class="reference internal" href="#installation">Installation</a>
<a class="reference internal" href="#premier-test">Premier test</a>
<a class="reference internal" href="#carte-isochrone">Carte isochrone</a>
<a class="reference internal" href="#calcul-d-itineraire">Calcul d'itinéraire</a>
<a class="reference internal" href="#conclusion">Conclusion</a>
<a class="reference internal" href="#licence">Licence</a></p>
<p>Valhalla, ou utilisation avancée des outils de cartographie en ligne en local, pour presque<sup id="sf-valhalla-1-back"><a href="#sf-valhalla-1" class="simple-footnote" title="Façon de parler">1</a></sup> pas un rond.</p>
<p>TL;DR …</p><p><cite>Article écrit le dimanche 12 décembre 2021 puis mis à jour le dimanche 23 janvier 2022</cite></p>
<p>Au sommaire :
<a class="reference internal" href="#contexte">Contexte</a>
<a class="reference internal" href="#valhalla">Valhalla</a>
<a class="reference internal" href="#prerequis">Prérequis</a>
<a class="reference internal" href="#installation">Installation</a>
<a class="reference internal" href="#premier-test">Premier test</a>
<a class="reference internal" href="#carte-isochrone">Carte isochrone</a>
<a class="reference internal" href="#calcul-d-itineraire">Calcul d'itinéraire</a>
<a class="reference internal" href="#conclusion">Conclusion</a>
<a class="reference internal" href="#licence">Licence</a></p>
<p>Valhalla, ou utilisation avancée des outils de cartographie en ligne en local, pour presque<sup id="sf-valhalla-1-back"><a href="#sf-valhalla-1" class="simple-footnote" title="Façon de parler">1</a></sup> pas un rond.</p>
<p>TL;DR (trop long, flemme de tout lire) : Désolé, il faut tout lire.</p>
<img alt="" src="images/valhalla/isochrone.jpg">
<p>Attention : les démos présentes dans cet article n'interrogent pas le service Valhalla, afin de limiter les abus, le service installé étant assez consommateur de ressources<sup id="sf-valhalla-2-back"><a href="#sf-valhalla-2" class="simple-footnote" title="Pourquoi les services en ligne proposant ça sont ou limités au niveau requête ou payant à votre avis ?">2</a></sup>. Des jeux de données prédéfinis seront stockés de manière statique, pour illustrer l'article.</p>
<p>Il y aura quelques extraits vidéo<sup id="sf-valhalla-3-back"><a href="#sf-valhalla-3" class="simple-footnote" title="hébergées sur PeerTube">3</a></sup> montrant les résultats interactifs, en plus des captures d'écran et des pages de démo.</p>
<div class="section" id="contexte">
<h2>Contexte</h2>
<p>En 2015, j'avais écrit un article sur comment afficher des points sur une carte<sup id="sf-valhalla-4-back"><a href="#sf-valhalla-4" class="simple-footnote" title=" https://blog.chibi-nah.fr/affichage-de-points-sur-une-carte ">4</a></sup>, avec Leaflet. J'étais resté sur une utilisation simple.</p>
<p>En 2021, ayant assisté à une présentation, mentionnant les cartes isochrone, je me suis demandé s'il était possible de générer ce genre de carte avec OSM/Leaflet.</p>
<p>La réponse est : oui, mais !</p>
<p>Alors, oui, c'est faisable, mais ce n'est pas forcément simple (en tout cas, aussi simple que d'afficher des points sur une carte), et les services en ligne pour générer les données geojson sont ou bien payants ou bien limités à une zone ou bien limité à nnn requêtes par mois, nnn étant un nombre assez faible.</p>
</div>
<div class="section" id="valhalla">
<h2>Valhalla</h2>
<p>Inspiré de la mythologie nordique<sup id="sf-valhalla-5-back"><a href="#sf-valhalla-5" class="simple-footnote" title=" https://valhalla.readthedocs.io/en/latest/valhalla-intro/ ">5</a></sup>, Valhalla est un logiciel libre et open source, composé de divers outils, notamment :</p>
<ul class="simple">
<li>THOR (Tiled, Hierarchical Open Routing) ;</li>
<li>ODIN (Open Directions and Improved Narrative) ;</li>
<li>TYR (Take Your Route).</li>
</ul>
<p>Et d'autres (Baldr, Loki, Midgard, Sif, Skadi, Meili, Mjolnir).</p>
<p>Pourquoi avoir choisi ici Valhalla et non OSRM ? OSRM chargeant la totalité des données en RAM pour des performances accrues, ça peut nécessiter une quantité de RAM très élevée (tousse 128 Go de RAM /tousse), et nécessitant de générer la totalité des nodes pour le routage. Valhalla, au contraire, plus souple (ne chargeant que les données nécessaire à la volée), mais peut s'avérer moins précis ou moins rapide au niveau routage.</p>
<p>Accessoirement, Valhalla supporte la génération de cartes isochrones, sans passer par des outils ou libs additionnelles.</p>
<p>Dernier point, et probablement le plus intéressant ici : on peut également modifier les paramètres (vitesse, notamment) à la volée, avec Valhalla, ce qui n'est pas possible avec OSRM (il faut regénérer la totalité des nœuds avec les paramètres modifiés et tout recharger en RAM).</p>
<p>Ici, un lien vers un tableau résumé (en anglais) entre les deux solutions : <a class="reference external" href="https://github.com/Telenav/open-source-spec/blob/master/osrm/doc/osrm-vs-valhalla.md#from-product-managers-perspective">https://github.com/Telenav/open-source-spec/blob/master/osrm/doc/osrm-vs-valhalla.md#from-product-managers-perspective</a></p>
<p>Que cela soit OSRM ou Valhalla, les deux peuvent se déployer via Docker (c'est la solution que j'ai fini par retenir, ces outils sont assez complexes et ont des dépendances chiantes à gérer).</p>
</div>
<div class="section" id="prerequis">
<h2>Prérequis</h2>
<p>Au niveau matériel, c'est surtout de l'espace disque et la vitesse de transfert pour les données qui sera importante. Si on se contente d'une région française (ancien découpage en 22 régions), par exemple, pour la région Lorraine (que j'ai utilisé pour faire les tests), il faut compter environ 1 Go (un peu moins en fait).</p>
<p>Au niveau logiciel, Docker (<a class="reference external" href="https://www.docker.com/">https://www.docker.com/</a>), docker-compose et un serveur web (peu importe, Apache, Lighttpd, Nginx…) seront requis. Ayant déjà lighttpd installé et me servant comme serveur de test local, je l'utiliserai. Étant donné que pour les tests réalisés ici, le serveur ne fera que servir des fichiers statiques, ce n'est pas nécessaire de sortir l'artillerie lourde LAMP<sup id="sf-valhalla-6-back"><a href="#sf-valhalla-6" class="simple-footnote" title="Linux, Apache, MySQL/MariaDB, PHP">6</a></sup>. Je n'ai pas testé, mais ça devrait également fonctionner avec Windows (10 ou Server), avec Docker et IIS.</p>
<p>Pas obligatoire, mais utile pour les premiers tests : jq (un outil CLI<sup id="sf-valhalla-7-back"><a href="#sf-valhalla-7" class="simple-footnote" title="En mode console">7</a></sup> permettant de formater/manipuler du JSON<sup id="sf-valhalla-8-back"><a href="#sf-valhalla-8" class="simple-footnote" title="JavaScript Object Notation, qui comme son nom ne l'indique pas, est un format de fichier relativement pratique pour échanger des données, pas obligatoirement avec javascript.">8</a></sup>)</p>
</div>
<div class="section" id="installation">
<h2>Installation</h2>
<p>Installation rapide sous Debian (et dérivés). Adaptez pour votre distrib (zypper, pacman, …)</p>
<div class="highlight"><pre><span></span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>docker<span class="w"> </span>docker-compose<span class="w"> </span>jq
</pre></div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Ne pas oublier de donner les privilèges pour manipuler docker sans les privilèges root.</p>
</div>
<div class="highlight"><pre><span></span>sudo<span class="w"> </span>usermod<span class="w"> </span>-aG<span class="w"> </span>docker<span class="w"> </span>alex
</pre></div>
<p>Remplacer alex par votre compte utilisateur.</p>
<p>Se déconnecter/reconnecter (dans le doute, reboute) pour que cette modification soit prise en compte.</p>
<p>Créer un répertoire (chez moi, c'est dans ~/work/map/valhalla).</p>
<p>Créer dans ce répertoire un fichier texte, le nommer "docker-compose.yml".</p>
<p>Copier-coller le contenu suivant dans le fichier "docker-compose.yml".</p>
<div class="highlight"><pre><span></span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s">'3.0'</span>
<span class="nt">services</span><span class="p">:</span>
<span class="nt">valhalla</span><span class="p">:</span>
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">gisops/valhalla:latest</span>
<span class="w"> </span><span class="nt">ports</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"8002:8002"</span>
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./custom_files/:/custom_files</span>
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">tile_urls=http://download.geofabrik.de/europe/france/lorraine-latest.osm.pbf</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">use_tiles_ignore_pbf=True</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">force_rebuild=False</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">force_rebuild_elevation=False</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">build_elevation=False</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">build_admins=True</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">build_time_zones=True</span>
</pre></div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p>tile_urls= contient la liste (séparés par un espace) des jeux de données OSM à télécharger et à utiliser. Pour cet exemple, je me suis limité à la région Lorraine.
Pour d'autres régions en France, consulter cette page, et copier les liens .osm.pbf et les coller à droite de tile_urls=
<a class="reference external" href="http://download.geofabrik.de/europe/france.html">http://download.geofabrik.de/europe/france.html</a></p>
<p class="last">Pour d'autres pays/continent, aller sur <a class="reference external" href="http://download.geofabrik.de/index.html">http://download.geofabrik.de/index.html</a></p>
</div>
<p>Enregistrer et fermer le fichier.</p>
<p>Ouvrir un terminal (si ce n'est déjà fait), se déplacer dans le répertoire contenant ce fichier docker-compose.yml</p>
<div class="highlight"><pre><span></span><span class="nb">cd</span><span class="w"> </span>~/work/map/valhalla
</pre></div>
<p>Exécuter docker-compose</p>
<div class="highlight"><pre><span></span>docker-compose<span class="w"> </span>up<span class="w"> </span>--build
</pre></div>
<p>Cette commande (tout en un) crée le conteneur docker, télécharge les ressources, et démarre le conteneur.</p>
<p>Cette opération peut prendre un long moment.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Pour retrouver le nom du conteneur, taper la commande docker ps
le nom est sous la dernière colonne.</p>
</div>
</div>
<div class="section" id="premier-test">
<h2>Premier test</h2>
<p>Pour vérifier que Valhalla est correctement installé et fonctionne, ouvrir un nouveau terminal, et copier-coller cette commande :</p>
<div class="highlight"><pre><span></span>curl<span class="w"> </span>http://localhost:8002/route<span class="w"> </span>--data<span class="w"> </span><span class="s1">'{"locations":[{"lat":48.6892,"lon":6.1758},{"lat":48.6399,"lon":6.1837}],"costing":"auto","directions_options":{"units":"kilometers","language":"fr-FR"}}'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>jq<span class="w"> </span>.
</pre></div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">curl doit être installé, bien entendu.</p>
</div>
<p>Cette commande, ici, demande à Valhalla de calculer un itinéraire entre deux points (Nancy Gare à Houdement Porte Sud/zone commerciale), en voiture.</p>
<p>Modifier les coordonnées [{"lat":48.6892,"lon":6.1758},{"lat":48.6399,"lon":6.1837}] par des coordonnées présentes sur votre jeu de données si c'est en dehors de la région Lorraine (ou alors, ne vous étonnez pas si un message d'erreur apparaît).</p>
<p>Si aucune erreur n'est trouvée et que le résultat ressemble à ceci, c'est que cela fonctionne.</p>
<div class="highlight"><pre><span></span><span class="p">{</span>
<span class="nt">"trip"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">"locations"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"break"</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"lat"</span><span class="p">:</span><span class="w"> </span><span class="mf">48.6892</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"lon"</span><span class="p">:</span><span class="w"> </span><span class="mf">6.1758</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"original_index"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"break"</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"lat"</span><span class="p">:</span><span class="w"> </span><span class="mf">48.6399</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"lon"</span><span class="p">:</span><span class="w"> </span><span class="mf">6.1837</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"city"</span><span class="p">:</span><span class="w"> </span><span class="s2">"left"</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"original_index"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">],</span>
<span class="w"> </span><span class="nt">"legs"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">"maneuvers"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"instruction"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Conduisez vers le nord-est sur Avenue Foch."</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"verbal_succinct_transition_instruction"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Conduisez vers le nord-est. Ensuite, Serrez à droite vers Toutes directions."</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"verbal_pre_transition_instruction"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Conduisez vers le nord-est sur Avenue Foch. Ensuite, Serrez à droite vers Toutes directions."</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"verbal_post_transition_instruction"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Continuez pendant 20 mètres."</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"street_names"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="s2">"Avenue Foch"</span>
<span class="w"> </span><span class="p">],</span>
<span class="w"> </span><span class="nt">"time"</span><span class="p">:</span><span class="w"> </span><span class="mf">1.412</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"length"</span><span class="p">:</span><span class="w"> </span><span class="mf">0.019</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"cost"</span><span class="p">:</span><span class="w"> </span><span class="mf">1.589</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"begin_shape_index"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"end_shape_index"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"verbal_multi_cue"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"travel_mode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"drive"</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"travel_type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"car"</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="err">…</span>
<span class="w"> </span><span class="p">],</span>
<span class="w"> </span><span class="nt">"summary"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">"has_time_restrictions"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"min_lat"</span><span class="p">:</span><span class="w"> </span><span class="mf">48.63963</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"min_lon"</span><span class="p">:</span><span class="w"> </span><span class="mf">6.175782</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"max_lat"</span><span class="p">:</span><span class="w"> </span><span class="mf">48.689305</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"max_lon"</span><span class="p">:</span><span class="w"> </span><span class="mf">6.194352</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"time"</span><span class="p">:</span><span class="w"> </span><span class="mf">417.009</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"length"</span><span class="p">:</span><span class="w"> </span><span class="mf">6.655</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"cost"</span><span class="p">:</span><span class="w"> </span><span class="mf">716.95</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">"status_message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Found route between points"</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"units"</span><span class="p">:</span><span class="w"> </span><span class="s2">"kilometers"</span><span class="p">,</span>
<span class="w"> </span><span class="nt">"language"</span><span class="p">:</span><span class="w"> </span><span class="s2">"fr-FR"</span>
<span class="p">}</span>
</pre></div>
<p>Récupérer les données dans un terminal, c'est bien beau, mais ça serait mieux si on pouvait afficher ça sur une carte.</p>
</div>
<div class="section" id="carte-isochrone">
<h2>Carte isochrone</h2>
<p>Ou comment afficher sous forme de surface, toutes les zone accessibles en un certain temps, à partir d'un point.</p>
<p>Par exemple : depuis la Place Stan, qu'est-ce qui est accessible en 10 minutes à pieds.</p>
<p>Je suis parti des fichiers d'exemples fournis avec Valhalla<sup id="sf-valhalla-9-back"><a href="#sf-valhalla-9" class="simple-footnote" title=" https://github.com/valhalla/demos ">9</a></sup>, modifiés/simplifiés ici pour cet article.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Pour éviter toute utilisation abusive de mon serveur Valhalla (qui n'est pas accessible/exposé sur Internet), la démo contient uniquement un seul jeu de données, données figées ; cela étant amplement suffisant pour la démo.</p>
</div>
<img alt="" src="images/valhalla/demo1.jpg">
<p>La démo est accessible ici :</p>
<p><a class="reference external" href="https://blog.chibi-nah.fr/images/valhalla/demo1/">https://blog.chibi-nah.fr/images/valhalla/demo1/</a></p>
<p>Démo en vidéo, avec un service valhalla fonctionnel. On peut voir les changement des paramètres et les modifications sur la carte en temps réel.</p>
<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" title="valhalla - démo 1 isochrone" src="https://tube.nah.re/videos/embed/b84ef0bb-95f7-4c3c-9af8-a4e82e64bc2a" frameborder="0" allowfullscreen=""></iframe><p>Les fichiers de démo (la partie interactive étant commentée) sont disponibles dans cette archive zip : <a class="reference external" href="https://blog.chibi-nah.fr/images/valhalla/demo1/demo1.zip">https://blog.chibi-nah.fr/images/valhalla/demo1/demo1.zip</a></p>
<p>Pour réactiver la partie interactive, comme sur la démo vidéo, ouvrir le fichier js/isochrone.js</p>
<p>Descendre à la ligne 66 (dans la fonction getContours()), et supprimer ces caractères :</p>
<div class="highlight"><pre><span></span><span class="err">/*</span>
</pre></div>
<p>Descendre à la ligne 78, et supprimer ces caractères :</p>
<div class="highlight"><pre><span></span><span class="o">*</span><span class="err">/</span>
</pre></div>
<p>Descendre à la ligne 81, et supprimer cette ligne :</p>
<div class="highlight"><pre><span></span><span class="kd">let</span><span class="w"> </span><span class="nx">url</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"isochrone.json"</span><span class="p">;</span>
</pre></div>
<p>Enregistrer.</p>
<p>Maintenant, le script chargera les données depuis le service valhalla écoutant sur <a class="reference external" href="http://localhost:8002">http://localhost:8002</a>, comme indiqué à la ligne 67.</p>
<p>Au niveau technique, pas grand chose à dire en fait. Toutes les opérations se font dans la fonctione isochrone.js.</p>
<p>À la ligne 2, on définit les coordonnées de départ (le premier point).</p>
<div class="highlight"><pre><span></span><span class="kd">const</span><span class="w"> </span><span class="nx">initLocation</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="nx">lat</span><span class="o">:</span><span class="w"> </span><span class="mf">48.69354</span><span class="p">,</span><span class="w"> </span><span class="nx">lng</span><span class="o">:</span><span class="w"> </span><span class="mf">6.18327</span><span class="p">};</span>
</pre></div>
<p>Ici, ces coordonnées correspondent à la Place Stanislas, à Nancy (Lorraine/Grand-Est, France, Europe).</p>
<p>Juste en dessous, on initialise Leaflet, et on sélectionne le serveur de tuiles <cite>b.tile.openstreetmap.org</cite>. (modifier http/https si nécessaire).</p>
<p>Les fonctions suivantes, <cite>parseContour()</cite>, <cite>createMarker()</cite>, <cite>onLocationChanged()</cite>, <cite>onMapClick()`</cite> ont été récupérées quasiment telles-quelles depuis les fichiers de démo. Je ne m'attarderai pas dessus. Idem pour les fonctions <cite>onTileLayerChange()</cite> et <cite>onLatLngInputChanged()</cite>.</p>
<p>On arrive maintenant sur <cite>getContours()</cite>. Cette fonction est probablement la plus intéressante, parce que c'est dans cette fonction que l'on récupère les différents paramètres du formulaire html.</p>
<p>Se référer à cette page de documentation <a class="reference external" href="https://valhalla.readthedocs.io/en/latest/api/turn-by-turn/api-reference/#costing-models">https://valhalla.readthedocs.io/en/latest/api/turn-by-turn/api-reference/#costing-models</a></p>
<p>notamment cette section <a class="reference external" href="https://valhalla.readthedocs.io/en/latest/api/turn-by-turn/api-reference/#pedestrian-costing-options">https://valhalla.readthedocs.io/en/latest/api/turn-by-turn/api-reference/#pedestrian-costing-options</a></p>
<p>pour en savoir plus sur les différents paramètres gérés.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Mon utilisation de valhalla peut être différente de la votre. Ici, je suis parti sur l'utilisation du routage pour de la marche à pieds (pedestrian). Les options pour du routage à vélo (Bicycle), voiture (auto), camion (truck) sont différentes. Se référer à la page de documentation indiquée plus haut, dans les sections dédiées à ces moyens de transport.</p>
</div>
<p>Donc, dans <cite>getContours()</cite>, on se retrouve avec ce gros pavé de code :</p>
<div class="highlight"><pre><span></span><span class="kd">let</span><span class="w"> </span><span class="nx">url</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'http://localhost:8002/isochrone?json='</span><span class="p">;</span>
<span class="kd">let</span><span class="w"> </span><span class="nx">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{}</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'locations'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[{</span><span class="s2">"lat"</span><span class="o">:</span><span class="nx">coord</span><span class="p">.</span><span class="nx">lat</span><span class="p">,</span><span class="w"> </span><span class="s2">"lon"</span><span class="o">:</span><span class="nx">coord</span><span class="p">.</span><span class="nx">lng</span><span class="p">}];</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'costing'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'pedestrian'</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'costing_options'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s2">"pedestrian"</span><span class="o">:</span><span class="p">{</span><span class="s2">"walking_speed"</span><span class="o">:</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">'speed'</span><span class="p">).</span><span class="nx">value</span><span class="p">,</span><span class="w"> </span><span class="s2">"alley_factor"</span><span class="o">:</span><span class="w"> </span><span class="s2">"1"</span><span class="p">,</span><span class="s2">"use_tracks"</span><span class="o">:</span><span class="s2">"1"</span><span class="p">,</span><span class="s2">"service_penalty"</span><span class="o">:</span><span class="s2">"1"</span><span class="p">}};</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'denoise'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">'denoise'</span><span class="p">).</span><span class="nx">value</span><span class="p">;</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'generalize'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">'generalize'</span><span class="p">).</span><span class="nx">value</span><span class="p">;</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'contours'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">parseContour</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">'contours'</span><span class="p">).</span><span class="nx">value</span><span class="p">);</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'polygons'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">'polygons_lines'</span><span class="p">).</span><span class="nx">value</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="s1">'polygons'</span><span class="p">;</span>
<span class="nx">url</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="nx">escape</span><span class="p">(</span><span class="nb">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">json</span><span class="p">));</span>
</pre></div>
<p>On commence par définir l'adresse du serveur valhalla, via <cite>location</cite>, suivi de l'appel à Thor (via le module isochrone).</p>
<p>json= sera suivi d'un objet javascript sérialisé, contenant les paramètres situés juste en dessous.</p>
<ul class="simple">
<li><cite>locations</cite> contient les coordonnées de latitude et longitude, ici, correspondant au point sur la carte (le curseur bleu).</li>
<li><cite>costing</cite> contient le type de déplacement. Ici, 'pedestrian' indique un déplacement à pieds.</li>
<li><cite>denoise</cite>, <cite>generalize</cite> et <cite>contours</cite> contiennent les paramètres définis dans le formulaire. Ce n'est pas forcément essentiel.</li>
<li><cite>polygons</cite> contient le type de rendu à faire, soit en lignes, soit en zones. Ça prend un booléen <cite>true</cite> ou <cite>false</cite> en paramètre.</li>
</ul>
<p>Et enfin, LE paramètre le plus important : <cite>costing_options</cite>. Je l'ai gardé pour la fin, parce que c'est ici que tout se joue.</p>
<p>L'objet <cite>pedestrian</cite> contient toutes les options de routage (toutes ne sont pas utilisées ici, il y en a nettement plus dans la doc).</p>
<ul class="simple">
<li><cite>walking_speed</cite> : vitesse de déplacement à pieds. Dans la démo, cette valeur est modifiable facilement via le formulaire.</li>
<li><cite>alley_factor</cite> : facteur (pénalité/coût) pour traverser les allées. la valeur par défaut étant à 2, je l'ai définie ici à 1.</li>
<li><cite>use_tracks</cite> : Une valeur de 0 indique d'exclure tout routage à travers des pistes ou sentier (dans la mesure du possible). La valeur de 1 indique d'inclure les sentiers. La valeur par défaut est de 0.5.</li>
<li><cite>service_penalty</cite> : Une pénalité appliquée sur les routes génériques. Par défaut à 0, ici, je l'ai définie à 1.</li>
</ul>
<p>Il existe d'autre types de pénalités/coûts, comme l'utilisation de ferrys, des pentes (collines), des escaliers, etc.</p>
<p>Ici, je me suis limité à l'essentiel.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Il y aurait encore pas mal de trucs à faire sur les cartes isochrones, comme par exemple, comment afficher plusieurs points en même temps (prendre une liste des coordonnées des boulangeries, et tracer à partir de ces points, des zones de 5 minutes puis 10 minutes à pieds, pour trouver des zones sans boulangerie, zones blanches donc), ou évaluer différents moyens de transport en simultané, comme la comparaison entre la voiture et le vélo, etc ; mais je vais m'arrêter là.</p>
</div>
</div>
<div class="section" id="calcul-d-itineraire">
<h2>Calcul d'itinéraire</h2>
<p>Parmi les utilisations possibles de Valhalla, c'est bien entendu le calcul d'itinéraire.</p>
<p>Par exemple, comment aller de la Préfecture à la Porte Notre-Dame à pieds.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Tout comme la démo pour la carte isochrone, je suis parti des fichiers d'exemple, et un seul jeu de données figées est disponible.</p>
</div>
<img alt="" src="images/valhalla/demo2.jpg">
<p>La démo est accessible ici :</p>
<p><a class="reference external" href="https://blog.chibi-nah.fr/images/valhalla/demo2/">https://blog.chibi-nah.fr/images/valhalla/demo2/</a></p>
<p>Démo en vidéo, avec un service valhalla fonctionnel. On peut voir les durées changer en fonction de la vitesse de déplacement.</p>
<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" title="valhalla - démo 1 isochrone" src="https://tube.nah.re/videos/embed/959ef6bf-2224-4708-a542-ccf7f1521102" frameborder="0" allowfullscreen=""></iframe><p>Les fichiers de démo (la partie interactive étant commentée) sont disponibles dans cette archive zip : <a class="reference external" href="https://blog.chibi-nah.fr/images/valhalla/demo2/demo2.zip">https://blog.chibi-nah.fr/images/valhalla/demo2/demo2.zip</a></p>
<p>Pour réactiver la partie interactive, comme sur la démo vidéo, ouvrir le fichier js/route.js</p>
<p>Descendre à la ligne 36 (dans la fonction get_routes()), et supprimer ces caractères :</p>
<div class="highlight"><pre><span></span><span class="c1">//</span>
</pre></div>
<p>Descendre à la ligne 37, et supprimer cette ligne :</p>
<div class="highlight"><pre><span></span><span class="kd">const</span><span class="w"> </span><span class="nx">url</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'route.json'</span><span class="p">;</span>
</pre></div>
<p>Enregistrer.</p>
<p>Maintenant, le script chargera les données depuis le service valhalla écoutant sur <a class="reference external" href="http://localhost:8002">http://localhost:8002</a>, comme indiqué à la ligne 20.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Au niveau technique, c'est assez proche de ce qui est fait avec la carte isochrone. Je ne reprendrai pas la totalité des explications déjà faites, seulement ce qui diffère ici.</p>
</div>
<p>On définit le point de départ avec <cite>startPoint</cite>, le point d'arrivée avec <cite>endPoint</cite>, ainsi que les coordonnées du centre de la carte avec <cite>initLocation</cite>.</p>
<div class="highlight"><pre><span></span><span class="kd">const</span><span class="w"> </span><span class="nx">initLocation</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="nx">lat</span><span class="o">:</span><span class="w"> </span><span class="mf">48.69629</span><span class="p">,</span><span class="w"> </span><span class="nx">lon</span><span class="o">:</span><span class="w"> </span><span class="mf">6.18186</span><span class="p">};</span>
<span class="kd">const</span><span class="w"> </span><span class="nx">startPoint</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="nx">lat</span><span class="o">:</span><span class="w"> </span><span class="mf">48.69353</span><span class="p">,</span><span class="w"> </span><span class="nx">lon</span><span class="o">:</span><span class="w"> </span><span class="mf">6.18327</span><span class="p">};</span>
<span class="kd">const</span><span class="w"> </span><span class="nx">endPoint</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="nx">lat</span><span class="o">:</span><span class="w"> </span><span class="mf">48.69935</span><span class="p">,</span><span class="nx">lon</span><span class="o">:</span><span class="w"> </span><span class="mf">6.17778</span><span class="p">};</span>
</pre></div>
<p>Juste en dessous, on initialise Leaflet, et on sélectionne le serveur de tuiles <cite>b.tile.openstreetmap.org</cite>. (modifier http/https si nécessaire).</p>
<p>La fonction get_routes() contient les paramètres pour le calcul d'itinéraire.</p>
<div class="highlight"><pre><span></span><span class="nx">json</span><span class="p">[</span><span class="s1">'locations'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="nx">startPoint</span><span class="p">,</span><span class="nx">endPoint</span><span class="p">];</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'costing'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'pedestrian'</span><span class="p">;</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'costing_options'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s2">"pedestrian"</span><span class="o">:</span><span class="p">{</span><span class="s2">"walking_speed"</span><span class="o">:</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">'speed'</span><span class="p">).</span><span class="nx">value</span><span class="p">,</span><span class="w"> </span><span class="s2">"alley_factor"</span><span class="o">:</span><span class="w"> </span><span class="s2">"1"</span><span class="p">,</span><span class="s2">"use_tracks"</span><span class="o">:</span><span class="s2">"1"</span><span class="p">,</span><span class="s2">"service_penalty"</span><span class="o">:</span><span class="s2">"1"</span><span class="p">}};</span>
<span class="nx">json</span><span class="p">[</span><span class="s1">'directions_options'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s2">"units"</span><span class="o">:</span><span class="s2">"kilometers"</span><span class="p">,</span><span class="s2">"language"</span><span class="o">:</span><span class="s2">"fr-FR"</span><span class="p">}</span>
</pre></div>
<ul class="simple">
<li><cite>locations</cite> contient les points de départ et d'arrivée.</li>
<li><cite>costing</cite> correspond au moyen de transport. Ici, piéton <cite>pedestrian</cite></li>
<li><cite>costing_options</cite> contient les contraintes sous forme de coût pour le déplacement à pieds. On retrouve notamment la vitesse de déplacement, ici, lue via le champ <cite>speed</cite> du formulaire sur la page de démo. Cela permet de recalculer la durée en fonction de la vitesse de déplacement.</li>
<li><cite>directions_options</cite> contient l'unité de mesure pour les déplacements et la langue à utiliser pour les instructions.</li>
</ul>
<p>La fonction build_geojson() a été modifiée pour pouvoir afficher les instructions pour l'itinéraire.</p>
<div class="highlight"><pre><span></span><span class="kd">let</span><span class="w"> </span><span class="nx">duration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">leg</span><span class="p">.</span><span class="nx">summary</span><span class="p">.</span><span class="nx">time</span><span class="p">;</span>
<span class="kd">let</span><span class="w"> </span><span class="nx">minute</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nx">duration</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">60</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="mf">0</span><span class="p">);</span>
<span class="kd">let</span><span class="w"> </span><span class="nx">seconde</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nx">duration</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="mf">60</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="mf">0</span><span class="p">);</span>
<span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">"<h3>Itinéraire</h3>"</span>
<span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">"<b>Durée totale : </b>"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">minute</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"minutes "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">seconde</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">" secondes<br />"</span>
<span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">"<b>Distance totale : </b>"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">leg</span><span class="p">.</span><span class="nx">summary</span><span class="p">.</span><span class="nx">length</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">" km<br /><br />"</span>
<span class="nx">leg</span><span class="p">.</span><span class="nx">maneuvers</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="w"> </span><span class="p">(</span><span class="nx">maneuver</span><span class="p">)</span><span class="w"> </span><span class="p">=></span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="nx">maneuver</span><span class="p">.</span><span class="nx">type</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">4</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">"<b>type : </b>"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">maneuver</span><span class="p">.</span><span class="nx">type</span><span class="p">;</span>
<span class="w"> </span><span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">" ; durée : "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">maneuver</span><span class="p">.</span><span class="nx">time</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">' secondes<br />'</span><span class="p">;</span>
<span class="w"> </span><span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">"<b>instruction : </b>"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">maneuver</span><span class="p">.</span><span class="nx">instruction</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">"<b>type : </b>"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">maneuver</span><span class="p">.</span><span class="nx">type</span><span class="p">;</span>
<span class="w"> </span><span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">" ; durée : "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">maneuver</span><span class="p">.</span><span class="nx">time</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">' secondes<br />'</span><span class="p">;</span>
<span class="w"> </span><span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">"<b>instruction : </b>"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">maneuver</span><span class="p">.</span><span class="nx">instruction</span><span class="p">;</span>
<span class="w"> </span><span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">"<br />"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">maneuver</span><span class="p">.</span><span class="nx">verbal_post_transition_instruction</span><span class="p">;</span>
<span class="w"> </span><span class="nx">roadTrip</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s2">"<br /><br />"</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">});</span>
</pre></div>
<ul class="simple">
<li><cite>leg.summary</cite> contient les données d'informations sur l'itinéraire, notamment la durée via <cite>time</cite> et la distance via <cite>length</cite>.</li>
<li><cite>leg.maneuvers</cite> contient chacune des étapes pour l'itinéraire. C'est pour cela que l'on utilise une boucle, et chaque instruction se retrouve alors dans l'objet maneuver.</li>
</ul>
<p>Pour chaque étape (ou maneuvre) :</p>
<ul class="simple">
<li><cite>type contient</cite> le type. Par exemple 1 pour départ, 4 pour arrivée… pour plus de détails, lire la documentation de Valhalla.</li>
<li><cite>time contient</cite> la durée de la maneuvre</li>
<li><cite>instruction</cite> contient les instructions (tourner à droite dans Rue des Dominicains)</li>
<li><cite>verbal_post_transition_instruction</cite> contient des instructions supplémentaires (continuer pendant 60 mètres).</li>
</ul>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Sur l'étape d'arrivée, il n'y a pas d'instruction supplémentaire. C'est pour cela que ce cas est traité à part, pour éviter d'afficher <cite>undefined</cite> à la fin des instructions.</p>
</div>
<p>Pour le reste, quasiment pas de modifications par rapport à l'exemple.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Tout comme les cartes isochrones, on pourrait faire d'autres trucs avec le calcul d'itinéraire, notamment ajouter des points d'étape, voir comment éviter certaines rues (travaux par exemple), ou calculer/gérer/afficher des itinéraires alternatifs, etc ; mais je vais m'arrêter là.</p>
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Cet article n'a fait qu'effleurer ce qui est faisable avec Valhalla. Cependant, je pense que c'est un bon point de départ pour quiconque souhaiterait se lancer dans l'aventure, aussi bien pour générer des cartes isochrones <sup id="sf-valhalla-10-back"><a href="#sf-valhalla-10" class="simple-footnote" title="ça peut être utilisé au sein d'une mairie ou d'une collectivité locale, par exemple pour déterminer les emplacements pour des points de dépots de verre/papier ou s'il manque un service ou un commerce de proximité dans un quartier ">10</a></sup> que pour faire du calcul d'itinéraire<sup id="sf-valhalla-11-back"><a href="#sf-valhalla-11" class="simple-footnote" title="comme générer des chemins de randonnées">11</a></sup>.</p>
</div>
<div class="section" id="licence">
<h2>Licence</h2>
<p>Le projet Valhalla et les démos de ce projet<sup id="sf-valhalla-12-back"><a href="#sf-valhalla-12" class="simple-footnote" title=" https://github.com/valhalla/demos ">12</a></sup> étant sous licence MIT, les exemples et code source présentés sur cette page sont également sous licence MIT.</p>
<p>Les données OSM sont sous licence ODbL : <a class="reference external" href="https://www.openstreetmap.org/copyright/fr">https://www.openstreetmap.org/copyright/fr</a></p>
<p>--</p>
</div>
<ol class="simple-footnotes"><li id="sf-valhalla-1">Façon de parler <a href="#sf-valhalla-1-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-2">Pourquoi les services en ligne proposant ça sont ou limités au niveau requête ou payant à votre avis ? <a href="#sf-valhalla-2-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-3">hébergées sur PeerTube <a href="#sf-valhalla-3-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-4"> <a class="reference external" href="https://blog.chibi-nah.fr/affichage-de-points-sur-une-carte">https://blog.chibi-nah.fr/affichage-de-points-sur-une-carte</a> <a href="#sf-valhalla-4-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-5"> <a class="reference external" href="https://valhalla.readthedocs.io/en/latest/valhalla-intro/">https://valhalla.readthedocs.io/en/latest/valhalla-intro/</a> <a href="#sf-valhalla-5-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-6">Linux, Apache, MySQL/MariaDB, PHP <a href="#sf-valhalla-6-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-7">En mode console <a href="#sf-valhalla-7-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-8">JavaScript Object Notation, qui comme son nom ne l'indique pas, est un format de fichier relativement pratique pour échanger des données, pas obligatoirement avec javascript. <a href="#sf-valhalla-8-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-9"> <a class="reference external" href="https://github.com/valhalla/demos">https://github.com/valhalla/demos</a> <a href="#sf-valhalla-9-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-10">ça peut être utilisé au sein d'une mairie ou d'une collectivité locale, par exemple pour déterminer les emplacements pour des points de dépots de verre/papier ou s'il manque un service ou un commerce de proximité dans un quartier <a href="#sf-valhalla-10-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-11">comme générer des chemins de randonnées <a href="#sf-valhalla-11-back" class="simple-footnote-back">↩</a></li><li id="sf-valhalla-12"> <a class="reference external" href="https://github.com/valhalla/demos">https://github.com/valhalla/demos</a> <a href="#sf-valhalla-12-back" class="simple-footnote-back">↩</a></li></ol>Support pour webcam2022-01-18T00:00:00+01:002022-01-18T00:00:00+01:00alextag:blog.chibi-nah.fr,2022-01-18:/support-pour-webcam<p>TL;DR (trop long, flemme de lire).</p>
<p>Télécharger, découper et imprimer le fichier <a class="reference external" href="images/supportWebcam/support-logitech-streamcam.stl">support-logitech-streamcam.stl</a>.</p>
<div class="section" id="contexte">
<h2>Contexte</h2>
<p>Cela fait plusieurs mois que j'utilise une webcam<sup id="sf-support-pour-webcam-1-back"><a href="#sf-support-pour-webcam-1" class="simple-footnote" title="Logitech Streamcam">1</a></sup>, mais son positionnement n'était pas super.</p>
<p>En effet, ayant changé de moniteurs PC et ayant fini par craquer et les positionner sur des bras articulés …</p></div><p>TL;DR (trop long, flemme de lire).</p>
<p>Télécharger, découper et imprimer le fichier <a class="reference external" href="images/supportWebcam/support-logitech-streamcam.stl">support-logitech-streamcam.stl</a>.</p>
<div class="section" id="contexte">
<h2>Contexte</h2>
<p>Cela fait plusieurs mois que j'utilise une webcam<sup id="sf-support-pour-webcam-1-back"><a href="#sf-support-pour-webcam-1" class="simple-footnote" title="Logitech Streamcam">1</a></sup>, mais son positionnement n'était pas super.</p>
<p>En effet, ayant changé de moniteurs PC et ayant fini par craquer et les positionner sur des bras articulés, je n'avais plus d'emplacement pour poser la webcam.</p>
<p>La solution de la poser au dessus de l'un des écrans n'étant plus possible <sup id="sf-support-pour-webcam-2-back"><a href="#sf-support-pour-webcam-2" class="simple-footnote" title="Parce que trop fin">2</a></sup>, il m'a fallu trouver une autre solution.</p>
<p>L'une des possibilité était de poser la webcam sur la colonne centrale <sup id="sf-support-pour-webcam-3-back"><a href="#sf-support-pour-webcam-3" class="simple-footnote" title="celle maintenant les deux bras articulés">3</a></sup>, mais cela ne convenait pas du tout.</p>
<img alt="" src="images/supportWebcam/image1.jpg">
<p>Jugez par vous-même. C'est pas terrible.</p>
</div>
<div class="section" id="modelisation">
<h2>Modélisation</h2>
<p>D'abord, avant de toucher au PC, il faut réfléchir sur la forme de la pièce. Par habitude, j'ai dessiné vite-fait une esquisse sur un cahier. Une partie circulaire qui ira sur le montant, une fente rectangulaire dans laquelle coulissera le support d'origine de la webcam.</p>
<p>Ensuite, armé d'un pied à coulisse, j'ai mesuré le diamètre du montant (~35,5 mm), et aussi le support de la webcam (36 mm × 12 mm).</p>
<img alt="" src="images/supportWebcam/support.jpg">
<p>Jusque là, pas de soucis.</p>
<p>Ayant galéré avec FreeCAD (crash, instable, tutos plus à jour), je suis parti sur OpenSCAD.</p>
<div class="section" id="openscad">
<h3>OpenSCAD</h3>
<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Le code présenté ici correspond à la version 2 du support. Une erreur de mesure et l'absence de marge ont fait que la pièce imprimée initialement était en fait trop petite. Les corrections sur les cotes ont été faites.</p>
</div>
<p>D'un aspect plutôt austère, cet outil de modélisation a une approche « script ». En résumé, la souris ne sert qu'à regarder la pièce sous différents angles.</p>
<img alt="" src="images/supportWebcam/openScad1.jpg">
<p>La pièce sera composée d'un rectangle, et d'un demi-cercle dépassant de ce rectangle.</p>
<p>On commence par le rectangle (44 mm × 40 mm). Taper dans la zone de texte, dans l'éditeur :</p>
<div class="highlight"><pre><span></span><span class="nx">square</span><span class="p">([</span><span class="mf">44</span><span class="p">,</span><span class="mf">40</span><span class="p">]);</span>
</pre></div>
<p>Appuyer sur la touche F5. Un rectangle doit apparaître dans la zone de visualisation.</p>
<img alt="" src="images/supportWebcam/openScad2.jpg">
<p>Maintenant, on ajoute un cercle, de diamètre 44 mm :</p>
<div class="highlight"><pre><span></span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">44</span><span class="p">);</span>
</pre></div>
<p>Un appui sur F5 et… ah, ben, c'est pas bon en fait.</p>
<img alt="" src="images/supportWebcam/openScad3.jpg">
<p>Le cercle a été tracé en utilisant les coordonnées x = 0, y = 0, Z = 0 comme point central.</p>
<p>Il faut donc déplacer le centre de ce cercle, disons, de 22 mm sur l'axe des x (axe rouge indiqué dans le coin en bas à gauche, dans la visualisation).</p>
<p>On va utiliser l'instruction <cite>translate</cite> sur le cercle.</p>
<p>Modifier le code comme suit :</p>
<div class="highlight"><pre><span></span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">44</span><span class="p">);</span>
<span class="p">};</span>
</pre></div>
<img alt="" src="images/supportWebcam/openScad4.jpg">
<p>Les deux éléments se superposent, ça serait bien de les fusionner réellement.</p>
<p>Modifier le code comme suit :</p>
<div class="highlight"><pre><span></span><span class="nx">union</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">square</span><span class="p">([</span><span class="mf">44</span><span class="p">,</span><span class="mf">40</span><span class="p">]);</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">44</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="p">}</span>
</pre></div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Ne pas hésiter à indenter le code pour le rendre plus lisible.</p>
</div>
<img alt="" src="images/supportWebcam/openScad5.jpg">
<p>Maintenant, on va enlever de la matière (soustraire), via l'instruction <cite>difference</cite>.</p>
<p>Le cercle correspondant à la matière à retirer devra avoir son centre positionné au même endroit que le cercle initial ; donc déplacement sur l'axe des x de 22 mm.</p>
<p>On va prendre un peu de marge, et creuser avec un diamètre de 37mm. Il y aura un léger jeu dans la pièce, mais ce n'est pas trop grave <sup id="sf-support-pour-webcam-4-back"><a href="#sf-support-pour-webcam-4" class="simple-footnote" title="Au pire, on peut caler avec un morceau de carton, bristol, feuille pliée…">4</a></sup>.</p>
<div class="highlight"><pre><span></span><span class="nx">difference</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">//Pièce de base</span>
<span class="w"> </span><span class="nx">union</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">square</span><span class="p">([</span><span class="mf">44</span><span class="p">,</span><span class="mf">40</span><span class="p">]);</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">44</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">//cercle (matière à retirer)</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">37</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="p">}</span>
</pre></div>
<img alt="" src="images/supportWebcam/openScad6.jpg">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">On peut ajouter des commentaires dans le code. Cela permet de s'y retrouver, ou de tester une petite partie du code, sans impacter le reste.</p>
</div>
<div class="highlight"><pre><span></span><span class="c1">//ce commentaire tient sur une seule ligne</span>
<span class="cm">/*</span>
<span class="cm"> * Ce commentaire tient</span>
<span class="cm"> * sur plusieurs lignes.</span>
<span class="cm"> */</span>
</pre></div>
<p>Admettons que l'on veuille juste tester l'instruction <cite>difference</cite> sur le cercle. On modifierait le code comme ceci :</p>
<div class="highlight"><pre><span></span><span class="nx">difference</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">//Pièce de base</span>
<span class="c1">// union() {</span>
<span class="c1">// square([44,40]);</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">44</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="c1">// }</span>
<span class="w"> </span><span class="c1">//cercle (matière à retirer)</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">37</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="p">}</span>
</pre></div>
<img alt="" src="images/supportWebcam/openScad7.jpg">
<p>C'était juste pour l'exemple.</p>
<p>Décommenter le code.</p>
<p>On va maintenant découper la fente.
On ajoute une nouvelle différence dans l'ensemble, avec un rectangle de 37 mm × 13 mm, et centré par rapport au rectangle, mais décalé par rapport au cercle.</p>
<div class="highlight"><pre><span></span><span class="nx">difference</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">difference</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">//Pièce de base</span>
<span class="w"> </span><span class="nx">union</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">square</span><span class="p">([</span><span class="mf">44</span><span class="p">,</span><span class="mf">40</span><span class="p">]);</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">44</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">//cercle (matière à retirer)</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">37</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">//rectangle (matière à retirer)</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">3.5</span><span class="p">,</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">square</span><span class="p">([</span><span class="mf">37</span><span class="p">,</span><span class="mf">13</span><span class="p">]);</span>
<span class="w"> </span><span class="p">};</span>
<span class="p">}</span>
</pre></div>
<img alt="" src="images/supportWebcam/openScad8.jpg">
<p>Maintenant, il faut donner du « volume » à la pièce. On va faire alors une extrusion linéaire, via <cite>linear_extrude</cite>, d'une hauteur de 50 mm.</p>
<div class="highlight"><pre><span></span><span class="nx">linear_extrude</span><span class="p">(</span><span class="nx">height</span><span class="o">=</span><span class="mf">50</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">difference</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">difference</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">//Pièce de base</span>
<span class="w"> </span><span class="nx">union</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">square</span><span class="p">([</span><span class="mf">44</span><span class="p">,</span><span class="mf">40</span><span class="p">]);</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">44</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">//cercle (matière à retirer)</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">37</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">//rectangle (matière à retirer)</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">3.5</span><span class="p">,</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">square</span><span class="p">([</span><span class="mf">37</span><span class="p">,</span><span class="mf">13</span><span class="p">]);</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<img alt="" src="images/supportWebcam/openScad9.jpg">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Ne pas hésiter à changer l'angle de vue avec la souris.</p>
</div>
<img alt="" src="images/supportWebcam/openScad10.jpg">
<p>On a presque fini avec la modélisation.</p>
<p>Pour éviter que ce support ne tombe, ça serait bien de boucher l'une des extrémités circulaire.</p>
<p>On va alors ajouter un cylindre dans la partie circulaire, d'une épaisseur de 5 mm.</p>
<div class="highlight"><pre><span></span><span class="nx">union</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">linear_extrude</span><span class="p">(</span><span class="nx">height</span><span class="o">=</span><span class="mf">50</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">difference</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">difference</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">//Pièce de base</span>
<span class="w"> </span><span class="nx">union</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">square</span><span class="p">([</span><span class="mf">44</span><span class="p">,</span><span class="mf">40</span><span class="p">]);</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">44</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">//cercle (matière à retirer)</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">circle</span><span class="p">(</span><span class="nx">d</span><span class="o">=</span><span class="mf">37</span><span class="p">);</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">//rectangle (matière à retirer)</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">3.5</span><span class="p">,</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">square</span><span class="p">([</span><span class="mf">37</span><span class="p">,</span><span class="mf">13</span><span class="p">]);</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">//cylindre servant de « bouchon »</span>
<span class="w"> </span><span class="nx">translate</span><span class="p">([</span><span class="mf">22</span><span class="p">,</span><span class="mf">0</span><span class="p">,</span><span class="mf">0</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">cylinder</span><span class="p">(</span><span class="nx">h</span><span class="o">=</span><span class="mf">5</span><span class="p">,</span><span class="w"> </span><span class="nx">d</span><span class="o">=</span><span class="mf">44</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<img alt="" src="images/supportWebcam/openScad11.jpg">
<img alt="" src="images/supportWebcam/openScad12.jpg">
<p>On a presque fini.</p>
<p>Appuyer sur F6 pour calculer le rendu (F5 ne fait qu'un aperçu).</p>
<p>Appuyer ensuite sur F7 pour générer un fichier .stl.</p>
<img alt="" src="images/supportWebcam/openScad13.jpg">
<p>Le fichier .scad est disponible ici : <a class="reference external" href="images/supportWebcam/support-logitech-streamcam.scad">support-logitech-streamcam.scad</a>. ; tout comme le fichier .stl <a class="reference external" href="images/supportWebcam/support-logitech-streamcam.stl">support-logitech-streamcam.stl</a>.</p>
<p>La partie modélisation est terminée.</p>
</div>
<div class="section" id="preparation-de-l-impression-3d">
<h3>Préparation de l'impression 3D</h3>
<p>Bien, maintenant que l'on a notre fichier stl, on va pouvoir l'imprimer ? En fait, non. Il y a une étape intermédiaire : transformer un modèle 3D en un fichier interprétable par l'imprimante, le fichier gcode<sup id="sf-support-pour-webcam-5-back"><a href="#sf-support-pour-webcam-5" class="simple-footnote" title="Ce fichier contient les instructions comme chauffe la buse à telle température, avance le plateau (bed) de 30 mm sur l'axe des x, etc.">5</a></sup>.</p>
<p>Prenez votre logiciel préféré <sup id="sf-support-pour-webcam-6-back"><a href="#sf-support-pour-webcam-6" class="simple-footnote" title="pour moi, c'est PrusaSlicer, basé sur Slic 3r">6</a></sup>, et importez le fichier .stl.</p>
<img alt="" src="images/supportWebcam/slicer1.jpg">
<p>Faire les réglages habituels, je n'entrerai pas dans les détails, ça change d'une imprimante 3D à l'autre<sup id="sf-support-pour-webcam-7-back"><a href="#sf-support-pour-webcam-7" class="simple-footnote" title="Je me suis fait des profils d'impression, celui que j'utilise le plus, c'est épaisseur 0,2mm, rapide, avec remplissage rectiligne à 30%. Ce réglage me convient pour la plupart des trucs que j'imprime">7</a></sup>.</p>
<p>Faire le découpage/trancher/slicer (le mot peut varier).</p>
<img alt="" src="images/supportWebcam/slicer2.jpg">
<p>Ne pas hésiter à visualiser le résultat couche par couche.</p>
<img alt="" src="images/supportWebcam/slicer3.jpg">
<p>Enfin, générez le G-Code, et l'envoyer à l'imprimante (via Octoprint, avec une microSD, etc).</p>
</div>
<div class="section" id="impression-3d">
<h3>Impression 3D</h3>
<p>Patienter quelques heures, le temps que la machine imprime la pièce<sup id="sf-support-pour-webcam-8-back"><a href="#sf-support-pour-webcam-8" class="simple-footnote" title="4 heures et 20 minutes pour moi, avec une Ender 3 Pro">8</a></sup>.</p>
<img alt="" src="images/supportWebcam/print.jpg">
</div>
<div class="section" id="resultat">
<h3>Résultat</h3>
<p>Résultat en images :</p>
<img alt="" src="images/supportWebcam/print2.jpg">
<img alt="" src="images/supportWebcam/print3.jpg">
<img alt="" src="images/supportWebcam/print4.jpg">
<p>Et une fois en place :</p>
<img alt="" src="images/supportWebcam/resultat1.jpg">
<img alt="" src="images/supportWebcam/resultat2.jpg">
<img alt="" src="images/supportWebcam/resultat3.jpg">
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Créer une pièce en plastique à partir de rien, ce n'est pas compliqué. C'est juste un peu long, mais le résultat en valait la peine.</p>
<p>--</p>
</div>
<ol class="simple-footnotes"><li id="sf-support-pour-webcam-1">Logitech Streamcam <a href="#sf-support-pour-webcam-1-back" class="simple-footnote-back">↩</a></li><li id="sf-support-pour-webcam-2">Parce que trop fin <a href="#sf-support-pour-webcam-2-back" class="simple-footnote-back">↩</a></li><li id="sf-support-pour-webcam-3">celle maintenant les deux bras articulés <a href="#sf-support-pour-webcam-3-back" class="simple-footnote-back">↩</a></li><li id="sf-support-pour-webcam-4">Au pire, on peut caler avec un morceau de carton, bristol, feuille pliée… <a href="#sf-support-pour-webcam-4-back" class="simple-footnote-back">↩</a></li><li id="sf-support-pour-webcam-5">Ce fichier contient les instructions comme chauffe la buse à telle température, avance le plateau (bed) de 30 mm sur l'axe des x, etc. <a href="#sf-support-pour-webcam-5-back" class="simple-footnote-back">↩</a></li><li id="sf-support-pour-webcam-6">pour moi, c'est PrusaSlicer, basé sur Slic 3r <a href="#sf-support-pour-webcam-6-back" class="simple-footnote-back">↩</a></li><li id="sf-support-pour-webcam-7">Je me suis fait des profils d'impression, celui que j'utilise le plus, c'est épaisseur 0,2mm, rapide, avec remplissage rectiligne à 30%. Ce réglage me convient pour la plupart des trucs que j'imprime <a href="#sf-support-pour-webcam-7-back" class="simple-footnote-back">↩</a></li><li id="sf-support-pour-webcam-8">4 heures et 20 minutes pour moi, avec une Ender 3 Pro <a href="#sf-support-pour-webcam-8-back" class="simple-footnote-back">↩</a></li></ol>Projet MIDI Thru Box2022-01-09T00:00:00+01:002022-01-09T00:00:00+01:00alextag:blog.chibi-nah.fr,2022-01-09:/ProjetM<div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Article en cours de rédaction !</p>
</div>
<p>Un petit projet que j'avais évoqué dans le bilan de 2020, sous le nom de Projet M.</p>
<p>Ayant pu avancer dessus, suite à un regain de motivation, je peux maintenant le dévoiler.</p>
<p>Sans grande prétention, ce petit projet d'électronique est tout simplement une MIDI …</p><div class="admonition warning">
<p class="first admonition-title">Avis</p>
<p class="last">Article en cours de rédaction !</p>
</div>
<p>Un petit projet que j'avais évoqué dans le bilan de 2020, sous le nom de Projet M.</p>
<p>Ayant pu avancer dessus, suite à un regain de motivation, je peux maintenant le dévoiler.</p>
<p>Sans grande prétention, ce petit projet d'électronique est tout simplement une MIDI Thru Box, un répéteur/hub MIDI actif 1 entrée vers 5 sorties.</p>
<p>Pas grand chose dedans en fait.</p>
<p>Un 6N136 (ou 6N137, tout dépendra de ce qui sera disponible) (octo-coupleur) en entrée, pour isoler le signal, un 74HC14 (6 inverseurs non avec trigger de Schmitt) pour dupliquer le signal sur 5 sorties (double inversion). Un régulateur 7805 classique pour abaisser la tension à 5V depuis une tension classique de 9-12V. Plus quelques condensateurs et résistances, et deux LED. Une pour indiquer que le circuit est alimenté, et l'autre pour indiquer l'activité MIDI.</p>
<p>Pouvant faire ça vite-fait avec une plaque à essais de type veroboard, mais n'apportant pas vraiment de fun, j'ai préféré faire ça de manière un peu plus « pro », en concevant complètement le circuit imprimé.</p>
<p>Pourquoi le réaliser moi-même ? Parce qu'un petit tour sur le marché du neuf m'a fait vite déchanter. Un appareil de ce genre est vendu dans les 60 à 90€. C'est cher pour ce que c'est.</p>
<p>La suite pour plus tard…</p>
<p>Spoiler :</p>
<img alt="" src="images/projetm/schema.png" />
<img alt="" src="images/projetm/pcb1.jpg" />
<img alt="" src="images/projetm/pcb2.jpg" />
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Le routage est maintenant fait.</p>
</div>
<iframe title="KiCad - Éditeur de PCB. Routage (manuel) des pistes." src="https://tube.nah.re/videos/embed/a90f90e9-143a-42ff-bc3f-924c0550237b" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups" width="560" height="315" frameborder="0"></iframe>Bilan de 20212021-12-30T00:00:00+01:002021-12-30T00:00:00+01:00alextag:blog.chibi-nah.fr,2021-12-30:/bilan-2021<!-- :status: draft -->
<p>Petit bilan de l'année écoulée.</p>
<p>L'année 2021 se termine. C'est le moment de faire le bilan.</p>
<div class="section" id="bilan-de-l-annee">
<h2>Bilan de l'année</h2>
<div class="section" id="au-niveau-associatif">
<h3>Au niveau associatif</h3>
<p>Je ne suis plus membre du collège solidaire depuis la dernière AGO.</p>
<p>Indépendamment de ce fait, la dissolution de l'association Lorraine Data Network a été annoncée au milieu …</p></div></div><!-- :status: draft -->
<p>Petit bilan de l'année écoulée.</p>
<p>L'année 2021 se termine. C'est le moment de faire le bilan.</p>
<div class="section" id="bilan-de-l-annee">
<h2>Bilan de l'année</h2>
<div class="section" id="au-niveau-associatif">
<h3>Au niveau associatif</h3>
<p>Je ne suis plus membre du collège solidaire depuis la dernière AGO.</p>
<p>Indépendamment de ce fait, la dissolution de l'association Lorraine Data Network a été annoncée au milieu de l'année 2021.</p>
</div>
<div class="section" id="au-niveau-en-ligne">
<h3>Au niveau En ligne</h3>
<p>Pas grand-chose à signaler, juste un léger impact sur les accès en IPv4 lors de la panne générale d'OVH. Les services étaient toujours accessibles en IPv6.</p>
<p>Ajout de 2-3 trucs sur mon serveur gopher.</p>
<p>Maintenance habituelle des serveurs, ajout d'articles sur le blog, etc.</p>
</div>
<div class="section" id="au-niveau-hors-ligne">
<h3>Au niveau Hors ligne</h3>
<p>Pas grand-choseà dire non plus. La pénurie de composants repousse l'investissement dans du matériel. J'ai toutefois pu changer de CPU sur ma machine, pour avoir un truc un peu plus performant que ce que j'avais déjà. L'ayant déjà évoqué dans un pouët, je ne le répéterai pas ici.</p>
</div>
<div class="section" id="au-niveau-irl">
<h3>Au niveau IRL</h3>
<p>Gros événements, bien négatifs (cancer, décès), ayant eu un énorme impact émotionnel, entre début 2020 et mi-2021 >.< Je ne m'attarderai pas dessus.</p>
</div>
</div>
<div class="section" id="dans-ce-qui-etait-prevu-pour-2021">
<h2>Dans ce qui était prévu pour 2021</h2>
<div class="section" id="client-km-pour-sailfishos">
<h3>Client KM pour SailfishOS</h3>
<p>C'est toujours au point mort. Quasiment pas de karaoké cette année (pas le moral pour), voir plus haut.</p>
</div>
<div class="section" id="projet-lyan">
<h3>Projet Lyan</h3>
<p>En hiatus.</p>
</div>
<div class="section" id="ffmpeg-mpv">
<h3>ffmpeg/mpv</h3>
<p>La doc est finalisée. Les astuces que j'avais donné sous forme de pouëts sur le Fediverse ont été rassemblés.</p>
</div>
<div class="section" id="projet-v">
<h3>Projet V</h3>
<p>En suspens.</p>
</div>
<div class="section" id="projet-e">
<h3>Projet E</h3>
<p>Attente composants manquants pour le prototype.</p>
</div>
<div class="section" id="projet-m">
<h3>Projet M</h3>
<p>Toujours en suspens. Le schéma sur KiCAD est terminé, le routage ne l'est pas, et le positionnement dépend des composants que je n'ai pas.</p>
</div>
<div class="section" id="blog">
<h3>Blog</h3>
<p>Articles en suspens rédigés et publiés, et ajout de nouveaux articles…</p>
</div>
<div class="section" id="migrer-les-services-sur-un-nouveau-serveur">
<h3>Migrer les services sur un nouveau serveur</h3>
<p>C'était prévu pour 2021, mais à cause de la pénurie, c'est reporté en 2022.</p>
</div>
</div>
<div class="section" id="previsions-pour-2022">
<h2>Prévisions pour 2022</h2>
<p>Je ne vais pas m'avancer dans des trucs irréalisables.</p>
<div class="section" id="client-km-pour-sailfishos-1">
<h3>Client KM pour SailfishOS</h3>
<p>Repoussé à une date ultérieure, quand j'aurai la motivation pour.</p>
</div>
<div class="section" id="projet-v-1">
<h3>Projet V</h3>
<p>Peut-être un prototype en 2022, mais pas avant le milieu de l'année.</p>
</div>
<div class="section" id="projet-e-1">
<h3>Projet E</h3>
<p>Tout dépendra de la disponibilité des pièces restantes.</p>
</div>
<div class="section" id="projet-m-1">
<h3>Projet M</h3>
<p>Commander les composants manquants, finir le routage, faire un prototype pour valider.</p>
</div>
<div class="section" id="blog-1">
<h3>Blog</h3>
<p>Rédiger de nouveaux articles.</p>
</div>
<div class="section" id="migrer-les-services-sur-un-nouveau-serveur-1">
<h3>Migrer les services sur un nouveau serveur</h3>
<p>Tout dépendra de la disponibilité des pièces informatique. Peut être mi-2022.</p>
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Bilan mitigé pour 2021 (pour ne pas dire année merdique, mais presque).</p>
<p>Pour 2022, je vais mettre la barre encore moins haut pour les projets.</p>
</div>
PlayStation 2, Raspberry Pi et lecteur DVD HS2021-10-26T00:00:00+02:002021-10-26T00:00:00+02:00alextag:blog.chibi-nah.fr,2021-10-26:/playstation2-raspberrypi<p>À cause du comportement irresponsable du chargé de com de Raspberry Pi et de la perte totale de la confiance envers cette société, cet article a été supprimé !</p>
<p>Due to the irresponsible behavior of the Raspberry Pi's CM and the total loss of trust in this company, this article has …</p><p>À cause du comportement irresponsable du chargé de com de Raspberry Pi et de la perte totale de la confiance envers cette société, cet article a été supprimé !</p>
<p>Due to the irresponsible behavior of the Raspberry Pi's CM and the total loss of trust in this company, this article has been deleted!</p>
<p>En savoir plus (en anglais)/More informations : <a class="reference external" href="https://eiara.nz/posts/2022/Dec/09/a-case-study-on-raspberry-pis-incident-on-the-fediverse/">https://eiara.nz/posts/2022/Dec/09/a-case-study-on-raspberry-pis-incident-on-the-fediverse/</a></p>
mpv, OSD et affichage du nom du chapitre en cours de lecture2021-07-04T00:00:00+02:002021-07-04T00:00:00+02:00alextag:blog.chibi-nah.fr,2021-07-04:/mpv-osd-et-chapitre<p>TL;DR (trop long, flemme de tout lire) : Un appui sur la touche 'g' affiche le chapitre en cours de lecture dans mpv.
Copier le script <a class="reference external" href="https://aeka.chibi-nah.net/~alex/brol/showCurrentChapter.lua">https://aeka.chibi-nah.net/~alex/brol/showCurrentChapter.lua</a> dans ~/.config/mpv/scripts</p>
<div class="section" id="contexte">
<h2>Contexte</h2>
<p>Tout est parti d'un pouët de @devnull<sup id="sf-mpv-osd-et-chapitre-1-back"><a href="#sf-mpv-osd-et-chapitre-1" class="simple-footnote" title=" https://mamot.fr/@devnull/106521784534006704 ">1</a></sup> sur le Fediverse …</p></div><p>TL;DR (trop long, flemme de tout lire) : Un appui sur la touche 'g' affiche le chapitre en cours de lecture dans mpv.
Copier le script <a class="reference external" href="https://aeka.chibi-nah.net/~alex/brol/showCurrentChapter.lua">https://aeka.chibi-nah.net/~alex/brol/showCurrentChapter.lua</a> dans ~/.config/mpv/scripts</p>
<div class="section" id="contexte">
<h2>Contexte</h2>
<p>Tout est parti d'un pouët de @devnull<sup id="sf-mpv-osd-et-chapitre-1-back"><a href="#sf-mpv-osd-et-chapitre-1" class="simple-footnote" title=" https://mamot.fr/@devnull/106521784534006704 ">1</a></sup> sur le Fediverse<sup id="sf-mpv-osd-et-chapitre-2-back"><a href="#sf-mpv-osd-et-chapitre-2" class="simple-footnote" title="Pour n̶e̶ ̶p̶a̶s̶ changer…">2</a></sup>. En résumé : Est-il possible d'afficher la piste d'un fichier .cue en cours de lecture dans mpv ? Soit de manière permanente, soit pendant une certaine durée, ou lors de l'appui sur une touche.</p>
</div>
<div class="section" id="le-script">
<h2>Le script</h2>
<p>Le moyen le plus simple pour arriver à ce résultat, c'est l'écriture d'un script lua, et de l'enregistrer dans ~/.config/mpv/scripts (sous GNU/Linux et BSD, chemin à adapter sous Windows et Mac OS).</p>
<div class="highlight"><pre><span></span><span class="c1">--affichage du chapitre en cours</span>
<span class="c1">-- Licence WTFPL v2</span>
<span class="c1">-- @alex@social.nah.re</span>
<span class="kd">local</span> <span class="n">options</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">"mp.options"</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">utils</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">"mp.utils"</span><span class="p">)</span>
<span class="c1">--paramètres par défaut</span>
<span class="kd">local</span> <span class="n">cfg</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">key</span> <span class="o">=</span> <span class="s1">'g'</span><span class="p">,</span>
<span class="n">osdDuration</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span>
<span class="n">name</span> <span class="o">=</span> <span class="s1">'showCurrentChapter'</span>
<span class="p">}</span>
<span class="n">options</span><span class="p">.</span><span class="n">read_options</span><span class="p">(</span><span class="n">cfg</span><span class="p">,</span> <span class="s1">'showCurrentChapter'</span><span class="p">)</span>
<span class="kd">local</span> <span class="kr">function</span> <span class="nf">showCurrentChapter</span><span class="p">()</span>
<span class="kd">local</span> <span class="n">chapter</span> <span class="o">=</span> <span class="n">mp</span><span class="p">.</span><span class="n">get_property_osd</span><span class="p">(</span><span class="s1">'chapter'</span><span class="p">)</span>
<span class="n">mp</span><span class="p">.</span><span class="n">osd_message</span><span class="p">(</span><span class="n">chapter</span><span class="p">,</span> <span class="n">cfg</span><span class="p">.</span><span class="n">osdDuration</span><span class="p">)</span>
<span class="kr">end</span>
<span class="kr">if</span><span class="p">(</span><span class="n">cfg</span><span class="p">.</span><span class="n">key</span><span class="p">)</span> <span class="kr">then</span>
<span class="n">mp</span><span class="p">.</span><span class="n">add_key_binding</span><span class="p">(</span><span class="n">cfg</span><span class="p">.</span><span class="n">key</span><span class="p">,</span> <span class="n">cfg</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">showCurrentChapter</span><span class="p">)</span>
<span class="n">mp</span><span class="p">.</span><span class="n">msg</span><span class="p">.</span><span class="n">verbose</span><span class="p">(</span><span class="s2">"key:'"</span><span class="o">..</span><span class="n">cfg</span><span class="p">.</span><span class="n">key</span><span class="o">..</span><span class="s2">"' bound to '"</span><span class="o">..</span><span class="n">cfg</span><span class="p">.</span><span class="n">name</span><span class="o">..</span><span class="s2">"'"</span><span class="p">)</span>
<span class="kr">end</span>
</pre></div>
<p>Pas grand-chose à dire en fait.</p>
<p>Définir les paramètres par défaut, notamment la touche sur laquelle il faudra appuyer pour exécuter le script (ici, 'g'), et la durée d'affichage (5 secondes).</p>
<p>Ces options peuvent être redéfinies dans un fichier de configuration externe<sup id="sf-mpv-osd-et-chapitre-3-back"><a href="#sf-mpv-osd-et-chapitre-3" class="simple-footnote" title="Cf. documentation de mpv -> https://mpv.io/manual/stable/ ">3</a></sup>, ce qui évite de modifier le script<sup id="sf-mpv-osd-et-chapitre-4-back"><a href="#sf-mpv-osd-et-chapitre-4" class="simple-footnote" title="On peut très bien modifier le script en fait.">4</a></sup>.</p>
<p>À la fin, si la touche (cfg.key) est définie, alors on demande à mpv de l'ajouter dans sa liste des touches "mappées", et en lui indiquant quelle est la fonction à appeler (showCurrentChapter) lors de l'appui sur cette touche (g).</p>
<p>Et au dessus, la fonction affichant le chapitre.</p>
<p>J'avais d'abord essayé l'appel à <cite>mp.get_property('chapter')</cite>, mais je récupérais uniquement l'index du chapitre en cours de lecture (par exemple : <cite>5</cite>).</p>
<p>J'ai pensé charger la liste des chapitres dans un tableau, via chapter-list, mais cela complexifiait le code. Et en lisant la doc, en fait, le moyen le plus simple, c'était d'appeler <cite>mp.get_property_osd('chapter')</cite> directement.</p>
<p>Et pour l'affichage, il suffit d'appeler la fonction <cite>mp.osd_message(texte à afficher, durée)</cite>.</p>
<p>La durée étant stockée dans les paramètres, on n'a pas besoin de modifier la valeur dans cette fonction.</p>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Rien de compliqué. Un peu de code, quelques tests, et surtout<sup id="sf-mpv-osd-et-chapitre-5-back"><a href="#sf-mpv-osd-et-chapitre-5" class="simple-footnote" title="On ne peut pas y échapper.">5</a></sup> beaucoup de lecture de documentation<sup id="sf-mpv-osd-et-chapitre-6-back"><a href="#sf-mpv-osd-et-chapitre-6" class="simple-footnote" title="Bon, ça va, je sais à peu près comment fonctionne mpv et comment est organisée la documentation.">6</a></sup>.</p>
<p>--</p>
</div>
<ol class="simple-footnotes"><li id="sf-mpv-osd-et-chapitre-1"> <a class="reference external" href="https://mamot.fr/@devnull/106521784534006704">https://mamot.fr/@devnull/106521784534006704</a> <a href="#sf-mpv-osd-et-chapitre-1-back" class="simple-footnote-back">↩</a></li><li id="sf-mpv-osd-et-chapitre-2">Pour n̶e̶ ̶p̶a̶s̶ changer… <a href="#sf-mpv-osd-et-chapitre-2-back" class="simple-footnote-back">↩</a></li><li id="sf-mpv-osd-et-chapitre-3">Cf. documentation de mpv -> <a class="reference external" href="https://mpv.io/manual/stable/">https://mpv.io/manual/stable/</a> <a href="#sf-mpv-osd-et-chapitre-3-back" class="simple-footnote-back">↩</a></li><li id="sf-mpv-osd-et-chapitre-4">On peut très bien modifier le script en fait. <a href="#sf-mpv-osd-et-chapitre-4-back" class="simple-footnote-back">↩</a></li><li id="sf-mpv-osd-et-chapitre-5">On ne peut pas y échapper. <a href="#sf-mpv-osd-et-chapitre-5-back" class="simple-footnote-back">↩</a></li><li id="sf-mpv-osd-et-chapitre-6">Bon, ça va, je sais à peu près comment fonctionne mpv et comment est organisée la documentation. <a href="#sf-mpv-osd-et-chapitre-6-back" class="simple-footnote-back">↩</a></li></ol>Wallpaper Finer2021-06-20T00:00:00+02:002021-06-20T00:00:00+02:00alextag:blog.chibi-nah.fr,2021-06-20:/wallpaper-finer<p>Wallpaper finer est un petit logiciel libre et open source (GPLv2), permettant de redimensionner et recadrer très facilement et rapidement une image. Son principal défaut ? Il utilise encore Qt 4.</p>
<p>Comment modifier le code de ce logiciel pour utiliser Qt5 ? Réponse dans cet article.</p>
<p>TL;DR (trop long, flemme de …</p><p>Wallpaper finer est un petit logiciel libre et open source (GPLv2), permettant de redimensionner et recadrer très facilement et rapidement une image. Son principal défaut ? Il utilise encore Qt 4.</p>
<p>Comment modifier le code de ce logiciel pour utiliser Qt5 ? Réponse dans cet article.</p>
<p>TL;DR (trop long, flemme de tout lire) : le code source du portage vers Qt5 est disponible ici :</p>
<p><a class="reference external" href="https://gitlab.com/chibinah/wallpaperfiner">https://gitlab.com/chibinah/wallpaperfiner</a></p>
<p>Compilation :</p>
<div class="highlight"><pre><span></span>mkdir<span class="w"> </span>build
<span class="nb">cd</span><span class="w"> </span>build
qmake<span class="w"> </span>../WallpaperFiner.pro
make
</pre></div>
<p>Vérification que ça utilise bien qt5 :</p>
<div class="highlight"><pre><span></span>ldd<span class="w"> </span>wallpaperfiner
</pre></div>
<p>Exécution :</p>
<div class="highlight"><pre><span></span>./wallpaperfiner
</pre></div>
<div class="section" id="introduction">
<h2>Introduction</h2>
<p>Tout est parti d'un pouët de @TritTriton<sup id="sf-wallpaper-finer-1-back"><a href="#sf-wallpaper-finer-1" class="simple-footnote" title=" https://shelter.moe/@TritTriton/106436810381701106 ">1</a></sup>, qui parlait d'un petit logiciel permettant de recadrer et redimensionner une image facilement. Son seul reproche, c'est que c'est en Qt4<sup id="sf-wallpaper-finer-2-back"><a href="#sf-wallpaper-finer-2" class="simple-footnote" title="qui date quand même de 2005, et dont la dernière mise à jour date de 2012.">2</a></sup>. Cela impose donc de garder un framework<sup id="sf-wallpaper-finer-3-back"><a href="#sf-wallpaper-finer-3" class="simple-footnote" title="En français, on est censé parler de cadriciel, mais personne ne connait ça sous ce nom">3</a></sup> ancien sur sa machine.</p>
<img alt="" src="images/wpfiner/wpfiner.jpg">
<p>L'application (une fois le portage vers Qt5 effectué) en action.</p>
</div>
<div class="section" id="le-code-source">
<h2>Le code source</h2>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Tout a été rédigé avec GNU/Linux, notamment Debian, en tête. Rien n'a été testé sous Windows, aucune aide ni support ne sera apporté de ma part pour ce système d'exploitation.</p>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Ici, j'ai utilisé Qt Creator pour des raisons pratiques<sup id="sf-wallpaper-finer-4-back"><a href="#sf-wallpaper-finer-4" class="simple-footnote" title="Même si je n'aime pas la disposition de l'environnement de développement intégré (IDE), ni sa traduction inconsistente (c'est à moitié traduit en français).">4</a></sup>. J'aurais pu utiliser geany, vscode, vim, emacs ou autre éditeur de texte.</p>
</div>
<p>Le code source de Wallpaper Finer est disponible sur le site du développeur, Péter Deák<sup id="sf-wallpaper-finer-5-back"><a href="#sf-wallpaper-finer-5" class="simple-footnote" title=" http://hyperprog.com/wpfiner/index.html ">5</a></sup>, et est sous licence GPL v2. La dernière version date du mois d'août 2012<sup id="sf-wallpaper-finer-6-back"><a href="#sf-wallpaper-finer-6" class="simple-footnote" title="ce qui correspond à Qt 4.8, Qt 5 étant sorti après">6</a></sup>.</p>
<p>Le projet s'ouvre sans souci avec Qt Creator<sup id="sf-wallpaper-finer-7-back"><a href="#sf-wallpaper-finer-7" class="simple-footnote" title="Ça peut être utile d'installer Qt5, les outils de développement, etc. Se référer à la documentation ou au gestionnaire de paquets de la distribution utilisée. Idem : je n'apporterai aucune aide sur comment installer et ou configurer le tout.">7</a></sup>. Le projet étant créé avec Qt4, il faut modifier la configuration pour utiliser la bonne version de Qt. Lors de la rédaction de l'article, on en était à la version 5.15.2<sup id="sf-wallpaper-finer-8-back"><a href="#sf-wallpaper-finer-8" class="simple-footnote" title="En tout cas, sous Debian GNU/Linux">8</a></sup>.</p>
<img alt="" src="images/wpfiner/qtcreator1.jpg">
<p>Lors de l'ouverture du projet, Qt Creator demande de le configurer, notamment la cible, ici Desktop (Qt5).</p>
<p>Il faut quand même vérifier si c'est bien la bonne version de Qt qui est sélectionnée, pour éviter toute surprise si jamais on a plusieurs versions du framework<sup id="sf-wallpaper-finer-9-back"><a href="#sf-wallpaper-finer-9" class="simple-footnote" title="Cadriciel. Ce terme est barbant, je vais laisser framework partout dans l'article.">9</a></sup>.</p>
<img alt="" src="images/wpfiner/qtcreator2.jpg">
<p>Liste des kits de développement (SDK) paramétrés. Ayant fait du ménage dedans, il n'y a plus que Desktop (Qt5).</p>
<img alt="" src="images/wpfiner/qtcreator3.jpg">
<p>Versions de Qt installées. Version 4.8.7 (Qt4) et version 5.15.2 (Qt5).</p>
<p>Tout est bon ? On peut continuer.</p>
<p>Cliquer sur le bouton "Configure project".</p>
<p>Au bout de quelques instants, le projet s'affiche sous Projets, en haut à gauche.</p>
<img alt="" src="images/wpfiner/qtcreator4.jpg">
<p>Par défaut, tous les nœuds de l'arborescence sont repliés.</p>
</div>
<div class="section" id="adaptations-a-faire">
<h2>Adaptations à faire</h2>
<div class="section" id="projet">
<h3>Projet</h3>
<p>Il y a quelques modifications à faire dans WallpaperFiner.pro.</p>
<p>Ajouter <em>widgets</em> à droite, sur la ligne QT :</p>
<div class="highlight"><pre><span></span><span class="n">QT</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">core</span><span class="w"> </span><span class="n">gui</span><span class="w"> </span><span class="n">widgets</span>
</pre></div>
<p>Pour la traduction en français, ajouter <em>wpfiner_fr.ts</em> à droite, sur la ligne TRANSLATIONS :</p>
<div class="highlight"><pre><span></span><span class="n">TRANSLATIONS</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">wpfiner_hu</span><span class="p">.</span><span class="n">ts</span><span class="w"> </span><span class="n">wpfiner_pl</span><span class="p">.</span><span class="n">ts</span><span class="w"> </span><span class="n">wpfiner_fr</span><span class="p">.</span><span class="n">ts</span>
</pre></div>
<img alt="" src="images/wpfiner/qtcreator5.jpg">
<p>Modifications effectuées dans WallpaperFiner.pro.</p>
<p>Enregistrer et fermer le fichier.</p>
</div>
<div class="section" id="traduction-fr">
<h3>Traduction fr</h3>
<p>On va tout de suite ajouter la traduction en français.</p>
<ul class="simple">
<li>Ouvrir le nœud Other files.</li>
<li>Dupliquer le fichier wpfiner_pl.ts.</li>
<li>Nommer le fichier wpfiner_fr.ts.</li>
</ul>
<img alt="" src="images/wpfiner/qtcreator6.jpg">
<p>Duplication du fichier pour la traduction.</p>
<img alt="" src="images/wpfiner/qtcreator7.jpg">
<p>Nommage du fichier.</p>
<p>Ouvrir le fichier <em>wpfiner_fr.ts</em> en double-cliquant dessus. On va faire une modification dans ce fichier xml.</p>
<p>Dans <em>TS</em>, changer la langue de <em>pl_PL</em> à <em>fr_FR</em>, pour <em>language</em> et <em>sourceLanguage</em>.</p>
<div class="highlight"><pre><span></span><span class="nt"><TS</span><span class="w"> </span><span class="na">version=</span><span class="s">"2.0"</span><span class="w"> </span><span class="na">language=</span><span class="s">"fr_FR"</span><span class="w"> </span><span class="na">sourcelanguage=</span><span class="s">"fr_FR"</span><span class="nt">></span>
</pre></div>
<img alt="" src="images/wpfiner/qtcreator8.jpg">
<p>Modifications effectuées.</p>
<p>Enregistrer et fermer le fichier.</p>
<p>Ouvrir maintenant le fichier <em>wpfiner_fr.ts</em> avec Qt Linguist (l'outil dédié pour la traduction).</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">On peut aussi éditer le fichier xml à la main. Mais ce n'est pas forcément pratique et c'est source d'erreurs.</p>
</div>
<img alt="" src="images/wpfiner/qtcreator9.jpg">
<p>Menu contextuel -> Ouvrir avec</p>
<img alt="" src="images/wpfiner/qtlinguist1.jpg">
<p>Qt Linguist. Comparé à un outil léger comme PoEdit, l'interface semble compliquée.</p>
<p>Faire la traduction des différents textes et messages. Je ne m'attarderai pas dessus, ce n'est pas très difficile.</p>
<img alt="" src="images/wpfiner/qtlinguist2.jpg">
<p>Traduction française terminée.</p>
<p>Cliquer sur le menu Fichier -> Publier pour générer le fichier wpfiner_fr.qm. On en aura besoin par la suite.</p>
<img alt="" src="images/wpfiner/qtlinguist3.jpg">
<p>Menu Fichier -> Publier.</p>
<p>Fermer Qt Linguist.</p>
<p>Dans Qt Creator, ouvrir le nœud Resources, wpfiner.qrc, /</p>
<p>Faire un clic droit sur / -> Ajouter des fichiers existants…</p>
<img alt="" src="images/wpfiner/qtcreator10.jpg">
<p>Menu contextuel -> Ajouter des fichiers existants…</p>
<p>Sélectionner le fichier wpfiner_fr.qm et cliquer sur Ouvrir.</p>
<img alt="" src="images/wpfiner/qtcreator11.jpg">
<p>Boîte de dialogue de sélection de fichiers.</p>
</div>
<div class="section" id="entete-wpfiner-h">
<h3>Entête (wpfiner.h)</h3>
<p>Ouvrir le fichier <em>wpfiner.h</em>.</p>
<p>Modifier le numéro de version en 0.95 (la version étant 0.94).</p>
<div class="highlight"><pre><span></span><span class="cp">#define VERSION "0.95"</span>
</pre></div>
<p>Dans ce fichier, il y a une erreur (indiquée en rouge) :</p>
<ul class="simple">
<li>expected class name.</li>
</ul>
<p>Pour corriger cette erreur, il faut ajouter des #includes supplémentaires.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">S'aider de la documentation du SDK Qt, notamment les pages de migration Qt4 vers Qt5.</p>
</div>
<p>Les entêtes à ajouter sous #include <QtCore> sont :</p>
<div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><QMainWindow></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><QFrame></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><QMenu></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><QMenuBar></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><QMessageBox></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><QFileDialog></span>
</pre></div>
<img alt="" src="images/wpfiner/qtcreator12.jpg">
<p>Modifications effectuées.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">il reste un warning (ligne jaune), ne pas en tenir compte pour le moment<sup id="sf-wallpaper-finer-10-back"><a href="#sf-wallpaper-finer-10" class="simple-footnote" title="En fait, j'ai carrément ignoré tous les warnings dans le code source, cela concerne des fonctions ou des instructions dépréciées.">10</a></sup></p>
</div>
<p>Enregistrer et fermer le fichier wpfiner.h.</p>
</div>
<div class="section" id="c-main-cpp">
<h3>C++ (main.cpp)</h3>
<p>Ouvrir le fichier <em>main.cpp</em>.</p>
<p>Il y a deux erreurs dans ce fichier :</p>
<ul class="simple">
<li>QtGui/QApplication: No such file or directory ;</li>
<li>variable has incomplete type 'QApplication'.</li>
</ul>
<p>Pour corriger ces erreurs, il faut également modifier les includes.</p>
<p>Supprimer cet include :</p>
<div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><QtGui/QApplication></span>
</pre></div>
<p>Cet include n'existe plus dans Qt5.</p>
<p>Ajouter les deux includes suivants :</p>
<div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><QtWidgets></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><QMainWindow></span>
</pre></div>
<p>Profiton-en pour ajouter la traduction française dans la liste des traductions.</p>
<p>Modifier la ligne #define INSTALLED_LANGNUM en remplaçant la valeur 3 par 4</p>
<div class="highlight"><pre><span></span><span class="cp">#define INSTALLED_LANGNUM 4</span>
</pre></div>
<p>Modifier la liste des langues en remplaçant également [3] par [4], et en ajoutant une ligne supplémentaire référençant la langue française.</p>
<div class="highlight"><pre><span></span><span class="kt">char</span><span class="w"> </span><span class="n">langs</span><span class="p">[</span><span class="n">INSTALLED_LANGNUM</span><span class="p">][</span><span class="mi">4</span><span class="p">][</span><span class="mi">30</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">{</span><span class="s">"English"</span><span class="w"> </span><span class="p">,</span><span class="s">"en"</span><span class="p">,</span><span class="s">""</span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span><span class="s">"French"</span><span class="w"> </span><span class="p">,</span><span class="s">"fr"</span><span class="p">,</span><span class="s">":/wpfiner_fr.qm"</span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span><span class="s">"Hungarian"</span><span class="p">,</span><span class="s">"hu"</span><span class="p">,</span><span class="s">":/wpfiner_hu.qm"</span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span><span class="s">"Polish"</span><span class="w"> </span><span class="p">,</span><span class="s">"pl"</span><span class="p">,</span><span class="s">":/wpfiner_pl.qm"</span><span class="p">}</span>
<span class="p">};</span>
</pre></div>
<img alt="" src="images/wpfiner/qtcreator13.jpg">
<p>Modifications effectuées.</p>
<p>Enregistrer et fermer le fichier main.cpp.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Comme je ne tiens pas compte de la version Windows<sup id="sf-wallpaper-finer-11-back"><a href="#sf-wallpaper-finer-11" class="simple-footnote" title="Comme indiqué au début de l'article">11</a></sup>, tout le code défini dans #ifdef Q_WS_WIN n'a pas été modifié. Il y a de fortes chances pour que la traduction française ne fonctionne pas sous Windows. Il faudra modifier le code en conséquence.</p>
</div>
</div>
<div class="section" id="c-wpfiner-cpp">
<h3>C++ (wpfiner.cpp)</h3>
<p>Ouvrir le fichier <em>wpfiner.cpp</em>.</p>
<p>Quatre erreurs sont présentes ici (en fait, il n'y en a que deux, les deux autres en découlent) :</p>
<ul class="simple">
<li>invalid use of incomplete type class 'QDesktopWidget'</li>
<li>class 'QString' has no member named 'toAscii'</li>
<li>member access into incomplete type 'QDesktopWidget'</li>
<li>no member named 'toAscii' in 'QString'</li>
</ul>
<p>Pour la première erreur, c'est encore un problème d'include. Remplacer QtGui par QtWidgets.</p>
<p>Supprimer cet include :</p>
<div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><QtGui></span>
</pre></div>
<p>Ajouter cet include :</p>
<div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><QtWidgets></span>
</pre></div>
<img alt="" src="images/wpfiner/qtcreator14.jpg">
<p>Modifications effectuées côté include.</p>
<p>Concernant la seconde erreur, la méthode toAscii() n'existe plus. On va utiliser toLatin1() à la place</p>
<p>Descendre vers la ligne 339<sup id="sf-wallpaper-finer-12-back"><a href="#sf-wallpaper-finer-12" class="simple-footnote" title="tout dépend de la présence de sauts de lignes supplémentaires côté code.">12</a></sup>.</p>
<p>Remplacer :</p>
<div class="highlight"><pre><span></span><span class="n">finedImage</span><span class="p">.</span><span class="n">save</span><span class="p">(</span><span class="o">&</span><span class="n">finedFile</span><span class="p">,</span><span class="n">save_format</span><span class="p">.</span><span class="n">toAscii</span><span class="p">().</span><span class="n">data</span><span class="p">());</span>
</pre></div>
<p>par :</p>
<div class="highlight"><pre><span></span><span class="n">finedImage</span><span class="p">.</span><span class="n">save</span><span class="p">(</span><span class="o">&</span><span class="n">finedFile</span><span class="p">,</span><span class="n">save_format</span><span class="p">.</span><span class="n">toLatin1</span><span class="p">().</span><span class="n">data</span><span class="p">());</span>
</pre></div>
<img alt="" src="images/wpfiner/qtcreator15.jpg">
<p>Appel de la méthode corrigée</p>
<p>Enregistrer et fermer le fichier wpfiner.cpp.</p>
</div>
<div class="section" id="compilation">
<h3>Compilation</h3>
<p>C'est bon ? On peut compiler le projet.</p>
<p>Pour cela, cliquer sur le petit marteau en bas à gauche, ou passer par le menu Compiler -> Build all projects</p>
<p>Un petit Build devrait apparaître en bas, vers la droite, pour indiquer que le projet est en cours de compilation.</p>
<img alt="" src="images/wpfiner/qtcreator16.jpg">
<p>Compilation en cours.</p>
<p>Une fois la compilation terminée, cliquer sur l'onglet <em>Problèmes</em> en bas.</p>
<p>Normalement, si tout a été modifié correctement, il ne devrait pas y avoir d'erreurs en rouge. Juste quelques avertissements (warnings) en jaune, notamment des appels dépréciés qu'il faudrait remplacer.</p>
<img alt="" src="images/wpfiner/qtcreator17.jpg">
<p>Liste des problèmes trouvés. Aucune erreur, uniquement des avertissements.</p>
</div>
<div class="section" id="test">
<h3>Test</h3>
<p>C'est bon ? On peut tester ?</p>
<p>On peut.</p>
<p>Cliquer sur le triangle en bas à gauche (celui du haut, pas celui du bas avec un insecte dessus).</p>
<p>L'application doit se lancer sans problème.</p>
<img alt="" src="images/wpfiner/wpfiner2.jpg">
<p>L'application a démarré.</p>
<p>Ouvrir une image ou la glisser-déposer sur la fenêtre, et vérifier le bon fonctionnement du redimensionnement et du recadrage de l'image. Vérifier aussi que l'enregistrement de l'image fonctionne aussi.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Le bouton « Définir comme fond d'écran<sup id="sf-wallpaper-finer-13-back"><a href="#sf-wallpaper-finer-13" class="simple-footnote" title="To Desktop en anglais">13</a></sup> » crée un répertoire <em>WpFiner</em> dans le répertoire $home, enregistre l'image dedans, mais n'effectue pas le changement de fond d'écran. Cela ne fonctionnerait que sous Windows. C'est l'une des limitations de la version GNU/Linux.</p>
</div>
</div>
</div>
<div class="section" id="compilation-et-installation">
<h2>Compilation et installation</h2>
<p>Pourquoi le titre Compilation ? Pourquoi en plus un changement de niveau de titre alors qu'on vient de compiler et de tester ?</p>
<p>On a compilé via Qt Creator, en Debug. Maintenant, on va compiler en release.</p>
<p>Pourquoi ? Parce que la version de debug, qui se trouve dans ../build-WallpaperFiner-Desktop-Debug pèse 2 Mo, et la version Release ne pèse que dans les 155 ko.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">On peut compiler en release avec Qt Creator, en changeant Debug en Release, en bas à gauche. Cependant, la compilation depuis un terminal intéressera plus de personnes, parce que c'est automatisable/plus simple à gérer avec aur/insérer ici une autre raison pour préférer la ligne de commande.</p>
</div>
<p>Lancer un terminal. Se déplacer dans le répertoire du projet.</p>
<p>Dans le répertoire du projet, créer un répertoire build, via le terminal ou via un gestionnaire de fichiers.</p>
<img alt="" src="images/wpfiner/term1.jpg">
<p>Création du répertoire build.</p>
<p>Se déplacer dans ce répertoire.</p>
<p>Taper la commande suivante pour générer le fichier Makefile :</p>
<div class="highlight"><pre><span></span>qmake<span class="w"> </span>../WallpaperFiner.pro
</pre></div>
<img alt="" src="images/wpfiner/term2.jpg">
<p>Création du Makefile.</p>
<p>Pas d'erreur ? Parfait.</p>
<p>Taper simplement make pour compiler l'application. Des lignes vont défiler, c'est normal.</p>
<div class="highlight"><pre><span></span>make
</pre></div>
<img alt="" src="images/wpfiner/term3.jpg">
<p>Compilation en cours. Les avertissements (warnings) apparaissent à l'écran, c'est normal.</p>
<p>Une fois terminé, vérifier que le fichier wallpaperfiner a bien été généré, et ne fait que 155 ko (environ, tout dépend si c'est compté en ko ou kio).</p>
<img alt="" src="images/wpfiner/term4.jpg">
<p>Ici, c'est bon. Le fichier exécutable (en vert) fait la taille attendue.</p>
<p>On va vérifier que c'est bien Qt5 qui est utilisé, via la commande ldd.</p>
<div class="highlight"><pre><span></span>ldd<span class="w"> </span>wallpaperfiner
</pre></div>
<img alt="" src="images/wpfiner/term5.jpg">
<p>Résultat ?</p>
<pre class="literal-block">libQt5Widgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007f0a08314000)
libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f0a07c52000)
libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f0a07707000)
</pre>
<p>C'est bon, c'est bien Qt5.</p>
<p>On peut lancer l'application et refaire quelques tests, pour confirmer le bon fonctionnement.</p>
<div class="highlight"><pre><span></span>./wallpaperfiner
</pre></div>
<img alt="" src="images/wpfiner/term6.jpg">
<p>Parfait, aucun problème rencontré.</p>
<p>Pour l'installation, il suffit de copier l'exécutable dans un répertoire défini dans $PATH, comme /usr/local/bin</p>
<p>Par exemple via sudo cp</p>
<div class="highlight"><pre><span></span>sudo<span class="w"> </span>cp<span class="w"> </span>wallpaperfiner<span class="w"> </span>/usr/local/bin/
</pre></div>
<img alt="" src="images/wpfiner/term7.jpg">
<p>Ici, j'ai utilisé en plus la commande <em>whereis wallpaperfiner</em> pour confirmer que wallpaperfiner est bien reconnu et est situé au bon endroit.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p>On peut créer une entrée de menu.</p>
<p>Pour cela :</p>
<ul class="last simple">
<li>soit passer par un éditeur comme <em>alacarte</em>, <em>MenuLibre</em> ou équivalent</li>
<li>soit modifier le fichier <em>wallpaperfiner.desktop</em> situé dans le répertoire Desktop, notamment changer les chemins et ajouter la traduction en français de la description, le copier dans /usr/local/share/applications et copier l'icône wpfiner.png dans /usr/local/share/pixmaps/.</li>
</ul>
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Concrètement, le portage vers Qt5 se fait en moins d'une demi-heure, lecture de documentation comprise. C'est relativement simple, sans prise de tête.</p>
<p>Remerciements à <a class="reference external" href="https://shelter.moe/@TritTriton">@TritTriton</a> pour son pouët montrant cet outil, pour avoir pu compiler la version Qt5 et avoir confirmé son bon fonctionnement.</p>
<p>Modification dimanche 11 juillet 2021.</p>
<p>Le code source est désormais versionné et est disponible sur Shelter.</p>
<p>Modification samedi 20 novembre 2021.</p>
<p>Le service gitlab sur Shelter devant fermer sous peu, le code source versionné est maintenant disponible sur gitlab.com : <a class="reference external" href="https://gitlab.com/chibinah/wallpaperfiner">https://gitlab.com/chibinah/wallpaperfiner</a></p>
<p>--</p>
</div>
<ol class="simple-footnotes"><li id="sf-wallpaper-finer-1"> <a class="reference external" href="https://shelter.moe/@TritTriton/106436810381701106">https://shelter.moe/@TritTriton/106436810381701106</a> <a href="#sf-wallpaper-finer-1-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-2">qui date quand même de 2005, et dont la dernière mise à jour date de 2012. <a href="#sf-wallpaper-finer-2-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-3">En français, on est censé parler de cadriciel, mais personne ne connait ça sous ce nom <a href="#sf-wallpaper-finer-3-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-4">Même si je n'aime pas la disposition de l'environnement de développement intégré (IDE), ni sa traduction inconsistente (c'est à moitié traduit en français). <a href="#sf-wallpaper-finer-4-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-5"> <a class="reference external" href="http://hyperprog.com/wpfiner/index.html">http://hyperprog.com/wpfiner/index.html</a> <a href="#sf-wallpaper-finer-5-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-6">ce qui correspond à Qt 4.8, Qt 5 étant sorti après <a href="#sf-wallpaper-finer-6-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-7">Ça peut être utile d'installer Qt5, les outils de développement, etc. Se référer à la documentation ou au gestionnaire de paquets de la distribution utilisée. Idem : je n'apporterai aucune aide sur comment installer et ou configurer le tout. <a href="#sf-wallpaper-finer-7-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-8">En tout cas, sous Debian GNU/Linux <a href="#sf-wallpaper-finer-8-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-9">Cadriciel. Ce terme est barbant, je vais laisser framework partout dans l'article. <a href="#sf-wallpaper-finer-9-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-10">En fait, j'ai carrément ignoré tous les warnings dans le code source, cela concerne des fonctions ou des instructions dépréciées. <a href="#sf-wallpaper-finer-10-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-11">Comme indiqué au début de l'article <a href="#sf-wallpaper-finer-11-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-12">tout dépend de la présence de sauts de lignes supplémentaires côté code. <a href="#sf-wallpaper-finer-12-back" class="simple-footnote-back">↩</a></li><li id="sf-wallpaper-finer-13">To Desktop en anglais <a href="#sf-wallpaper-finer-13-back" class="simple-footnote-back">↩</a></li></ol>Bilan de 20202020-12-30T00:00:00+01:002020-12-30T00:00:00+01:00alextag:blog.chibi-nah.fr,2020-12-30:/bilan-2020<p>Petit bilan de l'année écoulée.</p>
<p>L'année 2020 fut assez compliquée, entre les confinements, les couvre-feu, et autres soucis IRL.</p>
<div class="section" id="bilan-de-l-annee">
<h2>Bilan de l'année</h2>
<div class="section" id="au-niveau-associatif">
<h3>Au niveau associatif</h3>
<p>Cette année fut assez difficile au niveau associatif.
L'AGO 2019 de Lorraine Data Network a pu se faire sans problème en février dernier, avec un …</p></div></div><p>Petit bilan de l'année écoulée.</p>
<p>L'année 2020 fut assez compliquée, entre les confinements, les couvre-feu, et autres soucis IRL.</p>
<div class="section" id="bilan-de-l-annee">
<h2>Bilan de l'année</h2>
<div class="section" id="au-niveau-associatif">
<h3>Au niveau associatif</h3>
<p>Cette année fut assez difficile au niveau associatif.
L'AGO 2019 de Lorraine Data Network a pu se faire sans problème en février dernier, avec un bilan pas exceptionnel mais pas totalement catastrophique.</p>
<p>Je m'étais posé la question, à savoir : « est-ce que je reste membre du collège solidaire ou bien j'en sors et reste simple membre. » Je suis assez lassé au niveau associatif, et l'année 2020 n'a fait qu'amplifier cette lassitude.</p>
<p>En ajoutant une charge de travail assez lourde, j'en suis au stade où le PC reste éteint quand je rentre. Le monde associatif n'étant plus prioritaire.</p>
<p>Bref, je pense présenter ma démission lors de la prochaine AGO.</p>
</div>
<div class="section" id="au-niveau-en-ligne">
<h3>Au niveau En ligne</h3>
<p>Les services tournent sans trop de problème, et sont a peu près à jour.</p>
<p>Au niveau documentation, c’est simple : je n'ai quasiment rien écrit.</p>
<p>Côté blog, la migration de PluXML vers Pélican s’est faite sans trop de problèmes. Il reste 2-3 pages à corriger. Je pense notamment à l’article sur l’ajout de points sur une carte Open Street Map, avec Leaflet.js. Le thème, simple et sobre me convient, avec la gestion des MediaQueries pour adapter les couleurs en fonction des préférences de la personne visitant le site (thème clair par défaut ou thème sombre).</p>
<p>J'ai quelques articles en cours de rédaction, mais rien de publiable en l'état. La recherche de documentation, la lecture et la compréhension prenant pas mal de temps.</p>
<p>Côté gopher, j'ai ajouté les articles du blog, les fan-fiction de Et La Terre Éclata, plus deux ou trois autres trucs.</p>
</div>
<div class="section" id="au-niveau-hors-ligne">
<h3>Au niveau Hors ligne</h3>
<p>Cette année, à cause du confinement, c'est simple, il n'y a pas eu de séance de karaoké. Je n'ai réinstallé que récemment Karaoké Mugen, en version 4.18.</p>
<p>Quelques achats de matériel, comme un lecteur de code barre (article à rédiger) et un NAS (article à rédiger). Quelques pouëts sur le Fediverse concernant ce matériel ont été publiés.</p>
<p>Quelques bidouillages avec ffmpeg (documentation à mettre à jour).</p>
<p>Quelques mises à jour et bidouillages sur le téléphone sous SailfishOS 3.4 (idem, à documenter).</p>
<p>Entre deux périodes de confinement, j'ai fini par changer de FAI, me revenant au final moins cher, avec plus de services, et un débit montant (théorique) multiplié par un peu plus de deux (300 Mbps -> 700 Mbps), et un débit descendant multiplié par beaucoup (synchro 300 Mbps -> 5 Gbps).</p>
<p>L'ajout d'un bouton RESET, prévu de longue date, et enfin en place sur mon Tandy 1000 HX. Un article de blog a été publié à ce sujet.</p>
</div>
<div class="section" id="au-niveau-irl">
<h3>Au niveau IRL</h3>
<p>Quasiment pas d'activité sportive, uniquement de la marche à pieds et de la trottinette (pas électrique) quasiment au quotidien.</p>
</div>
</div>
<div class="section" id="previsions-pour-2021">
<h2>Prévisions pour 2021</h2>
<p>Quand le gros projet IRL me laissera un peu de temps…</p>
<div class="section" id="client-km-pour-sailfishos">
<h3>Client KM pour SailfishOS</h3>
<p>Pour l'instant, c'est toujours au point mort. J'espère juste pouvoir reprendre le projet et avancer dessus.</p>
</div>
<div class="section" id="projet-lyan">
<h3>Projet LYAN</h3>
<p>Pareil, de l'écriture à faire dessus. J'ai quelques idées, mais pas suffisamment de temps pour rédiger le tout.</p>
</div>
<div class="section" id="ffmpeg-mpv">
<h3>ffmpeg/mpv</h3>
<p>Ajouter de nouveaux trucs et astuces dans la doc.</p>
</div>
<div class="section" id="projet-v">
<h3>Projet V</h3>
<p>Aucune annonce officielle par rapport à ce projet. Juste une idée qu'il me faudra implémenter.</p>
</div>
<div class="section" id="projet-e">
<h3>Projet E</h3>
<p>Un petit projet d'électronique pour l'instant en suspens.</p>
</div>
<div class="section" id="projet-m">
<h3>Projet M</h3>
<p>Idem, un autre petit projet d'électronique démarré en 2020 et également en suspens.</p>
</div>
<div class="section" id="blog">
<h3>Blog</h3>
<p>Finir d'écrire les articles en cours, et en rédiger de nouveaux.</p>
</div>
<div class="section" id="migrer-les-services-sur-un-nouveau-serveur">
<h3>Migrer les services sur un nouveau serveur</h3>
<p>Présentement, cela me coûte ~450€ par an pour deux serveurs dédiés qui commencent à accuser leur âge.
Du coup, j'hésite entre rapatrier certains services chez moi, ou a migrer sur un autre serveur dédié, nettement plus puissant (mais pas au même tarif).</p>
<p>Si je les rapatrie chez moi, il me faudra regarder ce que je peux utiliser comme micro-serveur.</p>
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Un petit paquet de projets pour 2021. On verra bien si j'arrive à les mener à bien.</p>
</div>
Fibre optique - épisode 32020-10-04T00:00:00+02:002020-10-04T00:00:00+02:00alextag:blog.chibi-nah.fr,2020-10-04:/fibre-optique-episode-3<img alt="" src="images/fibre-episode-3/10191471315.png" />
<div class="section" id="contexte">
<h2>Contexte</h2>
<p>J'ai changé de FAI¹ courant juillet (après le confinement), pour diverses raisons :</p>
<ul class="simple">
<li>quelques problèmes de Peering bien agaçants avec Orange, notamment avec des serveurs dédiés situés en Allemagne ;</li>
<li>l'option appels vers les téléphones mobiles qui me rajoute +5€ sur la facture par mois sur la ligne fixe ;</li>
<li>l'immeuble couvert …</li></ul></div><img alt="" src="images/fibre-episode-3/10191471315.png" />
<div class="section" id="contexte">
<h2>Contexte</h2>
<p>J'ai changé de FAI¹ courant juillet (après le confinement), pour diverses raisons :</p>
<ul class="simple">
<li>quelques problèmes de Peering bien agaçants avec Orange, notamment avec des serveurs dédiés situés en Allemagne ;</li>
<li>l'option appels vers les téléphones mobiles qui me rajoute +5€ sur la facture par mois sur la ligne fixe ;</li>
<li>l'immeuble couvert par d'autres opérateurs Fibre ;</li>
<li>un concurrent proposant mieux² pour moins cher³.</li>
</ul>
<p>Après deux semaines d'attente et l'intervention d'un techicien à domicile (+ intervention dans le point de mutualisation pour changer de porte parce que FAI différent), la nouvelle liaison fibre fut opérationnelle.
Seul point négatif : il a fallu douze jours supplémentaires pour porter le numéro de téléphone fixe, et l'assistance de ce nouveau FAI ne fut clairement pas à la hauteur, donnant ce genre de réponse :</p>
<ul class="simple">
<li>ça sera porté quand ça sera porté ;</li>
<li>ça sera opérationnel prochainement ;</li>
<li>bientôt.</li>
</ul>
<p>Bref, une journée de plus d'attente et je demandais l'annulation de la portabilité du numéro et résiliation de l'abonnement (jusqu'à 14 jours pour changer d'avis).</p>
<p>J'ai rudement bien fait d'attendre la fin du confinement pour changer de fournisseur, parce qu'étant en télétravail pendant cette période difficile, le téléphone était absolument indispensable.</p>
<p>Bref, abonnement fonctionnel début août.</p>
<p>Et accessoirement, je passe d'une Livebox Play poussive avec l'ONT Huawei séparé à une Freebox Pop avec l'ONT au format SFP, inséré directement dans sa cage prévue sur la Freebox. Un truc en moins à brancher sur la multiprise, ce n'est pas plus mal.</p>
<p>Et comme toujours : pas de télévision ni de player/décodeur TV. Juste un abonnement Internet + téléphone.</p>
<img alt="" src="images/fibre-episode-3/freebox-pop.jpg" />
<p>La Freebox Pop (blanche), avancée (normalement, elle est plus loin dans le meuble) pour la photo, avec les informations sur les débits affichés à l'écran.</p>
<p>À noter : j'ai imprimé des petits patins circulaires (pas visibles sur la photo) pour la surélever pour améliorer le refroidissement de la box.</p>
<img alt="" src="images/fibre-episode-3/afficheur-freebox-pop.jpg" />
<p>Débits (synchro) 5 Gbit/s descendant, 700 Mbit/s montant. L'ONT supportant jusqu'à 10 Gbit/s descendant et 1 Gbit/s montant.</p>
</div>
<div class="section" id="limitations">
<h2>Limitations ?</h2>
<p>La Freebox disposant de deux ports à 1 Gbit/s et de un port à 2,5 Gbit/s, plus le wifi, il n'est malheureusement pas possible de relier un PC avec une liaison de 5 Gbit/s.</p>
<img alt="" src="images/fibre-episode-3/freebox.jpg" />
<p>Interface d'administration de la Freebox. Mon Pihole (Akira) est raccordé en ethernet 100 Mbit/s (amplement suffisant pour le serveur DNS). À noter : Ryoko est (déjà) en 2,5Gbit/s, la capture d'écran fut faite après la rédaction de l'article.</p>
<p>Dans la pratique, une connexion 300 Mbit/s est largement suffisante pour afficher des pages web. la différence est flagrante plutôt en téléchargement, à condition que le serveur en face ait une connexion Internet qui soit suffisamment élevée.</p>
<p>Sur la carte mère de mon PC, la carte réseau Realtek est de « seulement » 1 Gbit/s. Ce qui est déjà bien, mais c'est dommage de ne pas pouvoir utiliser ce que la Freebox propose.</p>
</div>
<div class="section" id="nouvelle-carte-reseau">
<h2>Nouvelle carte réseau</h2>
<p>Après quelques recherches, mon choix s'est porté sur une carte générique basée sur un chipset Realtek RTL8125, supportant les liaisons ethernet 10 Mbit/s, 100 Mbit/s, 1 Gbit/s et 2,5 Gbit/s. Modèle générique m'ayant coûté moins de 30 €, frais de port compris.</p>
<img alt="" src="images/fibre-episode-3/carte-reseau.jpg" />
<p>À noter : la présence d'un dissipateur thermique sur le chipset Realtek.</p>
<p>Ce chipset étant supporté dans le noyau Linux (mainstream), il n'y aura donc pas de surprises. En fait, je n'ai même pas eu besoin de le compiler, le driver Realtek 8169/8168/8101/8125 supportant ce chipset (vérifié et validé avec le noyau 5.8.5 utilisé actuellement).</p>
</div>
<div class="section" id="installation-de-la-carte">
<h2>Installation de la carte</h2>
<p>Bon, pas de grosses surprises à ce niveau là, vu que j'ai monté cette tour.</p>
<p>Sauf que niveau emplacements libres sur le boîtier, il n'y en a pas tant que ça.</p>
<img alt="" src="images/fibre-episode-3/emplacements.jpg" />
<p>Emplacements libres. À noter : l'équerre au niveau du port PCIEX-16-2 a été retirée.</p>
<p>Je préfèrerais laisser l'équivalent d'un slot libre au niveau des ventilateurs de la carte graphique, pour le refroidissement (elle a atteint les 70°C lors de benchmarks).</p>
<p>Le truc avec la nappe, c'est le port série (connecteur DB9), mais pas envie de le déplacer.</p>
<p>Du coup, le plus simple, c'est d'utiliser le port PCIEX-16-2 (c'est parfaitement compatible), le PCIEX-1-1 étant trop bas et le PCIEX-1-2 étant masqué/occupé par l'équerre avec le DB9.</p>
<img alt="" src="images/fibre-episode-3/carte-installee.jpg" />
<p>La carte, installée. Plus qu'à visser l'équerre et refermer le capot.</p>
<p>Lors du démarrage du PC, j'ai pensé à désactiver la carte ethernet sur la carte-mère ; étant inutilisée, cela ne sert à rien de la laisser active.</p>
<p>Une fois sous GNU/Linux, vérifions si la carte est bien reconnue.</p>
<blockquote>
<p>lspci | grep Ethernet</p>
<p>05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller</p>
</blockquote>
<p>Ok, là, c'est bon.</p>
<p>Plus qu'à corriger le nom de la carte réseau dans /etc/network/interfaces, la carte étant enp5s0 et non plus enp3s0.</p>
<p>Ne pas oublier de relancer le service networking pour que cela soit pris en compte.</p>
<p>Et maintenant, place aux tests.</p>
</div>
<div class="section" id="test">
<h2>Test</h2>
<p>Alors, là, ça se passe de commentaires…</p>
<p>Capture vidéo du test de débit</p>
<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tube.nah.re/videos/embed/09d40c58-e551-436e-a181-d539667140ba" frameborder="0" allowfullscreen></iframe><p>Résultat :</p>
<img alt="" src="images/fibre-episode-3/10191471315.png" />
<p>2 291,37 Mbit/s descendant, 675 Mbit/s montant. La latence varie entre 5 et 20 ms en fonction du serveur de destination.</p>
</div>
<div class="section" id="verdict">
<h2>Verdict</h2>
<p>Sans surprise, la carte fonctionne parfaitement. La connexion est stable, aussi bien au niveau PC comme au niveau Freebox.</p>
<p>On verra ce que ça donnera sur la durée.</p>
<p>---</p>
<p>¹ : Fournisseur d'Accès à Internet.</p>
<p>² : Débit plus élevé, appels vers les fixes ET mobiles inclus et non en option, meilleur matériel, IPv4 fixe, avec les 65 536 ports disponibles, préfixe IPv6 pas dynamique, port 25 déblocable, configuration DNS non verrouillée au niveau routeur, meilleure couverture wifi, etc.</p>
<p>³ : 29,90€ par mois la première année, puis 39,90€ par mois. Mais avec une réduction de 10€ sur l'abonnement mobile (qui passe donc de 19,90€ à 9,90€ par mois). Soit passer de 34,90 + 19.90€ par mois à 29,90 + 9,90€ par mois. Même à 39,90€ + 9,90€ après la première année me revient toujours moins cher que ce que me proposait Sosh/Orange.</p>
</div>
Reset sur Tandy 1000 HX2020-09-14T00:00:00+02:002020-09-14T00:00:00+02:00alextag:blog.chibi-nah.fr,2020-09-14:/reset-sur-tandy-1000-hx<p>Comment ajouter un bouton reset sur ce compatible PC-XT datant de 1987.</p>
<p>Un article pour le #septandy 2020.</p>
<div class="section" id="tl-dr">
<h2>TL;DR</h2>
<p>Trop long, flemme de lire.</p>
<p>Souder un bouton poussoir sur le condensateur C132. L'appui sur ce bouton doit court-circuiter le condensateur pour provoquer le RESET de la machine.</p>
<img alt="" src="images/Tandy1000/DSC00870.JPG" />
</div>
<div class="section" id="la-machine">
<h2>La machine …</h2></div><p>Comment ajouter un bouton reset sur ce compatible PC-XT datant de 1987.</p>
<p>Un article pour le #septandy 2020.</p>
<div class="section" id="tl-dr">
<h2>TL;DR</h2>
<p>Trop long, flemme de lire.</p>
<p>Souder un bouton poussoir sur le condensateur C132. L'appui sur ce bouton doit court-circuiter le condensateur pour provoquer le RESET de la machine.</p>
<img alt="" src="images/Tandy1000/DSC00870.JPG" />
</div>
<div class="section" id="la-machine">
<h2>La machine</h2>
<div class="section" id="tandy-1000-hx">
<h3>Tandy 1000 HX</h3>
<img alt="" src="images/Tandy1000/Tandy1000HX.jpg" />
<img alt="" src="images/Tandy1000/Tandy1000.jpg" />
<p>Ce compatible IBM PC, sorti en 1987, est doté d'un processeur Intel 8088, cadencé à 7,16 MHz (mode turbo, la fréquence de 4,77 MHz étant accessible via une combinaisons de touches au démarrage de la machine ou pouvant être définie dans les paramètres du BIOS).
Le Bios est celui de Phoenix Technologies.
256 ko de RAM sont présents (extensible à 640 ko de RAM au total via la carte d'extension Tandy Memory Expansion Board 25.1062).
Un lecteur de disquettes 3"½ simple densité (720 ko) est présent, avec un emplacement pour un second lecteur de disquettes dans le même format, et un connecteur d'extension pour un troisième lecteur, cette fois, externe, pouvant être un lecteur 3"½ ou 5"¼.</p>
<p>Particularité de cette machine : MS-DOS 2.11 est présent sur une ROM dans la machine, et il est alors possible de démarrer sans disquette de démarrage.</p>
<p>Autres particularités : pas de possibilité d'ajouter un disque dur (pas d'emplacement pour), et les connecteurs ISA ne sont pas dans le format standard (on peut aujourd'hui utiliser des adaptateurs).</p>
<img alt="" src="images/Tandy1000/TandyMemoryExpansionBoard1.jpg" />
<p>Carte d'extension mémoire Tandy originale.</p>
<img alt="" src="images/Tandy1000/TandyMemoryExpansionBoard2.jpg" />
<p>Les deux ports d'extension sont visibles en haut sur la photo.</p>
</div>
</div>
<div class="section" id="le-reset">
<h2>Le RESET</h2>
<p>Aussi bizarre que cela puisse paraître, il n'y a pas de bouton RESET présent sur les Tandy 1000 EX et HX. Ce bouton est bel et bien présent sur d'autres modèles de Tandy 1000.</p>
<div class="section" id="le-reset-sur-les-processeurs-808x">
<h3>Le RESET sur les processeurs 808x</h3>
<p>À savoir : le reset ne s'effectue pas au niveau du processeur, mais au niveau du générateur d'horloge, pour les machines à base de processeur 8088 et 8086.</p>
<p>Schéma d'illustration :</p>
<img alt="" src="images/Tandy1000/8086_chipset-7.gif" />
<p>Source : <a class="reference external" href="https://www.csee.umbc.edu/courses/undergraduate/CMPE310/Spring05/cpatel2/slides/html_versions/chap9_lect03_8086_chipset.html">https://www.csee.umbc.edu/courses/undergraduate/CMPE310/Spring05/cpatel2/slides/html_versions/chap9_lect03_8086_chipset.html</a></p>
<p>Ici, la broche /RES est reliée à un bouton RESET (relié à la masse, normalement ouvert), et au 5V (via une résistance de 10kΩ et un condensateur de 10 μF).
À l'allumage, la broche /RES est à l'état bas (0V). Le condensateur de 10 μF se charge via la résistance de 10 kΩ (ce qui prend environ 100 ms).
Une fois chargé, la broche /RES est alors à l'état haut.
Cette temporisation permet d'être sûr que la tension délivrée par l'alimentation est stable.
Tant que cette broche est à l'état bas, c'est comme si le bouton RESET restait enfonçé.</p>
<p>L'état RESET sur le processeur (et autres chipsets/puces) est alors géré via la broche RESET du générateur d'horloge.</p>
<p>Bon, ça, c'est la théorie.</p>
</div>
<div class="section" id="le-reset-sur-le-tandy-1000-hx">
<h3>Le RESET sur le Tandy 1000 HX</h3>
<p>En pratique, ça donne quoi sur le Tandy 1000 HX ?</p>
<p>Tout d'abord, après une observation attentive, de la carte-mère, il n'y a pas de chipset Intel autre que le 8088.</p>
<img alt="" src="images/Tandy1000/carte-mere.jpg" />
<img alt="" src="images/Tandy1000/carte-mere2.jpg" />
<p>Les seuls chipsets potentiels générant les signaux d'horloge et dont le quartz 16.0-28.6 MHz est à proximité sont ceux de NEC et de Texas Instruments.</p>
<p>La lecture du manuel technique est alors obligatoire. Heureusement, cette doc est très facile à trouver.</p>
<p>Après une lecture longue et fastidieuse de "Tandy 1000 HX Technical Reference", le schéma à la page 69, Timing and CPU est à analyser.</p>
<img alt="" src="images/Tandy1000/schema.jpg" />
<p>Notamment cette partie du schéma, en haut à gauche.</p>
<img alt="" src="images/Tandy1000/schema-detail.jpg" />
<p>Se pourrait-il que ?</p>
<p>La broche 21 de U20 – Light Blue – est appelée RSTIN, et sur cette broche, on retrouve la même disposition que celle plus haut, avec ici, une résistance de 47 kΩ et deux condensateurs de 10 µF et 0,1 µF. Soit un temps de charge des condensateurs de l'ordre de ~470 ms. Le bouton RESET, ici, n'est ni câblé, n'est ni présent sur le schéma.</p>
<p>Concrètement, ce bouton serait à câbler au niveau du point de liaison entre la résistance de 47 kΩ (R29) et le condensateur de 10 µF (C132) ; et la masse.
Ou plus simplement : shunter (court-circuiter) le condensateur C132.</p>
</div>
<div class="section" id="montage-de-test">
<h3>Montage de test</h3>
<p>Après vérification, re-vérification, et relecture de la doc (notamment des diagrammes), il est temps de câbler.</p>
<img alt="" src="images/Tandy1000/diagramme.jpg" />
<p>À noter : sur ce diagramme, il y a bien une section au milieu à droite pour le RESET (RSTIN).</p>
<p>Ayant des bouton poussoir (de type NO, Normalement Ouvert) sous la main, et des câbles DuPont, j'ai soudé deux fils sur un bouton (et isolé avec de la gaine thermorétractable), et les ai relié à deux mini grip-fil, et les ai branchés sur le condensateur C132 (à noter, ça fonctionne aussi avec C131 qui est monté en parallèle).</p>
<img alt="" src="images/Tandy1000/grip-fils.jpg" />
<p>Le montage temporaire étant en place, faisons les tests.</p>
</div>
<div class="section" id="smoke-test">
<h3>Smoke test</h3>
<p>N'arrivant plus à remettre la main sur le moniteur Tandy (RGBI), j'ai utilisé la sortie vidéo composite de la machine via un upscaler CVBS basique pour pouvoir brancher un écran moderne (en HDMI) dessus. C'est pas top, mais ça fonctionne.</p>
<p>Donc branchement sur la prise de courant, puis allumage.</p>
<p>Point positif : rien n'a explosé et pas de libération de fumée magique.</p>
<p>Après quelques secondes d'attente, un appui sur le bouton, et… ça fonctionne ! Le RESET est bel et bien opérationnel.</p>
<p>Démo en vidéo</p>
<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tube.nah.re/videos/embed/5a9729c4-084c-47e3-aa72-c0981b31c48b" frameborder="0" allowfullscreen></iframe><p>Tout fonctionne. Retirons le montage temporaire.</p>
</div>
<div class="section" id="choix-de-l-emplacement-percage-et-soudures">
<h3>Choix de l'emplacement, perçage et soudures</h3>
<p>Concrètement, rien de compliqué. Prendre deux fils, torsadés ou non (j'ai utilisé une chute de câble réseau), couper à la bonne longueur (ça ne sert à rien de faire passer des fils de 3 mètres de long), ne pas oublier de passer de la gaine thermo avant de souder le bouton.</p>
<p>Le plus compliqué fut en fait le perçade du boîtier, en partie à cause du blindage (que je voulais laisser en place), et aussi et surtout parce qu'il y a très peu d'endroits possibles où placer le bouton poussoir. Accessoirement, le boîtier en plastique étant courbé et non plat, ça n'arrange pas les choses.</p>
<p>L'emplacement qui me semblait le plus pratique (pour moi, en tout cas), c'est entre la prise jack 3,5 mm et le potentiomètre servant à régler le volume audio.</p>
<img alt="" src="images/Tandy1000/DSC00870.JPG" />
<p>Un coup de Dremel fut nécessaire pour "aplatir" le bord intérieur, la courbure empêchant de visser correctement le bouton. Le perçage en lui-même à été fait à la main, avec un alésoir conique (utilisé notamment en modélisme).</p>
<p>Au niveau du chemin des fils, il faudra faire attention à la position du blindage, du support pour les lecteurs de disquette et des différents connecteurs pour le clavier. Ne pas hésiter à faire des tests avant de couper et souder les fils.</p>
<p>Au niveau soudures, concrètement, rien de compliqué. Si c'est fait correctement, il n'y a pas besoin de mettre de la colle chaude, ni même de l'epoxy.</p>
<p>Si jamais vous avez besoin de mettre de la colle chaude ou de l'epoxy pour faire tenir une soudure ou la "renforcer", c'est qu'il y a un problème. Bref, ne faites jamais ça.</p>
<p>Pour le blindage, il m'a fallu couper une partie à la cisaille, pour que je puisse le remettre en place.</p>
<img alt="" src="images/Tandy1000/DSC00865.JPG" />
</div>
<div class="section" id="remontage-de-la-machine">
<h3>Remontage de la machine</h3>
<p>Normalement, rien ne doit gêner, à aucun moment.</p>
<p>Le fait d'avoir mis de la gaine thermo au niveau du bouton permet d'empêcher tout court-circuit intempestif avec le blindage (et provoquant voire bloquant le RESET).</p>
<img alt="" src="images/Tandy1000/DSC00895.JPG" />
<img alt="" src="images/Tandy1000/DSC00896.JPG" />
<img alt="" src="images/Tandy1000/DSC00899.JPG" />
<p>Plus qu'à remettre le capot et la carte d'extension mémoire. Rien de compliqué.</p>
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Finalement, le plus long fut surtout la lecture de la doc et la recherche de LA solution, celle présentée ici.</p>
<p>Ce qui est surprenant en fait, c'est que tout a été prévu pour ajouter un bouton RESET sur cette machine, mais celui-ci n'a jamais été câblé. Pourquoi ? On ne le saura probablement pas.</p>
<p>À noter : la raison pour laquelle je voulais ajouter un bouton RESET, c'était pour comprendre pourquoi la machine plantait aléatoirement, ou ne détectait pas toute la ram, voire foirait le test mémoire à l'allumage/redémarrage de la machine.</p>
<img alt="" src="images/Tandy1000/mem-error.jpg" />
<p>En fait, c'était tout simplement le cavalier sur la carte d'extension mémoire qui avait sauté. Celui qui indique quels sont les emplacements mémoire remplis (une partie ou la totalité).</p>
<p>Une fois un cavalier (le truc bleu sur la photo) placé sur la carte, plus aucun problème.</p>
<img alt="" src="images/Tandy1000/TandyMemoryExpansionBoard2.jpg" />
</div>
Déploiement terminé du nouveau blog2020-07-19T00:00:00+02:002020-07-19T00:00:00+02:00alextag:blog.chibi-nah.fr,2020-07-19:/deploiement-termine<p>La mise en place de la nouvelle version du blog est terminée.</p>
<div class="section" id="ancienne-version-du-blog">
<h2>Ancienne version du blog</h2>
<p>L'ancienne version du blog est toujours accessible à cette adresse : <a class="reference external" href="https://blog.chibi-nah.fr/oldblog/">https://blog.chibi-nah.fr/oldblog/</a>
Les commentaires sont bien entendu désactivés.</p>
</div>
<div class="section" id="nouvelle-version-du-blog">
<h2>Nouvelle version du blog</h2>
<p>Bien entendu, le déploiement de la nouvelle version ne …</p></div><p>La mise en place de la nouvelle version du blog est terminée.</p>
<div class="section" id="ancienne-version-du-blog">
<h2>Ancienne version du blog</h2>
<p>L'ancienne version du blog est toujours accessible à cette adresse : <a class="reference external" href="https://blog.chibi-nah.fr/oldblog/">https://blog.chibi-nah.fr/oldblog/</a>
Les commentaires sont bien entendu désactivés.</p>
</div>
<div class="section" id="nouvelle-version-du-blog">
<h2>Nouvelle version du blog</h2>
<p>Bien entendu, le déploiement de la nouvelle version ne s'est pas produite sans erreur :</p>
<pre class="code literal-block">
remote: rsync: open "blog/deploiement-termine.html" failed: Permission denied (13)
remote: rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1207) [sender=3.1.3]
To blog: blog.chibi-nah.fr.git
da63214..4194076 master -> master
</pre>
<p>Là, c'est bon, c'est corrigé.</p>
<p>Il ne me reste "plus" qu'à écrire de nouveaux articles… mais ça, c'est une autre histoire.</p>
</div>
<div class="section" id="flux-rss-atom">
<h2>Flux RSS/Atom</h2>
<p>"Normalement", ça devrait être bon avec de la réécriture d'URL (RewriteRule) et une redirection 302 vers la nouvelle adresse du flux RSS (il n'y a plus de flux par catégorie).</p>
</div>
Nouveau blog (2020)2020-07-05T00:00:00+02:002020-07-05T00:00:00+02:00alextag:blog.chibi-nah.fr,2020-07-05:/nouveau-blog-2020<p>Le nouveau blog est maintenant en place. À la place de PluXML, c'est maintenant au tour de Pelican de gérer le contenu.</p>
<div class="section" id="changements">
<h2>Changements</h2>
<p>Au niveau changement, le plus visible est probablement le changement du thème. Cependant, le procédé pour la rédaction des articles est complètement différent.</p>
<p>Les articles sont désormais …</p></div><p>Le nouveau blog est maintenant en place. À la place de PluXML, c'est maintenant au tour de Pelican de gérer le contenu.</p>
<div class="section" id="changements">
<h2>Changements</h2>
<p>Au niveau changement, le plus visible est probablement le changement du thème. Cependant, le procédé pour la rédaction des articles est complètement différent.</p>
<p>Les articles sont désormais stockés au format Markdown (pour ceux écrits par le passé), au format reStructuredText pour les nouveaux articles, et cette fois, tout est versionné et géré avec git.</p>
<p>Par exemple, pour écrire cet article, je tape présentement dans Visual Studio Code, sur mon PC, dans un fichier texte au format rst. Pour la publication, c'est Pelican qui s'en charge automatiquement dès que j'ajoute l'article dans git (git hook). Simple, rapide, et avec peu de contraintes.</p>
<img alt="" src="images/nouveau-blog-2020/vs.png" />
</div>
<div class="section" id="anciens-articles">
<h2>Anciens articles</h2>
<p>Pour les anciens articles, le script d'import a pu convertir le contenu des articles, mais pas les métadonnées (date de publication, url). J'ai du repasser sur tous les articles pour ajouter ces informations, de manière à ne pas casser les liens existants vers les articles du blog. Cependant, certaines pages avaient du contenu supplémentaire, sous forme de son ou de vidéo, le script ne les a pas importés. Il me faudra donc repasser sur chacune de ces pages et ajouter le code supplémentaire pour gérer ces médias.</p>
</div>
<div class="section" id="commentaires">
<h2>Commentaires</h2>
<p>Concernant la gestion des commentaires, ça va être très simple : je ne vais plus m'embêter avec. Les anciens commentaires n'ont pas été repris, et je n'ai pas l'intention ; dans un premier temps, en tout cas ; de les reprendre.</p>
<p>Pour tout commentaire, le plus simple sera de passer par le Fediverse (vous savez comment me joindre).</p>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>En n'ayant plus de grosses contraintes au niveau écriture me permettra d'écrire plus d'articles de blog dans les prochains mois ? Je ne m'avancerai pas trop dessus, mon emploi du temps (professionnel) étant bien chargé jusqu'à février 2021.</p>
</div>
Nouvelles du blog2020-03-08T00:00:00+01:002020-03-08T00:00:00+01:00alextag:blog.chibi-nah.fr,2020-03-08:/nouvelles-du-blog-2020<p>Ça fait un moment que j'hésitais à lâcher PluXML. Non pas parce que j'aime pas ce CMS (bien au contraire), mais à cause de certains détails agaçant.</p>
<p>Je l'utilise depuis 2010 (quasiment une décennie), mais depuis, ma procédure de rédaction des articles a pas mal évolué.</p>
<p>Mes derniers articles sont …</p><p>Ça fait un moment que j'hésitais à lâcher PluXML. Non pas parce que j'aime pas ce CMS (bien au contraire), mais à cause de certains détails agaçant.</p>
<p>Je l'utilise depuis 2010 (quasiment une décennie), mais depuis, ma procédure de rédaction des articles a pas mal évolué.</p>
<p>Mes derniers articles sont rédigés en ReStructuredText (rst), un langage de balisage léger, dans le même style que Markdown ou Textile, via ReText, suivi d'un export au format html, et enfin copier-coller dans l'éditeur html de PluXML.</p>
<p>Cela fait donc plusieurs étapes entre la rédaction et l'aperçu dans le blog, avec la répétition de toute la procédure si je veux éditer ou corriger un truc.</p>
<p>À noter : j'utilise la même procédure pour nv, qui tourne aussi sous PluXML.</p>
<p>Par exemple, la dernière fiction du mercredi a été rédigée en reStructuredText, à partir d'une idée tenant sur une ligne, puis exportée en html, etc.</p>
<p><a class="reference external" href="https://nouvelles.chibi-nah.fr/controle-z-d">https://nouvelles.chibi-nah.fr/controle-z-d</a></p>
<p>Par contre, pour mes pages de docs, j'utilise une procédure totalement différente. Là, je passe par Sphinx-doc, git, et quelques hooks.</p>
<p>Pour la rédaction, j'utilise aussi bien ReText, Geany ou Visual Studio Code (pas de troll, merci).</p>
<p>Je génère les pages en local pour contrôler le contenu. Le suivi des révisions étant géré par git, cela signifie donc que je peux aussi bien bosser avec Ryoko comme avec Yue. Et pour la publication ? Un simple git push, et c'est tout. Les pages sont générées sur le serveur puis copiés vers le répertoire de destination. Pas de copie via ftp ou scp. Pas de prise de tête.</p>
<p>Un processus totalement différent par rapport au blog.</p>
<p>Mon occupation actuelle est de reprendre tous les articles du blog (un peu moins d'une centaine), que j'ai converti en Markdown, via un script python, dont David Revoy a parlé récemment.</p>
<p><a class="reference external" href="https://www.davidrevoy.com/article756/moving-to-markdown">https://www.davidrevoy.com/article756/moving-to-markdown</a></p>
<p><a class="reference external" href="https://github.com/KillianKemps/Pluxml-to-Markdown">https://github.com/KillianKemps/Pluxml-to-Markdown</a></p>
<p>Cependant, le contenu du blog étant essentiellement statique (les commentaires étant modérés, voire carrément désactivés), l'intérêt d'un CMS générant dynamiquement les pages est discutable.
Je pense m'orienter vers un générateur statique. Pas Sphinx-doc, qui ne correspond pas à mes prérequis pour un blog (pour de la documentation, c'est juste génial). Plutôt Pelican (que je teste en ce moment).</p>
<p>Cela nécessite pas mal de travail. Notamment insérer toutes les métadonnées dans chacune des pages (date de publication, auteur, tags).
Et chose importante : essayer de garder les mêmes URL que celles générées avec PluXML.</p>
<p>La migration du blog s'effectuera dans les prochaines semaines, une fois les articles corrigés et le thème mis en place.</p>
Visual Studio, clavier TypeMatrix™ bépo et underscore2019-08-30T00:00:00+02:002019-10-12T00:00:00+02:00alextag:blog.chibi-nah.fr,2019-08-30:/visual-studio-clavier-typematrix-bepo-et-underscore<div class="section" id="ou-comment-se-prendre-la-tete-pour-pouvoir-taper-le-caractere">
<h2>Ou comment se prendre la tête pour pouvoir taper le caractère _</h2>
<p>Lors de la migration vers les nouvelles versions des outils en environnement professionnel, on peut rencontrer des problèmes complètement inattendus, et non documentés. D’autant plus s’il s’agit de produits Microsoft, où le support est absolument …</p></div><div class="section" id="ou-comment-se-prendre-la-tete-pour-pouvoir-taper-le-caractere">
<h2>Ou comment se prendre la tête pour pouvoir taper le caractère _</h2>
<p>Lors de la migration vers les nouvelles versions des outils en environnement professionnel, on peut rencontrer des problèmes complètement inattendus, et non documentés. D’autant plus s’il s’agit de produits Microsoft, où le support est absolument incapable de trouver l’origine du problème. Je ne parlerai pas des “experts” certifiés MSVP¹, pour qui le problème vient du clavier.</p>
<p>Là où c'est amusant, c’est que la touche fonctionne dans le champ de recherche mais pas dans l'éditeur.</p>
<p>J’avais rencontré ce problème avec Microsoft SQL Server Management Studio pour SQL Server 2017 (basé sur vs2015), et mon contournement était de taper l’underscore dans le bloc-note, puis de faire un copier-coller à chaque fois que j’en avais besoin, c’est-à-dire en permanence.</p>
<p>L’utilisant nettement moins souvent dans Visual Studio et ayant également Visual Studio Code (j’utilise plus ce dernier que la solution ultra lourde, d’ailleurs, et la touche underscore fonctionne, elle, sur VS Code), et les recherches de la solution s'avérant infructueuses, j’allais abandonner, jusqu’au moment, où au détour d’un message sur Stack Overflow, quelqu’un en Allemagne semblait avoir un problème similaire, mais avec un autre caractère ; sauf que là, une piste était donnée.</p>
</div>
<div class="section" id="les-raccourcis-claviers">
<h2>Les raccourcis claviers</h2>
<p>Certes, très utiles (enlevez-moi mon Ctrl + B et je pète un câble), mais parfois problématiques.</p>
<p>Après quelques tests stupides que je ne détaillerai pas, il s’avère que VS (depuis 2012 ? 2015 ?) détermine d’abord la séquence de touches, exécute le raccourci-clavier si celui-ci correspond, sinon insère le caractère pouvant correspondre à la même séquence.</p>
<p>Sur un TypeMatrix™ bépo, le caractère underscore _ s'obtient via Alt gr + espace. Sauf que Alt gr sous Windows, c’est un raccourci pour Ctrl + Alt. Donc, le caractère underscore _ correspond donc à Ctrl + Alt + Espace. Vous voyez venir la blague ?</p>
<p>Cette séquence de touches est attribuée à un raccourci clavier dans le mode éditeur. Et donc, prend le pas sur l’insertion du caractère tant désiré. Les raccourcis clavier ne s’appliquant pas dans le champ de recherche, cela explique pourquoi le _ peut être saisi sans aucun problème.</p>
<p>On a maintenant l’explication, du coup, corrigeons le problème.</p>
<p>Les captures d’écrans proviennent de Visual Studio 2017, mais c’est la même démarche dans MS SQL Server Management Studio.</p>
<p>Aller dans le menu « Outils », puis cliquer sur « Options… ».</p>
<img alt="" src="images/vs-bepo/vs-bepo-1.png" />
<p>Dans la fenêtre, cliquer sur « Clavier » sur la gauche.</p>
<p>La liste des raccourcis clavier s’affiche. Comme celle-ci est trop longue, on ne va pas les vérifier un par un.</p>
<img alt="" src="images/vs-bepo/vs-bepo-2.png" />
<p>Cliquer dans le champ texte sous « Appuyer sur les touches de raccourci : » puis appuyer les touches Alt gr + Espace. Cela insère bien le raccourci clavier Ctrl + Alt + Espace, ici en 1 sur la capture d’écran.</p>
<p>Le nom de la commande utilisant ce raccourci clavier apparaît alors sous « Raccourci actuellement utilisé par : », ici en 2 sur la capture d’écran.</p>
<img alt="" src="images/vs-bepo/vs-bepo-3.png" />
<p>Cliquer dans le champ texte sous « Afficher les commandes contenant : ».</p>
<p>Taper ensuite le nom de la commande (même partiellement) pour filtrer l’affichage.</p>
<p>Cliquer ensuite sur le nom de la commande, ici, la sélection en bleu sur la capture d’écran.</p>
<img alt="" src="images/vs-bepo/vs-bepo-4.png" />
<p>Cliquer sur le bouton « Supprimer », ici en 1 sur la capture d’écran.</p>
<p>Vérifier que le raccourci est bien supprimé, ici en 2 sur la capture d’écran.</p>
<p>Cliquer sur « OK », ici en 3 sur la capture d’écran pour valider et fermer la fenêtre.</p>
<p>Essayez de taper le caractère underscore. Cela devrait fonctionner.</p>
<p>Normalement, il y a un seul raccourci clavier avec cette séquence de touches. Si la touche n’est toujours pas reconnue, recommencer les manipulations pour trouver les autres commandes utilisant également cette séquence de touches.</p>
<p>---</p>
<p>¹ : Il suffit d’apprendre par cœur les annales et de réciter le tout par cœur² pour avoir la certification. Des gamins de 12 ans sont tout à fait capables (et certain·e·s l’ont obtenu).</p>
<p>² : La raison pour laquelle je n’ai pas ces certifications. Celles et ceux me connaissant IRL savent pourquoi.</p>
</div>
Ticket gamot2019-02-14T00:00:00+01:002019-02-14T00:00:00+01:00alextag:blog.chibi-nah.fr,2019-02-14:/ticket-gamot<p>Un petit rappel des définitions.</p>
<ul>
<li>GAMOT : Guichet Accueil Maintenance Opérateur Tiers.</li>
<li>TDP : Test De Position. Vérification raccordement plot ASDL, paire, transport.</li>
<li>ABS : test requis dans le logement mais Client ABSent.</li>
<li>DIA : demande de DIAgnostic de la ligne.</li>
<li>ERR : ERReur. GAMOT ouvert mais identifiant de ligne invalide.</li>
<li>IPC : Intervention sur le …</li></ul><p>Un petit rappel des définitions.</p>
<ul>
<li>GAMOT : Guichet Accueil Maintenance Opérateur Tiers.</li>
<li>TDP : Test De Position. Vérification raccordement plot ASDL, paire, transport.</li>
<li>ABS : test requis dans le logement mais Client ABSent.</li>
<li>DIA : demande de DIAgnostic de la ligne.</li>
<li>ERR : ERReur. GAMOT ouvert mais identifiant de ligne invalide.</li>
<li>IPC : Intervention sur le Point de Concentration.</li>
<li>RET : RÉTablissement de la ligne.</li>
<li>STT : Signalisation Transmise à Tort. Aucun défaut.</li>
<li>FIA : FIAbilisation de la ligne.</li>
</ul>Bonne année 20192019-01-01T00:00:00+01:002019-01-01T00:00:00+01:00alextag:blog.chibi-nah.fr,2019-01-01:/bonne-annee-2019<p>Tous mes meilleurs vœux pour la nouvelle année.</p>
<p>Du coup, j'en profite pour faire un petit bilan de l'année 2018.</p>
<p>Dans les réussites :</p>
<ul>
<li>
<p>Garder une instance Mastodon à peu près à jour ;</p>
</li>
<li>
<p>Déplacer l'instance Mastodon sur un nouveau serveur sans perdre de données ;</p>
</li>
<li>
<p>Mettre en place un site où je …</p></li></ul><p>Tous mes meilleurs vœux pour la nouvelle année.</p>
<p>Du coup, j'en profite pour faire un petit bilan de l'année 2018.</p>
<p>Dans les réussites :</p>
<ul>
<li>
<p>Garder une instance Mastodon à peu près à jour ;</p>
</li>
<li>
<p>Déplacer l'instance Mastodon sur un nouveau serveur sans perdre de données ;</p>
</li>
<li>
<p>Mettre en place un site où je peux écrire de la documentation, indépendamment du blog ( <a href="https://docs.nah.re">https://docs.nah.re</a> ) ;</p>
</li>
<li>
<p>Continuer d'expérimenter avec ffmpeg/mpv ;</p>
</li>
<li>
<p>Lâcher Android et passer sous SailfishOS pour mon téléphone principal.</p>
</li>
</ul>
<p>Ce qui était prévu mais qui n'a pas été fait :</p>
<ul>
<li>
<p>Écrire plus d'articles sur le blog ;</p>
</li>
<li>
<p>Écrire quelques nouveaux textes (en plus des mercredi fiction) ;</p>
</li>
<li>
<p>Finir la création d'un nouveau thème pour le blog ;</p>
</li>
<li>
<p>Faire du sport (le trajet pour aller au bureau en trotinette, ça ne compte pas).</p>
</li>
</ul>
<p>Ce qui aurait pu être mieux (mais mon temps libre n'est pas extensible)</p>
<ul>
<li>
<p>Timer plus de karaokés (Karaoké Mugen) ;</p>
</li>
<li>
<p>Participer plus à la vie associative (Lorraine Data Network) ;</p>
</li>
</ul>
<p>Du coup, ce que je pense prévoir pour 2019 :</p>
<ul>
<li>
<p>Vider la liste des karaokés que je dois faire/terminer ;</p>
</li>
<li>
<p>Avancer sur le projet LYAN (depuis 2009, il serait temps…) ;</p>
</li>
<li>
<p>Écrire un client Karaoké Mugen pour SailfishOS. Ça serait un excellent exercice pour me remettre à Qt.</p>
</li>
<li>
<p>Continuer d'écrire de la documentation sur ffmpeg, avec des exemples pertinents.</p>
</li>
</ul>
<p>Ça me semble relativement réaliste. Je ne vais pas prévoir une liste pas
possible et qui ne sera pas tenue/suivie.</p>Fibre optique, épisode 22018-07-21T00:00:00+02:002018-07-21T00:00:00+02:00alextag:blog.chibi-nah.fr,2018-07-21:/fibre-optique-episode-2<p><img alt="Speedtest" src="/images/fibre/fibre2.png"></p>Fibre optique2018-06-05T00:00:00+02:002018-06-05T00:00:00+02:00alextag:blog.chibi-nah.fr,2018-06-05:/fibre-optique<p><img alt="Résultat du speedtest" src="/images/fibre/fibre.png"></p>Full Tilt! Pinball2018-03-04T00:00:00+01:002018-03-04T00:00:00+01:00alextag:blog.chibi-nah.fr,2018-03-04:/full-tilt-pinball<h2>Full Tilt! Pinball</h2>
<p><img alt="Photo de la boîte du jeu. Source : wikipedia" src="/images/fulltilt/cover.jpg"></p>
<p>Ce jeu de flippers est sorti en 1995, et comprenait 3 tables :</p>
<ul>
<li>Dragon's Keep</li>
<li>Skulduggery</li>
<li>Space Cadet</li>
</ul>
<p>Si le nom "Space Cadet" vous dit quelque chose, c'est normal. J'en parlerai un
peu plus tard.</p>
<p>Full Tilt! Pinball a été développé par Cinematronics, et publié par Maxis (Sim …</p><h2>Full Tilt! Pinball</h2>
<p><img alt="Photo de la boîte du jeu. Source : wikipedia" src="/images/fulltilt/cover.jpg"></p>
<p>Ce jeu de flippers est sorti en 1995, et comprenait 3 tables :</p>
<ul>
<li>Dragon's Keep</li>
<li>Skulduggery</li>
<li>Space Cadet</li>
</ul>
<p>Si le nom "Space Cadet" vous dit quelque chose, c'est normal. J'en parlerai un
peu plus tard.</p>
<p>Full Tilt! Pinball a été développé par Cinematronics, et publié par Maxis (Sim
City, Les Sims, …)</p>
<h3>Points communs</h3>
<p>Les trois tables sont en fait trois jeux distincts, situés dans des
répertoires séparés. Le disque contient les jeux pour Windows 3.1 (16 bits) et
Windows 95 (32 bits). La version Windows 95 fonctionne également sous Windows
XP.</p>
<p>La résolution du jeu n'est pas fixe. On peut choisir 640x480, 800x600 et
1024x768.</p>
<p>Les sons sont au format Wave PCM 11 kHz (donc pas vraiment d'excellente
qualité), et les musiques sont au format MIDI – un synthétiseur MIDI ou un
expandeur MIDI est alors nécessaire pour pouvoir entendre les musiques.</p>
<p>Au niveau réalisme, il ne faut pas s'attendre à une simulation parfaite de la
physique (Pour ça, il vaut mieux jouer à 3D Pro Pinball, Timeshock! par
exemple). Le comportement est à peu pros cohérent dans Space Cadet, un peu
hasardeux dans Skulduggery et complètement irréaliste dans Dragon's Keep.
D'ailleurs, la bille a parfois tendance à disparaître de l'écran, voire à se
téléporter, ce qui est plutôt pénible.</p>
<p>Les contrôles sont simples :</p>
<ul>
<li>une touche pour lancer la bille</li>
<li>deux touches pour actionner les flippers</li>
<li>trois touches pour faire bouger le flipper vers la gauche, la droite ou vers le bas, pour modifier le comportement de la bille.</li>
</ul>
<h3>Les différentes tables</h3>
<h4>Dragon's Keep</h4>
<p><img alt="Capture d'écran de Dragon's Keep, sous Windows 3.1 - Dosbox" src="/images/fulltilt/DragonsKeep.png"></p>
<p>Cette table représente un univers de Fantasy, avec différentes « missions »,
comme « trouver l'antre du dragon », « sauver une jeune vierge », « vaincre le
dragon », « voler le trésor gardé par le dragon », avec des objets à collecter
comme des sorts, des armes et des armures.</p>
<h4>Skulduggerry</h4>
<p><img alt="Capture d'écran de Skuldugerry, sous Windows 3.1 - Dosbox" src="/images/fulltilt/Skulduggery.png"></p>
<p>Cette table représente un univers de pirates du 17e siècle (caraïbes). Au
moment de lancer la bille, une liste de « modes » défile. Je ne pourrai pas en
dire plus, je n'ai pas tout à fait compris comment cela fonctionnait.</p>
<h4>Space Cadet</h4>
<p><img alt="Capture d'écran de Space Cadet, sous Windows 3.1 - Dosbox" src="/images/fulltilt/SpaceCadet.png"></p>
<p>Cette table représente un univers spatial. Le but est de monter en grade
(cadet, sous-officier, lieutenant…), en effectuant différentes missions, comme
attaquer les bumpers, gravir la rampe de lancement, recharger (régulièrement)
en carburant.</p>
<h3>Pinball 3D pour Windows - Cadet de l'espace</h3>
<p><img alt="Capture d'écran de Pinball 3D pour Windows - Cadet de l'espace, sous Windows ME Millenium Edition" src="/images/fulltilt/3DPinball.png"></p>
<p>Cette version, intégrée dans Windows NT4, 2000, ME et XP (32 bits), est une
version légèrement réduite de Full Tilt! Space Cadet.</p>
<p>En effet, il n'y a plus qu'une seule musique, la résolution est limitée à
640x480. Il n'y a plus de « ball saved » lorsqu'une mission est accomplie.</p>
<p>D'autres modifications, d'ordre cosmétique sont également visibles (couleurs
de texte, bannière, police de caractère…)</p>
<p>Contrairement à mes souvenirs, cette version n'était pas incluse dans Windows
95. Elle était intégrée dans l'extension Microsoft Plus! pour Windows 95,
vendue séparément.</p>
<h3>Jouer au jeu</h3>
<p>Pour cela, il y a plusieurs méthodes</p>
<h4>Nativement</h4>
<p>Il suffit d'insérer le disque du jeu, et de l'installer sur n'importe quel PC
fonctionnant sous Windows 3.1, 95, 98, ME ou XP.</p>
<p>À noter : À partir de Windows 95, le synthétiseur MIDI utilisé pour jouer les
musiques est le SoftSynth Microsoft GM/GS, basé sur une version réduite du
SC-55. Sous Windows XP, on peut installer le synthétiseur Yamaha XG WDM (basé
sur le MU50), qui est de meilleure qualité. Sinon, on peut utiliser un
expandeur Akai, Roland, Yamaha, Korg… en MIDI (via MPU 401, port manette 15
broches et un adaptateur, interface MIDI USB…).</p>
<h4>Dosbox</h4>
<p>Si Windows 3.1 ou 95 est installé dans Dosbox, il suffit d'accéder au lecteur
CD-ROM depuis Windows puis installer le jeu. À noter : si le lecteur n'est pas
accessible, on peut copier tout le contenu du disque dans un répertoire
accessible depuis Dosbox.</p>
<h4>Wine</h4>
<p>Le jeu fonctionne également avec Wine. Il suffit de copier la version Windows
95 dans un répertoire situé dans le $WINEPREFIX.</p>
<p>La principale difficulté avec Wine, c'est pour avoir les musiques. L'une des
solutions est l'utilisation de Fluidsynth (déjà évoqué avec Touhou08, cf.
<a href="https://blog.chibi-nah.fr/touhou-08-imperishable-night-sous-gnu-linux">https://blog.chibi-nah.fr/touhou-08-imperishable-night-sous-gnu-linux</a> ).</p>
<p>Bien entendu, cela n'a pas fonctionné, parce que mon matériel a évolué depuis
(plus utilisation de jack2 comme serveur de son principal).</p>
<p>Heureusement, la documentation WINE est très claire et à jour.
<a href="https://wiki.winehq.org/MIDI">https://wiki.winehq.org/MIDI</a></p>
<p>Donc, lancement de l'un des flippers (ici Space Cadet) via la ligne de
commande :</p>
<div class="highlight"><pre><span></span><code>WINEDEBUG=+msacm wine CADET.EXE
</code></pre></div>
<p>Puis observation de ce qui arrive dans le terminal (attention, ça défile très
très vite dès que la musique commence à jouer).</p>
<p>Dans mon cas, les lignes intéressantes sont les suivantes :</p>
<div class="highlight"><pre><span></span><code>008e:trace:msacm:MIDIMAP_FindPort L"SC-8820 - SC-8820 Part A"
008e:trace:msacm:MIDIMAP_FindPort L"SC-8820 - SC-8820 Part B"
008e:trace:msacm:MIDIMAP_FindPort L"jack_midi - port"
008e:trace:msacm:MIDIMAP_FindPort L"a2jmidid - port"
008e:trace:msacm:MIDIMAP_FindPort L"Midi Through Port-0"
008e:trace:msacm:MIDIMAP_FindPort L"USB Uno MIDI Interface MIDI 1"
008e:trace:msacm:MIDIMAP_FindPort L"SC-8820 - SC-8820 MIDI"
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 0] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 1] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 2] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 3] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 4] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 5] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 6] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 7] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 8] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 9] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[10] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[11] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[12] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[13] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[14] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[15] => 0
</code></pre></div>
<p>Intéressons-nous d'abord à MIDIMAP_FindPort. On constate d'abord qu'il y a 7
sorties MIDI.</p>
<p>Si on compare avec la commande aconnect -o, on n'obtient pas du tout le même
résultat</p>
<div class="highlight"><pre><span></span><code>client 14: 'Midi Through' [type=noyau]
0 'Midi Through Port-0'
client 20: 'USB Uno MIDI Interface' [type=noyau,card=1]
0 'USB Uno MIDI Interface MIDI 1'
client 24: 'SC-8820' [type=noyau,card=2]
0 'SC-8820 Part A '
1 'SC-8820 Part B '
2 'SC-8820 MIDI '
</code></pre></div>
<p>Les sorties ne sont pas dans le même ordre, et on obtient que les sorties pour
ALSA. Celles de jack n'apparaissent pas.</p>
<p>Donc, reprenons ce qui est sorti de wine, et numérotons les sorties, en
commençant par 0 et non pas par 1 :</p>
<div class="highlight"><pre><span></span><code>0 : "SC-8820 - SC-8820 Part A"
1 : "SC-8820 - SC-8820 Part B"
2 : "jack_midi - port"
3 : "a2jmidid - port"
4 : "Midi Through Port-0"
5 : "USB Uno MIDI Interface MIDI 1"
6 : "SC-8820 - SC-8820 MIDI"
</code></pre></div>
<p>Si on regarde le mappage des canaux MIDI, on constate ceci :</p>
<div class="highlight"><pre><span></span><code>008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 0] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 1] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 2] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 3] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 4] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 5] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 6] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 7] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 8] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[ 9] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[10] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[11] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[12] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[13] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[14] => 0
008e:trace:msacm:MIDIMAP_LoadSettings chnMap[15] => 0
</code></pre></div>
<p>Les 16 canaux sont assignés à la sortie 0, qui correspond à "SC-8820 - SC-8820
Part A". Là, cela tombe bien, parce que j'ai un expandeur (matériel) qui
correspond. Si ce n'était pas le cas (par exemple, "jack_midi - port"), cela
poserait quelques problèmes, du genre pas de son.</p>
<p>Admettons que je veuille que la sortie par défaut soit "USB Uno MIDI Interface
MIDI 1", il faut donc que wine utilise la sortie 5.</p>
<p>Pour cela, sortons l'éditeur de base de registre.</p>
<div class="highlight"><pre><span></span><code>wine regedit
</code></pre></div>
<p>Si nécessaire, créer la clef suivante :</p>
<div class="highlight"><pre><span></span><code>HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Multimedia\MIDIMap
</code></pre></div>
<p>Si nécessaire, créer la valeur chaîne avec le nom suivant :</p>
<div class="highlight"><pre><span></span><code>CurrentInstrument
</code></pre></div>
<p>Puis éditer cette valeur chaîne, en saisissant #5 comme valeur.</p>
<p>![Capture d'écran de Regedit, montrant le chemin complet vers la clé, et une
fenêtre montrant le changement de la valeur de la chaîne
CurrentInstrument.]/images/fulltilt/regedit.png)</p>
<p>Relancer le jeu, et vérifier que la nouvelle sortie est bien prise en compte</p>
<div class="highlight"><pre><span></span><code>009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 0] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 1] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 2] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 3] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 4] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 5] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 6] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 7] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 8] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[ 9] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[10] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[11] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[12] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[13] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[14] => 5
009a:trace:msacm:MIDIMAP_LoadSettings chnMap[15] => 5
</code></pre></div>
<p>Normalement, il n'y a pas besoin de vérifier, on est censé entendre la musique
:)</p>
<h3>Vidéos</h3>
<p>Ci dessous, trois vidéos montrant les différentes table, en mode
démonstration.</p>
<p>À noter : les jeux ont été lancés via WINE 3.2 sous Debian SID. Pour la
musique, c'est un expandeur (matériel) qui est utilisé.</p>
<h4>Dragon's Keep</h4>
<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tube.nah.re/videos/embed/103c6a18-bf5b-4d6d-9a10-0a12e357b9d8" frameborder="0" allowfullscreen></iframe>
<h4>Skulduggery</h4>
<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tube.nah.re/videos/embed/931a9b45-916f-4d6f-9db6-75be393f8229" frameborder="0" allowfullscreen></iframe>
<h4>Space Cadet</h4>
<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tube.nah.re/videos/embed/1b747888-e6dc-4c27-ad87-60d31b00c099" frameborder="0" allowfullscreen></iframe>
<h3>Conclusion</h3>
<p>Pour conclure, avec un peu d'efforts, on peut toujours faire fonctionner ces
flippers en 2018, que cela soit nativement (avec un vieux PC) ou via
l'émulation (dosbox), voire l'exécution (via wine) sous GNU/Linux.</p>
<p>Pour la question « Où peut-on trouver ces jeux », mis à part les sites de
ventes de produits d'occasion ou les brocantes, je ne vois pas vraiment où on
peut le trouver.</p>
<h3>Remerciements</h3>
<p>L'anar geek, pour avoir évoqué 3D Pinball sous Windows XP, ce qui n'a donné
l'envie de ressortir la version « originale ».</p>
<p>Trit' pour m'avoir indiqué que non, 3D Pinball Space Cadet n'était pas intégré
à Windows 95.</p>Changer l'extension de plusieurs fichiers en une simple manipulation2017-12-03T00:00:00+01:002017-12-03T00:00:00+01:00alextag:blog.chibi-nah.fr,2017-12-03:/changer-l-extension-de-plusieurs-fichiers-en-une-simple-manipulation<p>Contrairement à MS-DOS, il n'y a pas de méthode simple pour changer juste
l'extension sur un grand nombre de fichiers.</p>
<p>Il existe des solutions avec une interface graphique, ou un ensemble de
commandes à taper.</p>
<p>J'ai fini par m'écrire un script qui évite de retaper toutes les commandes. Et
pour …</p><p>Contrairement à MS-DOS, il n'y a pas de méthode simple pour changer juste
l'extension sur un grand nombre de fichiers.</p>
<p>Il existe des solutions avec une interface graphique, ou un ensemble de
commandes à taper.</p>
<p>J'ai fini par m'écrire un script qui évite de retaper toutes les commandes. Et
pour le retrouver facilement, je l'ai appelé mass-rename, et l'ai enregistré
sous /usr/local/bin</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="nb">cd</span><span class="w"> </span><span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>
<span class="k">for</span><span class="w"> </span>f<span class="w"> </span><span class="k">in</span><span class="w"> </span>*.<span class="nv">$2</span><span class="p">;</span><span class="w"> </span><span class="k">do</span>
mv<span class="w"> </span>--<span class="w"> </span><span class="s2">"</span><span class="nv">$f</span><span class="s2">"</span><span class="w"> </span><span class="s2">"</span><span class="si">${</span><span class="nv">f</span><span class="p">%.</span><span class="nv">$2</span><span class="si">}</span><span class="s2">.</span><span class="nv">$3</span><span class="s2">"</span>
<span class="k">done</span>
</code></pre></div>
<p>Utilisation :</p>
<div class="highlight"><pre><span></span><code>mass-rename
</code></pre></div>
<p>Exemple :</p>
<div class="highlight"><pre><span></span><code>mass-rename ~/bureau/webcomics zip cbz
</code></pre></div>
<p>Attention : ce script ne fait absolument aucune vérification. À utiliser à vos
risques et périls.</p>Changer automatiquement de fond d'écran dans LightDM/GTK+ Greeter2017-05-01T00:00:00+02:002017-05-01T00:00:00+02:00alextag:blog.chibi-nah.fr,2017-05-01:/changer-automatiquement-de-fond-d-ecran-dans-lightdm-gtk-greeter<p>Dans cet article, nous allons voir comment changer automatiquement de fond
d'écran dans LightDM et GTK+ Greeter.</p>
<h3>Qu'est-ce que LightDM ?</h3>
<p>LightDM (Light Display Manager), est un gestionnaire d'affichage pour X Window
System, et qui gère, entres autres, l'ouverture des sessions graphiques.</p>
<p>Ce logiciel utilise divers front-ends pour dessiner l'interface de …</p><p>Dans cet article, nous allons voir comment changer automatiquement de fond
d'écran dans LightDM et GTK+ Greeter.</p>
<h3>Qu'est-ce que LightDM ?</h3>
<p>LightDM (Light Display Manager), est un gestionnaire d'affichage pour X Window
System, et qui gère, entres autres, l'ouverture des sessions graphiques.</p>
<p>Ce logiciel utilise divers front-ends pour dessiner l'interface de connexion,
comme GTK+ Greeter, Unity Greeter ou Webkit2 Greeter.</p>
<h3>GTK+ Greeter ?</h3>
<p>Ce front-end reprend le style de GDM, et est facilement configurable.</p>
<h3>Comment changer le fond d'écran</h3>
<p>Par défaut, le fond d'écran est celui de la distribution (Debian, Ubuntu ou
dérivée…).</p>
<p><img alt="LightDM avec le fond d écran Debian" src="/images/lightdm/debian.jpg"></p>
<p>Image par défaut</p>
<p>Sous Debian, avec GTK+ Greeter, l'image par défaut est définie dans
/usr/share/lightdm/lightdm-gtk-greeter.conf.d/01_debian.conf</p>
<p>Cependant, ce n'est pas une bonne idée de modifier la configuration à cet
endroit là.</p>
<p>Il vaut mieux éditer le fichier de configuration /etc/lightdm/lightdm-gtk-
greeter.conf</p>
<p>Par exemple, l'image que je veux utiliser est
/usr/local/share/lightdm/walls/miku.jpg</p>
<div class="highlight"><pre><span></span><code>[greeter]
background=/usr/local/share/lightdm/walls/miku.jpg
</code></pre></div>
<p><img alt="LightDM avec le fond d'écran que j'ai défini" src="/images/lightdm/miku.jpg"></p>
<p>Le résultat obtenu.</p>
<h3>Changer automatiquement de fond d'écran</h3>
<p>À priori, Webkit2 Greeter supporterait le changement automatique de fond
d'écran. Cependant :</p>
<ul>
<li>cela nécessite de récupérer le code source de ce front-end (non packagé dans Debian) ;</li>
<li>cela utilise webkit (moteur de rendu html) pour afficher une image (pourquoi ne pas lancer carrément Firefox tant qu'on y est). #troll ;</li>
<li>ce n'est pas amusant si on ne doit pas scripter.</li>
</ul>
<h4>Choix des images</h4>
<p>On commence d'abord par choisir des images. J'en ai choisi avec le moins
d'éléments graphiques au centre, je préfère que la fenêtre de connexion soit
au centre et non déporté sur l'un des côtés de l'écran.</p>
<p>Les images étant un mélange de .jpg et de .png, j'ai converti les .png en .jpg
à la main avec EOG (Fichier -> Enregistrer sous…)</p>
<p>Les images sont numérotées (de 1 à 7 dans mon cas).</p>
<p>Le répertoire /usr/local/share/lightdm/walls/ est créé, et est rendu lisible
par lightdm (un chmod 0644 devrait convenir). Les images sont copiées dedans.</p>
<p>Un lien symbolique (symlink) est créé.</p>
<div class="highlight"><pre><span></span><code>ln -sf 6.jpg default.jpg
</code></pre></div>
<p>Ici, j'utilise l'image 6.</p>
<h4>Paramétrage</h4>
<p>On modifie /etc/lightdm/lightdm-gtk-greeter.conf</p>
<p>et on utilise default.jpg à la place de l'image utilisée précédemment.</p>
<div class="highlight"><pre><span></span><code>[greeter]
background=/usr/local/share/lightdm/walls/default.jpg
</code></pre></div>
<p><img alt="LightDM avec le fond d'écran "default.jpg"" src="/images/lightdm/reading.jpg"></p>
<p>Désormais, pour changer l'image de fond, il suffit de modifier le lien
symbolique et non un fichier de configuration.</p>
<h4>Changement automatique</h4>
<p>Définir le lien symbolique à la main, c'est bien joli, mais je ne veux pas le
faire à chaque fois que j'allume mon ordinateur.</p>
<p>Scriptons un peu avec bash.</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="nb">cd</span><span class="w"> </span>/usr/local/share/lightdm/walls
<span class="nv">MIN</span><span class="o">=</span><span class="m">1</span>
<span class="nv">MAX</span><span class="o">=</span><span class="m">7</span>
<span class="nv">CURR</span><span class="o">=</span><span class="k">$(($(</span>ls<span class="w"> </span>-l<span class="w"> </span>default.jpg<span class="w"> </span><span class="p">|</span><span class="w"> </span>sed<span class="w"> </span><span class="s1">'s/\(.*\)> \(.*\)\.jpg/\2/'</span><span class="k">)</span><span class="w"> </span><span class="o">+</span><span class="m">1</span><span class="k">))</span>
<span class="k">if</span><span class="w"> </span><span class="o">[</span><span class="w"> </span><span class="nv">$CURR</span><span class="w"> </span>-gt<span class="w"> </span><span class="nv">$MAX</span><span class="w"> </span><span class="o">]</span>
<span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="nv">CURR</span><span class="o">=</span><span class="nv">$MIN</span>
<span class="k">fi</span>
ln<span class="w"> </span>-sf<span class="w"> </span><span class="nv">$CURR</span>.jpg<span class="w"> </span>default.jpg
</code></pre></div>
<p>Le script est enregistré dans /usr/local/bin/change-fond-lightdm.sh et est
rendu exécutable via chmod +x.</p>
<p>Quelques explications s'imposent :</p>
<ul>
<li>On se déplace d'abord là où sont stockées les images ;</li>
<li>On définit deux variables, MIN et MAX :</li>
</ul>
<blockquote>
<ul>
<li>MIN contient la valeur de la première image (certains comptent à partir
de zéro, d'autres à partir de un) ;</li>
<li>MAX contient la valeur de la dernière image (très important pour la
suite) ;
</li>
</ul>
</blockquote>
<p>Là, on arrive sur cette instruction imbuvable.</p>
<p>Décomposons cette instruction :</p>
<ul>
<li>ls -l default.jpg</li>
<li>sed</li>
<li>'s/(.<em>)> (.</em>).jpg/2/')</li>
<li>+1</li>
<li>CURR=$(( ))</li>
</ul>
<p>ls -l default.jpg. On l'utilise pour récupérer le nom du fichier pointé par
default. Ici, le résultat est :</p>
<div class="highlight"><pre><span></span><code>lrwxrwxrwx 1 root staff 5 mai 1 16:42 /usr/local/share/lightdm/walls/default.jpg -> 6.jpg
</code></pre></div>
<p>On utilise ensuite l'éditeur sed pour extraire le nom du fichier.</p>
<p>L'extraction en elle même s'effectue via l'expression régulière 's/(.<em>)>
(.</em>).jpg/2/')</p>
<p>On cherche deux groupes. Le premier s'arrête à > (noter la présence de
l'espace après le >). Le second groupe est le texte qui suit, et qui précède
.jpg.</p>
<p>On ne garde que le second groupe.</p>
<p>On obtient alors</p>
<div class="highlight"><pre><span></span><code>6
</code></pre></div>
<p>On ajoute 1.</p>
<p>On stocke le résultat dans la variable CURR.</p>
<p>Ensuite</p>
<ul>
<li>On compare le nombre contenu dans CURR avec MAX ;</li>
<li>Si CURR strictement supérieur à MAX</li>
<li>
<ul>
<li>alors CURR prend la valeur MIN</li>
</ul>
</li>
</ul>
<p>Ici, CURR contient 7. 7 n'est pas strictement supérieur à 7, donc on continue.
Si CURR aurait la valeur 8, alors la ligne then aurait été appelée, et CURR
serait revenu à 1.</p>
<ul>
<li>On crée le lien symbolique (-s) default.jpg avec remplacement si celui-ci existe (f) avec comme nom le nombre contenu dans CURR, que l'on concatène avec .jpg</li>
</ul>
<h4>On teste</h4>
<p>Il suffit de regarder la cible de default.jpg, puis d'appeler le script, puis
de regarder, etc…</p>
<p><img alt="Capture d'écran du terminal contenant en alternance les commandes ls -l
default.jpg et l'appel au script de changement d'image" src="/images/lightdm/tests.png"></p>
<p>Cela fonctionne correctement, on voit bien qu'après 7, on revient bien à 1.</p>
<p>Le cas 9 -> 10 n'a pas été testé.</p>
<h4>On intègre l'automatisation</h4>
<p>Ici, plusieurs possibilités :</p>
<ul>
<li>Ajouter l'appel au script dans /etc/rc.local ;</li>
<li>Créer un unit systemd ;</li>
<li>Exécuter le script toutes les heures via cron ;</li>
<li>Faire en sorte que cela soit LightDM qui appelle automatiquement le script lorsque LightDM démarre.</li>
</ul>
<p>C'est la dernière solution qui a été retenue.</p>
<p>On édite /etc/lightdm/lightdm.conf</p>
<p>Sous la section [Seat:*], on décommente/ajoute la ligne display-setup-script=…
comme ceci :</p>
<div class="highlight"><pre><span></span><code>[Seat:*]
display-setup-script=/usr/local/bin/change-fond-lightdm.sh
</code></pre></div>
<p>Test en vidéo :</p>
<p>Ici, LightDM est redémarré pour vérifier que le changement d'image de fond est
effectif.</p>
<p>À noter : si on veut que l'image change non pas au démarrage de LightDM mais à
chaque fois que LightDM est affiché (l'ordinateur démarre : une image, on
ouvre la session, on ferme la session, l'image change…), il faut utiliser
greeter-setup-script à la place de display-setup-script</p>
<div class="highlight"><pre><span></span><code>[Seat:*]
greeter-setup-script=/usr/local/bin/change-fond-lightdm.sh
</code></pre></div>
<h3>Remerciements</h3>
<p>Dave Null (<a href="https://mamot.fr/@devnull">@devnull</a>) pour l'idée de base, le
script de capture de l'écran de connexion, et avoir confirmé que ça fonctionne
:)</p>
<h3>Remarques</h3>
<p><a href="https://social.nah.re/users/alex/updates/266">Si vous me suivez sur Mastodon et que cet article vous dit quelque chose,
c'est normal :)</a></p>Vidéo composite et moniteur composante2017-02-25T00:00:00+01:002017-02-25T00:00:00+01:00alextag:blog.chibi-nah.fr,2017-02-25:/video-composite<p>Vidéo composite dans une entrée YPbPr sur un moniteur, ça marche ou pas ? Je dirais : ça dépend.</p>
<p><img alt="Photo de mon moniteur PC, affichant l'écran titre du jeu Bomberman 94, en noir et blanc" src="/images/composite/pce_b94.jpg"></p>
<h3>Vidéo composite</h3>
<p>Le signal vidéo composite permet de transmettre via un seul fil (enfin, un fil
de signal et un fil de masse) un ensemble de signaux :</p>
<ul>
<li>la luminance + synchronisation ;</li>
<li>la chrominance.</li>
</ul>
<h4>Luminance …</h4><p>Vidéo composite dans une entrée YPbPr sur un moniteur, ça marche ou pas ? Je dirais : ça dépend.</p>
<p><img alt="Photo de mon moniteur PC, affichant l'écran titre du jeu Bomberman 94, en noir et blanc" src="/images/composite/pce_b94.jpg"></p>
<h3>Vidéo composite</h3>
<p>Le signal vidéo composite permet de transmettre via un seul fil (enfin, un fil
de signal et un fil de masse) un ensemble de signaux :</p>
<ul>
<li>la luminance + synchronisation ;</li>
<li>la chrominance.</li>
</ul>
<h4>Luminance</h4>
<p>La luminance représente l'information sur la lumière. Admettons que la plage
aille de 0% à 100%, 0% est noir (pas de lumière), et 100% est blanc (lumière
au maximum). Toute valeur intermédiaire est un niveau de gris.</p>
<p>Avant l'arrivée de la télévision en couleur, seul le signal de luminance était
transmis.</p>
<p>La synchronisation (verticale) est transmise en même temps.</p>
<h4>Chrominance</h4>
<p>La chrominance représente l'information sur la couleur, plus exactement une
combinaison entre la teinte et la saturation.</p>
<p>Comment représenter les couleurs ? Pour cela, il y a trois normes,
incompatibles les unes les autres :</p>
<ul>
<li>NTSC (USA/Japon) (sous-porteuse à 3.579545 MHz ± 10 Hz) ;</li>
<li>PAL (Europe, sauf la France, la Russie et certains pays de l'Est) (sous-porteuse à 4.43361875 MHz ± 5 Hz) ;</li>
<li>SECAM (France, Russie, et certains pays de l'Est) (les couleurs sont en alternance, sur un signal FM).</li>
</ul>
<p>Je n'entrerai pas dans les détails sur ces normes, ici, cela n'a peu d'intérêt
pour cet article</p>
<p>Pour information :</p>
<ul>
<li>NTSC : National Television Standards Committee (ou Not The Smartest Choice, à cause de la fréquence de 29,97 trames par secondes au lieu de 30) ;</li>
<li>PAL : Phase Alteration Line</li>
<li>SECAM : Système Électronique Pour Couleur Avec Mémoire</li>
</ul>
<h4>Connectique</h4>
<p>On utilise une prise RCA jaune, ou une péritel (SCART, Euro-AV), entre les
appareils (console de jeu -> TV par exemple).</p>
<p><img alt="Décomposition d'une image en image Y, Pb et Pr" src="/images/composite/composite.jpg"></p>
<p>By <a href="//commons.wikimedia.org/wiki/User:Evan-Amos" title="User:Evan-Amos">Evan-Amos</a> - Own work, Public Domain, <a href="https://commons.wikimedia.org/w/index.php?curid=11339108">Link</a></p>
<h4>Limitations</h4>
<p>À cause des perturbations entre les deux signaux, on est limité à une
résolution de 480i en NTSC et 576i en PAL et en SECAM.</p>
<h3>Vidéo composante</h3>
<p>Contrairement au composite, la vidéo à composantes séparées transmet les
informations sur trois fils :</p>
<ul>
<li>luminance + synchronisation ;</li>
<li>différence entre le bleu et la luminance ;</li>
<li>différence entre le rouge et la luminance.</li>
</ul>
<p>À noter : YPbPr et YUV (PAL) sont des manières de représenter les couleurs
(espaces de couleurs). YCbCr est pour le numérique tandis que YPbPr est pour
l'analogique.</p>
<h4>Luminance</h4>
<p>Voir luminance sous composite, c'est <strong>presque</strong> la même chose.</p>
<h4>Bleu et Rouge ?</h4>
<p>Il n'y a donc pas de vert ?</p>
<p>Y Représente la luminance.</p>
<p>Pour calculer l'intensité du bleu, on soustrait la valeur B de Y. Pour
calculer l'intensité du rouge, on soustrait la valeur R de Y.</p>
<div class="highlight"><pre><span></span><code>Pb = B - Y
Pr = B - Y
</code></pre></div>
<p>Admettons que la différence varie entre 0 et 100%.</p>
<p>On regarde d'abord Pb.</p>
<p>Si Pb = 100%, alors le bleu est au maximum. Et Si Pb = 0%, le bleu est au
minimum, on est d'accord. Mais si le bleu est au minimum, on affiche quoi ?</p>
<p>On pourrait répondre « ben, du noir, non ? », et bien non.</p>
<p>Les valeurs de noir et de blanc sont déjà véhiculés par Y, on ne va pas
répéter cette information.</p>
<p>Si Pb = 0%, on a du vert.</p>
<p>Pour Pr, c'est exactement pareil.</p>
<p>Pourquoi utiliser cette méthode pour encoder l'information ? C'est uniquement
pour réduire la quantité d'information à tranmettre.</p>
<p>On s'est aperçu que l'œil humain était plus sensible à la variation de lumière
qu'à la variation de couleur. On a donc estimé que si les informations de
couleur étaient légèrement dégradées, cela ne poserait quasiment pas de
problème.</p>
<p>Note : Les calculs sont volontairement simplifiés, en réalité, c'est un peu
plus compliqué. Pour ceux qui n'auraient pas peur, la lecture de cette page
est recommandée :
<a href="http://poynton.com/notes/colour_and_gamma/ColorFAQ.html">http://poynton.com/notes/colour_and_gamma/ColorFAQ.html</a></p>
<h4>Connectique</h4>
<p>On utilise généralement trois prises RCA, une verte, une bleue et une rouge,
la transmission via une péritel est très rare, la transmission des
informations n'étant pas normalisé.</p>
<p>À noter, sur un cordon composante avec 5 fils, les deux fils supplémentaires
(rouge et blanc ou rouge et noir) sont destinés à l'audio. Ils sont la plupart
du temps regroupés à part, avec une étiquette « audio ». Ne pas confondre la
prise rouge Pr avec la prise rouge de l'audio.</p>
<p><img alt="Décomposition d'une image en image Y, Pb et Pr" src="/images/composite/component.jpg"> By <a href="//commons.wikimedia.org/wiki/ser:Evan-Amos" title="User:Evan-Amos">Evan-Amos</a>- Own work, Public Domain,<a href="https://commons.wikimedia.org/w/index.php?curid=11339108">Link</a></p>
<h4>Limitations</h4>
<p>Du fait que les signaux soient séparés, il y a moins de brouillage. La
résolution maximale est 1080i.</p>
<h4>Exemple de séparation YUV</h4>
<p><img alt="Décomposition d'une image en image Y, Pb et Pr" src="/images/composite/equasysColorSeparationLuminanceChrominance.png"></p>
<p>Source de l'image : <a href="http://www.equasys.de/colorformat.html">http://www.equasys.de/colorformat.html</a></p>
<blockquote>
<p>You are encouraged to use the technical service information by setting a
link to the equasys web site. You are free to reproduce or to disseminate
the technical service information, as long as you do not change the content
and you give a proper reference to the source by setting a link to
www.equasys.de.</p>
</blockquote>
<h3>RGB/RVB</h3>
<p>Je parlerai rapidement du RVB.</p>
<p>Les signaux RVB (Rouge Vert Bleu) ou RGB (Red Green Blue) trasmettent
directement la quantité de rouge, de vert et de bleu à utiliser. La lumière
est la somme de ces trois couleurs (synthèse additive). Un fil supplémentaire
(et séparé) transmet la synchronisation.</p>
<dl>
<dt>À noter : le VGA est également du RVB, mais avec deux fils de synchronisation</dt>
<dd>un pour la synchro horizontale et un pour la synchro verticale.</dd>
</dl>
<p>Exemple :</p>
<div class="highlight"><pre><span></span><code>R : 0%, V : 0%, B : 0% => noir
R : 100%, V : 100%, B : 100% => blanc
R : 100%, V : 0%, B : 0% => rouge
R : 0%, V : 100%, B : 0% => vert
R : 0%, V : 0%, B : 100% => bleu
</code></pre></div>
<p>Les autres couleurs s'obtiennent en faisant varier la quantité de rouge, de
vert et de bleu.</p>
<h4>Connectique</h4>
<p>Le RVB a surtout été utilisé en Europe, au niveau domestique, et partout
ailleurs au niveau professionnel.</p>
<p>En Europe, la prise Péritel a été concue (en partie) pour transporter ces
signaux.</p>
<p><img alt="Photo d'une prise péritel" src="/images/composite/scart.jpg"></p>
<p>By <a href="//commons.wikimedia.org/wiki/User:Bergsten" title="User:Jonas Bergsten">Jonas Bergsten</a> - Own work, Public Domain, <a href="https://commons.wikimedia.org/w/index.php?curid=237555">Link</a></p>
<p>Dans le monde professionnel, on utilise plutôt des connecteurs de type BNC.</p>
<p><img alt="Photo d'un connecteur BNC" src="/images/composite/bnc.jpg"></p>
<p>By <a href="//commons.wikimedia.org/wiki/User:Bergsten" title="User:Jonas Bergsten">Jonas Bergsten</a> - Own work, Public Domain, <a href="https://commons.wikimedia.org/w/index.php?curid=232488">Link</a></p>
<p>Dans le monde de l'informatique, on utilise la prise VGA</p>
<p><img alt="Photo d'une prise VGA" src="/images/composite/vga.jpg"></p>
<p>By <a href="//commons.wikimedia.org/wiki/User:Evan-Amos" title="User:Evan-Amos">Evan-Amos</a> - Own work, Public Domain, <a href="https://commons.wikimedia.org/w/index.php?curid=11339219">Link</a></p>
<h4>Limitations</h4>
<p>Je pense que c'est plus ou moins similaire au VGA.</p>
<h4>Exemple de séparation RVB</h4>
<p><img alt="Décomposition d'une image en images rouge, verte et bleue." src="/images/composite/equasysColorSeparationRedGreenBlue.png"></p>
<p>Source de l'image : <a href="http://www.equasys.de/colorformat.html">http://www.equasys.de/colorformat.html</a></p>
<blockquote>
<p>You are encouraged to use the technical service information by setting a
link to the equasys web site. You are free to reproduce or to disseminate
the technical service information, as long as you do not change the content
and you give a proper reference to the source by setting a link to
www.equasys.de.</p>
</blockquote>
<h3>Composite compatible Composante ?</h3>
<h4>Au niveau connectique</h4>
<p>Si c'est du RCA, la réponse est OUI</p>
<h4>Au niveau électrique</h4>
<p>Côté composite :</p>
<ul>
<li>La synchro est à 0,285 V.</li>
<li>La référence au noir est à 0,339 V.</li>
<li>La référence au blanc est à 1 V</li>
</ul>
<p>Côté composante :</p>
<p>De mémoire, la référence au blanc est entre 0,7 et 1 V, je ne sais plus
exactement, et impossible de retrouver ces valeurs sur Internet >.<. Pareil
pour la synchro et la référence au noir.</p>
<p>La théorie, c'est bien beau, maintenant</p>
<h3>On teste</h3>
<p>J'ai sorti ma PC Engine (JAP), sorti l'Interface Unit (IFU), branché la sortie
vidéo composite de l'IFU sur mon moniteur Asus (qui est doté d'une entrée
Composante), ai allumé le tout, et ai basculé sur l'entrée composante (sur le
moniteur).</p>
<p>Rien n'a explosé., tant mieux.</p>
<p>Ce que je constate :</p>
<p>Souvent, l'image saute, comme si le moniteur n'arrivait pas à synchroniser
l'image, notamment sur l'interface TED, ou au lancement de Magical Chase (le
logo Quest saute), alors qu'en jeu, souvent, ça passe sans problème.</p>
<p>J'ai essayé plusieurs jeux, certains sont absolument injouables (comme
Galaga'88, l'image saute en permanence pendant le jeu), d'autres s'en sortent
pas trop mal.</p>
<h3>Test en vidéo</h3>
<video controls="" height="720" preload="none" width="1280">
<source src="images/composite/pce.mp4" type="video/mp4" />
</video>
<p>Désolé pour la qualité audio absolument épouvantable (micro de l'appareil photo, bruit de fond, souffle…)</p>
<p>Pour redémarrer un jeu (reset), il faut appuyer sur RUN+SELECT (en appuyant sur RUN, ça met le jeu en pause)</p>
<h3>En conclusion</h3>
<p>Mon avis est mitigé. Certes, cela fonctionne, mais ce n'est pas extra.</p>
<p>La console sort un signal en 240p (reconnu comme du 480i sur le moniteur).</p>
<p>Du fait que les couleurs sont véhiculées sur les deux autres prises qui ne
sont pas branchées, le signal est affiché en noir et blanc.</p>
<p>Pour le problème de perte de l'image (clignotement), je pense que cela vient
de mon moniteur PC, le 480i étant le minimum qui peut être utilisé. Si la
console sort du 239p, le signal sera en partie reconnu (synchro), et pas
reconnu (c'est pas synchro).</p>
<p>En fonction des jeux, ça peut être une solution de dépannage, mais je ne sais
pas si la légère différence au niveau électrique ne risquerait pas d'user
prématurément l'électronique du moniteur.</p>
<p>L'utilisation d'un upscaler Composite -> VGA (ou HDMI) serait plus judicieuse.</p>
<p>Note : j'ai déjà branché une PS2 et une Wii sur ce moniteur, en YPbPr, sans
aucun problème (enfin, signal en 576i ou 480i/480p), l'image était en couleur.</p>Cloudbleed2017-02-24T00:00:00+01:002017-02-24T00:00:00+01:00alextag:blog.chibi-nah.fr,2017-02-24:/cloudbleed<p><img alt="Logo représentant un nuage aux couleurs de cloudflare, mais les gouttes de pluie sont remplacées par des gouttes de sang (référence à heartbleed, le cœur qui saigne). En dessous se trouve le texte #cloudbleed." src="/images//cloudbleed.png"></p>
<h3>Cloudbleed ?</h3>
<p>Cloudbleed est le nom donné à cette faille, nom plus facile à retenir que
project-zero:1139.
<a href="https://bugs.chromium.org/p/project-zero/issues/detail?id=1139">https://bugs.chromium.org/p/project-zero/issues/detail?id=1139</a>
<a href="https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-
cloudflare-parser-bug/">https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-
cloudflare-parser-bug/</a></p>
<h3>Qu'est-ce que Cloudflare ?</h3>
<p>Cloudflare est un service de reverse proxy (serveur cache + protection contre
les attaques de …</p><p><img alt="Logo représentant un nuage aux couleurs de cloudflare, mais les gouttes de pluie sont remplacées par des gouttes de sang (référence à heartbleed, le cœur qui saigne). En dessous se trouve le texte #cloudbleed." src="/images//cloudbleed.png"></p>
<h3>Cloudbleed ?</h3>
<p>Cloudbleed est le nom donné à cette faille, nom plus facile à retenir que
project-zero:1139.
<a href="https://bugs.chromium.org/p/project-zero/issues/detail?id=1139">https://bugs.chromium.org/p/project-zero/issues/detail?id=1139</a>
<a href="https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-
cloudflare-parser-bug/">https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-
cloudflare-parser-bug/</a></p>
<h3>Qu'est-ce que Cloudflare ?</h3>
<p>Cloudflare est un service de reverse proxy (serveur cache + protection contre
les attaques de type DDOS), un service de CDN (réplication de contenu partout
dans le monde sur des serveurs plus proches physiquement des utilisateurs), un
service d'optimisation des pages (réduction/réécriture).</p>
<p>L'infrastructure de Cloudflare est essentiellement basée sur Nginx (serveur
web + reverse proxy, comme Apache ou lighttpd, mais en plus léger et rapide).</p>
<h3>Est-ce lié à Heartbleed ?</h3>
<p>Non. Même si l'importance de cette faille a plus ou moins le même impact que
Heartbleed (fuite de données).</p>
<h3>La faille, en détails</h3>
<h4>Provocation de la faille</h4>
<p>Une page html, hébergée derrière un service proposé par cloudflare, pesant
moins de 4 ko (4096 octets) et contenant des données mal formatées (balise
fermante absente), peut contenir des données provenant de la mémoire (RAM) du
serveur.</p>
<p>Ces données peuvent être des clefs de chiffrement, des cookies
(d'authentification, par exemple), des mots de passe, des fragments de données
de type POST (données envoyés depuis un formulaire web, que ça soit un panier
sur un site marchand, un couple identifiant/mot de passe, un commentaire sur
un blog…), voire même des requêtes https provenant d'autres sites utilisant
également cloudflare.</p>
<p>Ces données ont été indexées par les moteurs de recherche (google, bing,
yahoo, yandex…), et sont encore accessible dans leurs cache (le vidage des
caches contenant ces données sont en cours).</p>
<p>Le problème provient d'un bout de code source, utilisé par email obfuscation
(masquage d'adresse email), Server-side Excludes (Exclusions côté serveur) et
automatic HTTPS rewrites (remplacement à la volée des adresses http:// en
https:///.</p>
<p>En résumé, une page web est lue par le serveur nginx de cloudflare, ce serveur
réécrit une partie de la page, par exemple, pour masquer une adresse email,
puis envoie cette page au navigateur web.</p>
<p>Le problème est situé au moment où le contenu est réécrit.</p>
<h4>Comment le contenu est-il réécrit ?</h4>
<p>Depuis les débuts de cloudflare, les ingénieurs utilisaient Ragel, un langage
de programmation basé sur des expressions régulières, qui génère du code en
langage C (transcompilation, conversion d'un langage de programmation vers un
autre langage de programmation. En général, on utilise cette technique de
programmation pour pouvoir écrire le code en un langage relativement simple,
ou contenant certaines fonctionnalités (langage dit de haut-niveau). Ce code
est alors converti en un autre langage, plus "proche de la machine" (langage
dit de bas niveau)).</p>
<p>Ragel : <a href="https://www.colm.net/open-source/ragel/">https://www.colm.net/open-source/ragel/</a></p>
<p>Les expressions régulières sont donc converties en C, jusque là, pas de
problème. Sauf qu'avec le temps, le code écrit avec Ragel a augmenté en
longueur et en complexité (de plus en plus de règles à évaluer), et devenait
de plus en plus difficile à maintenir. Les ingénieurs décidèrent alors
d'écrire un nouveau code (appelé cf-html) pour le remplacer. Il s'est avéré
que cf-html était beaucoup plus rapide, fonctionnait correctement avec le HTML
5 et était facile à maintenir (du code facile à maintenir est du code facile
et rapide à corriger et à améliorer).</p>
<p>La première fonctionnalité à utiliser cf-html est la fonctionnalité qui
corrige les adresses http en https. Les autres fonctionnalités, sont migrées
progressivement.</p>
<p>L'un des points à noter, c'est que le code généré par Ragel et cf-html est
compilé en tant que modules, puis est chargé par ngnix.</p>
<p>Chaque module chargé par le serveur proxy analyse le contenu html dans des
blocs de mémoire, effectue des modifications si nécessaire, et passe le
contenu au module suivant. Lorsque tous les modules ont effectués leurs
traitements, le serveur ngnix envoie la page au navigateur web.</p>
<p>Parmi ces traitements, cela peut être le déchiffrement du contenu https,
l'analyse de données (vers qui est destiné cette requête), le contenu est-il
encore à jour (cache expiré ou non)…</p>
<p>Une fois le bug isolé, il s'est avéré qu'il provenait de cf-html et non de
Ragel. Cependant, le bug était également présent dans le code écrit en Ragel,
mais il n'y avait aucun impact, parce que la mémoire était correctement
traitée. Via cf-html, il s'est avéré que la mémoire était traitée de manière
légèrement différente (de manière subtile) par rapport à Ragel, et c'est de là
que provient la faille.</p>
<h4>Désactivation des services concernés</h4>
<p>Dès que cloudflare a déterminé que le problème venait de cf-html, la société a
immédiatement désactivé les services dépendants de ce module, en attendant de
comprendre exactement d'où venait le problème.</p>
<h4>Origine du problème</h4>
<p>Si vous lisez couramment l'anglais (technique), je conseille vivement la
lecture de ce paragraphe (et celui d'après).
<a href="https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-
cloudflare-parser-bug/#rootcauseofthebug">https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-
cloudflare-parser-bug/#rootcauseofthebug</a></p>
<p>Il est nettement plus détaillé que mes explications plus bas. Mes explications
sont plus génériques (tentative de vulgarisation des éléments techniques avec
exemple d'un débordement).</p>
<p>Le code généré est du code en langage C. Ce langage, de bas niveau, permet la
manipulation de « pointeurs », et d'accéder directement à la mémoire de la
machine (bon, avec quelques restrictions, je simplifie parce que c'est plutôt
compliqué en fait. Et il faudrait tout un livre pour expliquer les pointeurs).</p>
<p>le code posant problème est le suivant :</p>
<blockquote>
<p>/<em> generated code </em>/
if ( ++p == pe )
goto _test_eof;
</p>
</blockquote>
<p>p correspond au pointeur (où on se trouve actuellement).
pe : l'adresse mémoire de la fin de la zone à lire.</p>
<p>++p : on ajoute 1 à p (on se déplace d'un octet)
puis on compare p avec pe.
Si p est égal à pe alors on saute à l'étiquette _test_eof.
Sinon on continue la lecture.</p>
<p>À noter : EOF signifie End Of File (Fin de fichier).</p>
<h4>Ok, et en quoi ce code pose problème ?</h4>
<p>Déroulons l'exécution :</p>
<p>Le texte html est stocké entre les adresses 0 et 4096 (4 ko). On ne tient pas
compte si c'est de l'utf-8 (pour l'exemple).
On initialise le pointeur p à zéro, et pe à 4096.</p>
<blockquote>
<p>on définit une étiquette _begin</p>
<p>On lit l'octet à l'adresse stockée dans p (p étant un pointeur vers cette
adresse).
On fait le traitement requis.
On incrémente p
p contient désormais 1
On compare p avec pe
p -> 1, pe -> 4096.
Les résultats sont différents, on continue le traitement.</p>
<p>On va à l'étiquette début.</p>
<p>On lit l'octet à l'adresse stockée dans p.
On fait le traitement requis.
On incrémente p
p contient désormais 2
On compare p avec pe
p -> 2, pe -> 4096.
Les résultats sont différents, on continue le traitement.</p>
<p>On va à l'étiquette début.</p>
</blockquote>
<p>ainsi de suite…</p>
<p>on arrive au moment ou p contient 4095</p>
<blockquote>
<p>On lit l'octet à l'adresse stockée dans p.
On fait le traitement requis.
On incrémente p
p contient désormais 4096
On compare p avec pe
p -> 4096, pe -> 4096.
Les résultats sont identiques, on va à l'étiquette _test_eof.</p>
</blockquote>
<p>Ici, le code fonctionne sans problème.</p>
<p>Que se passerait-il si, par hasard, on ajoute 1 entretemps ?</p>
<p>Admettons que l'on soit dans la boucle, et p = 4094</p>
<blockquote>
<p>On lit l'octet à l'adresse stockée dans p.
On fait le traitement requis.
On incrémente p
p contient désormais 2
On compare p avec pe
p -> 4095, pe -> 4096.
Les résultats sont différents, on continue le traitement.</p>
</blockquote>
<p>pour une certaine raison, on incrémente p de 1.</p>
<p>p vaut alors 4096.</p>
<p>Vous voyez où est le problème ? Non ? On continue le déroulement.</p>
<p>p vaut 4096.</p>
<blockquote>
<p>On lit l'octet à l'adresse stockée dans p.
On fait le traitement requis.
On incrémente p
p contient désormais 4097
On compare p avec pe
p -> 4097, pe -> 4096.
Les résultats sont différents, on continue le traitement.</p>
</blockquote>
<p>On commence à lire les données situées dans les adresses mémoire au delà de
4096, comme défini plus haut.</p>
<p>Et là, c'est le drame. On vient de sortir de la zone mémoire dans laquelle on
était censé lire les données (nom de ce bug : buffer overrun).</p>
<p>La solution pour éviter ce genre de problème est toute simple.</p>
<p>Le code effectuant le test est</p>
<blockquote>
<p>if ( ++p == pe )
goto _test_eof;</p>
</blockquote>
<p>Il suffit de remplacer le test de l'égalité == par est supérieur ou égal à</p>
<blockquote>
<p>if ( ++p >= pe )
goto _test_eof;</p>
</blockquote>
<p>Ainsi, lors de la lecture de la mémoire, si jamais le pointeur p est supérieur
ou égal à l'adresse pe, on sortira systématiquement en allant à l'étiquette
_test_eof.</p>
<p>Mais, le problème de cloudfront, c'est que ce code n'est pas écrit par un·e
humain·e, ce code est du code généré via Ragel.</p>
<p>Le code écrit en Ragel est le suivant :</p>
<blockquote>
<p>script_consume_attr := ((unquoted_attr_char)* :>> (space|'/'|'>'))</p>
<blockquote>
<p>{ ddctx("script consume_attr"); }
@{ fhold; fgoto script_tag_parse; }
$lerr{ dd("script consume_attr failed");
fgoto script_consume_attr; };
</p>
</blockquote>
</blockquote>
<p>On essaie de lire un attribut dans une balise, par exemple %lt;script
type="javascript">
Si l'attribut contient un espace, un slash ou un > alors on est à la balise
de fin.
Si l'attribut est correctement formaté, alors on exécute le code situé dans
@{}. Sinon, on exécute le code situé dans $lerr{}.</p>
<p>Admettons que dans la page, le contenu soit tronqué, et contienne uniquement
<script type=
Dans ce cas, le code situé dans $lerr{} sera appelé. À l'intérieur, on trouve
simplement "fgoto script_consume_attr", qui fait en sorte que le code saute à
l'étiquette script_consume_attr, qui est définie juste au dessus. On entre
dans une boucle (infernale), on sort de la zone mémoire attendue et on
commence à lire le contenu de la mémoire qui ne nous est pas destiné (buffer
overrun).</p>
<p>La solution ici, est de rajouter une instruction fhold dans le bloc $lerr{}.
fhold est l'équivalent en C de p-- (on décrémente p de 1). Du coup, p contient
le caractère qui a provoqué l'erreur :)</p>
<p>Je pense que c'est assez compliqué comme ça, du coup, je vais arrêter là pour
l'origine du problème.</p>
<h3>Qui est impacté ?</h3>
<p>La liste, encore incomplète, des sites potentiellement impactés, est
disponible ici :
<a href="https://github.com/pirate/sites-using-cloudflare">https://github.com/pirate/sites-using-cloudflare</a></p>
<p>Il est possible de télécharger le fichier complet (> 22 Mio) et de chercher à
l'intérieur.</p>
<h3>L'ironie de l'histoire</h3>
<p>Cloudflare a bien un programme de chasse aux bugs, pour tout bug découvert, on
peut gagner un t-shirt.</p>
<p>En comparaison, quand on voit les montants proposés par Google, ça laisse
songeur…
<a href="https://sites.google.com/a/chromium.org/dev/Home/chromium-security/hall-of-fame">https://sites.google.com/a/chromium.org/dev/Home/chromium-security/hall-of-fame</a></p>Serveur défaillant2016-09-30T00:00:00+02:002016-09-30T00:00:00+02:00alextag:blog.chibi-nah.fr,2016-09-30:/serveur-defaillant<p><img alt="Photo d'un disque dur ouvert." src="/images//disque-dur-800.jpg"> Photo par <a href="https://www.flickr.com/photos/hagdorned/15021103291/in/lbum-72157646804892131/">Magnus Hagdorn</a>, sous <a href="https://creativecommons.org/licenses/by-sa/2.0/fr/">licence CC BY SA</a></p>
<div class="highlight"><pre><span></span><code>ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000f 107 099 006 Pre-fail Always - 205095556
3 Spin_Up_Time 0x0003 100 100 000 Pre-fail Always - 0
4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 87
5 Reallocated_Sector_Ct 0x0033 100 …</code></pre></div><p><img alt="Photo d'un disque dur ouvert." src="/images//disque-dur-800.jpg"> Photo par <a href="https://www.flickr.com/photos/hagdorned/15021103291/in/lbum-72157646804892131/">Magnus Hagdorn</a>, sous <a href="https://creativecommons.org/licenses/by-sa/2.0/fr/">licence CC BY SA</a></p>
<div class="highlight"><pre><span></span><code>ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000f 107 099 006 Pre-fail Always - 205095556
3 Spin_Up_Time 0x0003 100 100 000 Pre-fail Always - 0
4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 87
5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 0
7 Seek_Error_Rate 0x000f 069 060 030 Pre-fail Always - 167761870739
9 Power_On_Hours 0x0032 050 050 000 Old_age Always - 44067
10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 88
183 Runtime_Bad_Block 0x0032 100 100 000 Old_age Always - 0
184 End-to-End_Error 0x0032 100 100 099 Old_age Always - 0
187 Reported_Uncorrect 0x0032 084 084 000 Old_age Always - 16
188 Command_Timeout 0x0032 100 099 000 Old_age Always - 4295032833
189 High_Fly_Writes 0x003a 100 100 000 Old_age Always - 0
190 Airflow_Temperature_Cel 0x0022 065 050 045 Old_age Always - 35 (Min/Max 34/35)
194 Temperature_Celsius 0x0022 035 050 000 Old_age Always - 35 (0 16 0 0 0)
195 Hardware_ECC_Recovered 0x001a 023 013 000 Old_age Always - 205095556
197 Current_Pending_Sector 0x0012 099 099 000 Old_age Always - 42
198 Offline_Uncorrectable 0x0010 099 099 000 Old_age Offline - 42
199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0
240 Head_Flying_Hours 0x0000 100 253 000 Old_age Offline - 44213 (132 145 0)
241 Total_LBAs_Written 0x0000 100 253 000 Old_age Offline - 3639020994
242 Total_LBAs_Read 0x0000 100 253 000 Old_age Offline - 2452794878
</code></pre></div>
<p>La quasi-totalité des sites que j'héberge sous les sous-domaines en chibi-
nah.fr/net et en nah.re sont inaccessibles.
Les données sont en cours de récupération/transfert (actuellement 42 Go
transférés) vers un autre disque/serveur.
La remise en ligne des sites sera fait progressivement ce week-end.</p>
<p>Les sites des copains, ayant déjà migré sur un autre serveur, ne sont pas
impactés.</p>
<p>~~Plus de détails prochainement.~~</p>
<p><strong>Édit : La plupart des sites et bases de données sont restaurés, je peux
donner des détails.</strong></p>
<h2>Jeudi soir</h2>
<p>Je lis mes flux rss, consulte mes emails, comme d'habitude. Tous les sites
fonctionnent.</p>
<h2>Vendredi matin</h2>
<p>Vers 10h30, je me rends compte que mon client mail (<a href="https://f-droid.org/posts/k-9-mail/">K-9 Mail sur
Android</a>) ne se synchronise plus (échec
de connexion) avec le serveur. Pensant à un souci de connexion 3G/HSPA,
j'ignore le problème.</p>
<p>À 11h, toujours pas de connexion, je décide de jeter un œil sur mon webmail
(j'attendais un email), et là, c'est le drame. Le webmail répond, mais ne se
charge pas entièrement. Je reprend mon téléphone, et force la synchronisation.
Toujours rien. Je ne me laisse pas démonter pour autant, et lance
<a href="https://f-droid.org/repository/browse/?fdfilter=connectbot&fdid=org.connectbot">connectbot</a>.
La saisie de ma passphrase plus tard, je tente de me connecter via ssh. Échec
de connexion. Mon autre serveur, lui, est joignable avec la même clef, ce
n'est pas un problème de connexion. Je tente de me connecter depuis un autre
PC, et là, j'ai la main.</p>
<p>Le shell bash m'accueille sans problème. Je tape naïvement htop, et là</p>
<div class="highlight"><pre><span></span><code>Erreur d'entrée/sortie
</code></pre></div>
<p>Ooook ?</p>
<p>Je tente de me connecter en root (via su)</p>
<div class="highlight"><pre><span></span><code>Erreur d'entrée/sortie
</code></pre></div>
<p>Je tape une commande au hasard (comme df -h)</p>
<div class="highlight"><pre><span></span><code>Erreur d'entrée/sortie
</code></pre></div>
<p>Bon… Les commandes ne répondent pas</p>
<p>Je tente dmesg</p>
<div class="highlight"><pre><span></span><code>ayaka kernel: ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ayaka kernel: ata1.00: BMDMA stat 0x64
ayaka kernel: ata1.00: failed command: READ DMA EXT
ayaka kernel: ata1.00: cmd 25/00:00:e1:3a:f7/00:01:62:00:00/e0 tag 0 dma 131072 in
ayaka kernel: res 51/40:00:dd:3b:f7/40:00:62:00:00/00 Emask 0x9 (media error)
ayaka kernel: ata1.00: status: { DRDY ERR }
ayaka kernel: ata1.00: error: { UNC }
ayaka kernel: ata1.00: configured for UDMA/133
ayaka kernel: sd 0:0:0:0: [sda] Unhandled sense code
ayaka kernel: sd 0:0:0:0: [sda]
ayaka kernel: Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
ayaka kernel: sd 0:0:0:0: [sda]
ayaka kernel: Sense Key : Medium Error [current] [descriptor]
ayaka kernel: Descriptor sense data with sense descriptors (in hex):
ayaka kernel: 72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
ayaka kernel: 62 f7 3b dd
ayaka kernel: sd 0:0:0:0: [sda]
ayaka kernel: Add. Sense: Unrecovered read error - auto reallocate failed
ayaka kernel: sd 0:0:0:0: [sda] CDB:
ayaka kernel: Read(10): 28 00 62 f7 3a e1 00 01 00 00
ayaka kernel: end_request: I/O error, dev sda, sector 1660369885
ayaka kernel: ata1: EH complete
ayaka kernel: ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ayaka kernel: ata1.00: BMDMA stat 0x64
ayaka kernel: ata1.00: failed command: READ DMA EXT
ayaka kernel: ata1.00: cmd 25/00:08:d9:3b:f7/00:00:62:00:00/e0 tag 0 dma 4096 in
ayaka kernel: res 51/40:00:dd:3b:f7/40:00:62:00:00/00 Emask 0x9 (media error)
ayaka kernel: ata1.00: status: { DRDY ERR }
ayaka kernel: ata1.00: error: { UNC }
ayaka kernel: ata1.00: configured for UDMA/133
ayaka kernel: sd 0:0:0:0: [sda] Unhandled sense code
ayaka kernel: sd 0:0:0:0: [sda]
ayaka kernel: Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
ayaka kernel: sd 0:0:0:0: [sda]
ayaka kernel: Sense Key : Medium Error [current] [descriptor]
ayaka kernel: Descriptor sense data with sense descriptors (in hex):
ayaka kernel: 72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
ayaka kernel: 62 f7 3b dd
ayaka kernel: sd 0:0:0:0: [sda]
ayaka kernel: Add. Sense: Unrecovered read error - auto reallocate failed
ayaka kernel: sd 0:0:0:0: [sda] CDB:
ayaka kernel: Read(10): 28 00 62 f7 3b d9 00 00 08 00
ayaka kernel: end_request: I/O error, dev sda, sector 1660369885
ayaka kernel: ata1: EH complete
</code></pre></div>
<p>Et ce, en boucle.</p>
<p>Là,<s>petit</s>gros moment de panique : le disque dur est en train de lâcher.</p>
<h3>Petit aparté</h3>
<p>Dans un mail, à la question « Ma question est la suivante : vous qui passez du
temps à administrer une infra perso, quels sont ces services un peu chiants
pour lesquels vous savez que vous réagissez rapidement s'ils tombent ? »,
j'avais répondu :</p>
<div class="highlight"><pre><span></span><code>Bonsoir,
Pour moi, c'est le serveur de mails qui est ultra-prioritaire (et même
critique), parce que ma famille l'utilise également. Si jamais ce
service tombe, je lâche tout pour pouvoir intervenir le plus vite
possible pour le rétablir (les adresses sont utilisées par exemple pour
tout ce qui est administratif (impôts et autres)).
Le serveur web est plutôt critique (plusieurs domaines hébergés), tout
comme le DNS, mais ça attendra le soir (ou le week-end au pire des cas).
Pour le reste (jabber, mumble…) c'est peu prioritaire.
Alex - nah
</code></pre></div>
<p>Fin de l'aparté.</p>
<p>Récapitulons, on est vendredi 30 septembre, il est quasiment midi. Je pose un
après-midi de congé, et je rentre.</p>
<p>Premier truc à faire : manger. Je réfléchis mal si j'ai le ventre vide.</p>
<p>Second truc à faire, se connecter au manager OVH, pour redémarrer le serveur,
et le démarrer via NetBoot, sur une image rescue64.</p>
<p>Le temps que ça redémarre, j'ai largement le temps de me préparer un café.</p>
<p>Quelque minutes plus tard, le serveur pingue à nouveau. Bien entendu, l'email
contenant les informations de connexion est envoyé sur le serveur de mails…
qui vient de démarrer en rescue >.< mais bon, heureusement que l'une de mes
clefs publiques est rattachée sur mon compte, le robot l'a bien ajouté dans la
liste des clefs autorisées.</p>
<p>Je monte les partitions, et tente d'y accéder. À priori, le disque est encore
lisible.</p>
<p>Je génère alors une paire de clefs ssh que je copie sur mon autre serveur
dédié (j'ai de la place dessus, le débit et la bande passante ne sont pas des
soucis), et je lance la longue tâche de transfert (over sshfs) de copie des
fichiers.</p>
<p>La priorité est : tenter de sauver le maximum de fichiers. que ça soit les
sites hébergés, les bases de données et (si possible) le contenu de /etc.</p>
<p>La copie prend une bonne partie de l'après-midi.</p>
<p>Il est 19h20. Les copies sont terminées, à priori, tous les fichiers ont pu
être sauvegardés. Je mange un morceau, puis je m'attaque à la longue tâche qui
m'attend : l'installation des services de base sur Aeka.</p>
<p>Notes :</p>
<ul>
<li>Serveur dédié défaillant : <a href="https://duckduckgo.com/?q=ayaka+yukihiro">Ayaka (雪広 あやか)</a></li>
<li>Serveur dédié fonctionnel : <a href="https://duckduckgo.com/?q=masaki+aeka+jurai">Aeka (柾木 阿重霞 樹雷)</a></li>
</ul>
<p>Apache2 est déjà installé, avec<s>MySQL</s>MariaDB, je n'ai donc pas à les
réinstaller.</p>
<p>Commençons par les plus urgents : le DNS et le serveur d'emails.</p>
<p>L'installation des deux services ainsi que la configuration s'est déroulé
quasiment sans anicroche, je commence à recevoir les emails de la journée
(dont celui attendu). Cependant, un domaine résiste. Il est 22h30, je décide
d'arrêter, je dois me lever tôt samedi matin (genre, vers 5h, pour prendre le
train).</p>
<h2>Samedi matin</h2>
<p>J'allume mon pc portable, et je reprend la configuration du domaine
récalcitrant. Modifications des SOA, de la glue record, systématiquement, je
me prends un timeout sur la commande DIG. Les autres domaines fonctionnant sur
le même serveur, eux, répondent instantanément. Je constate alors avoir perdu
trop de temps et décide d'utiliser les DNS d'OVH pour ce domaine.</p>
<p>Je jette un œil rapidement sur twitter, et je vois qu'une question à propos de
la configurations des DNS m'est posée (Ha ? Comme par hasard). J'y réponds,
précise quelques éléments, ajoute quelques pistes (comme d'hab), et j'attends
que le domaine soit à nouveau joignable pour continuer la restauration des
services.</p>
<p>Le domaine récalcitrant est finalement joignable, et les emails arrivent aussi
dessus.</p>
<p>C'est tout pour le samedi. L'essentiel est de nouveau fonctionnel, je peux
alors profiter du week-end.</p>
<h2>Lundi soir</h2>
<p>Je m'attelle à la tâche suivante : Restaurer les sites hébergés.</p>
<p>Pour ça, ce fut relativement rapide, vu que j'ai une copie de la config
d'Ayaka.</p>
<p>J'en profite pour faire un peu de ménage sur mes sites personnels, notamment
les trucs expérimentaux ou en beta.</p>
<p>Les sites sont restaurés, c'est bon, mais certains demandent une base de
données MySQL. Je regarde le dossier des dumps SQL, et là, c'est le drame.</p>
<p>Des fichiers sont manquants, incomplets, corrompus ou illisibles (remplis de
0x00). Cela me prendra du temps pour tenter de récupérer les données (jusqu'à
mardi soir en fait).</p>
<p>Je récupère les bases de données, crée une VM sur mon pc portable avec
EXACTEMENT la même config que le serveur, la même version de MySQL, et je
tente de monter les bases.</p>
<p>Les BDD sont lisibles, je me dépêche de faire des dumps. Un contrôle rapide
effectué, je charge les dumps dans MariaDB, sur Aeka. Les bases sont
restaurées, les comptes dédiés aussi.</p>
<p>J'en profite pour mettre à jour <a href="https://roundcube.net/">Roundcube</a>, et le
thème <a href="https://github.com/messagerie-melanie2/Roundcube-Skin-Melanie2-Larry-Mobile">Melanie2</a></p>
<p>Je regarde les sites restaurés, et je me rends compte que certains sites ne
sont pas compatibles php7. C'est notamment le cas de Cheveretto, de Piwigo, et
d'OpenArdilla.</p>
<p>Cheveretto, dans la version que j'utilise, correspond à mon usage attendu
(juste une solution simple pour partager des images, sans créer de galerie),
mais je me demande si je ne vais pas le remplacer par une instance de
<a href="http://lut.im">lut.im</a>.</p>
<p>Piwigo, je le mettrai à jour quand j'aurai le temps.</p>
<p>Par contre, OpenArdilla n'a jamais dépassé le stade de la version 0.1, le site
n'existe plus et il n'y a aucune activité sur sourceforge depuis des années.
Ça m'embête un peu, parce que je n'ai pas trouvé d'agrégateur de flux RSS
similaire, ultra-minimaliste (pas de gestion de lu/non lu par exemple) avec la
même disposition (n'afficher que les 10 derniers titres, par site, sans
regroupement). J'ai bien un leed qui tourne, mais c'est pas pareil.</p>
<p>La prochaine tâche qui m'attend, c'est donc de tenter de porter OpenArdilla en
PHP7. Bon courage.</p>
<p>Pour les autres sites, pas de problème majeur, idem pour les autres services.</p>
<h2>Conclusion</h2>
<p>Cela m'aura pris quelques jours pour tout récupérer et (quasiment) tout
restaurer.</p>
<p>L'ironie du sort, c'est que j'avais planifié la migration Ayaka -> Aeka, et
que j'ai commencé par les sites des copains. La migration, telle que prévue
aurait du être progressive, avec un arrêt prévu d'Ayaka pour décembre.
Finalement, ça aura été fait dans l'urgence.</p>NetBSD sur une carte Olimex LIME 22016-06-03T00:00:00+02:002016-06-03T00:00:00+02:00alextag:blog.chibi-nah.fr,2016-06-03:/netbsd-lime2<p><img alt="Photo d'une carte Olimex LIME 2" src="/images/netBSD/DSC00956.JPG"></p>
<p>Un petit article tout simple, qui explique comment installer rapidement NetBSD
sur une carte Olimex LIME 2.</p>
<p>Ça ne servira pas forcément à grand-chose. C'est plus pour le
sport/fun/amusement/parce que c'est possible (rayer les mentions inutiles).</p>
<p>Pour commencer, il faut :</p>
<ul>
<li>Une carte Olimex LIME 1 ou LIME …</li></ul><p><img alt="Photo d'une carte Olimex LIME 2" src="/images/netBSD/DSC00956.JPG"></p>
<p>Un petit article tout simple, qui explique comment installer rapidement NetBSD
sur une carte Olimex LIME 2.</p>
<p>Ça ne servira pas forcément à grand-chose. C'est plus pour le
sport/fun/amusement/parce que c'est possible (rayer les mentions inutiles).</p>
<p>Pour commencer, il faut :</p>
<ul>
<li>Une carte Olimex LIME 1 ou LIME 2. Perso, j'ai utilisé ma Brique Internet que j'utilise pour faire les tests.</li>
<li>Une carte au format microSD (que j'appellerai SD dans l'article par commodité) et un adaptateur microSD -> SD. Le minimum serait 2 Go, j'ai utilisé une microSD de 16 Go en classe 10.</li>
<li>Un câble série à brancher sur le connecteur UART de la carte, et un logiciel (genre <a href="http://git.pengutronix.de/?p=tools/microcom.git">microcom</a>) pour pouvoir l'utiliser.</li>
<li>Un ordinateur sous GNU/Linux (de préférence) ou *BSD. Les MACs, ça a beau <a href="https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/KernelProgramming/BSD/BSD.html">être basé sur FreeBSD</a> (+ micronoyau MACH), ça ne compte pas. Windows, on oublie. Je n'ai pas testé sur <a href="https://www.haiku-os.org/">Haiku</a> ni sur <a href="http://monaos.org/">MonaOS</a>.</li>
<li>De la place sur le disque dur.</li>
<li>Une connexion internet qui fonctionne.</li>
<li>Avoir de quoi compiler fex2bin serait un plus.</li>
</ul>
<p>Pour être franc, je n'ai rien inventé. Je me suis basé sur la <a href="https://wiki.netbsd.org/ports/evbarm/allwinner/">page
d'installation de NetBSD pour
ARM/Allwinner</a>. J'ai utilisé
le noyau de la carte BananaPi, carte qui est "relativement" proche de la
LIME2. J'avais la flemme de compiler le noyau BSD exprès pour la carte.</p>
<p>Donc, commençons par récupérer l'image système de NetBSD, en version ARM, se
trouvant là :
<a href="http://ftp.netbsd.org/pub/NetBSD/NetBSD-7.0.1/evbarm-earmv7hf/binary/gzimg/">http://ftp.netbsd.org/pub/NetBSD/NetBSD-7.0.1/evbarm-earmv7hf/binary/gzimg/</a></p>
<p>Récupérons le bootloader (u-boot) pour la carte, en l'occurence, la LIME 2,
ici :
<a href="http://dl.linux-sunxi.org/nightly/u-boot-sunxi/u-boot-sunxi-mainline/u-boot-
sunxi-mainline-latest/">http://dl.linux-sunxi.org/nightly/u-boot-sunxi/u-boot-sunxi-mainline/u-boot-
sunxi-mainline-latest/</a></p>
<p>Décompressons l'image de NetBSD.</p>
<div class="highlight"><pre><span></span><code>gunzip armv7.img.gz
</code></pre></div>
<p>Décompressons l'archive u-boot</p>
<div class="highlight"><pre><span></span><code>tar xf u-boot-sunxi-mainline-a20-olinuxino-lime2.tar.xz
</code></pre></div>
<p>Déplaçons les fichiers décompressés dans le répertoire courant</p>
<div class="highlight"><pre><span></span><code>mv u-boot-sunxi-mainline-a20-olinuxino-lime2-20160428T000127-e25b369/* ./
</code></pre></div>
<p>Copions le bootloader sur l'image de NetBSD, au bon endroit</p>
<div class="highlight"><pre><span></span><code>dd if=u-boot-sunxi-with-spl.bin of=armv7.img bs=1k seek=8 conv=notrunc
</code></pre></div>
<p>Flashons la carte SD (ici, /dev/sdb, ne vous trompez surtout pas de
périphérique ou alors prévoyez un bon backup de votre machine) avec l'image
modifiée de NetBSD.</p>
<div class="highlight"><pre><span></span><code>sudo dd if=armv7.img of=/dev/sdb bs=1M
</code></pre></div>
<p>Éjecter et réinsérer la carte SD</p>
<p>À ce stade, on a une carte SD bootable avec u-boot, et contenant un système
NetBSD. Cependant, le système n'est pas utilisable.</p>
<p>Monter la carte SD (sdb1 dans mon cas), et se déplacer dessus.</p>
<div class="highlight"><pre><span></span><code>pmount /dev/sdb1 /media/sdb1
cd /media/sdb1
</code></pre></div>
<p>Comme il n'y a pas de noyau NetBSD prévu pour la LIME 2, on va utiliser celui
du Banana Pi.</p>
<p>Copions alors le noyau, comme suit :</p>
<div class="highlight"><pre><span></span><code>cp netbsd-BPI.ub netbsd.ub
</code></pre></div>
<p>Préparons le fichier de configuration pour u-boot.</p>
<div class="highlight"><pre><span></span><code>vim boot.cmd
</code></pre></div>
<p>Ajoutons dans ce fichier :</p>
<div class="highlight"><pre><span></span><code>setenv kernel_addr 82000000
setenv kernel netbsd.ub
setenv bootargs "root=ld0a"
fatload mmc 0:1 ${kernel_addr} ${kernel}
bootm ${kernel_addr}
</code></pre></div>
<p>Compilons ce fichier cmd à l'aide de mkimage (paquet u-boot-tools sous
debian).</p>
<div class="highlight"><pre><span></span><code>mkimage -C none -A arm -T script -d boot.cmd boot.scr
</code></pre></div>
<p>Il faut maintenant la configuration de la carte. Pour cela, télécharger le
fichier a20-olinuxino_lime2.fex depuis <a href="https://github.com/linux-sunxi/sunxi-boards/tree/master/sys_config/a20">https://github.com/linux-sunxi/sunxi-boards/tree/master/sys_config/a20</a>.</p>
<p>Récupérer au passage (si ce n'est pas déjà fait) <a href="https://github.com/linux-sunxi/sunxi-tools">https://github.com/linux-sunxi/sunxi-tools</a>, et compiler au moins fex2bin (pas sur la carte SD, bien
entendu)</p>
<p>Convertir le fichier fex en fichier bin. Ne pas oublier de copier le fichier
.bin sur la carte SD.</p>
<div class="highlight"><pre><span></span><code>fex2bin a20-olinuxino_lime2.fex > lime2.bin
</code></pre></div>
<p>Créer (ou modifier) le fichier uEnv.txt</p>
<div class="highlight"><pre><span></span><code>vim uEnv.txt
</code></pre></div>
<p>contenu du fichier uEnv.txt</p>
<div class="highlight"><pre><span></span><code>bootargs=root=ld0a sysconfig=0x43000000
uenvcmd=mmc dev 0; mmc rescan; fatload mmc 0:1 43000000 lime2.bin;
fatload mmc 0:1 82000000 netbsd.ub; bootm 82000000
</code></pre></div>
<p>Si tout va bien, vous devriez avoir ces fichiers sur la carte SD (j'aurais pu
effacer les kernels des autres cartes, mais bon, flemme) :</p>
<div class="highlight"><pre><span></span><code>LICENCE.broadcom
a20-olinuxino_lime2.fex
boot.cmd
boot.ini
boot.scr
bootcode.bin
cmdline.txt
fixup.dat
fixup_cd.dat
kernel7.img
lime2.bin
netbsd-BEAGLEBOARD.ub
netbsd-BEAGLEBONE.ub
netbsd-BPI.ub
netbsd-CUBIEBOARD.ub
netbsd-CUBIETRUCK.ub
netbsd-HUMMINGBIRD_A31.ub
netbsd-ODROID-C1.ub
netbsd.ub
start.elf
start_cd.elf
uEnv.txt
</code></pre></div>
<p>Démonter proprement la carte avant de l'éjecter</p>
<div class="highlight"><pre><span></span><code>cd
pumount /dev/sdb1
</code></pre></div>
<p>Insérer la carte SD dans le lecteur de la carte Olimex, brancher le câble
série sur le connecteur UART (Bleu -> GND, Rouge -> RX, Vert -> TX), lancer
microcom, et alimenter la LIME 2 pour la démarrer.</p>
<div class="highlight"><pre><span></span><code>microcom -p /dev/ttyUSB0 -s 115200
</code></pre></div>
<p>Si tout va bien, u-boot devrait apparaître à l'écran</p>
<div class="highlight"><pre><span></span><code>U-Boot SPL 2016.05-rc3-ge25b369 (Apr 28 2016 - 00:13:29)
DRAM: 1024 MiB
CPU: 912000000Hz, AXI/AHB/APB: 3/2/2
Trying to boot from MMC1
U-Boot 2016.05-rc3-ge25b369 (Apr 28 2016 - 00:13:29 +0200) Allwinner Technology
CPU: Allwinner A20 (SUN7I)
Model: Olimex A20-OLinuXino-LIME2
I2C: ready
DRAM: 1 GiB
MMC: SUNXI SD/MMC: 0
*** Warning - bad CRC, using default environment
</code></pre></div>
<p>Après les tests initiaux, NetBSD devrait démarrer. Quelques instants plus
tard, un message indiquant que le système redimensionne la partition devrait
apparaître. Cette étape est nécessaire pour que toute la carte SD soit
utilisable.</p>
<div class="highlight"><pre><span></span><code>Growing ld0 disklabel (1111MB -> 15343MB)
Resizing /
</code></pre></div>
<p>Dès que cette opération est terminée, le système redémarre automatiquement.</p>
<p>Si tout va bien, le message suivant devrait apparaître</p>
<div class="highlight"><pre><span></span><code>NetBSD/evbarm (armv7) (console)
login:
</code></pre></div>
<p>Se connecter via le login root. Il n'y a pas de mot de passe.</p>
<p>Et voilà, NetBSD est désormais utilisable (quoique, encore au stade
expérimental). Je ne connais pas l'impact de l'utilisation du noyau du Banana
Pi sur cette carte, je n'ai pas assez de recul. Je ne serai en aucun cas
responsable en cas <a href="http://www.megatokyo.it/planche/fr0015/ca-fait-boum">d'explosion du
CPU</a>.</p>
<p>J'espère n'avoir rien oublié lors de la rédaction de cet article.</p>
<p>Juste à titre indicatif, voici le <a href="/images/netBSD/boot.txt">log complet du démarrage de la LIME
2</a>.</p>Affichage de points sur une carte2015-12-20T00:00:00+01:002015-12-20T00:00:00+01:00alextag:blog.chibi-nah.fr,2015-12-20:/affichage-de-points-sur-une-carte<p>Un petit article pour ceux qui veulent utiliser un fond de carte <a href="https://www.openstreetmap.org/">OpenStreetMap</a> et ajouter des informations au dessus, avec la librairie javascript leaflet</p>
<p>Note : je m'étais inspiré de <a href="http://asmaloney.com/2014/01/code/creating-an-interactive-map-with-leaflet-and-openstreetmap">ce tutoriel</a> pour écrire le script <s>mi 2015</s> en octobre 2015,
pour des besoins propres. Pour la rédaction de cet article …</p><p>Un petit article pour ceux qui veulent utiliser un fond de carte <a href="https://www.openstreetmap.org/">OpenStreetMap</a> et ajouter des informations au dessus, avec la librairie javascript leaflet</p>
<p>Note : je m'étais inspiré de <a href="http://asmaloney.com/2014/01/code/creating-an-interactive-map-with-leaflet-and-openstreetmap">ce tutoriel</a> pour écrire le script <s>mi 2015</s> en octobre 2015,
pour des besoins propres. Pour la rédaction de cet article, je suis reparti du script et non du tutoriel.</p>
<p>Note 2 : cet article ne couvre qu'une toute petite partie de ce que l'on peut faire avec leaflet. On peut en plus tracer des polygones sur la carte, tracer un cercle autour d'un point…</p>
<h3>Un petit exemple :</h3>
<p><img alt="Carte de la ville de Paris, dans OpenStreetMap, avec un point rouge au niveau de la tour Eiffel et une description et photo de ce monument" src="/images/map/map.png"></p>
<h3>Comment faire ?</h3>
<p>Il faut deux choses :</p>
<ul>
<li>des données ;</li>
<li>du temps.</li>
</ul>
<p>Commençons par les données.</p>
<p>Il faut à minima :</p>
<ul>
<li>Les coordonnées des points à afficher</li>
<li>Un texte à afficher</li>
</ul>
<h3>Exemple simple</h3>
<p>Prenons le cas de la Tour Eiffel. Elle se trouve aux coordonnées suivantes :
latitude 48.8582, longitude 2.2945. Utilisons donc le nom « Tour Eiffel ».</p>
<p>Les données seront stockées au format json. Pour cet exemple, le fichier json
est présent sous la forme d'un fichier texte et non généré automatiquement à
partir de données stockées dans une base de données.</p>
<h3>Contenu du fichier js données :</h3>
<div class="highlight"><pre><span></span><code><span class="nx">markers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="s2">"name"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Tour Eiffel"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"lat"</span><span class="o">:</span><span class="w"> </span><span class="mf">48.8582</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"lng"</span><span class="o">:</span><span class="w"> </span><span class="mf">2.2945</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">];</span>
</code></pre></div>
<p>Peu d'explications sont nécessaires : j'utilise trois champs : name, qui
contient le nom (ou le titre, peu importe le nom), lat, contient la latitude,
et lng, la longitude. Le tout est stocké dans un array (tableau, d'où les [])
nommé markers.</p>
<p>On a (pour le moment) une donnée. Maintenant, il faut l'afficher sur la carte.
Pour cela, il faut inclure dans la page html :</p>
<ul>
<li>Le script js et la css de leaflet, à inclure dans l'entête de la page html (section head)</li>
<li>Le script js de jquery, à inclure dans l'entête de la page html (section head).</li>
<li>Le script d'initialisation et de traitement/formatage des données pour leaflet. (détaillé plus bas).</li>
<li>Le fichier json contenant les données.</li>
</ul>
<h4>Éléments à inclure dans la page :</h4>
<div class="highlight"><pre><span></span><code><span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">"http://code.jquery.com/jquery-1.11.1.min.js"</span><span class="p">></</span><span class="nt">script</span><span class="p">></span>
<span class="p"><</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span> <span class="na">href</span><span class="o">=</span><span class="s">"http://cdn.leafletjs.com/leaflet-0.7.5/leaflet.css"</span> <span class="p">/></span>
<span class="p"><</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/javascript"</span> <span class="na">src</span><span class="o">=</span><span class="s">"http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js?2"</span><span class="p">></</span><span class="nt">script</span><span class="p">></span>
…
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
…
<span class="p"><</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">"map"</span> <span class="na">style</span><span class="o">=</span><span class="s">"height: 800px; border: 1px solid #AAA;"</span><span class="p">></</span><span class="nt">div</span><span class="p">></span>
<span class="p"><</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">'text/javascript'</span> <span class="na">src</span><span class="o">=</span><span class="s">'images/map/markers.json'</span><span class="p">></</span><span class="nt">script</span><span class="p">></span>
<span class="p"><</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">'text/javascript'</span> <span class="na">src</span><span class="o">=</span><span class="s">'images/map/leafScript.js'</span><span class="p">></</span><span class="nt">script</span><span class="p">></span>
…
</code></pre></div>
<p>Remarque : Autant cela fonctionnait en 2015, autant cela ne fonctionne plus en 2021 (erreurs de certificat). Héberger jquery et leaflet (js et css) en local pour limiter ce genre de problème.</p>
<p>Passons maintenant au script qui va initialiser leaflet et formater les
données.</p>
<h3>Contenu du script :</h3>
<div class="highlight"><pre><span></span><code><span class="c1">//Initialisation des coordonnées de la map. Ici, au dessus de Paris</span>
<span class="kd">var</span><span class="w"> </span><span class="nx">map</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">L</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="w"> </span><span class="s1">'map'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">center</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="mf">48.8662</span><span class="p">,</span><span class="w"> </span><span class="mf">2.3124</span><span class="p">],</span>
<span class="w"> </span><span class="nx">minZoom</span><span class="o">:</span><span class="w"> </span><span class="mf">2</span><span class="p">,</span>
<span class="w"> </span><span class="nx">zoom</span><span class="o">:</span><span class="w"> </span><span class="mf">14</span>
<span class="p">});</span>
<span class="c1">//Chargement des tuiles</span>
<span class="c1">// Consulter cette page pour la liste des serveurs : http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Tile_servers</span>
<span class="c1">//</span>
<span class="c1">//mapquest : http://{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.png</span>
<span class="c1">//OSM : http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png</span>
<span class="nx">L</span><span class="p">.</span><span class="nx">tileLayer</span><span class="p">(</span><span class="w"> </span><span class="s1">'//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">attribution</span><span class="o">:</span><span class="w"> </span><span class="s1">'(C) <a href="http://osm.org/copyright" title="OpenStreetMap" target="_blank">OpenStreetMap</a> contributors | Demo by <a href="http://nah.re" target="_blank" tilte="nah">nah</a>'</span><span class="p">,</span>
<span class="w"> </span><span class="nx">subdomains</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="s1">'a'</span><span class="p">,</span><span class="s1">'b'</span><span class="p">,</span><span class="s1">'c'</span><span class="p">]</span>
<span class="p">}).</span><span class="nx">addTo</span><span class="p">(</span><span class="w"> </span><span class="nx">map</span><span class="w"> </span><span class="p">);</span>
<span class="c1">//Gestion des popups. On boucle sur les données contenues dans le fichier json</span>
<span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">i</span><span class="o">=</span><span class="mf">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nx">markers</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="nx">i</span><span class="w"> </span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="nx">L</span><span class="p">.</span><span class="nx">marker</span><span class="p">([</span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">lat</span><span class="p">,</span><span class="w"> </span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">lng</span><span class="p">],{})</span>
<span class="w"> </span><span class="p">.</span><span class="nx">bindPopup</span><span class="p">(</span><span class="s1">'<b>'</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">name</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'</b>'</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="nx">addTo</span><span class="p">(</span><span class="w"> </span><span class="nx">map</span><span class="w"> </span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>
<p>Voilà. On a maintenant un marqueur bleu au dessus de la Tour Eiffel, sur la
carte, ainsi qu'un popup qui est affiché lorsque l'on clique sur le marqueur.</p>
<p>Cet exemple, avec le code minimaliste (et non minifié) est visible ici :</p>
<p><a href="/images/map/test/demo-bleu.html">demo-bleu.html</a></p>
<h3>Second exemple</h3>
<p>Maintenant, allons plus loin. Je veux afficher la Tour Eiffel, la Pyramide du
Louvre et l'arc de triomphe sur une carte, avec des pointeurs rouges, une
infobulle qui affiche une photo et un résumé provenant de wikipédia ainsi
qu'un lien vers l'article de ce dernier.</p>
<p>Modifions le fichier de données comme suit :</p>
<h3>Contenu du fichier js données :</h3>
<div class="highlight"><pre><span></span><code><span class="nx">markers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="s2">"name"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Pyramide du Louvre"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"comments"</span><span class="o">:</span><span class="w"> </span><span class="s2">"La pyramide du Louvre est une pyramide constituée de verre et de métal, située au milieu de la cour Napoléon du musée du Louvre à Paris, où se situe le hall d’accueil."</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"wikipedia"</span><span class="o">:</span><span class="s2">"http://fr.wikipedia.org/wiki/Pyramide_du_Louvre"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"lat"</span><span class="o">:</span><span class="w"> </span><span class="mf">48.86102</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"lng"</span><span class="o">:</span><span class="w"> </span><span class="mf">2.33582</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"photo_uri"</span><span class="o">:</span><span class="w"> </span><span class="s2">"https://commons.wikimedia.org/wiki/File%3ALouvre_Pyramid_-_censored_copyright_2.jpg"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"photo_thumbnail"</span><span class="o">:</span><span class="w"> </span><span class="s2">"https://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Louvre_Pyramid_-_censored_copyright_2.jpg/128px-Louvre_Pyramid_-_censored_copyright_2.jpg"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"attribution"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Par hakkun, Zscout370 [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons"</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="s2">"name"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Tour Eiffel"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"comments"</span><span class="o">:</span><span class="w"> </span><span class="s2">"La tour Eiffel est une tour de fer puddlé de 324 mètres de hauteur située à Paris, à l’extrémité nord-ouest du parc du Champ-de-Mars en bordure de la Seine dans le 7ᵉ arrondissement."</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"wikipedia"</span><span class="o">:</span><span class="s2">"http://fr.wikipedia.org/wiki/Tour_Eiffel"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"lat"</span><span class="o">:</span><span class="w"> </span><span class="mf">48.8582</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"lng"</span><span class="o">:</span><span class="w"> </span><span class="mf">2.2945</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"photo_uri"</span><span class="o">:</span><span class="w"> </span><span class="s2">"https://commons.wikimedia.org/wiki/File%3AEiffelturm.JPG"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"photo_thumbnail"</span><span class="o">:</span><span class="w"> </span><span class="s2">"https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Eiffelturm.JPG/128px-Eiffelturm.JPG"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"attribution"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Par Benutzer:BigBartimäus (Photographie personnelle) [Public domain], via Wikimedia Commons"</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="s2">"name"</span><span class="o">:</span><span class="w"> </span><span class="s2">"L'arc de triomphe"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"comments"</span><span class="o">:</span><span class="w"> </span><span class="s2">"L’arc de triomphe de l’Étoile souvent appelé simplement l'Arc de Triomphe, dont la construction, décidée par l'empereur Napoléon Iᵉʳ, débuta en 1806 et s'acheva en 1836 sous Louis-Philippe, est situé à Paris, dans le 8ᵉ arrondissement."</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"wikipedia"</span><span class="o">:</span><span class="s2">"http://fr.wikipedia.org/wiki/Arc_de_triomphe_de_l%27%C3%89toile"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"lat"</span><span class="o">:</span><span class="w"> </span><span class="mf">48.87376</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"lng"</span><span class="o">:</span><span class="w"> </span><span class="mf">2.29504</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"photo_uri"</span><span class="o">:</span><span class="w"> </span><span class="s2">"https://commons.wikimedia.org/wiki/File%3AParis_Arc_de_Triomphe_011.jpg"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"photo_thumbnail"</span><span class="o">:</span><span class="w"> </span><span class="s2">"https://upload.wikimedia.org/wikipedia/commons/thumb/d/d8/Paris_Arc_de_Triomphe_011.jpg/128px-Paris_Arc_de_Triomphe_011.jpg"</span><span class="p">,</span>
<span class="w"> </span><span class="s2">"attribution"</span><span class="o">:</span><span class="w"> </span><span class="s2">"By Vassil (Own work) [Public domain], via Wikimedia Commons"</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">]</span>
</code></pre></div>
<p>J'ai ajouté quelques éléments en plus, notamment les commentaires (ou
description), les liens vers les photos/vignettes, et bien entendu, les
attributions pour les auteurs des photos.</p>
<p>À noter : on a un truc absurde en France, au niveau du droit d'auteur. La
liberté de panorama n'est pas autorisée. On n'a pas le droit de publier une
photo d'une sculpture/monument/œuvre d'art exposée dans rue, sans demander
l'autorisation aux ayants droits.
Pour la Tour Eiffel (de jour, uniquement, de nuit, l'éclairage est sous droits
d'auteur) et l'arc de triomphe, il n'y a pas de problème, les 70 ans après la
mort du créateur/auteur/architecte sont largement dépassés.
Pour la pyramide du Louvre, datant du début des années 1990, ce n'est pas le
cas. Du coup, la photo de la pyramide est censurée.</p>
<p>Plus d'infos sur cette absurdité :
<a href="https://commons.wikimedia.org/wiki/Commons:Freedom_of_panorama/fr#France">https://commons.wikimedia.org/wiki/Commons:Freedom_of_panorama/fr#France</a></p>
<p>Et le script comme suit :</p>
<h3>Contenu du script :</h3>
<div class="highlight"><pre><span></span><code><span class="c1">//Initialisation des coordonnées de la map</span>
<span class="kd">var</span><span class="w"> </span><span class="nx">map</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">L</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="w"> </span><span class="s1">'map'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">center</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="mf">48.8662</span><span class="p">,</span><span class="w"> </span><span class="mf">2.3124</span><span class="p">],</span>
<span class="w"> </span><span class="nx">minZoom</span><span class="o">:</span><span class="w"> </span><span class="mf">2</span><span class="p">,</span>
<span class="w"> </span><span class="nx">zoom</span><span class="o">:</span><span class="w"> </span><span class="mf">14</span>
<span class="p">});</span>
<span class="c1">//Initialisation de l'icône du marqueur</span>
<span class="kd">var</span><span class="w"> </span><span class="nx">redIcon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">L</span><span class="p">.</span><span class="nx">icon</span><span class="p">({</span>
<span class="w"> </span><span class="nx">iconUrl</span><span class="o">:</span><span class="w"> </span><span class="s1">'images/map/marker-icon-red.png'</span><span class="p">,</span>
<span class="w"> </span><span class="nx">iconSize</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="mf">25</span><span class="p">,</span><span class="mf">41</span><span class="p">]</span>
<span class="p">});</span>
<span class="c1">//Chargement des tuiles</span>
<span class="c1">// Consulter cette page pour la liste des serveurs : http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Tile_servers</span>
<span class="c1">//</span>
<span class="c1">//mapquest : http://{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.png</span>
<span class="c1">//OSM : http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png</span>
<span class="nx">L</span><span class="p">.</span><span class="nx">tileLayer</span><span class="p">(</span><span class="w"> </span><span class="s1">'//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">attribution</span><span class="o">:</span><span class="w"> </span><span class="s1">'(C) <a href="http://osm.org/copyright" title="OpenStreetMap" target="_blank">OpenStreetMap</a> contributors | Demo by <a href="http://nah.re" target="_blank" tilte="nah">nah</a>'</span><span class="p">,</span>
<span class="w"> </span><span class="nx">subdomains</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="s1">'a'</span><span class="p">,</span><span class="s1">'b'</span><span class="p">,</span><span class="s1">'c'</span><span class="p">]</span>
<span class="p">}).</span><span class="nx">addTo</span><span class="p">(</span><span class="w"> </span><span class="nx">map</span><span class="w"> </span><span class="p">);</span>
<span class="c1">//Gestion des popups.</span>
<span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">i</span><span class="o">=</span><span class="mf">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nx">markers</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="nx">i</span><span class="w"> </span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="nx">L</span><span class="p">.</span><span class="nx">marker</span><span class="p">([</span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">lat</span><span class="p">,</span><span class="w"> </span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">lng</span><span class="p">],</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">icon</span><span class="o">:</span><span class="w"> </span><span class="nx">redIcon</span>
<span class="w"> </span><span class="p">})</span>
<span class="w"> </span><span class="p">.</span><span class="nx">bindPopup</span><span class="p">(</span><span class="s1">'<a title="'</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">attribution</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'" href="'</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">photo_uri</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'"><img src="'</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">photo_thumbnail</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'" /></a><br /><b>'</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">name</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'</b><br /><i>'</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">comments</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"</i><br /><a href='"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">markers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">wikipedia</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"'>Wikipédia</a>"</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="nx">addTo</span><span class="p">(</span><span class="w"> </span><span class="nx">map</span><span class="w"> </span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>
<p>Les modifications du script sont « simples ». On ajoute l'icône rouge et le
traitement des infos (+formatage) dans l'info-bulle et le tour est joué.</p>
<p>Le résultat des modifications est visible en haut de cette page. C'est le code
qui est utilisé pour afficher la carte de l'exemple.</p>
<p>Cet exemple, avec le code minimaliste (et non minifié) est visible ici :</p>
<p><a href="/images/map/demo.html">demo.html</a></p>
<p>Il y aurait encore pas mal de choses à expliquer sur les fonctionnalités de
leaflet, notamment sur le tracé de polygones, pour entourer un parking, par
exemple, mais je vais m'arrêter là.</p>
<h3>Liens</h3>
<p>Leaflet : <a href="http://leafletjs.com/">http://leafletjs.com/</a>
Source des données : <images/map/markers.json>
Script : <images/map/leafScript.js></p>
<p>Le script leafScript.js et le fichier de données markers.json sont sous
<a href="https://fr.wikipedia.org/wiki/WTFPL#Version_2">licence WTFPL version 2</a>.</p>Édition de police d'écriture2015-10-03T00:00:00+02:002015-10-03T00:00:00+02:00alextag:blog.chibi-nah.fr,2015-10-03:/edition-de-police-d-ecriture<p>Une petite question qui revient de temps en temps :
Comment faire pour faire apparaître des « ondes wifi » sur la lettre i, comme
sur le site de <a href="http://labriqueinter.net/">La Brique Inter.net</a>, sans que cela
soit une image ?</p>
<h3>Introduction</h3>
<p><img alt="Texte La Brique Inter.net, en noir sur fond blanc, avec les ondes sur le
i." src="/images/brique/logo-hype.png"> Logo hype</p>
<p>Si on affiche le site sans javascript, on voit que c'est …</p><p>Une petite question qui revient de temps en temps :
Comment faire pour faire apparaître des « ondes wifi » sur la lettre i, comme
sur le site de <a href="http://labriqueinter.net/">La Brique Inter.net</a>, sans que cela
soit une image ?</p>
<h3>Introduction</h3>
<p><img alt="Texte La Brique Inter.net, en noir sur fond blanc, avec les ondes sur le
i." src="/images/brique/logo-hype.png"> Logo hype</p>
<p>Si on affiche le site sans javascript, on voit que c'est le caractère Î qui
est affiché.</p>
<p><img alt="Texte La Brique Inter.net, en noir sur fond blanc, avec un i accent
circonflexe majuscule." src="/images/brique/logo-pas-hype.png"> Logo pas hype</p>
<p>Note : J'ai utilisé des images <a href="https://blog.chibi-nah.fr/edition-de-police-d-ecriture#0089a1">[1]</a> pour pouvoir « illustrer » l'article.</p>
<p>Outils nécessaires : uniquement des logiciels libres.</p>
<ul>
<li>Inkscape, pour l'édition vectorielle ;</li>
<li>FontForge, pour éditer une fonte de la police d'écriture.</li>
</ul>
<p>La police Jura (Jura Book) a été dessinée par <a href="http://io.debian.net/~danielj/">Daniel
Johnson</a> et est sous licence <a href="https://en.wikipedia.org/wiki/SIL_Open_Font_License">"SIL Open Font Licence"</a>, qui autorise
(entres autres) les modifications. Cette police est disponible dans toutes les
bonnes crèmeries, n'hésitez pas à la demander à votre moteur de recherche
favori.</p>
<h3>Inkscape</h3>
<p>Ouvrons Inkscape, et dessinons des ondes.</p>
<p><img alt="Capture d'écran du logiciel inkscape." src="/images/brique/inkscape.png"> Logo dessiné</p>
<p>Ça, c'était la partie la plus amusante.</p>
<h3>FontForge</h3>
<p>Ouvrir FontForge, ouvrir la police Jura, et sélectionner la case du Î (i majuscule accent circonflexe).</p>
<p><img alt="Capture d'écran du logiciel FontForge, lettre Î
sélectionnée." src="/images/brique/capital_I.png"> La case avec la lettre Î</p>
<p>Double-cliquer sur la case pour passer en mode « dessin ».</p>
<p>Sélectionner puis supprimer l'accent circonflexe.</p>
<p><a href="/images/brique/capital_I2.png"><img alt="Capture d'écran du logiciel FontForge, mode dessin." src="/images/brique/capital_I2.png"></a> <a href="/images/brique/capital_I3.png"><img alt="Capture d'écran du logiciel FontForge,
accent circonflexe sélectionné." src="/images/brique/capital_I3.png"></a> <a href="/images/brique/capital_I4.png"><img alt="Capture d'écran du logiciel FontForge,
accent circonflexe supprimé." src="/images/brique/capital_I4.png"></a> Édition de la lettre Î</p>
<p>Revenir sur Inkscape, sélectionner (et copier) le dessin vectoriel (donc, les
ondes), et coller directement dans FontForge.</p>
<p>Il faudra sans doute effectuer quelques petites retouches, et aligner les
ondes.</p>
<p><a href="/images/brique/final.png"><img alt="Capture d'écran avec le logiciel FontForge, et la lettre Î
terminée." src="/images/brique/final.png"></a> Résultat final</p>
<h3>Export final</h3>
<p>Enregistrer la police de caractère (pour pouvoir la modifier plus tard), puis
générer les différentes fontes pour le web (ttf, woff…), soit via un site web
dédié, soit via la ligne de commande ; se référer à l'article <a href="https://blog.chibi-nah.fr/conversion-de-polices-pour-le-web">Conversion de
polices pour le web</a> pour ce dernier cas.</p>
<h3>Conclusion</h3>
<p>Avec un peu de temps et deux logiciels libres, on peut éditer aisément
n'importe quelle police d'écriture pour y intégrer des images vectorielles.
Les seules limitations sont : le nombre de couleurs, l'imagination, et la
licence de la police. Toutes n'autorisent pas la modification et encore moins
l'utilisation en dehors du cadre « personnel » (en gros, ça ne sort pas de
votre ordinateur/téléphone).</p>
<p>L'étape d'Inkscape est totalement optionnelle, on peut dessiner directement
dans FontForge, même si c'est moins évident/facile.</p>
<p>Tout commentaire qui n'a rien à voir avec cet article se verra supprimé sans
sommation.</p>
<hr>
<p>1 : Flemme d'installer la police d'écriture jurabook pour seulement un
article.</p>D Beam2015-06-29T00:00:00+02:002015-06-29T00:00:00+02:00alextag:blog.chibi-nah.fr,2015-06-29:/dbeam<p>Non, cet article ne parlera pas de haricots, mais d'un contrôleur que l'on
peut trouver sur certains synthétiseurs/claviers maîtres
<a href="https://blog.chibi-nah.fr/dbeam#a1">[1]</a>.</p>
<p>Ce contrôleur est constitué de deux LED infrarouge placées côte à côte, une en
émission, l'autre en réception. Ce contrôleur mesure la distance de tout objet
placé au dessus …</p><p>Non, cet article ne parlera pas de haricots, mais d'un contrôleur que l'on
peut trouver sur certains synthétiseurs/claviers maîtres
<a href="https://blog.chibi-nah.fr/dbeam#a1">[1]</a>.</p>
<p>Ce contrôleur est constitué de deux LED infrarouge placées côte à côte, une en
émission, l'autre en réception. Ce contrôleur mesure la distance de tout objet
placé au dessus de ces deux LED et convertit cette information en signal MIDI.</p>
<p><img alt="Photo d'un contrôleur D Beam. On voit les deux LED
infrarouge." src="/images/dbeam/dbeam.jpg"> Photo d'un
contrôleur D Beam. On voit les deux LED infrarouge.</p>
<p>Ce contrôleur a été mis au point par la société Interactive Light pour leur
propres interfaces, et cette société a été rachetée par Roland, au milieu des
années 90. Ce contrôleur fut alors utilisé sur la GrooveBox MC-505, et par la
suite, sur d'autres matériels conçus par le fabricant japonais, tels que
synthés, claviers maîtres, keytars…</p>
<p>Au niveau de l'utilisation, ça se rapproche un peu du thérémine
<a href="https://blog.chibi-nah.fr/dbeam#a2">[2]</a> (pour ceux qui connaissent), avec
comme principale différence, c'est que le thérémine utilise des ondes radio et
le d-beam, un rayon infrarouge.</p>
<p>Le principal inconvénient de cette technologie, c'est qu'elle n'est disponible
que chez un seul fabricant.</p>
<p>Le principal avantage, c'est que l'on peut paramétrer ce contrôleur pour
pouvoir piloter n'importe quel type d'effet, que ça soit une vitesse de LFO
(parfait pour faire de la dub-step), l'ouverture d'un filtre, la hauteur de
note (pitch), le volume… Cela apporte une autre manière de jouer avec son
instrument <a href="https://blog.chibi-nah.fr/dbeam#a3">[3]</a>.</p>
<p>Comme je ne sais pas ce que je pourrais dire de plus, je pense que le plus
simple, c'est de faire une démo en vidéo.</p>
<video controls>
<source src="https://blog.chibi-nah.fr/images/dbeam/dbeam.mp4" type="video/mp4">
</video>
<p>La sortie audio du synthé est reliée sur l'entrée ligne du Zoom H2n, et la
sortie audio du h2n sur les enceintes amplifiées. Mis à part l'alimentation,
je n'ai rien branché sur le synthé. Pas de pédale d'effets ou de commande, pas
de câble USB, comme on peut le voir à la fin de la vidéo. Les trois notes
jouées au tout début servent juste pour la synchro audio/vidéo au montage.</p>
<p>Dans la vidéo, le D Beam est assigné au cut-off des trois "couches" (ici
appelés tones). Le but est de jouer sur la fréquence de coupure du filtre, et
de jouer sur la résonance. À noter, on peut utiliser ses mains, ou n'importe
quel objet (j'ai pris mon carnet de prise de notes) pour contrôler le synthé.</p>
<p>Le patch est un truc personnalisé ; pensez à un vaisseau extra-terrestre
<img alt=":p" src="plugins/plxtoolbar/custom.buttons/smilies/tongue.png"> ; à base de 3
ondes carrées dont deux utilisées en modulation en anneau (ring modulator), 3
LFO, 2 filtres LPF, 1 filtre PKG, de la reverb, du panning delay, du pitch
shifter (tout ça sur le synthé, je n'ai pas traité le son de manière
logicielle ou matérielle. Le son obtenu sort comme ça du synthé).</p>
<hr>
<p>1 : Non, je ne ferai pas de jeu de mots pourri avec "goshujin sama".
2 : L'un des plus anciens instruments électronique, toujours fabriqué et
utilisé en 2015. Cet instrument, difficile à jouer, est constitué de deux
antennes, une pour le volume et l'autre pour la hauteur de note. On utilise
donc les deux mains pour jouer de cet instrument.
3 : de musique.</p>Problème de catégorie2015-06-29T00:00:00+02:002015-06-29T00:00:00+02:00alextag:blog.chibi-nah.fr,2015-06-29:/probleme-de-categorie<p>Pour une raison<s>que j'ignore</s>, un article de MAO s'est retrouvé sur le
planet ASRALL.</p>
<p>J'ai ajouté une catégorie dans PluXML, placé l'article précédent dans cette
catégorie, et le moteur du blog lui a assigné l'id 17, qui lui, est réservé
pour l'asrall.</p>
<p>Normalement, c'est corrigé.</p>Cowbell, ou pas…2015-05-08T00:00:00+02:002015-05-08T00:00:00+02:00alextag:blog.chibi-nah.fr,2015-05-08:/cowbell-ou-pas<p>Madame monsieur, bonsoir.
Une étrange épidémie s'est répandue sur Terre. Elle porte un nom, le son de
cloche. Rassurez-vous, cela n'a rien à voir avec une quelconque guerre de
clochers ou une croisade religieuse.
D'après nos informateurs, il s'agirait d'un son électronique, provenant d'une
étrange machine découverte au début des …</p><p>Madame monsieur, bonsoir.
Une étrange épidémie s'est répandue sur Terre. Elle porte un nom, le son de
cloche. Rassurez-vous, cela n'a rien à voir avec une quelconque guerre de
clochers ou une croisade religieuse.
D'après nos informateurs, il s'agirait d'un son électronique, provenant d'une
étrange machine découverte au début des années 80.</p>
<p>Et c'est suite à cette introduction sans queue (de vache) ni tête (de veau),
que je vais expliquer rapidement comment reproduire (de loin, avec les
oreilles bouchées) un son ressemblant (ou pas du tout en fait) au Cowbell du
TR-808.</p>
<p>Tout d'abord, il faut savoir comment ce son est produit.</p>
<p>Je ne vais pas entrer dans les détails (<a href="http://www.frisnit.com/roland-tr-808-cowbell-rebuild/">Mark Longstaff-Tyrrell</a> l'ayant déjà
fait), mais en résumé, il s'agit de deux ondes carrées, l'une à 540 Hz,
l'autre à 800 Hz, avec un filtre passe-bande, centré à environ 850 Hz, avec
une pente à 3dB/octave et une bande de 200 Hz (Q=4,25), avec une enveloppe de
type AD (Attack Decay).</p>
<hr>
<p>Outils nécessaires :</p>
<ul>
<li>Soit un synthétiseur possédant 2 oscillateurs séparés (2 OSC/VCO/DCO) avec une forme d'onde carrée (sinon utiliser deux synthés avec un seul oscillateur, ça devrait marcher aussi).</li>
<li>Soit un plugin (LV2/VSTi/LADSPA/AU) possédant un oscillateur avec une forme d'onde carrée.</li>
<li>De quoi envoyer une note au format midi (clavier maître, clavier d'ordinateur…).</li>
<li>Un analyseur de spectre (logiciel ou matériel, par exemple Instrument Tuner [spectrum] sous GNU/Linux, ou Span, de Voxengo sous Mac OS X).</li>
</ul>
<p>Ici, je vais expliquer les manipulations sous GNU/Linux.</p>
<p>J'ai KXStudio installé, avec les plugins CALF, jack2, Catia et Carla (déjà
expliqué dans un précédent article, je ne vais pas revenir dessus).</p>
<p>Démarrer Jack2, puis Catia et Carla.</p>
<p>Dans Catia, connecter l'instance de Carla. (Mon clavier maître étant branché
sur l'interface M-Audio MIDI USB Uno)</p>
<p><a href="/images/mao9/catia.png"><img alt="Catia - liaison MIDI entre l'interface MIDI et Calra" src="/images/mao9/catia.png"></a></p>
<p>Dans Carla, dans l'onglet Rack, ajouter le plugin Instrument Tuner [Spectrum],
puis le plugin Calf Monosynth. Ne pas oublier de tout éteindre par défaut (via
le bouton « Panic, par exemple ».)</p>
<p><a href="/images/mao9/rack1.png"><img alt="Ajout de l'instrument Tuner dans Carla" src="/images/mao9/rack1.png"></a></p>
<p>Basculer sur l'onglet Patchbay, et connecter les plugins comme suit :</p>
<p><a href="/images/mao9/patchbay1.png"><img alt="Liaisons entre les plugins audio" src="/images/mao9/patchbay1.png"></a></p>
<p>Revenir sur l'onglet Rack, puis « allumer » l'analyseur de spectre, puis
l'instance de Calf Monosynth. Activer les interfaces graphiques (GUI).</p>
<p>Note : je n'utilise qu'un seul des deux oscillateurs de Calf Monosynth. Le
second ne peut pas être réglé « correctement », j'utiliserai une seconde
instance du plugin.</p>
<p>Régler l'oscillateur sur Square, appuyer sur une touche du clavier maître,
puis jouer avec les molettes Transpose et Detune pour faire en sorte que le
signal s'approche le plus possible des 540 Hz.</p>
<p>Régler ensuite le filtre sur 6dB/oct (il n'y a pas 3 dB/oct), le cutoff au
plus près de 850 Hz, pas de résonnance, puis basculer sur l'onglet Modulation.</p>
<p><a href="/images/mao9/rack2.png"><img alt="Réglages du monosynth" src="/images/mao9/rack2.png"></a></p>
<p>Régler les enveloppes plus ou moins comme sur la capture (ou comme vous le
voulez, vous êtes assez grands pour savoir ce que vous faites).</p>
<p><a href="/images/mao9/calf-env.png"><img alt="Réglage des enveloppes" src="/images/mao9/calf-env.png"></a></p>
<p>Le son obtenu devrait ressembler (ou non) à ça :</p>
<p><em>Notez que le decay est trop court. J'aurais du l'augmenter un peu.</em></p>
<p>Dès que ce plugin est paramétré, fermer l'interface graphique de ce plugin,
puis cloner le plugin sur le rack. Les paramètres du filtre et de l'enveloppe
seront alors identiques, il ne sera pas nécessaire de les reparamétrer.</p>
<p><a href="/images/mao9/rack3.png"><img alt="Rack audio de Carla" src="/images/mao9/rack3.png"></a></p>
<p>Revenir sur le patchbay et connecter le second synthétiseur.</p>
<p><a href="/images/mao9/patchbay2.png"><img alt="Liaisons entre les plugins audio" src="/images/mao9/patchbay2.png"></a></p>
<p>« Éteindre » la première instance de Calf Monosynth, puis « allumer » la
seconde instance et afficher l'interface du plugin.</p>
<p>Le plugin étant presque paramétré, il ne reste qu'à jouer avec les molettes
Transpose et Detune pour faire en sorte que le signal s'approche le plus
possible des 800 Hz.</p>
<p><a href="/images/mao9/rack4.png"><img alt="Réglages du second monosynth" src="/images/mao9/rack4.png"></a></p>
<p>Le son obtenu devrait ressembler (ou non) à ça :</p>
<p>Dès que c'est bon, « allumer » la première instance du synthétiseur, éteindre
(éventuellement) l'analyseur de spectre, puis écouter le son produit.</p>
<p><a href="/images/mao9/rack5.png"><img alt="Rack audio de Carla" src="/images/mao9/rack5.png"></a></p>
<p>Vous devriez alors obtenir un son semblable à celui-ci. Il ne reste plus qu'à
le traiter (eq, reverb…) et de l'utiliser dans un mix :)</p>
<p>Certes, ce n'est pas LE son exact, mais même d'une TR-808 à l'autre, le son de
cloche n'était pas tout à fait le même, du fait qu'il soit produit par des
composants analogiques.</p>
<p>Cependant, noyé dans un mix, encodé en MP3 128k, lu sur un téléphone avec un
casque B…ts, personne ne fera la différence.</p>Nettoyage et changement des contacts sur une GameBoy Color2015-04-26T00:00:00+02:002015-04-26T00:00:00+02:00alextag:blog.chibi-nah.fr,2015-04-26:/nettoyage-et-changement-des-contacts-sur-une-gameboy-color<p><em>Notez que j'ai bien écrit « UNE » et non « un ». Faut pas abuser non plus.</em></p>
<p>Ceci n'est pas un tutoriel, mais plus un petit guide non explicatif, sur le
démontage et le nettoyage d'une Game Boy Color.</p>
<p>Ce guide n'est pas agréé par Nintendo. L'auteur de cet article ne sera en …</p><p><em>Notez que j'ai bien écrit « UNE » et non « un ». Faut pas abuser non plus.</em></p>
<p>Ceci n'est pas un tutoriel, mais plus un petit guide non explicatif, sur le
démontage et le nettoyage d'une Game Boy Color.</p>
<p>Ce guide n'est pas agréé par Nintendo. L'auteur de cet article ne sera en
aucun cas responsable en cas de destruction de votre console.</p>
<p>Outils nécessaires :</p>
<ul>
<li>Des doigts</li>
<li>Un tournevis cruciforme, genre PH0 ou PH00</li>
<li>(plus dur à trouver) Un tournevis tri-wing</li>
<li>Une petite boîte pour recueillir les vis.</li>
</ul>
<p>Avoir une GameBoy Color sous la main serait un plus.</p>
<p>La console datant de 1998, il est inutile d'espérer une quelconque prise en
garantie en 2015, surtout quand les touches directionnelles et A/B ne
répondent plus.</p>
<p>Commençons par rassembler les outils. Comme petite boîte, j'utilise une boîte
de médiators. Pour le tournevis cruci, c'est un tournevis "de précision". Le
tri-wing a été trouvé pour une somme dérisoire sur un site d'enchères connu.</p>
<p><img alt="Tournevis tri-wing et tournevis cruciforme" src="/images/gbc/tournevis.jpg"> Un tournevis tri-wing (au dessus) et un tournevis cruciforme (en dessous).</p>
<p><img alt="Tournevis tri-wing et tournevis cruciforme, détail des têtes" src="/images/gbc/tournevis2.jpg"> Notez bien la forme du tri-wing, à gauche. N'essayez pas la technique du cramage de bic, ça ne marche pas.</p>
<p>Commençons par retourner la console.</p>
<p><img alt="Game boy color, violette, vue de dos" src="/images/gbc/gbc-dos1.jpg">
Elle ne le sait pas encore, mais ses touches sont déjà mortes.</p>
<p>Retirons le cache-pile, si celui est toujours présent <em>(je l'ai remplacé, ça
fait longtemps que celui d'origine est cassé et perdu)</em>.</p>
<p><img alt="Game boy color, violette, vue de dos, cache piles retiré" src="/images/gbc/gbc-dos2.jpg">
Il est fort probable que vous ayez commencé ce non-tutoriel par cette partie.</p>
<p>Retirons les six (6) vis tri-wing avec le tournevis approprié.</p>
<p><img alt="Game boy color, violette, vue de dos, vis retirées" src="/images/gbc/gbc-dos3.jpg">
Après l'utilisation d'un outil qui tourne au vice…</p>
<p>Retirons doucement le capot arrière.</p>
<p><img alt="Game boy color, capot retiré" src="/images/gbc/gpc-pcb1.jpg">
Sérieusement, ça a besoin d'un bon nettoyage. <em>(J'ai triché sur cette photo,
les vis sont déjà retirées.)</em></p>
<p>Retirons les trois (3) vis cruciforme.</p>
<p><img alt="Position des vis à retirer" src="/images/gbc/gpc-pcb2.jpg">
Ne pas oublier celle qui se cache à coté du connecteur des piles.</p>
<p>Débloquer la nappe qui relie le PCB à l'écran. <strong>Attention, c'est fragile.</strong></p>
<p><img alt="Position des clips retenant la nappe de l'écran au PCB, position verrouillée" src="/images/gbc/gpc-pcb3.jpg">
Surtout, N'UTILISEZ PAS DE TOURNEVIS !</p>
<p><img alt="Position des clips retenant la nappe de l'écran au PCB, position déverrouillée" src="/images/gbc/gpc-pcb4.jpg">
Déverrouillage effectué.</p>
<p>Retirer la nappe et retirer doucement le PCB.</p>
<p><img alt="PCB Game boy color, vue de face" src="/images/gbc/gbc-pcb5.jpg">
Le PCB seul. Idem : un bon coup de nettoyage s'impose.</p>
<p><img alt="Coque avant du Game boy color" src="/images/gbc/gbc-bface.jpg">
La coque avant, avec l'écran derrière sa mousse, et les contacts <em>déjà changés
sur cette photo</em>.</p>
<p>Enlevons les contacts caoutchouc.</p>
<p><img alt="Coque avant du Game boy color, contacts carbone retirés" src="/images/gbc/gbc-bface2.jpg">
La coque avant, avec l'écran derrière sa mousse, et les contacts retirés.</p>
<p>Petite comparaison entre des contacts neufs <em>(origine : un site d'enchères)</em>
et ceux d'origine.</p>
<p><img alt="Comparaison des contacts carbone, les nouveaux et les anciens, directions" src="/images/gbc/gbc-contacts1.jpg">
À gauche, le neuf, à droite, l'origine, complètement usé..</p>
<p><img alt="Comparaison des contacts carbone, les nouveaux et les anciens, actions" src="/images/gbc/gbc-contacts2.jpg">
Le caoutchouc de la touche A est tellement usé que l'on voit le bureau à
travers la fissure…</p>
<p>Pour le remontage, faire les opérations dans l'ordre inverse.</p>Modifier le prompt de son shell2015-04-18T00:00:00+02:002015-04-18T00:00:00+02:00alextag:blog.chibi-nah.fr,2015-04-18:/modifier-le-prompt-de-son-shell<p>Article mis à jour à 23h19. Le problème de git a été résolu.</p>
<p>(Pseudo) suite de l'article sur Fish [1]. Après le message d'accueil,
personnalisons le prompt.</p>
<h3>D'abord, qu'est-ce que le prompt ?</h3>
<p>Prompt, de l'Italien "Pronto", et signifiant « prêt » [2], est une bête
étrange que l'on retrouve sur toutes les …</p><p>Article mis à jour à 23h19. Le problème de git a été résolu.</p>
<p>(Pseudo) suite de l'article sur Fish [1]. Après le message d'accueil,
personnalisons le prompt.</p>
<h3>D'abord, qu'est-ce que le prompt ?</h3>
<p>Prompt, de l'Italien "Pronto", et signifiant « prêt » [2], est une bête
étrange que l'on retrouve sur toutes les consoles [3], que ça soit sous MS-DOS
[4], la ligne de commande Windows [5], ou les *nix [6].</p>
<p>Symbolisé par un '$', un '#' ou un '>', cela sert à inviter l'utilisateur à
taper des commandes [7]. Évidemment, si on tape « merci de me faire du café »,
au pire, on aura un « Commande inconnue 'merci' ». Si on tape « make coffee »
sur un système BSD relié à une cafetière, on aura du café [8].</p>
<p>Après, la plupart des visiteurs de ce blog savent ce qu'est le prompt, donc,
entrons dans le vif du sujet.</p>
<h3>Personnalisons le prompt.</h3>
<p>Sous bash, le plus simple est de modifier la variable PS1.
Lançons alors bash sans rien, comme ceci :</p>
<p><img alt="Capture d'écran montrant le shell bash par défaut, comme sur l'exemple ci-dessus." src="https://blog.chibi-nah.fr//images/prompt/bash1.png"></p>
<p>On a vraiment le strict minimum. Le nom du shell et sa version, suivi du
caractère '$'.
Modifions alors la variable PS1.</p>
<p><img alt="Capture d'écran montrant le shell bash avec le prompt modifié, comme sur l'exemple ci-dessus." src="https://blog.chibi-nah.fr//images/prompt/bash2.png"></p>
<p>Voilà qui est déjà mieux, et qui ressemble plus ce à quoi on est habitué de
voir.</p>
<p>On peut mettre de la couleur, afficher d'autres informations, etc, je ne
m'attarderai pas dessus.</p>
<h3>powerline-shell</h3>
<p><img alt="Capture d'écran montrant le prompt powerline" src="/images/prompt/powerline.png"></p>
<p><a href="https://github.com/milkbikis/powerline-shell">powerline-shell</a> est un petit script ensemble de scripts écrit en python [9]. Sa particularité, c'est qu'il permet de remplacer le prompt par quelque chose de plus complet, par exemple en plus du chemin, il peut indiquer dans quelle branche git on se situe, ou si on est connecté via ssh. Facilement extensible (via des "segments"), il est simple d'usage, compatible avec bash, zsh et fish (entres-autres). De plus, il fonctionne également sous Windows (cygwin). Il s'inspire de <a href="https://github.com/Lokaltog/vim-powerline">powerline</a>, une extension de vim.</p>
<p>Cependant, il nécessite, pour un fonctionnement optimal, une police de caractère "patchée", contenant des caractères unicode supplémentaires. Ces polices peuvent se trouver <a href="https://github.com/Lokaltog/powerline-fonts">ici</a>.</p>
<p>L'installation sous bash et zsh ne pose pas de problèmes en particulier. Cependant, sous fish, en suivant les instructions données, cela ne marchait pas (pourquoi ? mystère). Du coup, j'ai créé un fichier "fish_prompt.fish " dans "~/.config/fish/functions", et y ai inséré le contenu suivant :</p>
<div class="highlight"><pre><span></span><code>$ cat .config/fish/functions/fish_prompt.fish
function fish_prompt
~/powerline-shell.py $status --shell bare ^/dev/null
end
</code></pre></div>
<p>Édit : la doc de fish recommande de passer par function et non d'utiliser fish.config. Cf. <a href="http://fishshell.com/docs/current/faq.html#faq-prompt"> How do I set my prompt?</a></p>
<p>Une déconnexion de fish plus tard, on passe du prompt par défaut à powerline-shell.</p>
<p><img alt="Comparaison entre le prompt de fish, par défaut, et de powerline-shell" src="/images/prompt/powerline-fish.jpg"></p>
<p>En haut, le prompt par défaut, en bas, powerline-shell. La différence est notable.
Le terminal utilisé ici est <a href="http://tilda.sourceforge.net/tildaabout.php">tilda</a>, la police est <a href="https://github.com/Lokaltog/powerline-fonts/tree/master/UbuntuMono">Ubuntu mono derivative powerline</a>.</p>
<p>À l'usage, ça donne ça :</p>
<p><img alt="" src="/images/prompt/powerline-shell2.jpg"></p>
<p>La connexion ssh fait apparaître un petit cadenas sur fond orangé.
L'utilisateur "root" est affiché sur un fond rouge, et le nom de machine est
sur fond blanc. Ce n'est pas le thème par défaut, mais un thème légèrement
retouché pour correspondre à mes besoins.</p>
<h3>Conclusion</h3>
<p>Au final, ce prompt est agréable et pratique, à tel point que je ne pourrais plus m'en passer.
À noter cependant un léger délai avec zsh sous Windows au moment d'afficher le prompt. C'est possible que cela soit lié à python sur cette plateforme.
Par contre, sur un de mes dépôts git, powerline-shell semble planter, et n'affiche rien. Il faudra que je regarde ça de plus près. À noter, si je retire le .git, l'affichage du prompt fonctionne, et si je le remet, ça ne fonctionne plus [10]. Je n'ai pas ce problème sur mes autres dépôts git.</p>
<p>Édit : problème réglé. git retourne les infos en français, donc en utf-8. Bien entendu, le segment git attendait de l'ascii. L'ajout de</p>
<div class="highlight"><pre><span></span><code>branch = branch.decode('utf-8')
</code></pre></div>
<p>sur la ligne avant</p>
<div class="highlight"><pre><span></span><code>powerline.append(' %s ' % branch, fg, bg)
</code></pre></div>
<p>vers la ligne 46 de git.py, puis rexécution de "./install.py" pour mettre à
jour le script, règle le problème.</p>
<p><a href="/images/prompt/powerline-shell3.jpg"><img alt="terminal montrant les erreurs python, puis le prompt
fonctionnel." src="/images/prompt/powerline-
shell3.jpg"></a></p>
<hr>
<p>1 : Lisible ici <a href="https://blog.chibi-nah.fr/article26">personnaliser-le-greeting-de-fish</a>
2 : Je ne sais pas si c'est vrai ou non, c'est juste que je trouvais que les termes étaient proches. Si c'est totalement faux ou absurde, rigolez-en, si c'est vrai… ben euh… c'est que c'est vrai.
3 : Le truc obscur dont j'ai du parler dans un précédent article, utilisé par les 1337 |-|4><0r M45+3R. Ce n'est pas une console de jeux comme la p$ ou la ><|30><, même si les rares consoles de jeux qui tournent sur la distrib « OpenDingux » ont une console ; une console dans la console.
4 : Déjà en son temps, pour passer de C> à C:>, il fallait taper prompt $p$g.
5 : le truc dans une fenêtre 80x25 non étirable et accessible via cmd.exe
6 : Donc, pas sur GNU/Lennax… je <strong>sais</strong> , un article écrit un vendredi sans troll sur systemd, c'est pas un bon article. À noter, j'ai réellement utilisé systemd sur fedora19, il y a des bons trucs dedans, et également des trucs vraiment pénible, notamment quand un processus part en <a href="http://www.megatokyo.it/planche/fr0518/">cavale…</a>
7 : Ça doit être pour ça qu'on appelle ça une invite de commande…
8 : À noter la commande "c", qui, suivie d'un certain nombre de paramètres, permet d'obtenir un certain breuvage, comme l'indique sa <a href="http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man1/c.1.html">page de man.</a>
9 : Vous vous attendiez à quoi ? du PERL ?
10 : Quand je regarde comme ça, on me voit. Quand je regarde comme ça, on ne me voit plus. On me voit, on me voit plus…</p>Tutoriel : comment installer SteamOS2015-04-18T00:00:00+02:002015-04-18T00:00:00+02:00alextag:blog.chibi-nah.fr,2015-04-18:/tuto-installation-steamos<p>Ceci est un long tutoriel, détaillé, expliquant comment installer SteamOS,
sans passer par l'installation officielle, qui efface automatiquement le
disque dur et nécessite un bios UEFI.</p>
<p>Par simple curiosité, j'ai téléchargé l'image d'installation. L'installation
est automatisée (preseed) et un script post-installation est exécuté.</p>
<p>Au lieu de modifier l'image d'installation et …</p><p>Ceci est un long tutoriel, détaillé, expliquant comment installer SteamOS,
sans passer par l'installation officielle, qui efface automatiquement le
disque dur et nécessite un bios UEFI.</p>
<p>Par simple curiosité, j'ai téléchargé l'image d'installation. L'installation
est automatisée (preseed) et un script post-installation est exécuté.</p>
<p>Au lieu de modifier l'image d'installation et d'installer manuellement, j'ai
préféré opter pour une autre solution, pas forcément plus longue, mais qui
fonctionne parfaitement.</p>
<p>Prérequis :</p>
<ul>
<li>Un disque dur (ou SSD) ayant de la place de libre.</li>
<li>Avoir préparé une partition de 10 Go minimum (c'est vraiment le strict minimum, de quoi installer SteamOS et un petit jeu, pour valider l'installation).</li>
<li>Avoir préparé une partition qui servira pour le swap (1 Go devrait suffire).</li>
<li>Ne pas avoir peur de la ligne de commande.</li>
<li>Ne rien avoir contre Linux Mint.</li>
<li>Une bonne connexion internet avec un bon débit (56k ou 3G limitée à 1,5 Go s'abstenir).</li>
<li>Une clé USB vide, de 2 Go minimum , ou alors, un DVD vierge.</li>
<li>Un clavier azerty en vaut deux (pas de support du bépo).</li>
<li>Du temps à perdre.</li>
</ul>
<h2>DISCLAIMER</h2>
<p>Ce tutoriel explique, de manière détaillée, comment installer SteamOS sur
votre PC.</p>
<p>Ce tutoriel n'a pas été testé sur un Mac.</p>
<p>Gardez à l'esprit que SteamOS est encore au stade de BETA, et qu'il ne s'agit
pas d'un produit stable ou fiable.</p>
<p><strong>FAITES UNE SAUVEGARDE DE VOS DONNÉES !</strong></p>
<p>L'auteur de cet article ne saurait être responsable en cas de pertes de
données.</p>
<p>Ce tutoriel a été écrit le samedi 18 avril 2015.</p>
<p>Il n'y a aucune garantie sur l'exactitude de ce tutoriel.</p>
<p>En cas de divergence entre le texte et une capture d'écran, tenir compte de la
capture d'écran. Celle-ci fait foi.</p>
<p>Ce tutoriel est rédigé durant mon temps libre. Je n'ai aucun lien avec Valve,
l'éditeur et développeur de Steam. Valve n'a pas lu ni approuvé ce tutoriel.
Si vous décidez de le suivre, c'est sous votre entière responsabilité.</p>
<p>La machine utilisée pour effectuer l'installation, ainsi que la source des
captures est un PC Portable HP, Touchsmart TM2, 1050ef, avec le disque dur
d'origine (500 Go)</p>
<p>Si vous êtes d'accord avec tous les termes, vous pouvez continuer la lecture
de cet article</p>
<h2>Préparer la clé USB.</h2>
<p>Pour commencer, récupérez l'image disque de Linux Mint.
<a href="http://linuxmint.com/download.php">http://linuxmint.com/download.php</a></p>
<p>J'ai téléchargé la version avec Cinnamon, en 64 bits.</p>
<p>Sous Windows, j'ai aussi téléchargé UNetbootin, qui permet de créer une clé
USB bootable à partir d'une image ISO.
<a href="http://unetbootin.sourceforge.net/">http://unetbootin.sourceforge.net/</a></p>
<p>J'ai pris une clé de 4 Go, démarré UNetbootin, et ai sélectionné DisqueImage.</p>
<p><img alt="UNetbootin" src="/images/steamOS2/UNetbootin.png"></p>
<p>Installation de Linux Mint 17.1 sur la clé</p>
<p><img alt="UNetbootin" src="/images/steamOS2/UNetbootin2.png"></p>
<p>Installation terminée.</p>
<p><img alt="UNetbootin" src="/images/steamOS2/UNetbootin3.png"></p>
<p>Redémarrage de l'ordi, et boot sur la clé USB.</p>
<h2>Linux Mint</h2>
<p>Arrivée sur le bureau Mint.</p>
<p><img alt="Bureau Linux Mint" src="/images/steamOS2/1.png"></p>
<p>Première étape, avant toute chose : configurer le clavier en français azerty.
Ouvrir un terminal, puis taper simplement</p>
<div class="highlight"><pre><span></span><code>setxkbmap fr
</code></pre></div>
<p>Tester (en tapant azerty).</p>
<p><img alt="setxkbmap fr" src="/images/steamOS2/2.png"></p>
<p>Laisser le terminal ouvert, on en aura besoin par la suite.</p>
<p><em>Note : pour plus de commodité, il est possible d'afficher ce tutoriel en
l'affichant dans firefox sur le live usb</em></p>
<h2>Création/formatage des deux partitions</h2>
<p>Seconde étape : créer et/ou formater la partition qui recevra SteamOS.</p>
<p>Ouvrir le menu (en bas à gauche), puis aller dans Administration -> GParted.</p>
<p><img alt="Menu -> Administration -> GParted" src="/images/steamOS2/3.png"></p>
<p>Si la partition pour SteamOS n'a pas été créée (sous Windows, par exemple).</p>
<ul>
<li>Sélectionner l'espace libre et faire un clic droit -> New</li>
<li>Dans Create new Partition, choisir la taille désirée (le maximum moins 1 Go),</li>
<li>S'il n'y a aucune partition, la créer en tant que partition principale (Create as Primary Partition), sinon la créer en tant que partition étendue (Create as Extended Partition).</li>
<li>Choisir le système de fichiers (File system) ext4</li>
<li>Pour le Label, indiquer SteamOS</li>
<li>Cliquer sur Add.</li>
</ul>
<p><img alt="Création d'une partition (étape 1)" src="/images/steamOS2/4.png"></p>
<p><img alt="Création d'une partition (étape 2)" src="/images/steamOS2/5.png"></p>
<p>Refaire la même manipulation, mais en sélectionnant linux-swap dans File
system.
Aller dans Edit -> Apply All (ou cliquer sur l'icône Return).</p>
<p>Si la partition pour SteamOS était déjà créée, la sélectionner et faire un
clic droit -> Format to -> ext4.
Faire de même pour la partition de swap</p>
<p><img alt="Formatage en ext4" src="/images/steamOS2/6.png"></p>
<p>Appliquer les modifications</p>
<p><img alt="GParted" src="/images/steamOS2/7.png"></p>
<p><img alt="Application des modifications en cours…" src="/images/steamOS2/8.png"></p>
<p>Faire ensuite un clic droit sur la partition fraichement formatée -> Label
Taper SteamOS</p>
<p><img alt="Changement du label de la partition (étape 1)" src="/images/steamOS2/9.png"></p>
<p><img alt="Changement du label de la partition (étape 2)" src="/images/steamOS2/10.png"></p>
<p>Appliquer les modifications</p>
<p>Notez le nom de la partition dans un coin (chez moi, c'est /dev/sda7)
Fermer GParted.</p>
<h2>Installation de Debian Wheezy</h2>
<p>Dans le terminal, taper ces deux commandes :</p>
<div class="highlight"><pre><span></span><code>sudo mkdir -p /media/SteamOS
sudo mount /dev/sda7 /media/SteamOS/
</code></pre></div>
<p>en remplaçant <strong>sda7</strong> par votre partition.</p>
<p><img alt="sudo mount /dev/sda7 /media/SteamOS/" src="/images/steamOS2/11.png"></p>
<p>Installons debootstrap, qui va nous permettre d'installer une Debian Wheezy
(SteamOS étant basée sur cette distribution).</p>
<div class="highlight"><pre><span></span><code>sudo apt-get install debootstrap
</code></pre></div>
<p><img alt="sudo apt-get install debootstrap" src="/images/steamOS2/12.png"></p>
<p>On installe ensuite notre Debian.</p>
<div class="highlight"><pre><span></span><code>sudo debootstrap --arch amd64 wheezy /media/SteamOS/ http://ftp.fr.debian.org/debian
</code></pre></div>
<p><img alt="sudo debootstrap…" src="/images/steamOS2/13.png"></p>
<p>Plus qu'à attendre, de quelques minutes à quelques heures, en fonction de
votre connexion internet.</p>
<div class="highlight"><pre><span></span><code>I: Base system installed successfully
</code></pre></div>
<p><img alt="Système de base installé" src="/images/steamOS2/14.png"></p>
<h2>C'est bon, on chroot</h2>
<p>Le système de base est installé. On va pouvoir installer SteamOS.</p>
<p>On monte trois éléments essentiels</p>
<div class="highlight"><pre><span></span><code>sudo mount /tmp /media/SteamOS/tmp -o none,bind
sudo mount /dev /media/SteamOS/dev -o none,rbind
sudo mount /proc /media/SteamOS/proc -o none,bind
</code></pre></div>
<p><img alt="Montage des partitions" src="/images/steamOS2/15.png"></p>
<p>Maintenant, on peut changer de racine (chroot = CHangeROOT)</p>
<div class="highlight"><pre><span></span><code>sudo chroot /media/SteamOS
</code></pre></div>
<p><img alt="sudo chroot /media/SteamOS" src="/images/steamOS2/16.png"></p>
<h2>On prépare l'installation</h2>
<p>Commençons par régler le problème de locale (langue à utiliser pour
l'affichage).</p>
<div class="highlight"><pre><span></span><code>export LANGUAGE=C
export LC_ALL=C
</code></pre></div>
<p><img alt="Export des variables d'environnement pour la langue par défaut" src="/images/steamOS2/17.png"></p>
<p>On ajoute les dépots steam</p>
<div class="highlight"><pre><span></span><code>nano /etc/apt/sources.list.d/steamos.list
</code></pre></div>
<p><img alt="nano /etc/apt/sources.list.d/steamos.list" src="/images/steamOS2/18.png"></p>
<p>Ajouter les lignes suivantes :</p>
<div class="highlight"><pre><span></span><code>deb http://repo.steampowered.com/steamos alchemist main contrib non-free
deb-src http://repo.steampowered.com/steamos alchemist main contrib non-free
</code></pre></div>
<p><img alt="Ajout des lignes du dépot SteamOS" src="/images/steamOS2/19.png"></p>
<p>Sortir en appuyant sur les touches Contrôle et X
Save modified buffer : répondre Y
File Name to write, appuyer sur Entrée</p>
<p><img alt="Sauvegarde dans nano (étape 1)" src="/images/steamOS2/20.png"></p>
<p><img alt="Sauvegarde dans nano (étape 2)" src="/images/steamOS2/21.png"></p>
<p><em>Note : pour enregistrer dans nano, c'est toujours les mêmes opérations. Je ne
les répéterai pas par la suite.</em></p>
<p>Ajoutons les dépots contrib et non-free de debian.</p>
<div class="highlight"><pre><span></span><code>nano /etc/apt/sources.list
</code></pre></div>
<p>Ajouter contrib non-free à la fin de la première ligne, et ajouter l'entrée
deb-src</p>
<p><em>Note : Normalement, on n'a pas besoin des sources (deb-src)</em></p>
<p><img alt="Ajout des dépots Debian supplémentaires" src="/images/steamOS2/22.png"></p>
<p>On active l'architecture 32 bits (multiarch).</p>
<div class="highlight"><pre><span></span><code>dpkg --add architecture i386
</code></pre></div>
<p><strong>Correction au 29/03/2016 :</strong>
Il s'agit de --add-architecture et non de --add architecture, avec un tiret
entre --add et architecture.</p>
<div class="highlight"><pre><span></span><code>dpkg --add-architecture i386
</code></pre></div>
<p><img alt="Activation de multiarch" src="/images/steamOS2/23.png"></p>
<p>On peut maintenant mettre à jour la liste des paquets.</p>
<div class="highlight"><pre><span></span><code>apt-get update
</code></pre></div>
<p><img alt="Mise à jour de la liste des paquets" src="/images/steamOS2/24.png"></p>
<p>Le message " GPG error […] the public key is not available…" devrait
apparaître.
Il suffit d'installer le paquet valve-archive-keyring</p>
<div class="highlight"><pre><span></span><code>apt-get install valve-archive-keyring
</code></pre></div>
<p>Au message d'alerte, répondre par y</p>
<p><img alt="" src="/images/steamOS2/25.png"></p>
<p><img alt="" src="/images/steamOS2/27.png"></p>
<p>Refaire un apt-get update pour mettre à jour les paquets et valider la clef de
valve</p>
<div class="highlight"><pre><span></span><code>apt-get update
</code></pre></div>
<p><img alt="" src="/images/steamOS2/30.png"></p>
<h2>On installe</h2>
<p>Commençons par la langue française.</p>
<div class="highlight"><pre><span></span><code>apt-get install locales
</code></pre></div>
<p><img alt="" src="/images/steamOS2/31.png"></p>
<p>Au message "do you want to continue [Y/n]", répondre par y</p>
<p><img alt="" src="/images/steamOS2/32.png"></p>
<div class="highlight"><pre><span></span><code>dpkg-reconfigure locales
</code></pre></div>
<p><img alt="" src="/images/steamOS2/34.png"></p>
<p>Descendre jusqu'à fr_FR.UTF-8 UTF-8, et appuyer sur espace pour cocher la
case.</p>
<p><img alt="" src="/images/steamOS2/35.png"></p>
<p><em>Note : Si vous êtes dans un autre pays, francophone ou non, cochez la case
qui vous correspond (fr_BE, fr_CA, fr_CH…)</em></p>
<p>Appuyer sur Entrée pour passer à l'écran suivant.</p>
<p><img alt="" src="/images/steamOS2/36.png"></p>
<p>Choisir la locale par défaut. Normalement, celle choisie précédemment.</p>
<p><img alt="" src="/images/steamOS2/37.png"></p>
<p><strong>Avant d'installer le noyau, ça peut être une bonne idée de voir les noms des
paquets qui contiennent les firmwares (non libres) du matériel. Notamment pour
la carte graphique et les cartes réseau/wifi.</strong>
<a href="https://packages.debian.org/search?suite=wheezy&searchon=names&keywords=firmware">https://packages.debian.org/search?suite=wheezy&searchon;=names&keywords;=firmware</a></p>
<p><em>Dans mon cas, il s'agit des paquets firmware-iwlwifi (wifi intel) et
firmware-realtek (rt8169)</em></p>
<div class="highlight"><pre><span></span><code>apt-get -t alchemist install linux-image-amd64 firmware-linux-nonfree firmware-iwlwifi firmware-intel
</code></pre></div>
<p><em>Oui, amd64, même si on a un processeur intel.</em></p>
<p><img alt="" src="/images/steamOS2/39.png"></p>
<p>Si vous avez un warning par rapport à un firmware non trouvé, c'est qu'il en
manque un, ou que celui choisi ne correspond pas au matériel. Il peut être
installé via la commande apt-get install [nom du paquet]</p>
<p>Le message "df: Warning: cannot read table of mounted file systems: No such
file or directory" est à ignorer. On est dans un chroot.</p>
<p><img alt="" src="/images/steamOS2/41.png"></p>
<p>Installons les mises à jour.</p>
<div class="highlight"><pre><span></span><code>apt-get upgrade
</code></pre></div>
<p><img alt="" src="/images/steamOS2/42.png"></p>
<p><img alt="" src="/images/steamOS2/43.png"></p>
<p>Installons les paquets pour Steam (moment vivement attendu).</p>
<div class="highlight"><pre><span></span><code>apt-get -t alchemist install steamos-base-files steam-launcher steamos-compositor steamos-modeswitch-inhibitor valve-wallpapers steam
</code></pre></div>
<p><img alt="" src="/images/steamOS2/46.png"></p>
<p><img alt="" src="/images/steamOS2/47.png"></p>
<p>Un repas plus tard… les paquets sont installés.</p>
<p><img alt="" src="/images/steamOS2/48.png"></p>
<p>Installation des paquets supplémentaires</p>
<div class="highlight"><pre><span></span><code>apt-get -t alchemist install libc6:i386 libgl1-mesa-dri:i386 steamos-modeswitch-inhibitor:i386 steam:i386 libtxc-dxtn-s2tc0:i386 libgl1-mesa-glx:i386 i965-va-driver:i386
</code></pre></div>
<p>Si vous avez une carte nvidia, ajouter ces paquets dans la liste des paquets à
installer :</p>
<div class="highlight"><pre><span></span><code>libgl1-nvidia-glx:i386 nvidia-vdpau-driver:i386
</code></pre></div>
<p><img alt="" src="/images/steamOS2/50.png"></p>
<p><img alt="" src="/images/steamOS2/51.png"></p>
<p>Pour le choix du clavier, choisir "Other", puis "French", et "French - French
(alternative, latin-9 only)".</p>
<p><img alt="" src="/images/steamOS2/52.png"></p>
<p><img alt="" src="/images/steamOS2/53.png"></p>
<p><img alt="" src="/images/steamOS2/55.png"></p>
<p><em>Comme je n'ai pas de carte nvidia, je peux ignorer cet écran.</em></p>
<p><img alt="" src="/images/steamOS2/56.png"></p>
<p>Installation de l'environnement de bureau (mode desktop)</p>
<div class="highlight"><pre><span></span><code>apt-get install lightdm gnome-session sudo alsa paman
</code></pre></div>
<p><img alt="" src="/images/steamOS2/57.png"></p>
<p><img alt="" src="/images/steamOS2/58.png"></p>
<p>N'oublions pas le réseau, grub (bootloader), ssh, midnight commander et htop</p>
<div class="highlight"><pre><span></span><code>apt-get install network-manager grub-pc ssh mc htop
</code></pre></div>
<p><img alt="" src="/images/steamOS2/59.png"></p>
<p>Configuration de Grub. Appuyer sur la touche Tabulation pour pouvoir se
déplacer sur OK, puis appuyer sur Entrée.</p>
<p><img alt="" src="/images/steamOS2/61.png"></p>
<p><strong>DANGER ! DANGER ! DANGER !</strong>
Installez grub sur le MBR de votre disque dur. Vérifiez trois fois avant de
valider.
Si vous avez déjà grub installé sur votre machine, ne sélectionnez aucune
partition, et passez par le grub de votre distribution. Normalement, si vous
faites cela, c'est en connaissance de cause.</p>
<p><img alt="" src="/images/steamOS2/62.png"></p>
<p>Installons console-data. Courage, on arrive bientôt à la fin.</p>
<p><img alt="" src="/images/steamOS2/63.png"></p>
<p>Choisir "Select keymap from full list", puis pc / azerty / French / Same as
X11 (latin9) / Standard</p>
<p><img alt="" src="/images/steamOS2/64.png"></p>
<p><img alt="" src="/images/steamOS2/65.png"></p>
<p><img alt="" src="/images/steamOS2/67.png"></p>
<p>L'installation en elle même est maintenant terminée</p>
<h2>Configuration</h2>
<p>Ajoutons les utilisateurs</p>
<div class="highlight"><pre><span></span><code>adduser --gecos "" --disabled-password desktop
adduser --gecos "" --disabled-password steam
</code></pre></div>
<p><img alt="" src="/images/steamOS2/68.png"></p>
<p>Ajoutons les groupes</p>
<div class="highlight"><pre><span></span><code>usermod -a -G audio,dip,video,plugdev,pulse,pulse-access desktop
usermod -a -G desktop,audio,dip,video,plugdev,pulse,pulse-access steam
</code></pre></div>
<p><img alt="" src="/images/steamOS2/69.png"></p>
<p>Définissons steamos comme session par défaut.</p>
<div class="highlight"><pre><span></span><code>/usr/lib/x86_64-linux-gnu/lightdm/lightdm-set-defaults -a steam -s steamos
</code></pre></div>
<p><img alt="" src="/images/steamOS2/70.png"></p>
<p>Je ne sais pas si ceci est nécessaire, mais c'était présent dans le post-
install.sh.</p>
<div class="highlight"><pre><span></span><code>date > /etc/skel/.imageversion
cp /etc/skel/.imageversion /home/steam/.imageversion
</code></pre></div>
<p><img alt="" src="/images/steamOS2/71.png"></p>
<p>Paramétrons le fuseau horaire</p>
<div class="highlight"><pre><span></span><code>dpkg-reconfigure tzdata
</code></pre></div>
<p><img alt="" src="/images/steamOS2/72.png"></p>
<p>Choisir Europe puis Paris (À adapter suivant votre fuseau horaire, bien
entendu).</p>
<p><img alt="" src="/images/steamOS2/73.png"></p>
<p><img alt="" src="/images/steamOS2/74.png"></p>
<p><img alt="" src="/images/steamOS2/75.png"></p>
<p>Note : il peut y avoir des conflits d'heure si Windows est installé sur la
même machine. En effet, ce dernier règle l'horloge sur l'heure locale, et
Linux sur l'heure UTC. La définition du fuseau horaire indique le décalage
dont il faut tenir compte pour l'affichage de la date.</p>
<p>Configuration des points de montage</p>
<p>Éditer le fichier /etc/fstab</p>
<div class="highlight"><pre><span></span><code>nano /etc/fstab
</code></pre></div>
<p>Insérer les lignes suivantes dans ce fichier :</p>
<div class="highlight"><pre><span></span><code># /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
/dev/sda7 / ext4 errors=remount-ro,noatime 0 1
/dev/sda5 none swap sw 0 0
devpts /dev/pts devpts defaults 0 0
shm /run/shm tmpfs nodev,nosuid 0 0
tmpfs /tmp tmpfs nodev,nosuid,noatime,nodiratime,size=2000M,mode=1777 0 0
none /sys/kernel/debug debugfs defaults 0 0
</code></pre></div>
<p>Remplacer sda7 par votre partition contenant SteamOS, et sda5 par celle
contenant le swap.</p>
<p><img alt="" src="/images/steamOS2/76.png"></p>
<p><img alt="" src="/images/steamOS2/77.png"></p>
<p>Plus qu'à définir le mot de passe root.</p>
<div class="highlight"><pre><span></span><code>passwd
</code></pre></div>
<p><img alt="" src="/images/steamOS2/78.png"></p>
<h2>C'est bon ? On reboot ?</h2>
<p>Taper exit (ou appuyez sur ctrl + d) pour sortir du chroot, puis du terminal.</p>
<p>Redémarrer l'ordinateur.</p>
<p>Si tout se passe bien, vous devriez voir un écran sur fond gris, avec la
mention Steam sur la gauche, et une barre de progression indiquant le
téléchargement des mises à jour Steam (~ 210 Mo)</p>
<p><img alt="" src="/images/steamOS2/img1.jpg"></p>
<p>Puis, arrivée sur Steam.</p>
<p><img alt="" src="/images/steamOS2/img2.jpg"></p>
<p>Choix de la langue.</p>
<p><img alt="" src="/images/steamOS2/img3.jpg"></p>
<p>Contrat de licence.</p>
<p><img alt="" src="/images/steamOS2/img4.jpg"></p>
<p>Ajustement de l'écran.</p>
<p><img alt="" src="/images/steamOS2/img5.jpg"></p>
<p>Écran de connexion.</p>
<p><img alt="" src="/images/steamOS2/img6.jpg"></p>
<p>Session ouverte.</p>
<p><img alt="" src="/images/steamOS2/img7.jpg"></p>
<p>Infos système. Carte graphique active : Intel.</p>
<p><img alt="" src="/images/steamOS2/img8.jpg"></p>
<p>Activation du bureau (en fait, un Gnome 3.4 :/)</p>
<p><img alt="" src="/images/steamOS2/img9.jpg"></p>
<p>Sortie audio : c'est pas la bonne carte (il y en a deux sur ce pc portable.)</p>
<p><img alt="" src="/images/steamOS2/img10.jpg"></p>
<p>Changeons de carte son.</p>
<p><img alt="" src="/images/steamOS2/img11.jpg"></p>
<p>Branchement à chaud de la manette. Celle-ci est bien reconnue, et un appui sur
le (X) central ouvre le menu :)</p>
<p><img alt="" src="/images/steamOS2/img12.jpg"></p>
<p>Parcours du magasin.</p>
<p><img alt="" src="/images/steamOS2/img13.jpg"></p>
<p>Choix et téléchargement.</p>
<p><img alt="" src="/images/steamOS2/img14.jpg"></p>
<p>Téléchargement en cours…</p>
<h2>Conclusion</h2>
<p>J'ai passé quasiment chaque soir depuis l'annonce pour tester l'installation
de SteamOS, en essayant différentes méthodes. Parfois, sans succès.</p>
<p>Cependant, ça m'a permis de voir les différents pièges qui peuvent survenir
pendant l'installation.</p>
<p>L'installation s'est bien déroulée hier soir (vendredi), à une faute de frappe
près, pour la configuration de lightdm (staemos au lieu de steamos).</p>
<p>Je suis donc parti de mon tuto d'hier pour créer celui présent dans cet
article, en formatant la partition, et en prenant des captures d'écran à
chaque étape.</p>
<p>Tout fonctionne, aussi bien le branchement à chaud de ma manette xbox 360 que
le son. D'ailleurs, pendant le téléchargement, on a un chant des baleines :)</p>
<p>Maintenant, à vous de tester. Bon courage et bonne chance.</p>SteamOS (annonce)2015-04-13T00:00:00+02:002015-04-13T00:00:00+02:00alextag:blog.chibi-nah.fr,2015-04-13:/steamos-annonce<p>Je sais que j'ai déjà écrit un article en <a href="https://blog.chibi-nah.fr/steamos">décembre 2013</a>, mais qu'en est-il aujourd'hui ?</p>
<p>Cette fois, j'essaierai d'écrire un tutoriel complet et non juste les grandes
lignes.</p>
<p>Cet article devrait être terminé d'ici la fin de la semaine 16 (donc d'ici
dimanche 19 avril).</p>
<p><strong>Édition au 18 avril :</strong> défi …</p><p>Je sais que j'ai déjà écrit un article en <a href="https://blog.chibi-nah.fr/steamos">décembre 2013</a>, mais qu'en est-il aujourd'hui ?</p>
<p>Cette fois, j'essaierai d'écrire un tutoriel complet et non juste les grandes
lignes.</p>
<p>Cet article devrait être terminé d'ici la fin de la semaine 16 (donc d'ici
dimanche 19 avril).</p>
<p><strong>Édition au 18 avril :</strong> défi réussi, le tutoriel est en ligne :)</p>
<p><a href="https://blog.chibi-nah.fr/tuto-installation-steamos">https://blog.chibi-nah.fr/tuto-installation-steamos</a></p>Afficher de manière classe des notes de bas de page dans un tooltip2015-01-05T00:00:00+01:002015-01-05T00:00:00+01:00alextag:blog.chibi-nah.fr,2015-01-05:/afficher-de-maniere-classe-des-notes-de-bas-de-page-en-tooltip<p>Ou comment je fais pour afficher les « notes de bas de page » au milieu du
texte, au survol de la souris ou au tapotement sur mobile/GSM, sur le site <a href="http://nouvelles.chibi-nah.fr/">de
mes nouvelles</a>.</p>
<p><a href="/images/tooltip/snap.png"><img alt="Capture d'écran d'un téléphone Android, affichant le navigateur Firefox,
ouvert sur la page des nouvelles, avec le tooltip « 1 : Note : les gobelins
s'affairent TOUJOURS auprès d'une étrange machine »
affiché." src="/images/tooltip/snap-t.png"></a> Affichage du site sur Mozilla Firefox sur
Android.</p>
<p>Sur le principe, c'est vraiment stupide. C'est simplement l'utilisation …</p><p>Ou comment je fais pour afficher les « notes de bas de page » au milieu du
texte, au survol de la souris ou au tapotement sur mobile/GSM, sur le site <a href="http://nouvelles.chibi-nah.fr/">de
mes nouvelles</a>.</p>
<p><a href="/images/tooltip/snap.png"><img alt="Capture d'écran d'un téléphone Android, affichant le navigateur Firefox,
ouvert sur la page des nouvelles, avec le tooltip « 1 : Note : les gobelins
s'affairent TOUJOURS auprès d'une étrange machine »
affiché." src="/images/tooltip/snap-t.png"></a> Affichage du site sur Mozilla Firefox sur
Android.</p>
<p>Sur le principe, c'est vraiment stupide. C'est simplement l'utilisation de la
classe « tooltip » sur la balise « a », et la définition arbitraire d'un
attribut « tooltip », contenant le texte à afficher.</p>
<p>Concrètement, dans le texte, j'ajoute une ligne comme ceci :</p>
<div class="highlight"><pre><span></span><code><a href="http://nouvelles.chibi-nah.fr/ucdle3#a1" class="tooltip" tooltip="1 : Note : les gobelins s'affairent TOUJOURS auprès d'une étrange machine." >[1]</a>
</code></pre></div>
<p>Note : le contenu de href n'a pas d'importance (à priori).
Et la définition de tooltip en css :</p>
<div class="highlight"><pre><span></span><code>a.tooltip
{
position: relative;
}
a.tooltip:hover:after
{
background: #333;
background: rgba(0,0,0,.8);
border-radius: 5px;
color: #fff;
content: attr(tooltip);
padding: 5px 15px;
display: block;
z-index: 98;
position: relative;
}
</code></pre></div>
<p>Pourquoi l'afficher comme ça et non comme les tooltips classiques avec des
triangles que l'on voit dans tous les exemples ? <a href="https://blog.chibi-nah.fr/afficher-de-maniere-classe-des-notes-de-bas-de-page-en-tooltip#a1">[1]</a>
C'est juste une histoire de compromis. Le but étant un affichage simple et
optimisé sur mobile.</p>
<p>Je sais, ça reste du bidouillage pas vraiment "propre", mais ça marche.</p>
<hr>
<p>1 : Tapez tooltip html5 dans votre moteur de recherche favori, vous trouverez
facilement.</p>Duke Nukem 3D, EDuke 32, Steam et GNU/Linux2014-12-14T00:00:00+01:002014-12-14T00:00:00+01:00alextag:blog.chibi-nah.fr,2014-12-14:/duke-nukem-3d-eduke-32-steam-et-gnu-linux<p>Cet article va parler de trois choses différentes mais liées :</p>
<ul>
<li>Duke Nukem 3D édition atomique</li>
<li>EDuke32, et l'utilisation du Roland SC-55 pour jouer les musiques midi</li>
<li>Le lancement de EDuke32 via Steam, sous GNU/Linux</li>
</ul>
<hr>
<h3>Duke Nukem 3D édition atomique</h3>
<p><a href="/images/duke3d/duke0002.jpg"><img alt="Écran titre du jeu Duke Nukem 3D, en version haute
définition." src="/images/duke3d/duke0002.jpg"></a> Admirez l'écran titre.</p>
<p>Le moyen le plus simple pour avoir …</p><p>Cet article va parler de trois choses différentes mais liées :</p>
<ul>
<li>Duke Nukem 3D édition atomique</li>
<li>EDuke32, et l'utilisation du Roland SC-55 pour jouer les musiques midi</li>
<li>Le lancement de EDuke32 via Steam, sous GNU/Linux</li>
</ul>
<hr>
<h3>Duke Nukem 3D édition atomique</h3>
<p><a href="/images/duke3d/duke0002.jpg"><img alt="Écran titre du jeu Duke Nukem 3D, en version haute
définition." src="/images/duke3d/duke0002.jpg"></a> Admirez l'écran titre.</p>
<p>Le moyen le plus simple pour avoir les fichiers de données du jeu, de manière
« légale », c'est d'acheter Duke Nukem 3D, via GOG ou Steam.</p>
<p>Sachant que le moteur 3D est libre/open source, on n'aura pas besoin de
l'exécutable fourni avec le jeu.</p>
<p>Pour profiter pleinement du jeu, deux possibilités :</p>
<ul>
<li>Soit la jouer old-school, et lancer le jeu via Dosbox (640×400 max, sensations de l'époque garantie). Tous les fichiers de l'édition MS-DOS sont présents dans le répertoire « classic » sous « gameroot ». <a href="/images/duke3d/duke3D-Dosbox.png"><img alt="Capture d'écran du jeu sous Dosbox." src="/images/duke3d/duke3D-Dosbox.png"></a> Le jeu sous Dosbox, en 640×400.</li>
<li>Soit profiter de l'évolution technologique, et utiliser <a href="http://eduke32.com/">EDuke32</a> avec <a href="http://hrp.duke4.net/about.php">HRP (High Resolution Pack</a>). Accessoirement, c'est le seul moyen de pouvoir y jouer dans des conditions « décentes », genre, en 1920x1200 :D <a href="/images/duke3d/duke0016.jpg"><img alt="Capture d'écran du jeu via EDuke32." src="/images/duke3d/duke0016.jpg"></a> Le jeu sous EDuke32, en 1920×1200.</li>
</ul>
<p>Ce pack contient :</p>
<ul>
<li>Les textures en haute résolution, ainsi que les modèles 3D (désactivables pour passer en mode sprites).</li>
<li>Les musiques enregistrées depuis un expandeur Roland Sound Canvas SC-55.</li>
<li>Optionnellement, un mode XXX (dont je tairai les détails, je vous laisse deviner ce que ça peut être. Le jeu passe en classé 18+ ou M for Mature).
*</li>
</ul>
<hr>
<h3>EDuke32, et l'utilisation du Roland SC-55 pour jouer les musiques midi</h3>
<p>Bon, les musiques enregistrées, c'est bien, mais moi, j'ai un SC-55 sous la
main, branché en midi sur mon ordi, le tout sous GNU/Linux. Je fais comment ?</p>
<p>Via la ligne de commande, comme ça :</p>
<div class="highlight"><pre><span></span><code>export EDUKE32_MUSIC_CMD="pmidi"
export ALSA_OUTPUT_PORTS=$(aplaymidi -l | grep "USB Uno" | cut -f2 -d " ")
/usr/games/eduke32
</code></pre></div>
<p>On exporte la <a href="http://fr.wikipedia.org/wiki/Variable_d%27environnement">variable
d'environnement</a>
EDUKE32_MUSIC_CMD, pour dire au jeu qu'il faut passer par pmidi pour jouer les
musiques.</p>
<p>Accessoirement, ALSA_OUTPUT_PORTS contient 24:0 ou 28:0, en fonction du port
midi défini dans
<a href="http://fr.wikipedia.org/wiki/Advanced_Linux_sound_architecture">ALSA</a>. Pour
trouver facilement cette valeur, j'ai juste à énumérer tous les ports midi
présents, et de filtrer pour trouver celui qui correspond à mon interface midi
USB (donc, ici, "USB Uno").</p>
<p>Non, le port midi n'est pas le lieu où on va immatriculer une galère.</p>
<p>Reste à démarrer le jeu, et de profiter des musiques dans les meilleures
conditions.</p>
<hr>
<h3>Le lancement de EDuke32 via Steam, sous GNU/Linux</h3>
<p>Et pour le lancer via steam ?</p>
<p>Si vous êtes en 64 bits, il va y avoir un problème.</p>
<p>En effet, le jeu va tenter de démarrer, mais va se figer au démarrage, voire
même, ne démarre pas du tout. Pourquoi ?</p>
<p>D'abord, espionnons un peu ce que fait steam, quand il démarre une appli (en
gros, lançons le jeu via un script, et copions un printenv quelque part).</p>
<p>Voilà ce que j'ai obtenu :</p>
<div class="highlight"><pre><span></span><code>SHELL=/bin/bash
STEAM_RUNTIME=0
LD_PRELOAD=:/home/alex/.steam/ubuntu12_32/gameoverlayrenderer.so:/home/alex/.steam/ubuntu12_64/gameoverlayrenderer.so
LD_LIBRARY_PATH=:/home/alex/.steam/ubuntu12_32:/home/alex/.steam/ubuntu12_64:/usr/local/games/:/usr/local/games//bin
</code></pre></div>
<p><strong>Pas bon.</strong></p>
<p>L'overlay est chargé en 32 et en 64 bits… donc, une chance sur deux que ça
foire.</p>
<p>La variable d'environnement LD_LIBRARY_PATH, qui contient les chemins vers les
libs (.so) est modifiée. Les libs sont celles fournies par Steam.</p>
<p>Si je lance le jeu avec ces variables d'environnement depuis une console, les
messages d'erreurs sont carrément explicites.</p>
<div class="highlight"><pre><span></span><code>ERROR: ld.so: object '/home/alex/.steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
ERROR: ld.so: object '/home/alex/.steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
ERROR: ld.so: object '/home/alex/.steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
libGL error: failed to load driver: r600
libGL error: Try again with LIBGL_DEBUG=verbose for more details.
libGL error: failed to load driver: swrast
libGL error: Try again with LIBGL_DEBUG=verbose for more details.
The program 'eduke32' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadValue (integer parameter out of range for operation)'.
(Details: serial 30 error_code 2 request_code 156 minor_code 3)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)
</code></pre></div>
<p>Donc, il suffit d'écraser les variables modifiées par les bonnes valeurs, et
le tour est joué.</p>
<p>J'en profite pour ajouter le support du midi, comme précisé plus haut.</p>
<p>Le script final, qui me permet de lancer le jeu via steam :</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="c1">#Variables d'environnement pour jouer les musiques via pmidi, sur le SC-55 branché sur un M-Audio MIDI USB UNO</span>
<span class="nb">export</span><span class="w"> </span><span class="nv">EDUKE32_MUSIC_CMD</span><span class="o">=</span><span class="s2">"pmidi"</span>
<span class="nb">export</span><span class="w"> </span><span class="nv">ALSA_OUTPUT_PORTS</span><span class="o">=</span><span class="k">$(</span>aplaymidi<span class="w"> </span>-l<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span><span class="s2">"USB Uno"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>cut<span class="w"> </span>-f2<span class="w"> </span>-d<span class="w"> </span><span class="s2">" "</span><span class="k">)</span>
<span class="c1">#Je remplace les chemins par les « bons »</span>
<span class="nb">export</span><span class="w"> </span><span class="nv">LD_PRELOAD</span><span class="o">=</span>:/home/alex/.steam/ubuntu12_64/gameoverlayrenderer.so
<span class="nb">export</span><span class="w"> </span><span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span>:/usr/lib/x86_64-linux-gnu/libfakeroot:/lib/i386-linux-gnu:/usr/lib/i386-linux-gnu:/lib/i586-linux-gnu:/usr/lib/i586-linux-gnu:/usr/local/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/lib32:/usr/lib32
<span class="c1">#Utilisé pour les mises au point.</span>
<span class="c1">#printenv > /home/alex/env.txt</span>
<span class="c1">#On initialise le SC-55 via un fichier midi contenant les sysex requis</span>
aplaymidi<span class="w"> </span>/usr/local/games/initSC.mid
<span class="c1">#On lance le jeu</span>
/usr/games/eduke32
<span class="c1">#Réinitialisation du SC-55, pour couper toutes les notes (all notes off)</span>
aplaymidi<span class="w"> </span>/usr/local/games/initSC.mid
</code></pre></div>
<hr>
<p>Pour finir, quelques images du jeu.</p>
<p><a href="/images/duke3d/duke0011.jpg"><img alt="Une capture d'écran du jeu Duke Nukem 3D, montrant l'un des ennemis, un
genre de sanglier humanoïde aux yeux rouges, avec un fusil à pompe et une
tenue de policier américain." src="/images/duke3d/duke0011.jpg"></a> Comme il est joli ce FLI… ce L.A.R.D.
<a href="/images/duke3d/duke0014.jpg"><img alt="Une capture d'écran du jeu Duke Nukem 3D, montrant plusieurs des ennemis
précédemment désignés, abattus par Duke lui-même." src="/images/duke3d/duke0014.jpg"></a> Je cite Johnny BAbrioli : « Je t'avais dit
Crève, sale alien ! »
<a href="/images/duke3d/duke0017.jpg"><img alt="Une capture d'écran du jeu Duke Nukem 3D, montrant un extraterrestre de
près." src="/images/duke3d/duke0017.jpg"></a> Je ne sais pas ce que tu me veux, mais
j'espère que tu ne va pas me faire un bisou.
<a href="/images/duke3d/duke0010.jpg"><img alt="Une capture d'écran du jeu Duke Nukem 3D, montrant Duke se regardant dans
un miroir, un fusil à pompe à la main." src="/images/duke3d/duke0010.jpg"></a> Damn… I'm looking good !</p>Arpégiateur sur le Roland GAIA SH-01.2014-10-19T00:00:00+02:002014-10-19T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-10-19:/arpegiateur<p>En m'amusant avec ce synthé, je n'ai pas pu m'empêcher de jouer avec
l'arpégiateur. Et là, je me suis demandé : est-il possible de créer ses
propres séquences et de les stocker avec le patch ?</p>
<p>En un mot : oui.</p>
<p><strong>MAIS</strong> , pas directement sur le synthétiseur.</p>
<p>Il y a bien une fonction …</p><p>En m'amusant avec ce synthé, je n'ai pas pu m'empêcher de jouer avec
l'arpégiateur. Et là, je me suis demandé : est-il possible de créer ses
propres séquences et de les stocker avec le patch ?</p>
<p>En un mot : oui.</p>
<p><strong>MAIS</strong> , pas directement sur le synthétiseur.</p>
<p>Il y a bien une fonction d'enregistrement de phrase, qui permet d'enregistrer
les notes jouées et les paramètres modifiés (filtres), mais c'est plutôt
limité, au niveau édition. Rappel : Sur le Gaia, il n'y a <a href="http://www.rolandus.com/products/details/1074">pas
d'écran</a>.</p>
<p>Donc, réinitialisons les paramètres sur le synthé (via shift + write), puis,
utilisons cet excellent outil qu'est <a href="http://www.grauw.nl/projects/gaia-tool/">Gaia
Tool</a> [1].</p>
<p>Le paramétrer pour la communication (via USB) avec le synthé, puis allons sur
"Temporary Patch", puis onglet "Arpeggio".</p>
<p>On a accès aux arpèges de base, comme note montante, descendante… et
<strong>surtout</strong> , on a accès à l'éditeur d'arpèges (qui tient plus du séquenceur
[2] que de l'arpège, de mon point de vue).</p>
<p><img alt="Capture d'écran de Gaia Tool, montrant l'éditeur
d'arpèges." src="/images/mao8/arpeges.png"></p>
<p>Pour éviter d'entrer dans pleins d'explications, le plus simple, c'est de
faire une démonstration, en vidéo. Les sons proviennent du synthé.</p>
<p>Changeons un peu de "Popcorn" pour le "Hello World" (c'est pas que j'en ai
marre, mais presque). Utilisons plutôt Funkytown (ou une mélodie s'en
approchant :D).</p>
<p>D'abord, définir les notes qui seront jouées, tout en sachant qu'on peut les
ajouter au fur et à mesure, l'ordre n'ayant pas de sens.</p>
<p>Puis ajoutons les "notes". Ici, les valeurs indiquent la vélocité (0 =
silence, 127 = maximum).</p>
<p>Activer l'arpégiateur sur le synthé (si ce n'est déjà fait), puis appuyer sur
une note (dans mon cas : C5, ou Do 5). Ne pas oublier de sélectionner le mode
"Phrase", comme motif.</p>
<p>Ajouter/corriger les notes, pour la mélodie.</p>
<p>La séquence s'enregistre au fur et à mesure dans la mémoire temporaire du
synthé. Pour la sauvegarder, soit l'enregistrer sur l'ordinateur via Gaia
tool, soit sauvegarder sur le synthé en même temps que le patch. Dans ce
dernier cas, on peut utiliser la séquence sans ordinateur (pratique, pour le
live par exemple).</p>
<hr>
<p>1 : logiciel libre, multi-plateforme (java), comprenant le chargement et
l'enregistrement de patches (ensemble des paramètres pour produire un son) sur
son ordinateur, la lecture et le chargement des patches disponibles sur
<a href="http://axial.roland.com/category/gaia/">Axial</a>, et un éditeur d'arpèges.
2 : séquenceur, ou Step Sequencer.</p>Le zglort2014-10-18T00:00:00+02:002014-10-18T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-10-18:/le-zglort<p>Non, ceci n'est pas lié à l'histoire du <a href="http://nouvelles.chibi-nah.fr/le-zglort">Zglort</a>, de près ou de loin (quoique).
Je vais plutôt expliquer comment j'ai produit le son que l'on peut écouter au
milieu de la lecture.</p>
<p><strong>Attention</strong> : cet article contient énormément de termes liés au domaine des
synthétiseurs. <strong>Si vous ne comprenez rien …</strong></p><p>Non, ceci n'est pas lié à l'histoire du <a href="http://nouvelles.chibi-nah.fr/le-zglort">Zglort</a>, de près ou de loin (quoique).
Je vais plutôt expliquer comment j'ai produit le son que l'on peut écouter au
milieu de la lecture.</p>
<p><strong>Attention</strong> : cet article contient énormément de termes liés au domaine des
synthétiseurs. <strong>Si vous ne comprenez rien, c'est normal</strong>. Une écoute ou
réécoute de <a href="http://lessondiers.knarfworld.net/emission/avr/6-synth%C3%A9tiseurs">l'émission n°6 des
Sondiers</a>
sur les synthétiseurs ne fera pas de mal, pour comprendre le contenu de cet
article.</p>
<p>Note : l'article a été corrigé (confondre dry et wet… c'est grave. On va dire
que c'est du au manque de sommeil.)</p>
<p>Remarque : le seul logiciel utilisé est Audacity (pour l'enregistrement et
l'amplification des sons). Tous les sons et effets ont été produit via un
synthétiseur [1].</p>
<p>Pour donner l'illusion d'un ordinateur générant du son, quoi de mieux que
d'utiliser le <a href="http://www.soundonsound.com/sos/aug00/articles/synthsec.htm">Sample and
Hold</a> [2] ? En
effet, le S&H; permet de générer facilement des notes de manière aléatoire.</p>
<p>Cela donne alors ce son :</p>
<p>Pour l'obtenir, je suis parti d'une onde de type PW (pulse width) [3], avec un
filtre coupe-haut [4] (avec une pente à -24dB/octave [5]) et un peu de
résonance [6]. La modulation est faite avec le LFO [7] (Low Frequency
Oscillator), assigné au "pitch" [8], réglé en mode S&H;, synchronisé avec le
tempo. [9]</p>
<p>Puis, pour donner un peu plus de relief, j'ai ajouté une seconde couche (en
fait, la première, le S&H; étant sur la seconde), toujours une onde de type
PW, réglée de la même manière (en fait, seule la forme d'onde diffère
légèrement), avec des paramètres similaire pour le filtre. Cette fois, le LFO
est réglé en mode "random" (utilisation d'une forme aléatoire, changeant
régulièrement), et également assigné au pitch. Ce LFO est également
synchronisé avec le tempo.</p>
<p>Cela donne alors ce son :</p>
<p>J'ai donc,</p>
<ul>
<li>sur la couche 1 : une onde PW, avec le LFO en mode random.</li>
<li>sur la couche 2 : une onde PW, avec le LFO en mode Sample and Hold</li>
</ul>
<p>Il manque quelque chose.</p>
<p>Que pourrait-on entendre sur un vaisseau spatial ? (de l'intérieur, bien
entendu)… Le bruit d'un réacteur ?</p>
<p>Donc, ajoutons une troisième couche.</p>
<p>Partons cette fois d'un générateur de bruit blanc [10]. Jouons sur le cut-off
pour obtenir un son sourd. Ajoutons une légère modulation sur le filtre. Pour
faire varier le "ton" du réacteur, j'ai juste à tourner le potard "key
follow", qui me permet de modifier légèrement la fréquence de coupure du
filtre (comme ça, je ne touche pas au réglage du filtre en lui même).</p>
<p>Cela donne alors ce son :</p>
<p>Ça commence à prendre forme.</p>
<p>Ajoutons un peu de "Panning Delay" [11], pour donner un léger relief stéréo,
également synchronisé avec le tempo, et réglons le "Pitch Shifter" [12] de
manière à avoir, un effet de "chœur" (ou chorus). Faire quand même attention
au<s>déphasage</s>désaccordage (detune). Cela permet également de donner
l'illusion qu'il y a plusieurs sons produits en même temps (pensez aux accord,
de trompette par exemple [13])</p>
<p>Superposons progressivement les sons (activons donc les couches une par une,
ou désactivons-les), et voyons voir ce que cela donne :</p>
<p>D'abord, les couches séparément :</p>
<p>Random</p>
<p>Sample and Hold</p>
<p>Bruit blanc</p>
<p>Les trois couches, activées (et additionnées) une par une, puis désactivées
une par une. D'abord, sans les effets, puis avec les effets.</p>
<p>Ça ne ressemble pas tout à fait à celui utilisé dans la nouvelle ? C'est
normal, et ce, pour deux raisons :</p>
<div class="highlight"><pre><span></span><code>* La première : je n'ai pas joué la même note (fondamentale) entre la nouvelle et les exemples (c'est la même note pour tous les exemples).
* La seconde : le Sample and Hold et le Random générant des oscillations complètement aléatoires, c'est impossible de reproduire exactement les mêmes sons.
</code></pre></div>
<p>Au final :</p>
<div class="highlight"><pre><span></span><code>* sur la couche 1 : une onde PW, avec le LFO en mode random.
* sur la couche 2 : une onde PW, avec le LFO en mode Sample and Hold
* sur la couche 3 : un bruit blanc.
</code></pre></div>
<p>Bonus complètement inutile, le patch pour reproduire ce son : <a href="/images/mao7/IA-Vaisseau.gaia">IA-
Vaisseau.gaia</a> [14]</p>
<hr>
<p>1 : Un <a href="http://fr.audiofanzine.com/synthe-modelisation/roland/gaia-sh-01/">Roland Gaia SH-01</a>. C'est un synthé numérique ("à modélisation
analogique"), clavier 3 octaves, sans écran, rempli de potards (11), de
sliders (18) et de boutons qui clignotent (58). Ça fait un beau sapin de noël
dans le noir.
2 : Sample and Hold. Une méthode simple, c'est d’échantillonner du bruit blanc
(sample), et de stocker cette valeur pendant un court instant (hold). Valeur
aléatoire garantie :)
3 : Une forme d'onde de base, pour produire un son type "8 bits". Cette forme
d'onde peut être modulée avec le LFO (PWM).
4 : Filtre coupe haut, ou passe bas. Aussi connu sous le nom de CUT-OFF.
5 : Pente : il s'agit de la pente de la coupure. Un filtre de premier ordre
permet d'atténuer de 6 dB par octave. Un filtre de second ordre, de 12 dB/o,
etc. Plus la pente est "raide", plus la coupure est brutale (et plus le filtre
coute cher, car difficile à fabriquer, si mes souvenirs des cours de Physique
Appliquée sont encore bons).
6 : Sur les premiers cut-off, il y avait un phénomène, appelé résonance. Au
niveau de la fréquence de coupure, au lieu d'atténuer le son, celui-ci était
légèrement amplifié sur une petite plage de fréquence. Cela fait vraiment
partie des sons typiques de la synthèse soustractive. Plus de détails :
<a href="http://www.soundonsound.com/sos/oct99/articles/synthsecrets.htm">http://www.soundonsound.com/sos/oct99/articles/synthsecrets.htm</a>
7 : Le LFO, ou Oscillateur à Basse Fréquence. C'est un générateur de fréquence
(par exemple, une oscillation toutes les 3 secondes, qui est utilisé pour
modifier un son dans le temps. Par exemple, pour modifier la hauteur de la
note, le volume, …
8 : Pitch. Ou la hauteur de la note. Pensez au Pitch Bend, la petite molette
sur le clavier qui permet de changer la hauteur de la note :)
9 : J'utilise le tempo pour synchroniser les deux LFO sur deux couches. Le
Gaia en possédant 3 (appelé Tone). Chaque couche contient son propre LFO, son
propre oscillateur, son propre filtre et amp (avec les différentes enveloppes
ADSR). Les couches sont indépendantes les unes des autres, mais on peut
toutefois utiliser la couche 2 en mode Synchro ou en mode Modulation en
Anneaux (Ring Modulator) avec la couche 1.
10 : Bruit blanc. Ce son caractéristique que vous obtenez sur n'importe quelle
radio n'étant pas réglée sur la fréquence d'une station de radio (idem pour la
télévision analogique… pas de bol, on a plus que du numérique de nos jours).
11 : Panning delay : un effet d'écho, jouant sur la stéréo (un coup à gauche,
un coup à droite. Je l'ai synchronisé avec le tempo.
12 : Pitch shifter : cela ajoute des "notes" supplémentaires, un peu comme un
chœur/chorale/chorus. On peut désaccorder aussi les notes, mais attention à la
cacophonie
13 : On est #trolldi, c'est donc permis. D'ailleurs, si vous arrivez à faire
un accord avec une seule trompette, prévenez-moi.
14 : Nécessite bien entendu un Gaia, et le logiciel <a href="http://www.grauw.nl/projects/gaia-tool/">gaia-
tools</a> pour le charger sur le
synthétiseur.</p>Sansa clip+ et fichiers midi2014-10-05T00:00:00+02:002014-10-05T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-10-05:/sansa-clip-et-fichiers-midi<p>Édit 06.10.2014 23h35: réenregistrement (audio uniquement) des musiques
jouées.</p>
<p>Un article<s>court</s>expliquant que ce petit lecteur, ne payant pas de mine,
et ne coutant pas cher, sait également interpréter des fichiers midi.</p>
<p>Question bidouillabilité, je me demande où ça va s'arrêter, parce que ça
devient de pire …</p><p>Édit 06.10.2014 23h35: réenregistrement (audio uniquement) des musiques
jouées.</p>
<p>Un article<s>court</s>expliquant que ce petit lecteur, ne payant pas de mine,
et ne coutant pas cher, sait également interpréter des fichiers midi.</p>
<p>Question bidouillabilité, je me demande où ça va s'arrêter, parce que ça
devient de pire en pire.</p>
<p>Autant, permettre la lecture des fichiers audio, genre MP3, WMA, c'est normal.
OGG/Vorbis et Flac, c'est moins courant.</p>
<p>Via Rockbox, supporter également le format monkey audio (ape), et autres
formats exotiques, notamment ceux provenant du monde du jeu vidéo, comme le
format ADX (<a href="http://en.wikipedia.org/wiki/ADX_%28file_format%29">http://en.wikipedia.org/wiki/ADX_%28file_format%29</a>), ou le
format SPC (<a href="http://en.wikipedia.org/wiki/Nintendo_S-SMP">http://en.wikipedia.org/wiki/Nintendo_S-SMP</a>)… là, ça commence à
être exceptionnel [1].</p>
<p>Avoir des jeux, un émulateur Game Boy dessus, ainsi que Doom (injouable, à
cause de l'écran monochrome, mais là, c'est plus pour la prouesse technique),
là, ça commence à être n'importe quoi</p>
<p>Désormais, ce lecteur est capable de jouer les fichiers midi. Oui, ceux là
même, utilisés en musique/MAO.</p>
<p>La seule difficulté est de trouver le compromis entre qualité des patches (les
instruments) et la taille (consommation mémoire).</p>
<p>En effet, ici, on est sur de l'embarqué et non sur PC. On ne peut pas dire :
bon, je vais charger SGM.sf2 (qui fait dans les 250 Mo), voire Crisis (1,5
Go), et le lecteur pourra se débrouiller avec. Ici, si on a 4 Mo de ram, on a
beaucoup de chance (tenir compte des buffers audio, des codecs/DSP, de l'OS,
de la gestion des disques, etc).</p>
<p>Pour les patches, on ne peut pas utiliser le format SF2, qui est un format
pourtant très répandu. Je pense que c'est pour une question de mémoire. En
effet, il faudrait charger toute la soundfont, ce qui peut être ridicule,
surtout si la partition n'utilise que deux (types d')instruments, comme les
percussions et les cordes.</p>
<p>Ici, regardons plutôt dans le domaine de l'histoire de la musique de jeux
vidéo sur PC, notamment la carte Gravis Ultrasound
<a href="http://en.wikipedia.org/wiki/Gravis_Ultrasound">http://en.wikipedia.org/wiki/Gravis_Ultrasound</a>. En effet, cette carte avait
une particularité, c'était la possibilité de stocker les formes d'ondes (ou
les samples des instruments) sur le disque dur de la machine, et non sur une
mémoire de stockage (sur ROM). Les fameux fichiers .PAT.</p>
<p>À l'époque (1992), au démarrage de la machine sous MS-DOS, un programme
résident (TSR) était lancé automatiquement, et chargeait dans la mémoire (RAM)
de la carte son, les instruments (pat) que la carte jouerait. Les développeurs
de jeu pouvaient également ne pas imposer l'utilisation de ce TSR, et
chargeaient alors leurs propres instruments au démarrage du jeu, sur la carte.</p>
<p>Le gros avantage de cette méthode, c'est que l'on n'est pas limité par les
instruments préinstallés dans la carte.</p>
<p>Quelques années plus tard, Creative Labs sortira à son tour, une carte
permettant de charger des instruments de manière dynamique dans sa mémoire, la
Sound Blaster AWE32… mais ceci est une autre histoire.</p>
<p>Du coup, quel rapport entre cette carte son (la GUS, Gravis Ultra Sound) et le
lecteur "MP3" qui peut jouer des fichiers midi ?</p>
<p>Simplement le format des instruments, les fichiers .PAT Cf.
<a href="http://www.rockbox.org/wiki/PluginMidiPlay">http://www.rockbox.org/wiki/PluginMidiPlay</a> sont utilisables directement avec
Rockbox.</p>
<p>À noter : Timidity (sous GNU/Linux) peut également utiliser les patches GUS
comme instruments pour la synthèse midi.</p>
<p>Donc, récupérons quelques patches (trouvable facilement à coup de moteur de
recherche), et commençons les tests. Penser d'abord à installer les .pat et
.cfg dans <em>/.rockbox/patchset/</em> , sinon, ça ne risque pas de marcher.</p>
<p>Suivant les fichiers midi joués (nombres d'instruments utilisés notamment), il
se peut que le lecteur plante sur une erreur MALLOC.
<img alt="Clip+ affichant le message d'erreur Out of Memory, MALLOC
BARF" src="/images/clipmidi/malloc.jpg">
Cela veut simplement dire qu'il n'y a pas assez de mémoire pour charger tous
les instruments. Comme la mémoire n'est pas allouée dynamiquement (pas de MMU,
Memory Management Unit), tout problème mémoire active le "chien de garde"
(watchdog), et cause le plantage complet du système. Le seul moyen de s'en
sortir est de redémarrer le lecteur.</p>
<p>Ci-dessous, une petite démonstration du lecteur en action. <strong>L'écoute au
casque est fortement déconseillée.</strong>
Pour cause, les enceintes étant un peu trop éloignées (je ne m'en suis pas
rendu compte sur le coup), j'ai du augmenter le volume du son dans la vidéo.
Cela a bien évidemment augmenté le niveau de bruit. J'aurais du enregistrer le
son à part. Encore désolé pour la mauvaise qualité audio.</p>
<p>Ouvrir / télécharger : <images/clipmidi/clip.mp4></p>
<p>Le lecteur est posé sur le bureau, une fiche jack 3,5mm branchée sur le côté,
pour la sortie audio. Les musiques sont jouées en temps réel par le lecteur.
Aucun expandeur midi matériel n'a été utilisé pour jouer les musiques.</p>
<p>Le lecteur est configuré en anglais, avec la "synthèse vocale" (que l'on
~~voit</s>entend à l'œuvre). L'appareil photo étant placé assez près, tous les
bruits de manipulations semblent amplifiés, ce qui est normal.</p>
<p>Bonus : les conditions de tournage.
<img alt="appareil photo filmant le lecteur mp3 posé sur un bureau" src="/images/clipmidi/tournage.jpg">
Oui, le lecteur MP3, c'est bien le tout petit truc noir avec un long fil blanc
branché dessus, et qui est en partie masqué par la sangle de l'appareil photo.</p>
<p>Édit 06 oct 2014 : les musiques ont été rejouées, et cette fois, enregistrées
correctement (via un zoom h2n).</p>
<p>Format ogg/vorbis non supporté ? <a href="/images/clipmidi/141007-000906.mp3">Télécharger en mp3</a>.</p>
<p>Au niveau qualité audio, c'est quand même meilleur qu'Android (où la qualité
de la soundfont midi est franchement horrible).</p>
<hr>
<p>1: j'ai déjà parlé de tout ça dans un précédent article.</p>Retirer la barre de recherche dans about:newtabs de Firefox 312014-07-25T00:00:00+02:002014-07-25T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-07-25:/retirer-la-barre-de-recherche-dans-about-newtabs-de-firefox-31<p>Si comme moi, vous trouvez que trois [1] barres de recherche Google dans
Firefox 31, c'est trop, voici une petite astuce pour masquer celle qui
s'affiche quand on ouvre un nouvel onglet.</p>
<p>Dans le répertoire chrome de votre profil [2], copiez (ou renommez) le fichier
<em>userContent-example.css</em> en <em>userContent.css …</em></p><p>Si comme moi, vous trouvez que trois [1] barres de recherche Google dans
Firefox 31, c'est trop, voici une petite astuce pour masquer celle qui
s'affiche quand on ouvre un nouvel onglet.</p>
<p>Dans le répertoire chrome de votre profil [2], copiez (ou renommez) le fichier
<em>userContent-example.css</em> en <em>userContent.css</em> , et insérez les lignes
suivantes à la fin du fichier <em>userContent.css</em> :</p>
<div class="highlight"><pre><span></span><code>#newtab-search-container {
display:none !important;
}
</code></pre></div>
<p>Fermez et relancez firefox, normalement, la barre de recherche a disparu.</p>
<p>Bonus : on peut afficher 4 lignes et 4 colonnes au lieu de 3 par défaut.
Dans about:config, changer les valeurs de "browser.newtabpage.columns" et
"browser.newtabpage.rows" en 4.</p>
<hr>
<p>1 : awesomebar + searchbar + newtab-search = 3, dont deux en trop.
Troll : dans Firefox 42, il y aura une barre de recherche dans la barre de
titre, en bas de chaque page, dans la barre des modules, dans un nouvel onglet
et à côté des onglets, dès fois que l'utilisateur soit trop stupide et ne
sache pas utiliser la barre de recherche.</p>
<p>2 : situé dans des endroits pas possible :
Sous OSX : /Users/<username>/Library/Application Support/Firefox/Profiles/<nom du profil>/chrome
Sous 2000/XP : C:\Documents and Settings\<username>\Application Data\Mozilla\Firefox\Profiles\<nom du profil>\chrome
Sous 7/8 : C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<nom du profil>\chrome
Sous GNU/Linux : ~/.mozilla/firefox/<nom du profil>/chrome</p>Page de manuel dans un tty ou dans son navigateur2014-07-19T00:00:00+02:002014-07-19T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-07-19:/page-de-manuel-dans-un-tty-ou-dans-son-navigateur<p><strong>Problème classique</strong>
Je cherche UN paramètre pour un outil en ligne de commande, genre ffmpeg ou
tar. Et là, je tape naïvement "man ffmpeg", avant de me rendre compte de mon
erreur : le manuel est long… trèèèèès long, et chercher dedans via un
terminal, ça devient très vite pénible.</p>
<p><strong>Solution …</strong></p><p><strong>Problème classique</strong>
Je cherche UN paramètre pour un outil en ligne de commande, genre ffmpeg ou
tar. Et là, je tape naïvement "man ffmpeg", avant de me rendre compte de mon
erreur : le manuel est long… trèèèèès long, et chercher dedans via un
terminal, ça devient très vite pénible.</p>
<p><strong>Solution</strong>
Ouvrir ce manuel dans un navigateur. J'avais proposé il y a quelques années,
l'outil "manServer", mais son instabilité chronique et l'utilisation d'un
serveur web dédié (intégré à cet outil) ont fait que j'ai depuis longtemps
abandonné cette idée.</p>
<p><strong>Solution 2</strong>
Lire la page de manuel de man (man man), et que vois-je ?</p>
<div class="highlight"><pre><span></span><code>−H[navigateur], −−html[=navigateur]
Cette option fera produire à groff une page au format HTML qui sera ensuite affichée dans un navigateur web. Le choix du navigateur est déterminé soit par l’argument optionnel navigateur, s’il est indiqué, soit par la variable d’environnement $BROWSER ou sinon par la valeur par défaut indiquée lors de la compilation (habituellement lynx). Cette option induit −t et ne fonctionne qu’avec les troff GNU.
</code></pre></div>
<p>Intéressant. Testons de suite avec tar, via la commande</p>
<div class="highlight"><pre><span></span><code>man -Hfirefox tar
</code></pre></div>
<p>C'est déjà plus lisible
<img alt=":-)" src="plugins/plxtoolbar/custom.buttons/smilies/smile.png"></p>
<p><strong>Hors-sujet</strong>
Ça a pu répondre à mon problème : comment fait-on pour compresser en LZMA un
répertoire contenant une foultitude de sous-répertoires et de fichiers et de
symlinks, donc déréférencement. <em>Toute ressemblance avec un gros backup sur
static ne serait (etc)</em></p>
<div class="highlight"><pre><span></span><code>tar -Jhcvf ../classes.tar.xz Classés
</code></pre></div>
<p><strong>/Hors-sujet</strong></p>
<p><strong>Alias(ing)</strong>
Par contre, ça devient vite pénible de préciser -H… ce qu'il faudrait, ça
serait un alias man -> man -H, mais si jamais je n'ai pas ma session X ouverte
(via startx), je suis bloqué… comment faire ?</p>
<p>C'est là que j'apprécie mon shell (fish, the friendly interactive shell) qui
me permet de créer des alias, mais sous forme de fonction.
Je récapitule donc mes besoins :</p>
<ul>
<li>Si Xorg est lancé, alors afficher la page de manuel dans firefox.</li>
<li>Sinon, l'afficher de manière classique.</li>
</ul>
<p>Ce qui peut alors se traduire par :</p>
<div class="highlight"><pre><span></span><code>function man
if printenv | grep DISPLAY >/dev/null
/usr/bin/man -Hfirefox $argv
else
/usr/bin/man $argv
end
end
</code></pre></div>
<p>Ici, la commande if ne fait que tester la valeur de retour du grep. Si grep a
trouvé quelque chose, il retourne 0, sinon 1 si non trouvé. Le contenu de
DISPLAY ne m'intéresse pas.</p>
<p>Ce fichier est enregistré dans ~.config/fish/functions/man.fish</p>
<p>Désormais, je peux taper man ffmpeg, aussi bien dans un tty (même si Xorg est
lancé dans un autre tty, l'absence de la variable d'environnement DISPLAY
indique que je n'ai pas d'environnement graphique), que dans une console sous
X (et là, DISPLAY existe).</p>
<p><strong>Trolls</strong>
Oui, j'utilise fish, on peut faire la même chose sur zsh ou sur bash, sauf que
je n'utilise quasiment plus ces shells, et donc, je ne détaillerai pas comment
faire… lisez donc les pages de man…
Les vrais barbus consultent les pages de manuel sur un terminal VT52 en 80
lignes par 25 colonnes, genre écran de minitel.
systemd.
Obi-Wan Kenobi.</p>rc-update: laptop-mode does not exist2014-07-19T00:00:00+02:002014-07-19T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-07-19:/rc-update-laptop-mode-does-not-exist<p>Si en mettant à jour une Debian SID et que vous êtes assez fou pour utiliser
open-rc et non systemd (QUOI ? mais c'est inconcevable… tout le monde DOIT
utiliser OBLIGATOIREMENT systemd), et que suite à un apt update, vous vous
prenez un</p>
<div class="highlight"><pre><span></span><code> * rc-update: service 'laptop-mode' does not exist
</code></pre></div>
<p>Alors creéz …</p><p>Si en mettant à jour une Debian SID et que vous êtes assez fou pour utiliser
open-rc et non systemd (QUOI ? mais c'est inconcevable… tout le monde DOIT
utiliser OBLIGATOIREMENT systemd), et que suite à un apt update, vous vous
prenez un</p>
<div class="highlight"><pre><span></span><code> * rc-update: service 'laptop-mode' does not exist
</code></pre></div>
<p>Alors creéz un fichier laptop-mode dans /etc/init.d, puis mettez simplement
dedans :</p>
<div class="highlight"><pre><span></span><code>#bin/sh
return 0
</code></pre></div>
<p>Rendez-le exécutable (chmod +x), et faites un apt-get -f install pour relancer
la partie de l'installation ayant échoué. Finir avec apt upgrade pour
poursuivre les mises à jour.</p>
<p><strong>ATTENTION : ceci est un hack vite fait mal fait, juste pour pouvoir finir
les mises à jour. Je verrai pourquoi j'ai ce problème plus tard…</strong></p>
<p>Log complet de la mise à jour :</p>
<div class="highlight"><pre><span></span><code>root > yue > home > alex > # > apt upgrade
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Calcul de la mise à jour... Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
libavahi-ui-gtk3-0 libjim0.75 libjpeg62:i386 libjpeg9 libllvm3.4 libllvm3.4:i386 libmbim-glib4 libnm-glib4 libnm-util2 libqmi-glib1 libtool-bin vlc-plugin-pulse
Veuillez utiliser « apt-get autoremove » pour les supprimer.
Fait
Les NOUVEAUX paquets suivants seront installés :
[liste de paquets]
Les paquets suivants ont été conservés :
[grosse liste de paquets]
Les paquets suivants seront mis à jour :
[liste énorme de paquets]
127 mis à jour, 3 nouvellement installés, 0 à enlever et 39 non mis à jour.
Il est nécessaire de prendre 0 o/180 Mo dans les archives.
Après cette opération, 16,5 Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] O
Lecture des fichiers de modifications (« changelog »)... Terminé
Extraction des modèles depuis les paquets : 100%
Préconfiguration des paquets...
(Lecture de la base de données... 232677 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de ...[premier paquet] ...
Dépaquetage de [premier paquet] (nouvelle version) sur (ancienne version) ...
[plein de lignes plus tard…]
Préparation du dépaquetage de .../systemd-shim_8-3_amd64.deb ...
Conservation de « détournement de /usr/share/dbus-1/system-services/org.freedesktop.systemd1.service en /usr/share/dbus-1/system-services/org.freedesktop.systemd1.service.systemd par systemd-shim »
Dépaquetage de systemd-shim (8-3) sur (8-2) ...
Paramétrage de screen (4.2.1-3) ...
update-rc.d: warning: default start runlevel arguments (2 3 4 5) do not match screen-cleanup Default-Start values (S)
update-rc.d: warning: default stop runlevel arguments (0 1 6) do not match screen-cleanup Default-Stop values (none)
Paramétrage de openrc (0.13.1-2) ...
Installation de la nouvelle version du fichier de configuration /etc/rc.conf ...
Add existing services ...
* rc-update: bootlogs already installed in runlevel 'recovery'; skipping
* rc-update: killprocs already installed in runlevel 'recovery'; skipping
* rc-update: motd already installed in runlevel 'recovery'; skipping
* rc-update: single already installed in runlevel 'recovery'; skipping
* rc-update: bootlogs already installed in runlevel 'default'; skipping
* rc-update: motd already installed in runlevel 'default'; skipping
* rc-update: nfs-common already installed in runlevel 'default'; skipping
* rc-update: binfmt-support already installed in runlevel 'default'; skipping
* rc-update: service 'laptop-mode' does not exist
update-rc.d: error: rc-update rejected the script header
dpkg: erreur de traitement du paquet openrc (--configure) :
le sous-processus script post-installation installé a retourné une erreur de sortie d'état 1
Paramétrage de systemd-shim (8-3) ...
Installation de la nouvelle version du fichier de configuration /etc/dbus-1/system.d/org.freedesktop.systemd-shim.conf ...
Traitement des actions différées (« triggers ») pour libc-bin (2.19-11) ...
Traitement des actions différées (« triggers ») pour dbus (1.8.8-2) ...
Des erreurs ont été rencontrées pendant l'exécution :
openrc
E: Sub-process /usr/bin/dpkg returned an error code (1)
root > yue > home > alex > # > apt-get -f install
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
Veuillez utiliser « apt-get autoremove » pour les supprimer.
0 mis à jour, 0 nouvellement installés, 0 à enlever et 40 non mis à jour.
1 partiellement installés ou enlevés.
Après cette opération, 0 o d'espace disque supplémentaires seront utilisés.
Paramétrage de openrc (0.13.1-2) ...
Add existing services ...
* rc-update: bootlogs already installed in runlevel 'recovery'; skipping
* rc-update: killprocs already installed in runlevel 'recovery'; skipping
* rc-update: motd already installed in runlevel 'recovery'; skipping
* rc-update: single already installed in runlevel 'recovery'; skipping
* rc-update: bootlogs already installed in runlevel 'default'; skipping
* rc-update: motd already installed in runlevel 'default'; skipping
* rc-update: nfs-common already installed in runlevel 'default'; skipping
* rc-update: binfmt-support already installed in runlevel 'default'; skipping
* rc-update: service 'laptop-mode' does not exist
update-rc.d: error: rc-update rejected the script header
dpkg: erreur de traitement du paquet openrc (--configure) :
le sous-processus script post-installation installé a retourné une erreur de sortie d'état 1
Des erreurs ont été rencontrées pendant l'exécution :
openrc
E: Sub-process /usr/bin/dpkg returned an error code (1)
root > yue > home > alex > # > vim /etc/init.d/laptop-mode
root > yue > home > alex > # > chmod +x /etc/init.d/laptop-mode
root > yue > home > alex > # > apt-get -f install
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
libavahi-ui-gtk3-0 libjim0.75 libjpeg62:i386 libjpeg9 libllvm3.4 libllvm3.4:i386 libmbim-glib4 libnm-glib4 libnm-util2 libqmi-glib1 libtool-bin vlc-plugin-pulse
Veuillez utiliser « apt-get autoremove » pour les supprimer.
0 mis à jour, 0 nouvellement installés, 0 à enlever et 40 non mis à jour.
1 partiellement installés ou enlevés.
Après cette opération, 0 o d'espace disque supplémentaires seront utilisés.
Paramétrage de openrc (0.13.1-2) ...
Add existing services ...
* rc-update: bootlogs already installed in runlevel 'recovery'; skipping
* rc-update: killprocs already installed in runlevel 'recovery'; skipping
* rc-update: motd already installed in runlevel 'recovery'; skipping
* rc-update: single already installed in runlevel 'recovery'; skipping
* rc-update: bootlogs already installed in runlevel 'default'; skipping
* rc-update: motd already installed in runlevel 'default'; skipping
* rc-update: nfs-common already installed in runlevel 'default'; skipping
* rc-update: binfmt-support already installed in runlevel 'default'; skipping
* service laptop-mode added to runlevel default
* rc-update: linuxlogo already installed in runlevel 'default'; skipping
* rc-update: nmbd already installed in runlevel 'default'; skipping
* rc-update: samba-ad-dc already installed in runlevel 'default'; skipping
* rc-update: sudo already installed in runlevel 'default'; skipping
* rc-update: syslog-ng already installed in runlevel 'default'; skipping
* rc-update: virtualbox already installed in runlevel 'default'; skipping
* rc-update: atd already installed in runlevel 'default'; skipping
* rc-update: cron already installed in runlevel 'default'; skipping
* rc-update: dbus already installed in runlevel 'default'; skipping
* rc-update: exim4 already installed in runlevel 'default'; skipping
* rc-update: gdomap already installed in runlevel 'default'; skipping
* rc-update: gpm already installed in runlevel 'default'; skipping
* rc-update: hddtemp already installed in runlevel 'default'; skipping
* rc-update: lighttpd already installed in runlevel 'default'; skipping
* rc-update: lirc already installed in runlevel 'default'; skipping
* rc-update: rsync already installed in runlevel 'default'; skipping
* rc-update: rtirq already installed in runlevel 'default'; skipping
* rc-update: ssh already installed in runlevel 'default'; skipping
* rc-update: avahi-daemon already installed in runlevel 'default'; skipping
* rc-update: inputlirc already installed in runlevel 'default'; skipping
* rc-update: wicd already installed in runlevel 'default'; skipping
* rc-update: mdm already installed in runlevel 'default'; skipping
* service plymouth added to runlevel default
* service rc.local added to runlevel default
* rc-update: rmnologin already installed in runlevel 'default'; skipping
* rc-update: hostname.sh already installed in runlevel 'sysinit'; skipping
* rc-update: mountkernfs.sh already installed in runlevel 'sysinit'; skipping
* rc-update: udev already installed in runlevel 'sysinit'; skipping
* rc-update: keyboard-setup already installed in runlevel 'sysinit'; skipping
* rc-update: mountdevsubfs.sh already installed in runlevel 'sysinit'; skipping
* rc-update: hdparm already installed in runlevel 'sysinit'; skipping
* rc-update: hwclock.sh already installed in runlevel 'sysinit'; skipping
* rc-update: checkroot.sh already installed in runlevel 'sysinit'; skipping
* rc-update: checkfs.sh already installed in runlevel 'sysinit'; skipping
* rc-update: checkroot-bootclean.sh already installed in runlevel 'sysinit'; skipping
* rc-update: kmod already installed in runlevel 'sysinit'; skipping
* rc-update: mountall.sh already installed in runlevel 'sysinit'; skipping
* rc-update: mountall-bootclean.sh already installed in runlevel 'sysinit'; skipping
* rc-update: procps already installed in runlevel 'sysinit'; skipping
* rc-update: udev-finish already installed in runlevel 'sysinit'; skipping
* rc-update: urandom already installed in runlevel 'sysinit'; skipping
* rc-update: networking already installed in runlevel 'sysinit'; skipping
* rc-update: rpcbind already installed in runlevel 'sysinit'; skipping
* rc-update: nfs-common already installed in runlevel 'sysinit'; skipping
* rc-update: mountnfs.sh already installed in runlevel 'sysinit'; skipping
* rc-update: mountnfs-bootclean.sh already installed in runlevel 'sysinit'; skipping
* rc-update: kbd already installed in runlevel 'sysinit'; skipping
* rc-update: console-setup already installed in runlevel 'sysinit'; skipping
* rc-update: alsa-utils already installed in runlevel 'sysinit'; skipping
* rc-update: bootmisc.sh already installed in runlevel 'sysinit'; skipping
* rc-update: plymouth-log already installed in runlevel 'sysinit'; skipping
* rc-update: screen-cleanup already installed in runlevel 'sysinit'; skipping
* rc-update: x11-common already installed in runlevel 'sysinit'; skipping
* service laptop-mode added to runlevel off
* rc-update: unattended-upgrades already installed in runlevel 'off'; skipping
* rc-update: sendsigs already installed in runlevel 'off'; skipping
* rc-update: umountnfs.sh already installed in runlevel 'off'; skipping
* rc-update: umountfs already installed in runlevel 'off'; skipping
* rc-update: umountroot already installed in runlevel 'off'; skipping
* rc-update: savecache already installed in runlevel 'off'; skipping
* rc-update: transit already installed in runlevel 'shutdown'; skipping
* Caching service dependencies ... [ ok ]
**********************************************************************
*** WARNING: if you are replacing sysv-rc by OpenRC, then you must ***
*** reboot immediately using the following command: ***
for file in /etc/rc0.d/K*; do s='basename $(readlink "$file")' ; /etc/init.d/$s stop; done
*** once rebooted, you could safely backup and remove /etc/rc?.d ***
**********************************************************************
root > yue > home > alex > # >
</code></pre></div>Nouveau thème (2)2014-07-14T00:00:00+02:002014-07-14T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-07-14:/nouveau-theme-2<p>Au bout d'un ans, j'ai ENFIN fini par me motiver à écrire un thème unique,
responsive, en html5 + css3.</p>
<p>Il n'a pas été écrit "from scratch", je suis parti d'un design existant sous
licence CC : « Horizons », par <a href="http://templated.co">TEMPLATED</a>.</p>
<p>Bien entendu, pour l'adapter pour PluXML, ça m'aura pris une bonne partie …</p><p>Au bout d'un ans, j'ai ENFIN fini par me motiver à écrire un thème unique,
responsive, en html5 + css3.</p>
<p>Il n'a pas été écrit "from scratch", je suis parti d'un design existant sous
licence CC : « Horizons », par <a href="http://templated.co">TEMPLATED</a>.</p>
<p>Bien entendu, pour l'adapter pour PluXML, ça m'aura pris une bonne partie de
ce week-end, mais le résultat en valait la peine.</p>
<p>Accessoirement, j'en aurai profité pour revoir mes connaissances du css3 et
redécouvrir les joies du débogage de javascript
<img alt=":D" src="plugins/plxtoolbar/custom.buttons/smilies/big_smile.png"></p>
<p>Édit : le problème des polices est quasiment corrigé, la balise video et les
rares iframes également. J'en ai profité pour faire une compression des images
via :</p>
<div class="highlight"><pre><span></span><code>find . -name '*.png' -exec optipng -preserve \{\} \;
find . -name '*.jpg' -exec jpegoptim \{\} \;
find . -name '*.jpeg' -exec jpegoptim \{\} \;
find . -name '*.JPG' -exec jpegoptim \{\} \;
</code></pre></div>phpmyadmin et SSL2014-06-22T00:00:00+02:002014-06-22T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-06-22:/phpmyadmin-et-ssl<p>Si comme moi, vous êtes amené à installer vite fait<s>mal fait</s>un phpmyadmin
4.2.4 sur un serveur, sans utiliser le paquet de la distrib Linux (souvent pas
à jour), et que vous voulez que SSL soit actif par défaut…</p>
<p>trois points à vérifier :</p>
<p>Tester d'abord que SSL …</p><p>Si comme moi, vous êtes amené à installer vite fait<s>mal fait</s>un phpmyadmin
4.2.4 sur un serveur, sans utiliser le paquet de la distrib Linux (souvent pas
à jour), et que vous voulez que SSL soit actif par défaut…</p>
<p>trois points à vérifier :</p>
<p>Tester d'abord que SSL (https) fonctionne. Cela évitera les prises de têtes
sur la config de phpmyadmin qui n'y sera pour rien.</p>
<p>Ajouter</p>
<div class="highlight"><pre><span></span><code>$cfg['ForceSSL'] = true;
</code></pre></div>
<p>dans le fichier config.inc.php (dans phpmyadmin).</p>
<p>Si jamais la page fait une boucle infinie, vérifiez que</p>
<div class="highlight"><pre><span></span><code>$cfg['PmaAbsoluteUri'] = 'URL complète vers phpmyadmin';
</code></pre></div>
<p>est bien renseignée.</p>
<p>Bien entendu, si ces variables n'existent pas, les ajouter dans le fichier de
config, peu importe l'ordre (on n'est pas obligé de les mettre à la fin, comme
ce que j'ai l'habitude de lire sur le grand Ternet).</p>Clip+ en rade2014-06-14T00:00:00+02:002014-06-14T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-06-14:/clip-en-rade<p>Ce qui devait finir par arriver arriva. Mon lecteur<s>MP3</s>ogg/vorbis FLAC ne fonctionne plus correctement. Je n'ai plus de son sur la voie gauche.</p>
<p>Après avoir bien pris mon temps pour le démonter (pour voir où sont situés les
clips, et ne pas les casser) avec un mediator …</p><p>Ce qui devait finir par arriver arriva. Mon lecteur<s>MP3</s>ogg/vorbis FLAC ne fonctionne plus correctement. Je n'ai plus de son sur la voie gauche.</p>
<p>Après avoir bien pris mon temps pour le démonter (pour voir où sont situés les
clips, et ne pas les casser) avec un mediator (en plastique, 0,46mm), j'ai
trouvé le fautif.</p>
<p>Une bête soudure qui a sauté [1].</p>
<p><a href="/images/ClipplusEnRade/DSC08871.jpg"><img alt="Photo du Clip+ avec la soudure cassée entourée en rouge" src="/images/ClipplusEnRade/DSC08871-t.jpg"></a></p>
<p>Notez sur la droite, la présence d'un cheveu, ce qui donne une idée de la
taille de la soudure à refaire
<img alt=":p" src="plugins/plxtoolbar/custom.buttons/smilies/tongue.png"> En comparaison, la fiche jack a un diamètre de 3,5 millimètre.</p>
<p>Un coup de fer plus tard, c'est mieux.</p>
<p><a href="/images/ClipplusEnRade/DSC08872.jpg"><img alt="Photo du Clip+ avec la soudure refaite entourée en
rouge" src="/images/ClipplusEnRade/DSC08872-t.jpg"></a></p>
<p>J'en ai profité pour refaire la soudure de la masse de la prise jack qui
commençait aussi à montrer des signes de faiblesse.</p>
<p>Tant que le lecteur est ouvert, profitons-en pour relever les références de la
batterie (ça peut toujours être utile).</p>
<p><a href="/images/ClipplusEnRade/DSC08870.JPG"><img alt="Batterie BAK 323036P, 3.7V 290mAh" src="/images/ClipplusEnRade/DSC08870-t.JPG"></a>
<a href="http://www.bak.com.cn/products2.aspx?ProductsCateID=69&CateID=47&CurrCateID=69&page=3">http://www.bak.com.cn/products2.aspx?ProductsCateID=69&CateID;=47&CurrCateID;=69&page;=3</a></p>
<p>Quelques tests pour vérifier le bon fonctionnement, reste à nettoyer la
poussière, enlever les cheveux, chenils et autres, puis refermer le lecteur.</p>
<p><a href="/images/ClipplusEnRade/DSC08865.JPG"><img alt="Photo du Clip+ avec la soudure refaite entourée en rouge" src="/images/ClipplusEnRade/DSC08865-t.JPG"></a></p>
<p>Sérieusement, ça avait vraiment besoin d'un bon nettoyage.</p>
<p>C'est là que l'utilisation d'un mediator et non d'un tournevis quelconque fait
toute la différence. En effet, aucun clip n'a été cassé, la réparation est
transparente, le lecteur est toujours aussi solide qu'à l'origine.</p>
<p>Autre point intéressant à relever : ce lecteur est en fait, facile à démonter
et à remonter ; il n'a aucune pièce collée (mis à part la batterie qui est
collée sur une mousse, mais qui se retire facilement).</p>
<hr>
<p>1 : Après, ne pas s'étonner que ça finisse par lâcher, utiliser la même
méthode de "soudure" que les CMS pour "souder" (techniquement, c'est plus du
collage que de la soudure) de gros éléments, c'est pas une bonne idée.</p>MAO - parlons du MIDI2014-05-25T00:00:00+02:002014-05-25T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-05-25:/mao-parlons-du-midi<p>Comment parler de MAO sans parler du MIDI.</p>
<p>Édition du 25 mai 2014, 11h à 12h30 : correction de fautes de frappes,
d'erreurs, et ajout de quelques éléments oubliés (sysex, photos).</p>
<p>Édition du 27 avril 2015 : ajout de deux musiques de jeux vidéo provenant d'un
vrai MT-32.</p>
<p><strong>Mentions légales
Toutes les …</strong></p><p>Comment parler de MAO sans parler du MIDI.</p>
<p>Édition du 25 mai 2014, 11h à 12h30 : correction de fautes de frappes,
d'erreurs, et ajout de quelques éléments oubliés (sysex, photos).</p>
<p>Édition du 27 avril 2015 : ajout de deux musiques de jeux vidéo provenant d'un
vrai MT-32.</p>
<p><strong>Mentions légales
Toutes les photos présentes sur cette page ne sont présentes qu'à des fins
d'illustration et non à des fins publicitaires. Tous les noms et marques cités
appartiennent à leurs propriétaires respectifs.
/Mentions légales.</strong></p>
<h2>Qu'est-ce que le MIDI</h2>
<ul>
<li>Le midi, c'est le sud de la France.</li>
<li>Le midi, c'est le synonyme de 12h (12 PM pour les anglophones), et donc l'opposé de minuit (0h, ou 12 AM)</li>
<li>Le midi, c'est aussi un intervalle de temps où on mange (généralement, entre 12 et 14 heures).</li>
<li>Le midi, c'est le truc que l'on cherche à 14 heure.</li>
<li>Le midi, c'est également plein d'autres choses…</li>
<li>Le midi, c'est enfin l'acronyme de Musical Instrument Digital Interface, littéralement : Interface Numérique pour les Instruments de Musique (ou Interface pour les Instruments de Musique Numérique ?).</li>
</ul>
<h2>Le MIDI, en détail</h2>
<p>Ce que l'on désigne par MIDI, cela peut être plusieurs choses :</p>
<ul>
<li>Une connectique normalisée, au format DIN à 5 broches (prises, câbles).</li>
<li>Un protocole de communication normalisé.</li>
<li>Une harmonisation de la numérotation des instruments de musique (General MIDI).</li>
<li>Des contrôleurs MIDI.</li>
<li>Un format de fichier (les fameux .mid, format décrié à raison sous Windows).</li>
<li>Un truc permettant de faire du réseau sur Atari ST (midinet).</li>
</ul>
<h2>Une connectique normalisée</h2>
<p>La connectique est simple : Une prise en entrée, une prise en sortie, souvent
une prise supplémentaire qui recopie l'entrée (appelée Pass Thru ou simplement
Thru). Un câble ne permet la communication que dans un seul sens. Si on veut
une communication bidirectionnelle (dans les deux sens), il faut alors deux
câbles.</p>
<p><img alt="Un appareil MIDI avec ses prises IN, OUT et THRU" src="/images/mao2/Midi_ports_and_cable.jpg"></p>
<p>Vue des prises MIDI et d'un câble MIDI.</p>
<p>Les câbles se trouvent facilement dans n'importe quel magasin de musique, et
permettent une longueur maximale de 15 mètres.</p>
<p>Le format de la prise peut paraître étrange de nos jours (on n'utilise
quasiment plus le format DIN dans le domaine grand public, mis à part quelques
prises pour clavier/souris, au format PS/2, les magnétophones n'étant plus
utilisés, et les caméscopes n'ont plus de prise S-Vidéo), mais quand la norme
fut élaborée, cela permettait de réutiliser ses câbles de magnéto.</p>
<p>Le branchement se fait de manière simple. On raccorde la sortie d'un appareil
(ou le Thru) sur l'entrée d'un autre. On peut les brancher en cascade, mais au
delà de 3 ou 4, il vaut mieux utiliser un genre de Hub MIDI, pour limiter les
pertes de signal et réduire la latence.</p>
<p><img alt="Schéma représentant le branchement d'un clavier sur deux
expandeurs" src="/images/mao3/connexion-midi.png"></p>
<p>Exemple de raccordement en cascade, avec la prise THRU.</p>
<p>Ce connecteur est toujours présent et utilisé, même si on trouve de plus en
plus d'appareils MIDI (contrôleurs, expandeurs, synthétiseurs) ayant une prise
USB, et permettant de se raccorder facilement à un ordinateur, sans passer par
un adaptateur USB-MIDI, ou par une carte son ayant encore un connecteur
Joystick (la grosse prise DB 15 jaune) utilisant la norme MPU-401, aujourd'hui
obsolète.</p>
<p><img alt="Vue arrière d'un clavier maître M-Audio KeyStation 88 es" src="/images/mao3/M-Audio-KS88-rear.jpg"></p>
<p>La connectique d'un clavier maître récent.</p>
<h2>Un protocole de communication normalisé</h2>
<p>Avant l'arrivée du MIDI, chaque fabricant avait son propre système de
communication.</p>
<p>Par exemple, un système à base de CV/Gate (une tension électrique indiquait la
hauteur de la note, et le Gate (ou Trigger) servant à contrôler l'enveloppe).
Ce système existe depuis les années 60, mais pas toujours avec les mêmes
plages de tension. Un LA 2 sur un instrument pouvait donner un LA 6 sur un
autre.
Ou alors, via un protocole de communication plus évolué, comme le DCB (Digital
Control Bus), de Roland, présent notamment sur le Juno 60 et le Jupiter 8.
Le DCB a été remplacé par le midi, et on trouve des adaptateurs MIDI - DCB.</p>
<p><img alt="Connectique sur un Roland SH-09" src="/images/mao3/roland-sh-09.jpg"></p>
<p>Prises CV et GATE sur un synthétiseur Roland SH-09.</p>
<p>À noter, le CV/Gate est encore utilisé de nos jours, notamment sur les
synthétiseurs modulaires, avec soit un contrôle en tension (1V par octave),
soit le contrôle en fréquence (le LA 4 est alors à 440 Hz).</p>
<p>À noter également : un signal d'horloge pouvait provenir d'un autre
connecteur, pour piloter par exemple, un arpégiateur, ou synchroniser
plusieurs boîtes à rythme ou à percussion (genre, TR-808).</p>
<p><img alt="Vue des connecteurs sur un Juno-6" src="/images/mao3/juno-6-rear.jpg"></p>
<p>Connecteurs d'un Juno 6</p>
<p>Bref, pas vraiment de trucs compatibles les uns les autres, ou nécessitant de
passer par des adaptateurs intermédiaires, quand ces appareils existaient.</p>
<p>La norme MIDI provient du fondateur de Sequential Circuits et du designer du
Prophet-5, Dave Smith. À l'origine (en 1981), il s'agissait d'une proposition
pour une interface universelle pour les synthétiseur (USI, Universal
Synthesizer Interface), suite à ses rencontres avec Tom Oberheim (Oberheim) et
Ikutaro Kakehashi (Roland).</p>
<p>Ce protocole de communication proposait un système commun basé sur le système
de "Note ON" et "Note OFF" (jouer une note, arrêter la note), et ce, pour
différents fabricants.</p>
<p>Par la suite, ce protocole évolua, et donna lieu au MIDI, tel qu'on le connait
aujourd'hui.</p>
<p>La première démonstration fonctionnelle de ce protocole eu lieu au NAMM
d'hiver, en 1983, où un Prophet 600 (Sequential Circuits), fut relié à un
Jupiter 6 (Roland).</p>
<p><a href="/images/mao3/NAMM83.jpg"><img alt="Photo prise lors du NAMM en 1983, montrant les deux synthés branchés l'un
avec l'autre. Source : midi.org" src="/images/mao3/NAMM83-t.jpg"></a></p>
<p>NAMM en 1983. Source : midi.org</p>
<p>En plus de définir comment jouer une note, à quelle hauteur, et d'autres
paramètres, un élément important a été ajouté, ce sont les SysEx, pour System
Exclusive.</p>
<p>Ces instructions, placées entre F0 et F7, peuvent servir pour piloter des
enregistreurs (lecture, avancer, reculer, enregistrer…), pour synchroniser des
appareils (horloge), ou encore, pour contrôler certaines fonctionnalités
spécifiques à un périphérique midi, comme la fréquence d'un LFO, afficher un
message à l'écran d'un expandeur, etc.</p>
<p>Finalement, le MIDI, au point de vue matériel, n'est qu'un port série, uni-
directionnel, fonctionnant à 31 200 bits/s.</p>
<h2>Une harmonisation de la numérotation des instruments de musique</h2>
<p>Avant l'arrivée de la norme General MIDI (ou GM1) en 1991, chaque fabricant
pouvait disposer ses instruments comme il le souhaitait, la norme MIDI ne
s'occupant pas de cet aspect. Sauf que, pour faire communiquer deux
instruments de fabricants différents (voire même d'un même fabricant), les
instruments n'étaient pas placés au même endroit.</p>
<p>Par exemple (tiré de la documentation du Sound Canvas SC-55 de Roland, le
MT-32 étant aussi de Roland)</p>
<table>
<thead>
<tr>
<th>N° d'Instrument</th>
<th>Instrument GM1/GS</th>
<th>Instrument MT32</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Piano</td>
<td>Piano</td>
</tr>
<tr>
<td>11</td>
<td>Boîte à musique</td>
<td>Orgue électrique, 3e variation</td>
</tr>
<tr>
<td>25</td>
<td>Guitare à corde nylon</td>
<td>Ensemble d'instruments à vent synthétique, 1e</td>
</tr>
<tr>
<td>variation</td>
<td></td>
<td></td>
</tr>
<tr>
<td>48</td>
<td>Timpani</td>
<td>Onde carrée</td>
</tr>
<tr>
<td>89</td>
<td>Fantasia (nappe de synthé)</td>
<td>Trompette</td>
</tr>
</tbody>
</table>
<p>Avouons-le, vouloir jouer un son de guitare, et obtenir un ensemble à vent, ce
n'est pas bon du tout.</p>
<p>La norme GM1 définit un certain nombre de prérequis :</p>
<ul>
<li>Une polyphonie de 24 voies (la polyphonie étant le nombre de notes minimales que l'appareil doit pouvoir jouer).</li>
<li>La gestion de la vélocité (Le musicien a appuyé plus ou moins fort sur la touche du piano, cela doit pouvoir être reproduit par un instrument).</li>
<li>L'instrument doit avoir 16 canaux midi, chacun pouvant être affecté à un instrument différent à un moment donné.</li>
<li>Le canal 10 doit être réservé pour les percussions.</li>
<li>Une classification des 127 instruments, par groupe de 8. De 1 à 8, les pianos, de 9 à 15, les percussions chromatiques comme le vibraphone, le marimba, le xylophone, de 17 à 24, les orgues (style Hammond, orgue d'église), etc.</li>
<li>D'autres éléments, comme la gestion de la molette de Pitch Bend, de modulation, etc.</li>
</ul>
<p>Cependant, des fabricants ont étendu cette norme, afin d'avoir accès à plus
d'instruments (les variations), d'accéder à des effets (flanger, phaser,
simulateur d'ampli de guitare), ou gérer des altérations, comme changer
l'enveloppe, jouer sur la résonance ou le cut-off.</p>
<p>Il est vrai que la norme GM1 ne permet d'associer que jusqu'à 8 instruments
par groupe, ce qui peut sembler bien peu.</p>
<p>En comparaison, le SC-55 (à la norme GS, General Standard, de Roland), propose
317 instruments. Le MU-80 de Yamaha (à la norme XG, eXtended General MIDI, de
Yamaha, étendant la norme GM1), en propose 729, le MU 2000 (GM1, GM2, GS et
XG) en propose 1 396…</p>
<p>À noter : en théorie, la norme GS permettrait de gérer jusqu'à 16 384
instruments différents (128 instruments, multiplié par 128 variations
possibles par instrument).</p>
<p>Suite à ces standards, une évolution de la norme General Midi a été conçue en
1999, le GM2. Elle permet, entres autres, la gestion des variations (ou
instruments alternatifs, comme le permettait le GS et le XG, 8 et 5 ans plus
tôt). Les appareils MIDI compatibles GM2 sont bien entendu compatibles GM1.
L'inverse n'est pas forcément vrai.</p>
<h2>Des contrôleurs MIDI</h2>
<p>Un contrôleur MIDI est simplement un appareil transformant les instructions du
musicien en signal de contrôle MIDI.</p>
<p>L'exemple le plus évident est le clavier maître, qui ressemble à un clavier de
piano, ou parfois, un espèce de clavier de piano monté sur un truc ressemblant
à une guitare, les fameux keytars.</p>
<p><img alt="Clavier maître" src="/images/mao3/Keystation_88es_top_RGB_.jpg"></p>
<p>Un clavier maître.</p>
<p><img alt="Keytar" src="/images/mao3/keytar-roland-AX-Synth.jpg"></p>
<p>Une keytar.</p>
<p>On trouve aussi des batteries électroniques, qui ont seulement des capteurs
piézo-électrique, et qui convertissent le jeu du batteur au format MIDI, et
permettant de jouer de la batterie de jour comme de nuit (enfin, on entend des
"poc-poc-poc", les éléments étant en plastique ou en caoutchouc), le son de
batterie étant généré par un ordinateur ou un expandeur (le « module »).</p>
<p><img alt="Une batterie électronique" src="/images/mao3/batterie-
electronique.jpg"></p>
<p>Une batterie électronique.</p>
<p>Il existe aussi des petits contrôleurs, appelés "Pads", dotés de boutons, de
curseurs, et pouvant être programmables, pous jouer une mélodie, par exemple.</p>
<p><img alt="Pads" src="/images/mao3/arturia-sparkle.jpg"></p>
<p>Un pad.</p>
<p>Un instant, j'ai parlé à plusieurs reprise d'expandeur, mais c'est quoi ?</p>
<p>Un expandeur est un appareil autonome, convertissant des instructions MIDI en
sons. On branche un clavier maître (ou n'importe quel contrôleur) en entrée,
et un casque ou un ampli en sortie.</p>
<p><img alt="Un Expandeur Yamaha MU 2000" src="/images/mao3/MU2000.jpg"></p>
<p>Un expandeur MIDI.</p>
<h2>Un format de fichier</h2>
<p>Les instructions MIDI peuvent être stockés dans un fichier. Ce format, SMF,
pour Standard Midi File, a été défini en 1988 et est normalisé. Plusieurs
extensions existent (.mid, .kar, .rmi, …), mais globalement, il y en a de
quatre sortes :</p>
<ul>
<li>SMF 0, toutes les données sont stockées sur un seul canal.</li>
<li>SMF 1, le fichier est multi-canal, avec pour chaque canal, ses données. Il s'agit du format le plus répandu.</li>
<li>SMF 2, le fichier contient plusieurs pistes (plusieurs musiques). Ce format est très peu répandu.</li>
<li>Spécifique à Microsoft Windows, le RMI, qui est encapsulé dans un conteneur RIFF (comme les fichiers .wav sont en fait un codec PCM encapsulé dans un fichier RIFF). Ce fichier RMI peut être accompagné d'un fichier DLS, DownLoadable Sound, qui contient l'ensemble des samples à jouer avec ce fichier midi.</li>
</ul>
<p>Si vous avez eu une connexion internet fin des années 90-début 2000, notamment
avant l'offre AOL à 99 francs, vous avez forcément visité au moins une page
jouant de la musique, avec une sonorité catastrophique, via le Lecteur Windows
Media (l'ancêtre de Windows Media Player), ou Quicktime. Si vous avez lancé au
moins une fois le flipper de Windows (Space Cadet), ou un 3D pinball de
Sierra, vous avez certainement retenu la musique électronique, avec des
instruments rappelant de loin une guitare basse et des sons de synthétiseur.
Ce sont en fait, des fichiers midi qui sont joués.</p>
<h2>Le MIDI dans les jeux</h2>
<p>On sort du cadre de la MAO, mais comment parler de MIDI sans parler des jeux
ayant utilisé le MIDI comme source de musique.</p>
<p>En plus des cartes sons (AdLib, Creative Sound Blaster, Gravis UltraSound), de
qualité inégale (la plupart sonnant pouet pouet), il y a eu deux principaux
appareils, utilisés entre la fin des années 80 et le milieu des années 90, le
Roland MT-32, et le Roland SC-55.</p>
<p>Le MT-32 est un synthétiseur, programmable via le MIDI, et datant de 1987.
Basé sur la synthèse L.A (comme le D-50), sa sonorité était largement
supérieure, aussi bien aux cartes sons existant à l'époque que les cartes sons
ultérieures. Doté de 9 canaux MIDI, de 128 instruments et de 33 percussions,
il n'est pas compatible GM1, même s'il existe un gros patch sysex qui permet
de supporter partiellement le GM1.</p>
<p><img alt="Photo d'un Roland MT-32" src="/images/mao3/MT_32.jpg"></p>
<p>Juste à titre indicatif, ce lien présente une liste de jeux pouvant tirer
parti du MT-32.</p>
<p><a href="http://fr.wikipedia.org/wiki/Liste_de_jeux_vid%C3%A9o_compatibles_avec_le_Roland_MT-32">http://fr.wikipedia.org/wiki/Liste_de_jeux_vid%C3%A9o_compatibles_avec_le_Roland_MT-32</a></p>
<p>Le SC-55 est un expandeur MIDI, sorti en 1991, quelques semaines avant la
publication de la norme GM1. Il s'agit en fait du premier appareil répondant à
la norme GS (de Roland), et les premiers modèles (ceux en version 1.10
notamment) ne sont pas 100% compatible GM1. Les suivants, eux, le sont.</p>
<p><img alt="Roland SC-55" src="/images/mao3/sc-55-1.jpg"></p>
<p>Un SC-55. Notez la présence du logo General MIDI à côté du logo GS.</p>
<p>Le SC-55 fera référence dans les jeux, notamment pour Doom, Duke Nukem 3D (les
bandes sons étant composées avec).</p>
<p>À noter, le SC-55 utilise des samples PCM et une version réduite de la
synthèse LA. Il peut se comporter comme un MT-32, mais ne permet pas d'être
programmé comme son prédécesseur.</p>
<p>Le SC-55 permet aussi de faire des trucs amusants, comme ceci :</p>
<p><a href="/images/mao3/StarGame.webm">Télécharger la vidéo au format webm.</a></p>
<p>Le fichier MIDI lu est StarGame. L'animation est jouée en temps réel, en même
temps que la musique. Les données sont transmises via le MIDI, par des codes
SysEx.
Le truc bleu posé dessus est une interface MIDI-USB. Notez aussi l'absence du
logo General MIDI.</p>
<p>À noter, les expandeur Yamaha supportant le GS sont aussi capables d'afficher
cette animation s'ils sont pourvus d'un écran.</p>
<p>De manière anecdotique, un seul jeu supporte le XG de Yamaha, il s'agit de
Final Fantasy 7. Final Fantasy 8 se reposera sur le format DLS pour les
musiques, les samples étant stockés dans ce format, et géré correctement sous
Windows, la puissance des machines de l'époque aidant. Si vous avez un peu de
temps à perdre, regardez le contenu de FF8.DLS, il y a quelques perles dedans
:)</p>
<p>La plupart des exemples ci-dessous ont été capturés via un Zoom H2n, et
enregistré sous GNU/Linux via audacity (et jack), pour la bonne et simple
raison qu'il n'y a pas d'entrée ligne sur mon pc portable.
Cette méthode est discutable, mais cela me permettait de gagner du temps pour
le contrôle et le découpage. Pas besoin d'enlever/remettre la carte SD, pas
besoin de basculer en mode lecteur USB.</p>
<p>N'ayant pas de MT-32 sous la main, j'ai utilisé un Roland SC-55 en mode MT-32
(l'éteindre, garder appuyé la touche Instrument Gauche, et l'allumer. Au
message "Init MT-32, Sure?", appuyer sur ALL pour valider).</p>
<p><strong>Petit up :</strong> j'ai (enfin) un MT-32 de première génération sous la main, donc
j'ai réenregistré l'intro de The Secret of Monkey Island. Les différences de
sonorité entre le MT-32 et le SC-55 en mode MT-32 sont vraiment flagrantes.</p>
<p>Pour Final Fantasy 7, j'ai utilisé un Yamaha MU15, qui est la version
transportable du MU50 (fonctionne sur piles, et est aussi gros que deux livres
de poches superposés).</p>
<p><img alt="Photo d'un Yamaha MU15" src="/images/mao3/yamahamu15_2.gif"></p>
<p>The Secret of Monkey Island (SC-55 en mode MT-32), 1990</p>
<p>The Secret of Monkey Island (avec un vrai MT-32), 1990</p>
<p><img alt="The Secret of Monkey Island" src="/images/mao3/monkeyIsland.png"></p>
<p>Space Quest 1 (remake VGA) (MT-32), 1991</p>
<p><img alt="Capture d'écran de l'écran titre du jeu Space Quest" src="/images/mao3/spaceQuestVGA.png"></p>
<p>À noter, une partie des sons d'effets (FX) sont joués directement par
l'expandeur, car celui-ci est programmable. On n'est pas limité par les
presets de base. Je n'ai pas mis la version SC-55 en mode MT-32, ce dernier
n'étant pas programmable, il manque la moitié des pistes audio, celles-ci
étant remplacées par un son de piano.</p>
<p>Tie Fighter (SC-55), 1994</p>
<p><img alt="Capture d'écran du jeu Tie Fighter" src="/images/mao3/tieFighter.png"></p>
<p>Doom (Devinez avec quoi :p Attention, il y a un piège), 1993</p>
<p>À noter, le rendu audio n'est pas le même entre une machine Roland et une
machine Yamaha. Ce fichier permet de comparer les deux : D'abord le MU15, puis
le SC-55</p>
<p><img alt="Capture d'écran du jeu Doom" src="/images/mao3/doom.png"></p>
<p>Pinball 3D, Space Cadet (Microsoft GS Soft Synth), 1995. Notez la présence
importante de reverb.</p>
<p><img alt="Le flipper Space Cadet sous Windows" src="/images/mao3/pinball.png"></p>
<p>Sierra On-Line, 3D Ultra Pinball (réenregistré depuis la version Windows).</p>
<p><img alt="3D Ultra pinball" src="/images/mao3/3D_Pinball_Sierra.png"></p>
<p>Gradius II, (SC-55), 1992</p>
<p><img alt="Gradius 2 x68000" src="/images/mao3/gradius2.png"></p>
<p>Detana Twinbee, (SC-55), 1991</p>
<p><img alt="Detana Twinbee x68000" src="/images/mao3/detana-
twinbee.png"></p>
<p>Final Fantasy VII, (MU15), 1998</p>
<p><img alt="FF7 PC, patch avalanche" src="/images/mao3/ff7.jpg"></p>
<p>Suivant le type de matériel ou de logiciel, le rendu peut être catastrophique,
moyen, ou (très) bon. Le midi n'étant (en gros) qu'une partition, cela dépend
après du musicien (ici, logiciel ou matériel) qui la joue.</p>
<p>Bonus</p>
<p>J'ai dit plus haut que la plupart des cartes sons des années fin 80 début 90
sonnaient "pouet pouet" ? Ci-dessous, le test (par Lazy Game Reviews) avec le
jeu Secret of Monkey Island. (Regardez bien les années, ça peut choquer par
moment.)</p>
<p>À noter : La carte Game Blaster est la carte précédant la Sound Blaster, suivi
de la SB16. La carte LAPC-I est la version "Carte son PC" du MT-32 (la carte
est énorme d'ailleurs), la Gravis était une excellente carte son, mais peu de
jeux l'ont exploité, donc peu de ventes, donc peu de jeux… :/, la SCC-1 est la
version "Carte son PC" du SC-55. Je ne ferai aucun commentaire sur la AWE-32.</p>
<h2>Midinet</h2>
<p>À ne pas confondre avec Midinette.</p>
<p><img alt="Atari ST 1040" src="/images/mao3/Atari_1040STf.jpg"></p>
<p>MidiNet, puis LittleNET, utilisait les ports MIDI d'un Atari ST pour créer un
réseau entre deux machines. Le MIDI étant, au niveau matériel, rien d'autre
qu'un port série uni-directionnel, et fonctionnant à la vitesse de 31 200
bits/s ; cela peut sembler limite aujourd'hui, mais en 1987, où le minitel
fonctionnait à 1 200 bits/s (en down, en up, ça devait être 75 bits/s), cela
suffisait largement.</p>
<hr>
<p>Sources pour la rédaction de cet article :</p>
<ul>
<li><a href="http://www.midi.org/aboutmidi/tut_history.php">http://www.midi.org/aboutmidi/tut_history.php</a>.</li>
<li><a href="http://mixonline.com/TECnology-Hall-of-Fame/smith-sequential-midi-090106/">http://mixonline.com/TECnology-Hall-of-Fame/smith-sequential-midi-090106/</a>.</li>
<li><a href="http://fr.wikipedia.org/wiki/Musical_Instrument_Digital_Interface">http://fr.wikipedia.org/wiki/Musical_Instrument_Digital_Interface</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Software_synthesizer#Typical_software_synthesizers">http://en.wikipedia.org/wiki/Software_synthesizer#Typical_software_synthesizers</a></li>
<li><a href="http://createdigitalmusic.com/2012/12/grammy-for-midi-creators-dave-smith-ikutaro-kakehashi-first-connection-mystery-solved/">http://createdigitalmusic.com/2012/12/grammy-for-midi-creators-dave-smith-ikutaro-kakehashi-first-connection-mystery-solved/</a></li>
<li><a href="http://fr.wikipedia.org/wiki/Roland_MT-32">http://fr.wikipedia.org/wiki/Roland_MT-32</a></li>
<li><a href="http://en.wikipedia.org/wiki/Roland_SC-55">http://en.wikipedia.org/wiki/Roland_SC-55</a></li>
<li><a href="http://en.wikipedia.org/wiki/Atari_ST">http://en.wikipedia.org/wiki/Atari_ST</a></li>
<li><a href="http://en.wikipedia.org/wiki/CV/Gate">http://en.wikipedia.org/wiki/CV/Gate</a>.</li>
<li><a href="http://sc55.duke4.net/history.php">http://sc55.duke4.net/history.php</a></li>
<li><a href="http://fr.audiofanzine.com/batterie-electronique/editorial/dossiers/la-batterie-electronique.html">http://fr.audiofanzine.com/batterie-electronique/editorial/dossiers/la-batterie-electronique.html</a></li>
<li>Les notices de Roland, notamment celles du SC-55 (expandeur midi), des Juno 6 et 60, ainsi que les notice de Yamaha, notamment celles du MU-15, du MU-80 et du MU-2000 (expandeurs MIDI).</li>
<li>Le livre "MIDI, Musique et séquenceurs pour Atari ST+STE", éditions Micro Application, datant de 1989, ISBN 978-2-868-992772.</li>
<li>Mes connaissances, suite aux manipulations de divers matériels MIDI.</li>
</ul>Base de la MAO sous GNU/Linux2014-05-20T00:00:00+02:002014-05-20T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-05-20:/base-mao-sous-gnu-linux<p>Pour cette série d'articles orientés MAO, commençons par la base.</p>
<p>Sous GNU/Linux, disons le franchement, au niveau du son, c'est le bordel.</p>
<p><a href="/images/mao1/audio-mess.png"><img alt="Diagramme montrant 19 nœuds représentant le moyen d'avoir du son sous
GNU/Linux, avec leurs relations" src="/images/mao1/audio-
mess-t.png"></a>
Source de l'image : Mike Melanson, <a href="http://blogs.adobe.com/penguin.swf/">http://blogs.adobe.com/penguin.swf/</a></p>
<h2>Au niveau des pilotes.</h2>
<p>Pour résumer, il y a trois "pilotes" [1].</p>
<ul>
<li>
<p>Le plus ancien (1992 …</p></li></ul><p>Pour cette série d'articles orientés MAO, commençons par la base.</p>
<p>Sous GNU/Linux, disons le franchement, au niveau du son, c'est le bordel.</p>
<p><a href="/images/mao1/audio-mess.png"><img alt="Diagramme montrant 19 nœuds représentant le moyen d'avoir du son sous
GNU/Linux, avec leurs relations" src="/images/mao1/audio-
mess-t.png"></a>
Source de l'image : Mike Melanson, <a href="http://blogs.adobe.com/penguin.swf/">http://blogs.adobe.com/penguin.swf/</a></p>
<h2>Au niveau des pilotes.</h2>
<p>Pour résumer, il y a trois "pilotes" [1].</p>
<ul>
<li>
<p>Le plus ancien (1992) étant OSS : Open Sound System. Utilisant le principe de base UNIX (tout est fichier) via /dev/dsp, il était facile pour un développeur de jouer des sons. Cependant, le support matériel était limité, pour jouer plusieurs sons en même temps, il fallait que la carte supporte le mixage matériel, etc. Suite à un changement de licence (passage vers une licence privatrice pour pouvoir supporter plus de matériel) [2], il a été remplacé par (suspense).</p>
</li>
<li>
<p>ALSA, Advanced Linux Sound Architecture, le "pilote" actuel (depuis 1998), remplaçant OSS. Fournissant à la fois le support matériel (donc de bas niveau) et un ensemble de ressource pour les développeurs (API), il a la réputation (réelle) d'être plus difficile à programmer qu'OSS.</p>
</li>
<li>
<p>OSS4. 4Front Technologies (ayant sponsorisé le développement de XMMS et ayant embauché le développeur initiel d'OSS) propose OSS v4 (version 4) sous licence GNU/GPL, et donc de nouveau libre (depuis 2007) [2].</p>
</li>
</ul>
<p>Inutile de préciser que l'on a (encore, comme d'habitude dans le monde
merveilleux de l'OpenSource), une guerre de clochers entre les défenseurs
d'OSS (simple à programmer, meilleur son qu'alsa parce que code plus simple)
et les défenseurs d'ALSA (OSS : libre puis proprio puis libre, ça sera quoi
après ? proprio ?).</p>
<h2>Au niveau logiciel</h2>
<p>Préparez le popcorn, c'est bien pire.</p>
<p>Chaque projet majeur a (ou a eu) sa propre solution pour palier les problèmes
d'OSS/ALSA. On les appelle "serveur de son". Je n'aborderai donc que les plus
gros.</p>
<ul>
<li>
<p>KDE a(vait) sa propre surcouche par dessus OSS : aRts, pour analog Real time synthesizer, qui comme son nom l'indique (ou pas), permet de mixer plusieurs sources audio avant de l'envoyer vers la carte son. Officiellement abandonné depuis 2004.</p>
</li>
<li>
<p>KDE (à partir de la version 4) utilise désormais Phonon, qui est un framework multimédia, remplaçant aRts, et devant être autonome, afin de ne pas dépendre d'autres ressources (comme xine, gstreamer, vaste sujet également).</p>
</li>
<li>
<p>Enlightenment avait son serveur de son : ESD Enlightenment Sound Daemon. Gnome a également utilisé ESD. Gérant le mixage de manière logicielle, ce serveur de son avait également la possibilité d'envoyer du son à travers le réseau local (par exemple, le son joué sur un PC portable pouvait être transmis à une chaîne hi-fi branchée sur un pc fixe, les deux ayant ESD de configuré et fonctionnel). ESD n'est plus utilisé de nos jours.</p>
</li>
<li>
<p>Pulse Audio (anciennement Polipaudio, datant de 2004). Il s'agit du serveur de son quasiment le plus répandu actuellement, et ce, malgré les polémiques (liées aux prises de position de son développeur, je n'entrerais pas dans les détails, ça finira en troll… regardez systemd [3]). Pulse Audio est le successeur d'ESD, supportant en plus le mixage audio par application (comme sous Windows Vista et successeurs), gérant les oreillettes Bluetooth (A2DP…), etc etc etc. Il souffre toutefois de problème de latence (à priori résolu dans les dernières versions), et de charge CPU pouvant être relativement élevée (le ré-échantillonnage à la volée pour l'encodage audio étant consommateur de ressource) [4]. Lors de son premier déploiement majeur, ce serveur de son avait tendance à casser toute la chaîne audio [5].</p>
</li>
<li>
<p>Jack, pour Jack Audio Connection Kit (donc rien à voir avec Jack, une chanson de MagoYond [6]), est un serveur de son temps réel et a faible latence, et est devenu de fait (de facto) LE serveur de son pour l'audio professionnelle (et donc, pour le home studio). Depuis la version 2, jack est multiplateforme (GNU/Linux, Mac OS X, Windows, Solaris, iOS, et *BSD).</p>
</li>
</ul>
<h2>Pour résumer</h2>
<p>Contentons nous d'une solution qui fonctionne, c'est à dire le duo jack +
alsa. Cela limitera les couches logicielles à traverser.
<img alt="Pyramide présentant de bas en haut, le matériel puis les différentes couches
logicielles" src="/images/mao1/LXF130.audio.layers.png">
Source de l'image : <a href="http://tuxradar.com/content/how-it-works-linux-audio-
explained">http://tuxradar.com/content/how-it-works-linux-audio-
explained</a></p>
<p>Sur la plupart des distributions GNU/Linux, jack est disponible dans les
dépots (chercher jackd ou jack2).</p>
<h2>KXStudio</h2>
<p><a href="http://kxstudio.sourceforge.net/">http://kxstudio.sourceforge.net/</a></p>
<p>Sous Debian et dérivées, Ubuntu et dérivées, et ArchLinux, il existe un projet
intitulé KXStudio, et comprenant tout ce qui est nécessaire pour faire de la
MAO, que cela soit au niveau des applications ou des plugins. KXStudio propose
également un dépot "non-free", pour les logiciels non libre. On y retrouve
(entres autres) Reaper (en version Windows, packagé pour fonctionner sous
GNU/Linux via wine), Renoise, le support des plugins VST…
<a href="http://kxstudio.sourceforge.net/Documentation:Manual:kxstudio_and_free_software">http://kxstudio.sourceforge.net/Documentation:Manual:kxstudio_and_free_software</a></p>
<p>À noter, KXStudio peut également être installé de manière autonome
(distribution Linux).</p>
<p>Pour l'installer sur sa Debian ou Ubuntu, il suffit de suivre les instructions
de la documentation de KXStudio (ajout de dépot, ajout de l'architecture i386
sur une machine x64…)</p>
<p><strong>Conseil important : pour éviter les prises de tête, n'installez pas (ou
désactivez) pulse-audio. Pulse-audio prend la main de manière exclusive (pour
lui tout seul) la ou les cartes sons qu'il détecte. S'il est démarré, jack ne
pourra pas fonctionner. Regardez le schéma un peu plus haut et vous
comprendrez facilement pourquoi.</strong></p>
<h2>Pour bien commencer</h2>
<p>si on n'installe pas les meta-paquets (qui installent tout un tas de logiciel,
par catégorie), il vaut mieux avoir au minimum :</p>
<ul>
<li>
<p><strong>Cadence</strong>. Cette application permet la configuration et le démarrage/arrêt de jack. Il y a également la gestion des ponts entre alsa et jack.
<a href="/images/mao1/cadence.png"><img alt="Capture d'écran de l'application Cadence." src="/images/mao1/cadence-t.png"></a></p>
</li>
<li>
<p><strong>Catia</strong>. Cette application permet de faire les routages audio et midi de manière simple et visuelle.
<a href="/images/mao1/catia.png"><img alt="Capture d'écran de l'application Catia." src="/images/mao1/catia-t.png"></a></p>
</li>
<li>
<p><strong>wine-rt</strong>. Cette application permet de faire fonctionner les applications Windows sous GNU/Linux ; avec, certes, plus ou moins de succès, suivant l'utilisation des ressources sous Windows (API, tout ça). Ici, il faut noter le suffixe "-rt". Il s'agit d'une version modifiée (patchée) de wine, pour fonctionner en mode "temps réel", afin de réduire au maximum la latence.
<a href="/images/mao1/wine.png"><img alt="Capture d'écran de winecfg." src="/images/mao1/wine-t.png"></a></p>
</li>
<li>
<p><strong>FeSTige</strong>. Cette application est une interface graphique au dessus de fst. Fst étant une application capable de faire fonctionner les plugins VST via wine-rt. Les plugins apparaissent alors comme des applications sous Catia, et on peut alors les relier entre eux, piloter des vsti via un clavier maître ou un arpégiateur, etc… À noter, Festige est surtout utile pour jouer en live, ou pour tester les plugins de manière autonome (donc, pas dans un DAW).
<a href="/images/mao1/festige.png"><img alt="Capture d'écran de festige." src="/images/mao1/festige-t.png"></a>
À noter aussi, FeSTige permet également de gérer les plugins VST via dssi-VST.
Dans ce cas, le midi passe via alsa et non via jack, et ne permet pas
l'intégration via ladish et ne supporte pas non plus les presets. Ces deux
points seront expliqués dans des prochains articles.</p>
</li>
<li>
<p><strong>Audacity</strong> Le logiciel d'édition de son multi-plateforme. Il est à Cubase ce que le bloc-note est à Word. Il permet seulement l'édition et l'application d'effets (pas en temps réel, et en mode destructif), ne gère pas le midi. Bref, ce n'est pas un Daw. Il est pratique pour faire de l'enregistrement de source sonore, de retoucher vite-fait des fichiers audio (découpage, trim, application d'un coupe bas, ou encodage dans un autre format…)
<a href="/images/mao1/audacity.png"><img alt="Capture d'écran d'audacity." src="/images/mao1/audacity-t.png"></a></p>
</li>
<li>
<p><strong>Audacious</strong> (j'en vois qui rigolent au fond). Il s'agit d'une reprise (fork) de Beep Media Player, lui même réécriture de XMMS (X MultiMedia Sound) en gtk2, lui même clone de Winamp, mais pour Unix. Pourquoi parler de ce lecteur ? Tout simplement parce qu'il supporte jack comme sortie audio. On peut également, et ce, jusqu'aux versions antérieures à la 3.5, l'utiliser comme lecteur midi, et router le flux vers un périphérique midi externe (comme un expandeur), ou d'utiliser fluidsynth pour avoir une synthèse midi <strong>presque</strong> aussi catastrophique que la synthèse midi sous Windows [7]
<a href="/images/mao1/audacious.png"><img alt="Capture d'écran d'audacious." src="/images/mao1/audacious-t.png"></a></p>
</li>
</ul>
<h2>Conclusion</h2>
<p>Cet article n'a fait que survoler une toute petite partie de la MAO sous
GNU/Linux.</p>
<p>J'ai préféré commencer par aborder une partie de l'historique (pourquoi on en
est là), puis à indiquer quelques logiciels pour commencer à expérimenter.</p>
<p>Le prochain article présentera plutôt un cas concret, comme par exemple, un
synthétiseur avec un plugin de reverb et un analyseur de spectre ?</p>
<hr>
<p>1 : techniquement, seulement 2, si on considère OSS et OSSv4 comme étant un seul "pilote" <img alt="remonter" src="https://blog.chibi-nah.fr/static/up.png">
2 : http://en.wikipedia.org/wiki/Open_Sound_System#Free.2C_proprietary.2C_free<img alt="remonter" src="https://blog.chibi-nah.fr/static/up.png">
3 : Les deux projets étant créés par la même personne, je ne lancerai donc aucun troll. <img alt="remonter" src="https://blog.chibi-nah.fr/static/up.png">
4 : Pour des raisons de débit, une oreillette ou un casque bluetooth ne supporte pas le format PCM. Il faut donc utiliser un codec (à la MP3, mais encore plus compressé) pour envoyer le flux audio à travers le bluetooth. Cela me fait doucement rigoler ceux qui "écoutent" de la musique avec un casque Beats en Bluetooth, double combo pour la qualité \o/ (ceci étant un troll, bien entendu). <img alt="remonter" src="https://blog.chibi-nah.fr/static/up.png">
5 : Bien entendu, si cela ne marche pas, c'est de la faute d'Ubuntu, pas du développeur… <img alt="remonter" src="https://blog.chibi-nah.fr/static/up.png">
6 : <a href="http://magoyond.com/">http://magoyond.com/</a>, <img alt="remonter" src="https://blog.chibi-nah.fr/static/up.png">
7 : Pour avoir un VRAI Roland Sound Canvas (un SC55 de première génération), je confirme : la synthèse Windows, bien qu'étant basée sur un Sound Canvas, ne fait clairement pas honneur. Les sonorités "ressemblent" de loin par rapport au vrai, mais sonnent très mal (comme si on avait échantillonné les instruments sur 4 bits à 11 000Hz). Je posterai quelques exemples comparatifs dans un prochain article. <img alt="remonter" src="https://blog.chibi-nah.fr/static/up.png"></p>MAO sous GNU/Linux, jouer en Live !2014-05-20T00:00:00+02:002014-05-20T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-05-20:/mao-sous-gnu-linux-jouer-en-live<p>Avant d'attaquer un gros morceau avec les DAW (Digital Audio Workstation),
amusons-nous un peu à jouer « en direct » avec des instruments.</p>
<p>Prérequis :</p>
<ul>
<li>Un clavier maître.</li>
<li>Avoir lu le premier article sur la MAO.</li>
</ul>
<h2>C'est quoi un clavier maître ?</h2>
<p>Si vous avez acheté un piano électronique dans un supermarché ou même …</p><p>Avant d'attaquer un gros morceau avec les DAW (Digital Audio Workstation),
amusons-nous un peu à jouer « en direct » avec des instruments.</p>
<p>Prérequis :</p>
<ul>
<li>Un clavier maître.</li>
<li>Avoir lu le premier article sur la MAO.</li>
</ul>
<h2>C'est quoi un clavier maître ?</h2>
<p>Si vous avez acheté un piano électronique dans un supermarché ou même dans un
*discount, il se peut qu'il y ait des grosses prises derrière, comme celles
qu'on utilisait avec les anciens magnétophones. Si c'est marqué MIDI OUT
quelque part, c'est bon, on peut l'utiliser comme clavier maître, via un
adaptateur MIDI <-> USB. Si le clavier dispose d'une sortie USB, c'est encore
mieux :)</p>
<p>Par exemple :
<a href="/images/mao2/Midi_ports_and_cable.jpg"><img alt="Connecteur et câble MIDI" src="/images/mao2/Midi_ports_and_cable.jpg"></a> (Photo par Pretzelpaws, source :
<a href="http://commons.wikimedia.org/wiki/File:Midi_ports_and_cable.jpg">http://commons.wikimedia.org/wiki/File:Midi_ports_and_cable.jpg</a>)</p>
<p>Si vous n'en n'avez pas, on utilisera le clavier ou la souris (mais ça sera
laaaargement moins pratique pour jouer, voire impossible dans notre cas
présent).</p>
<p>Commençons avec TyrellN6, de u-he, disponible ici :
<a href="http://www.u-he.com/cms/tyrelln6">http://www.u-he.com/cms/tyrelln6</a>
Il s'agit d'un VSTi (un instrument virtuel). Télécharger la version Windows,
puis l'installer via wine, par exemple, via un terminal, et la commande :</p>
<div class="highlight"><pre><span></span><code>wine TyrellN612Winstaller.exe
</code></pre></div>
<p><img alt="Étape 1 de l'installation de Tyrell via wine" src="/images/mao2/tyrell-1.png"></p>
<p><img alt="Étape 2 de l'installation de Tyrell via wine" src="/images/mao2/tyrell-2.png"></p>
<p><img alt="Étape 3 de l'installation de Tyrell via wine" src="/images/mao2/tyrell-3.png"></p>
<p><img alt="Étape 4 de l'installation de Tyrell via wine" src="/images/mao2/tyrell-4.png">
À noter : il vaut mieux installer tous les VST au même endroit, c'est plus
facile pour les retrouver via FeSTige.</p>
<p><img alt="Étape 5 de l'installation de Tyrell via wine" src="/images/mao2/tyrell-5.png"></p>
<p><img alt="Étape 6 de l'installation de Tyrell via wine" src="/images/mao2/tyrell-6.png"></p>
<p><img alt="Étape 7 de l'installation de Tyrell via wine" src="/images/mao2/tyrell-7.png"></p>
<p>Donc, commençons. Lancer d'abord Cadence, puis configurer (si ce n'est déjà
fait) Jack, puis le démarrer.
Lançons ensuite Catia, et FeSTige.</p>
<p>Dans Catia, exporter les périphériques midi alsa (passerelle a2j), via ce menu
:
<img alt="Activation de a2j dans Catia" src="/images/mao2/catia-midi.png">
<img alt="Activation de a2j" src="/images/mao2/a2j.png">
Cliquer sur Yes, puis retourner dans le menu et cliquer sur "Start Bridge"</p>
<p>Dans le menu "Edit" de FeSTige, aller dans "Préférences", et ajouter le chemin
vers le répertoire contenant les plugins vst. <em>(Je les installe dans
~/wine/Program Files/Steinberg/Vstplugins/)</em></p>
<p><img alt="Configuration de FeSTige" src="/images/mao2/festige-config.png"></p>
<p>Cliquer sur "Rafraichir", le VSTi devrait apparaître. Si non, vérifier le
"préfixe wine" (son dossier où il installe les applications Windows et les
DLL, la plupart du temps dans ~/.wine)</p>
<p>Note : c'est vraiment super, ce mélange de Français et d'Anglais dans
l'interface, c'est malheureusement fréquent dans le libre.</p>
<p>Note : j'ai créé un lien (symlink) dans mon répertoire home, appelé wine, et
qui pointe sur ~/.wine. Cela me permet d'y accéder facilement sans modifier le
préfixe wine.</p>
<p>Pour démarrer le VSTi, il suffit de le sélectionner dans la liste, puis de
cliquer sur "Lancer".</p>
<p>Si tout s'est bien passé, on devrait avoir quelque chose comme ça :
<a href="/images/mao2/full.png"><img alt="" src="/images/mao2/full-t.png"></a>
Un grand écran ou deux, ça devient vite nécessaire…</p>
<p>Maintenant, effectuons les liaisons entre les différents éléments (le fameux
routage).
Commençons par placer nos éléments dans un sens logique : Tout ce qui est en
entrée à gauche, en sortie à droite, les intermédiaires, au milieu (comme,
suivre la chaîne du son : acquisition (micro), traitement (effets),
restitution (hauts-parleurs)).
Comme ceci :
<img alt="Exemple de routage dans Catia" src="/images/mao2/routage.png"></p>
<p>Effectuons le raccordement. Mon clavier maître est identifié par "USB
Keystation 88es", le VSTi, par TyrellN6, et la sortie audio, par System.</p>
<p>À noter : les différentes couleurs. Bleu pour l'audio, vert pour le midi Jack,
marron ou orange (suivant les versions de Catia/Claudia) pour le midi Alsa. Au
moins, on ne peut pas se tromper, en tentant de raccorder une sortie midi sur
une entrée audio.</p>
<p>L'opération s'effectue de manière simple, à base de glisser-déposer.</p>
<p>Raccordons donc la sortie midi du clavier maître sur l'entrée audio du Tyrell,
puis les sorties audio (stéréo) sur les entrées de la sortie système (la carte
son, donc).</p>
<p>Quelques instants plus tard, on obtient ceci :
<img alt="Routage effectué" src="/images/mao2/routage-2.png"></p>
<p>Montons légèrement le volume, puis appuyons sur une touche du clavier maître.
Un son est joué ? parfait. Si rien ne sort, vérifier que :</p>
<ul>
<li>Les enceintes sont allumées, et aucun casque n'est branché dessus.</li>
<li>Si on joue au casque, vérifier qu'il est branché.</li>
<li>Vérifier que jack fonctionne, à l'aide d'audacious par exemple.</li>
</ul>
<p>Cela fonctionne (zut, j'avais pas branché mon casque >.<), alors on peut jouer
un peu.
Sur le Tyrell, cliquer sur "Presets", pour faire apparaître la liste des
patches (presets). Sélectionner DocM à gauche, puis "Vangelis CS80" ou
"Bladerunner" par exemple, puis, jouer quelques notes.</p>
<p><img alt="Liste de quelques patches du Tyrell" src="/images/mao2/tyrell-8.png"></p>
<p>Et voilà comment on peut jouer directement, sous GNU/Linux.</p>
<h2>Ce n'est pas fini</h2>
<p>Si on ajoutait quelques effets, comme de la réverbération ?</p>
<p>Allons chercher le VST gratuit GlaceVerb chez Dasample :
<a href="http://dasample.com/products/glaceverb/">http://dasample.com/products/glaceverb/</a></p>
<p>Installons le comme cela a été fait pour Tyrell, puis rafraichissons la liste
des VST dans FeSTige, et lançons le.</p>
<p>Un élément "GlaceVerb" est apparu dans Catia. Déconnectons alors la sortie
audio du Tyrell (via un clic droit -> Disconnect), et intercalons GlaceVerb
entre la sortie du Tyrell et la carte son, comme cela :
<img alt="GlaceVerb est connecté entre le Tyrell et la carte son" src="/images/mao2/glaceverb.png"></p>
<p>Jouons de nouveau quelque notes, changeons de preset dans GlaceVerb (tester
les FX, tout en bas de la liste), et voilà.</p>
<p>On peut utiliser cette méthode simple pour installer n'importe quel VST (ou
VSTi), et tester ses paramètres.</p>
<p><strong>Note importante : Tous les VST ne fonctionneront pas forcément.</strong> Par
exemple, le VST Zoom MS Decoder ne fonctionne pas (problème de compatibilité
ou dll manquante dans wine).</p>
<h2>Et l'analyseur de spectre ? alors ?</h2>
<p>Mea culpa, je l'ai complètement oublié.</p>
<p>Allons chercher l'excellent VST Span de Voxengo, à cette adresse :
<a href="http://www.voxengo.com/product/span/">http://www.voxengo.com/product/span/</a>
Si vous suivez le podcast des Sondiers (<a href="http://lessondiers.knarfworld.net/">http://lessondiers.knarfworld.net/</a>),
vous avez du en entendre parler.</p>
<p>Voxengo propose des plugins VST gratuits et en commercialise d'autres.</p>
<p>L'installation d'un VST ne devrait plus vous poser de problème, je passe
directement à son raccordement dans Catia.</p>
<p>Il suffit de le raccorder à la sortie de GlaceVerb, par exemple, pour voir le
spectre (et les éventuels clips/saturations).
<a href="/images/mao2/span.png"><img alt="Capture d'écran du bureau montrant Span, Catia, Cadence et le Tyrell" src="/images/mao2/span-t.png"></a></p>
<p>Remarque importante : l'analyseur de spectre est gourmand en ressource,
surtout si on monte en précision au niveau fréquentiel avec un temps
d'intégration court (en gros, précis et rapide).</p>
<p>À vous de jouer.</p>
<p>Le prochain article parlera de Bristol, et du juno 6 :
<a href="http://bristol.sourceforge.net/juno.html">http://bristol.sourceforge.net/juno.html</a></p>Firefox et Australis2014-04-05T00:00:00+02:002014-04-05T00:00:00+02:00alextag:blog.chibi-nah.fr,2014-04-05:/firefox-et-australis<p>Ou comment revenir sur une apparence similaire aux anciennes versions de
Mozilla Firefox.</p>
<p>En bref, autant j'aime bien australis sur Thunderbird tout comme sur Firefox,
autant certains points me dérangent.</p>
<p>À noter, toute la configuration a été effectuée avec une version nightly de
Firefox [1], mais cela fonctionne aussi sur …</p><p>Ou comment revenir sur une apparence similaire aux anciennes versions de
Mozilla Firefox.</p>
<p>En bref, autant j'aime bien australis sur Thunderbird tout comme sur Firefox,
autant certains points me dérangent.</p>
<p>À noter, toute la configuration a été effectuée avec une version nightly de
Firefox [1], mais cela fonctionne aussi sur la version 29, qui ne devrait pas
tarder à sortir, et qui sera la première version à intégrer Australis.</p>
<p><img alt="informations de version indiquant une version alpha 31 de Mozilla Firefox" src="/images/australis/fx_australis.png"></p>
<p>Voyons donc comment faire pour retrouver une apparence plus "classique".</p>
<p>Avec un nouveau profil, cela ressemble à ça :</p>
<p><a href="/images/australis/fx_australis_00.png"><img alt="Firefox 31 ouvert, avec une page vide, non configuré" src="/images/australis/fx_australis_00_m.png"></a></p>
<p>Ce qui est déroutant : pas de bouton "suivant", pas de barre de menus, pas de
barre d'extensions, des onglets arrondis…</p>
<p><strong>Édit 6 avril 2014</strong> : pour le bouton suivant, c'est le comportement "normal"
si la case "petites icônes" n'est pas cochée dans les options de
personnalisation, et ce, depuis la version 4 de Firefox. Merci Damien pour la
remarque.</p>
<p>On est loin de ceci :</p>
<p><a href="/images/australis/fx_australis_01.png"><img alt="Firefox 28 ouvert, avec une page vide, configuré aux petits oignons" src="/images/australis/fx_australis_01_m.png"></a></p>
<p>Commençons donc par remettre la barre de menus. Rien de difficile, un clic
droit à côté des onglets, et c'est bon.</p>
<p><img alt="Menu contextuel montrant la possibilité de remettre la barre de menus" src="/images/australis/fx_australis_03.png"></p>
<p><img alt="Barre de menus affichée" src="/images/australis/fx_australis_04.png"></p>
<p>Voilà qui est déjà mieux.</p>
<p>La prochaine étape consiste à l'installation de l'extension "Classic Theme
Restorer (Customise Australis)"</p>
<p><a href="/images/australis/fx_australis_05.png"><img alt="Liste des extensions" src="/images/australis/fx_australis_05_m.png"></a></p>
<p>Je ne détaillerai pas comment installer une extension, c'est plutôt trivial.
Au pire, interrogez votre moteur favori [2], il devrait vous répondre.</p>
<p>Une fois installé, l'interface ressemble à ça :</p>
<p><a href="/images/australis/fx_australis_06.png"><img alt="Classic Theme Restorer installé" src="/images/australis/fx_australis_06_m.png"></a></p>
<p>Euh ? elle est où la différence [3] ? Tout ce que je vois, c'est l'onglet qui
est devenu droit et non arrondi, et le bouton « Bookmarks » qui est revenu.
À part ça, rien. Le néant. Le vide… À quoi ça sert alors d'avoir installé
cette extension ? À rien ?</p>
<div class="highlight"><pre><span></span><code> « Patience et longueur de temps
Font plus que force ni que rage. »
</code></pre></div>
<p><em>Jean de la Fontaine, fable Le Lion et le Rat.</em></p>
<p>Cliquons sur le bouton « Préférences » de l'extension. Une fenêtre devrait
alors s'afficher.
Configurons comme suit :</p>
<p><img alt="Fenêtre de configuration de Classic Theme Restorer" src="/images/australis/fx_australis_20.png">
<img alt="Fenêtre de configuration de Classic Theme Restorer" src="/images/australis/fx_australis_21.png">
<img alt="Fenêtre de configuration de Classic Theme Restorer" src="/images/australis/fx_australis_22.png">
<img alt="Fenêtre de configuration de Classic Theme Restorer" src="/images/australis/fx_australis_23.png"></p>
<p>Fermer la fenêtre, puis relancer Firefox [4].</p>
<p>Faire de nouveau un clic droit, cocher « Add-on Bar » (ou son équivalent en
français), puis cliquer sur « Customize… » (ou Personnaliser…)</p>
<p><img alt="Barre de menus affichée de nouveau" src="/images/australis/fx_australis_08.png"></p>
<p>On arrive sur cette interface :</p>
<p><a href="/images/australis/fx_australis_09.png"><img alt="Personnalisation de Firefox" src="/images/australis/fx_australis_09_m.png"></a></p>
<p>Les modifications s'effectuant à base de glisser-déposer, les opérations ne
seront pas détaillées.</p>
<p>Toutefois, les modifications que j'ai apporté sont :</p>
<ul>
<li>Déplacer les icônes « Téléchargements » dans la barre des extensions, en bas ;</li>
<li>Déplacer les icônes « Précédent/suivant », « Accueil », depuis la droite vers la gauche ;</li>
<li>Déplacer les icônes « Stop », « Recharger », depuis la liste des outils additionnels.</li>
</ul>
<p>Comme ceci :</p>
<p><a href="/images/australis/fx_australis_10.png"><img alt="Les boutons ont été déplacés." src="/images/australis/fx_australis_10_m.png"></a></p>
<p>Totalement optionnel, en fonction de vos convictions politiques, ajouter le
moteur de recherche DuckDuckGo [5]</p>
<p><a href="/images/australis/fx_australis_11.png"><img alt="Ajout de DuckDuckGo comme moteur de recherche." src="/images/australis/fx_australis_11_m.png"></a></p>
<p>En cliquant sur « Gérer les moteurs de recherche », on peut changer leur
ordre, et désactiver la complétion automatique de la recherche (envoi de
données lors de la frappe)</p>
<p><img alt="Configuration des moteurs de recherche." src="/images/australis/fx_australis_12.png"></p>
<p>Changeons maintenant le fond. Le gris est un peu trop gris, pas assez grisé
[6]</p>
<p>Installons alors l'extension Persona Plus</p>
<p><a href="/images/australis/fx_australis_13.png"><img alt="Extension Personas Plus." src="/images/australis/fx_australis_13_m.png"></a></p>
<p>Puis, dans les paramètres de l'extension Personas Plus,</p>
<p><a href="/images/australis/fx_australis_14.png"><img alt="Extension Personas Plus installée." src="/images/australis/fx_australis_14_m.png"></a></p>
<p>activons les « Personas personnalisées ».</p>
<p><img alt="Configuration de l'extension Personas Plus." src="/images/australis/fx_australis_15.png"></p>
<p>enfin, éditons un persona personnalisé</p>
<p><img alt="Menu de l'extension Personas Plus." src="/images/australis/fx_australis_16.png"></p>
<p>Ayant déjà les images créées, il ne me reste qu'à les sélectionner.</p>
<p><a href="/images/australis/fx_australis_18.png"><img alt="Configuration d'un persona." src="/images/australis/fx_australis_18_m.png"></a></p>
<p>Après validation, le thème apparait alors dans la liste.</p>
<p><a href="/images/australis/fx_australis_19.png"><img alt="Liste des thèmes." src="/images/australis/fx_australis_19_m.png"></a></p>
<p>Pour afficher les URL complètes dans la barre d'adresse (avec le http), il
faut aller dans les options cachées, via l'adresse about:config, puis de
chercher trim.</p>
<p><a href="/images/australis/fx_australis_27.png"><img alt="about config." src="/images/australis/fx_australis_27_m.png"></a></p>
<p>Passer la valeur à False, en double cliquant dessus.</p>
<p><a href="/images/australis/fx_australis_28.png"><img alt="Trim URL désactivé." src="/images/australis/fx_australis_28_m.png"></a></p>
<p>Tester en saisissant une URL.</p>
<p><a href="/images/australis/fx_australis_29.png"><img alt="Capture d'écran montrant le blog." src="/images/australis/fx_australis_29_m.png"></a></p>
<p>Il ne me reste "plus qu'a" installer les extensions que j'utilise
habituellement, et à les placer dans leur barre.</p>
<p><a href="/images/australis/fx_australis_26.png"><img alt="Firefox configuré." src="/images/australis/fx_australis_26_m.png"></a></p>
<p>Et voila, Firefox a été reconfiguré, de façon à ressembler aux anciennes
versions.</p>
<p>À noter, d'autres éléments à configurer n'ont pas été détaillés, comme la
désactivation de la visionneuse pdf intégrée [7], le mode "Do not Track", et
autres…</p>
<hr>
<p>1 Sous Debian SID, avec une version compilée à la main (et qui met 2h30 à
compiler…)</p>
<p>2 Le truc que les gens, ils appellent ça « Internet »</p>
<p>3 Tentant de répondre en trois lettres, dont les deux premières sont D.T. …</p>
<p>4 Quitter Firefox et l'ouvrir à nouveau.</p>
<p>5 À mon avis, ça ne s'appelle pas CoinCoinGo, parce que ça serait trop proche
d'une certaine tribune.</p>
<p>6— C'était Green, mais alors Green, Green, comme Green.
— Oui, mais Green comment ?</p>
<p>7 about:config, chercher pdfjs, et sur pdfjs.disabled, changer la valeur à
True.</p>SteamOS2013-12-22T00:00:00+01:002013-12-22T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-12-22:/steamos<p><a href="/images/steamOS/DSC08406.JPG"><img alt="Logo SteamOS" src="/images/steamOS/DSC08406-t.jpg"></a></p>
<p>Tiens, comme c'est dimanche, si je testais SteamOS ?</p>
<dl>
<dt><strong>Edit</strong> : Le tutoriel détaillé pour installer SteamOS en 2015 est présent ici</dt>
<dd><a href="https://blog.chibi-nah.fr/tuto-installation-steamos">https://blog.chibi-nah.fr/tuto-installation-steamos</a></dd>
</dl>
<h3>SteamOS ?</h3>
<p>Il s'agit d'une distribution dérivée de Debian, créée par Valve Software
(Half-Life, Steam, Portal, L4D…), et destinée à fonctionner sur les machines
appelées "SteamBox …</p><p><a href="/images/steamOS/DSC08406.JPG"><img alt="Logo SteamOS" src="/images/steamOS/DSC08406-t.jpg"></a></p>
<p>Tiens, comme c'est dimanche, si je testais SteamOS ?</p>
<dl>
<dt><strong>Edit</strong> : Le tutoriel détaillé pour installer SteamOS en 2015 est présent ici</dt>
<dd><a href="https://blog.chibi-nah.fr/tuto-installation-steamos">https://blog.chibi-nah.fr/tuto-installation-steamos</a></dd>
</dl>
<h3>SteamOS ?</h3>
<p>Il s'agit d'une distribution dérivée de Debian, créée par Valve Software
(Half-Life, Steam, Portal, L4D…), et destinée à fonctionner sur les machines
appelées "SteamBox". À noter, n'importe qui peut monter sa propre "SteamBox".</p>
<h3>Installation.</h3>
<p>J'avais une partition de 9 Go inutilisée, et une distrib debian sid sous la
main.
Ne souhaitant pas suivre les instructions "officielles", car trop pénibles
(nécessite un UEFI, un disque de 500 Go, une clé usb externe, effacera la
totalité du disque dur, pas de dual boot, support des cartes nvidia
uniquement…[1], faisons ça à la main, de manière artisanale.
Donc, utilisation de debootstrap, chroot, compilation d'un kernel 3.12.6 (j'en
ai profité pour mettre à jour mon kernel sous sid dans la foulée), et création
des paquets .deb.
Installation des paquets, configuration de grub sur la partition sda7, mise à
jour de mon grub "principal", puis reboot.</p>
<p>Et là, c'est le drame.</p>
<h3>Kernel panic ! Unable to mount root.</h3>
<p>Bon, reboot sous sid, et regardons ce qui cloche.</p>
<p>Premier point, je compile mes noyaux sans initrd. Ce truc là sert à rien quand
on compile ses propres noyaux, vu que les pilotes requis, genre, ext4, sont
compilés en dur et non en tant que module (où est l'intérêt de les mettre en
module ? faut monter une image intermédiaire qui contient le module pour
monter la partition root pour charger les modules… bref).</p>
<p>Second point, cette andouille de GRUB, malgré l'option ROOT-UUID = false, a
réussi à mettre un root=uuid=<UUID de la partition>. Pour que l'UUID soit
reconnu, il faut charger l'initrd, qui va alors chercher quelle partition
correspond à l'UUID passé en paramètre, puis va corriger la partition root.
Encore un truc tordu écrit par je ne sais qui, et dont l'utilité est
discutable. Re bref.</p>
<p>Je remet à jour grub, via update-grub (sachant qu'au départ, ce qui m'a fait
basculer de lilo à grub, c'est la nécessité de mettre à jour lilo à chaque
modif et que grub, suffisait d'enregistrer le fichier. Désormais, on change un
paramètre de grub, faut lancer une commande qui va générer un fichier de
config totalement incompréhensible. Cf un ancien article).</p>
<p>Cette fois, je vérifie que le grub.cfg ne contient pas d'UUID.</p>
<h3>C'est bon ? On reboot ?</h3>
<p><a href="/images/steamOS/DSC08404.JPG"><img alt="Qui a dit : pas de multiboot ?" src="/images/steamOS/DSC08404-t.jpg"></a></p>
<p>Un redémarrage plus tard, arrivée sur Debian Wheezy SteamOS, suivi de Login:.</p>
<p>Bien.</p>
<p><a href="/images/steamOS/DSC08400.JPG"><img alt="Tiens, définissons un mot de passe root, c'est toujours
utile." src="/images/steamOS/DSC08400-t.jpg"></a></p>
<p>Les utilisateurs et les dépots valve ont été configurés lors de
l'installation, reste à finir les 2-3 trucs qui reste, genre pulse-audio,
drivers…</p>
<p>Démarrage de lightdm, et … plaf ! Écran noir.</p>
<h3>Vive openSSH</h3>
<p>Connexion en urgence via ssh (une excellente idée de l'installer avant toute
chose, au cas où), kill de lightdm, et constatation des dégats. Lightdm n'a
pas arrêté de faire "start-error-respawn-error-respawn-error-respawn", en
boucle. Suffisamment de quoi générer 10 Mo de log en 30 secondes.</p>
<p>Démarrage de X via startx, et arrivée sur le bureau Gnome 3.4, en mode
"classique" (ou failsafe).
Steam demandant glx, vérifions que déjà, je suis sur la radeon (ah, tiens ?
j'ai laissé DIGD au lieu de DDIS dans rc.local, corrigeons ça). Arrêt de gnome
et X, basculons sur la radeon (sudo echo DDIS >
/sys/kernel/debug/vgaswitcheroo/switch), relançons X, et… toujours pas de glx
(glxinfo : pas de DRI, pas de DRM, rien).</p>
<p>Bon, ajoutons debian wheezy en apt-pinning, puis mettons à jour les dépots.</p>
<p>Tant que j'y suis, ajoutons les paquets de base, genre htop, vim, mc, et de
quoi configurer alsa.</p>
<p>Bizarre, j'ai bien le driver radeon libre dans les dépots steam, mon kernel
est le même que sur sid, et j'ai pas de problèmes pour faire tourner UT2004
dessus. Doit manquer un paquet ou deux. Installons alors mesa, et tout ce qui
concerne DRI-DRM et radeon.
Effectivement, il manquait quelques paquets.</p>
<p><a href="/images/steamOS/package-list.txt">La liste complète de tous les paquets installés. Certains ne sont pas
disponible dans les dépots de valve ni de debian. Il s'agit des paquets liés
au linux-*, spécifiques à ma machine.</a>
À noter, j'ai commencé à faire le ménage dans les paquets, mais il reste des
trucs à virer, genre, apache.</p>
<h3>Ooooh, le beau troll gnome</h3>
<p><a href="/images/steamOS/SteamOS-radeon.png"><img alt="Bureau Gnome" src="/images/steamOS/SteamOS-radeon-t.png"></a></p>
<p>Cette fois, gnome démarre en mode "normal", et me montre un beau bureau (/me
tousse), en précisant bien que c'est la radeon qui tourne. glxinfo montre que
DRI est bien actif, et également plein plein d'extensions GL*. Ça semble
fonctionner.
Démarrons alors steam en mode "desktop". Ça marche.
Réactivons alors lightdm, un reboot et une mise à jour steam plus tard, voilà
le mode "Big Picture". Entrons les informations de connexion, et explorons les
menus.</p>
<p><a href="/images/steamOS/DSC08410.JPG"><img alt="Démarrage de SteamOS." src="/images/steamOS/DSC08410-t.jpg"></a>
<a href="/images/steamOS/DSC08411.JPG"><img alt="Animation du démarrage de Steam." src="/images/steamOS/DSC08411-t.jpg"></a>
<a href="/images/steamOS/DSC08412.JPG"><img alt="Steam, en mode Big Picture" src="/images/steamOS/DSC08412-t.jpg"></a>
<a href="/images/steamOS/DSC08414.JPG"><img alt="Paramètres." src="/images/steamOS/DSC08414-t.jpg"></a>
<a href="/images/steamOS/DSC08416.JPG"><img alt="Et voilà, SteamOS avec une radeon. C'était pas si
compliqué." src="/images/steamOS/DSC08416-t.jpg"></a>
SteamOS avec le pilote radeon libre \o/</p>
<p>Quelques trucs vides ou encore en test, rien de grave. Quelques bugs bien
pénibles, comme un crash de l'overlay steam (pas moyen d'en sortir, obligé de
tuer steam via un tty), ou le redémarrage de steam quand on sort d'un jeu, et…
pas de son.
C'est le moment de configurer correctement alsa, donc je commencer par jarter
pulse-audio. Tant que la base ne marche pas, ça sert à rien de bidouiller la
surcouche. Donc, dans /etc/default/pulse-audio, désactivons son démarrage
auto, puis arrêt du service, /etc/init.d/pulse-audio stop.</p>
<p>Après une heure d'acharnement et de lecture de doc (mais pourquoi ça marche
avec root mais pas avec les utilisateurs), je m'aperçois que c'est simplement
le groupe "pulse" qu'il faut utiliser en plus d'audio ¬_¬'. Hop, usermod -aG
pulse steam.</p>
<p>Reboot, et cette fois, j'ai le son. Je crois que j'ai oublié de réactiver pa.
Je verrai ça plus tard.</p>
<h3>Plus qu'à tester</h3>
<p>Faisons quelques tests, en évitant d'appeler l'overlay en pleine partie, et ça
marche. Musique, vidéo, interface "relativement" fluide (avec le driver radeon
libre), et le petit plus : SteamOS fonctionnel avec une radeon, alors que ce
n'est pas (encore) supporté.</p>
<p>Vidéo montrant SteamOS, du boot à l'utilisation, en passant par un jeu et le
navigateur web, pour finir par l'arrêt. <a href="/images/steamOS/SteamOS.webm">Télécharger au format webm, 640x360,
lisible par vlc</a></p>
<hr>
<p>1 : <a href="http://store.steampowered.com/steamos/buildyourown">http://store.steampowered.com/steamos/buildyourown</a></p>Deux claviers branchés, deux dispositions différentes2013-11-02T00:00:00+01:002013-11-02T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-11-02:/deux-claviers-deux-dispositions<p>Une petite astuce simple et rapide, quand on a deux claviers différents, avec
deux dispositions différentes, genre un azerty et un bépo, sous Xorg.</p>
<p>Ce qui serait bien, c'est que si je tape quelque chose sur mon clavier bépo,
la map utilisée soit celle du bépo, et si je tape …</p><p>Une petite astuce simple et rapide, quand on a deux claviers différents, avec
deux dispositions différentes, genre un azerty et un bépo, sous Xorg.</p>
<p>Ce qui serait bien, c'est que si je tape quelque chose sur mon clavier bépo,
la map utilisée soit celle du bépo, et si je tape sur mon clavier azerty, la
map utilisée soit en azerty.</p>
<p>Comment faire ?</p>
<p>Commençons par lister les périphériques via xinput</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> xinput -list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Wacom ISDv4 E3 Finger touch id=11 [slave pointer (2)]
⎜ ↳ Wacom ISDv4 E3 Pen stylus id=12 [slave pointer (2)]
⎜ ↳ Logitech USB Laser Mouse id=13 [slave pointer (2)]
⎜ ↳ TypeMatrix.com USB Keyboard id=15 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=17 [slave pointer (2)]
⎜ ↳ Wacom ISDv4 E3 Pen eraser id=19 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Video Bus id=8 [slave keyboard (3)]
↳ Power Button id=9 [slave keyboard (3)]
↳ Sleep Button id=10 [slave keyboard (3)]
↳ TypeMatrix.com USB Keyboard id=14 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=16 [slave keyboard (3)]
↳ HP WMI hotkeys id=18 [slave keyboard (3)]
</code></pre></div>
<p>Ce qui m'intéresse, ce sont les deux claviers, donc les deux lignes suivantes :</p>
<div class="highlight"><pre><span></span><code> ↳ TypeMatrix.com USB Keyboard id=14 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=16 [slave keyboard (3)]
</code></pre></div>
<p>Chaque clavier a un identifiant, reste à faire l'association [id clavier] -> [disposition].</p>
<p>Pour cela, il suffit de taper les deux commandes suivantes :</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> setxkbmap -device 14 -layout fr bepo
alex@yue ~> setxkbmap -device 16 -layout fr oss
</code></pre></div>
<p>La commande s'utilise comme suit :</p>
<div class="highlight"><pre><span></span><code>setxkbmap -device <id> -layout <langue> <variante>
</code></pre></div>
<p>À noter : ces ID peuvent changer d'un démarrage à l'autre, voire même si on
débranche/rebranche le clavier.</p>
<p>Du coup, il va falloir scripter un peu :)</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="c1">#Permet de redéfinir à la volée les dispositions des claviers branchés.</span>
<span class="c1">#Clavier du laptop : fr-oss</span>
<span class="c1">#TypeMatrix, si branché : fr-bépo</span>
<span class="c1">#Clavier de mon pc portable</span>
setxkbmap<span class="w"> </span>-device<span class="w"> </span><span class="k">$(</span>xinput<span class="w"> </span>--list<span class="w"> </span>--id-only<span class="w"> </span><span class="s2">"keyboard:AT Translated Set 2 keyboard"</span><span class="k">)</span><span class="w"> </span>-layout<span class="w"> </span>fr<span class="w"> </span>oss
<span class="c1">#À noter, le TypeMatrix peut ne pas être présent.</span>
<span class="c1">#Dans ce cas, on ne fait rien</span>
<span class="nv">CL_TMx2030</span><span class="o">=</span><span class="k">$(</span>xinput<span class="w"> </span>--list<span class="w"> </span>--id-only<span class="w"> </span><span class="s2">"keyboard:TypeMatrix.com USB Keyboard"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>sed<span class="w"> </span><span class="s1">'s/[^0-9]//g'</span><span class="k">)</span>
<span class="k">if</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>-n<span class="w"> </span><span class="s2">"</span><span class="nv">$CL_TMx2030</span><span class="s2">"</span><span class="w"> </span><span class="o">]</span>
<span class="k">then</span>
<span class="w"> </span>setxkbmap<span class="w"> </span>-device<span class="w"> </span><span class="nv">$CL_TMx2030</span><span class="w"> </span>-layout<span class="w"> </span>fr<span class="w"> </span>bepo
<span class="k">fi</span>
</code></pre></div>
<p>Rien de compliqué. On récupère les deux ID via xinput, puis on applique les
dispositions. Une petite variante pour le TypeMatrix. En effet, il vaut mieux
détecter sa présence, d'où le "sed" pour extraire la valeur numérique si le
clavier est branché.</p>
<p>Il ne reste plus qu'à appeler ce script dans l'autoexec de WMaker, ou via un
raccourci clavier, ou une entrée de menu.</p>
<p>Après, pourquoi s'embêter avec ça alors que je pourrais définir les deux
claviers en bépo ? Plusieurs raisons :</p>
<ul>
<li>Dosbox (enfin, DOS, dans dosbox) ne reconnait pas le bépo.</li>
<li>Quand je suis en extérieur, je ne prends pas systématiquement mon TM.</li>
<li>Je suis absolument incapable de taper en bépo sur mon clavier azerty, et en azerty sur mon bépo.</li>
<li>Quand quelqu'un utilise mon ordi (famille…), il/elle est habitué(e) à la disposition azerty, et n'a pas le temps (ni l'envie) d'apprendre le bépo.</li>
</ul>Évolution2013-11-02T00:00:00+01:002013-11-02T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-11-02:/evolution<p>Petit article parlant d'évolution et non de religion, révolution ou de
conspiration</p>
<p>Commençons par placer le contexte.</p>
<div class="highlight"><pre><span></span><code>var ctx:Context = Context.getContext();
</code></pre></div>
<p>Après la réparation des GBA[1] (contacts des touches complètement usés), je me
suis attaqué au nettoyage des jeux GB/GBC/GBA.</p>
<p>Après quelques années de service[2 …</p><p>Petit article parlant d'évolution et non de religion, révolution ou de
conspiration</p>
<p>Commençons par placer le contexte.</p>
<div class="highlight"><pre><span></span><code>var ctx:Context = Context.getContext();
</code></pre></div>
<p>Après la réparation des GBA[1] (contacts des touches complètement usés), je me
suis attaqué au nettoyage des jeux GB/GBC/GBA.</p>
<p>Après quelques années de service[2], je me retrouve avec des problème de
contact dans les cartouches. Un coup de soufflette[3] n'arrangeant rien, un
démontage[4] s'imposait.</p>
<p>Maintenant que le contexte est défini, parlons de l'évolution.</p>
<p>Tetris a juste une puce (en fait, le DIE est collé directement sur le PCB, il
n'est pas dans un boitier), Kirby' Dream Land a deux puces, Pokémon Jaune et
Donkey Kong 94 ont une pile CR1616 soudée…</p>
<p>Une image, c'est quand même plus parlant.</p>
<p><a href="/images//DSC07806.JPG"><img alt="Cartouches de jeux Game boy" src="/images//DSC07806.JPG"></a></p>
<p>Les jeux sont rangés par année de sortie, de 1989 à 2001.</p>
<p><a href="/images//DSC07812.JPG"><img alt="Tournevis TriWing et embout GameBit 3.8" src="/images//DSC07812.JPG"></a></p>
<p>L'outillage nécessaire pour le démontage propre.</p>
<hr>
<p>1 : Console de jeux vidéo portable sortie en 2000, rétrocompatible avec la GBC et la GB. Oui, je dis « LA » et non « LE », tout comme je dis « LA » gamecube, « LA » wii.</p>
<p>2: Tetris GB datant de 1989, soit 200 ans après la révolution française.</p>
<p>3 : Au compresseur, pas à la bouche, bien entendu.</p>
<p>4 : Pas la peine de s'emm*** à bricoler des tournevis à coup de cramage de bic. Un triwing et un gamebit 3.8, ça se trouve facilement, et ça coûte pas cher.</p>Astuces MIDI2013-08-24T00:00:00+02:002013-08-24T00:00:00+02:00alextag:blog.chibi-nah.fr,2013-08-24:/astuces-midi<p>Quelques astuces en vrac pour le MIDI (Musical Instrument Digital Interface)
sous GNU/Linux, plus particulièrement avec ALSA (Jack Audio permet de mieux
gérer cela, mais ici, je veux de l'alsa "pur", sans surcouche).
Ça tient plus de l'aide mémoire que de tutoriels, vu que je cherche souvent
ces infos …</p><p>Quelques astuces en vrac pour le MIDI (Musical Instrument Digital Interface)
sous GNU/Linux, plus particulièrement avec ALSA (Jack Audio permet de mieux
gérer cela, mais ici, je veux de l'alsa "pur", sans surcouche).
Ça tient plus de l'aide mémoire que de tutoriels, vu que je cherche souvent
ces infos.</p>
<p><strong>Lister les interfaces (qui est connecté à quoi)</strong></p>
<div class="highlight"><pre><span></span><code>alex@yue ~> aconnect -lio
client 0: 'System' [type=noyau]
0 'Timer '
1 'Announce '
Connexion À: 15:0
client 14: 'Midi Through' [type=noyau]
0 'Midi Through Port-0'
Connecté Depuis: 128:0
client 24: 'USB Uno MIDI Interface' [type=noyau]
0 'USB Uno MIDI Interface MIDI 1'
</code></pre></div>
<p>Ici, une appli (th08[1]) envoie des données midi vers "Midi Through Port-0" [2].</p>
<p><strong>Changer la sortie MIDI sous Wine.</strong></p>
<p>Je reprend l'exemple de th08. L'application fonctionne via Wine, et envoie ses
données vers "Client 14". Or, comme aucun expandeur midi n'est raccordé
dessus, aucune musique n'est jouée. Je veux que l'appli envoie les données
vers "Client 24"[3]. Pour cela, il faut ajouter (ou modifier) une entrée dans
la base de registre, pour indiquer qu'il ne faut pas prendre le premier
périphérique midi, mais le second. (attention, on compte à partir de zéro et
non de 1, donc le 1er a le n°0, le second, 1, le troisième 2, etc).</p>
<p>Le plus simple est de créer un fichier texte et d'y coller :</p>
<div class="highlight"><pre><span></span><code>REGEDIT4
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Multimedia\MIDIMap]
"CurrentInstrument"="#1"
</code></pre></div>
<p>Puis d'ouvrir regedit (wine regedit), et d'ouvrir le fichier pour que la clé
soit modifiée. On peut aussi le faire à la main, en créant les branches et la
clef.</p>
<p>Plus de détails dans la doc wine : <a href="http://www.winehq.org/docs/winedev-guide/mm-conf">http://www.winehq.org/docs/winedev-guide/mm-conf</a></p>
<p>Le résultat est donc :</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> aconnect -lio
client 0: 'System' [type=noyau]
0 'Timer '
1 'Announce '
Connexion À: 15:0
client 14: 'Midi Through' [type=noyau]
0 'Midi Through Port-0'
client 24: 'USB Uno MIDI Interface' [type=noyau]
0 'USB Uno MIDI Interface MIDI 1'
Connecté Depuis: 128:0
</code></pre></div>
<p><strong>Mapper une sortie MIDI vers une entrée MIDI.</strong></p>
<p>Par exemple, Utiliser un clavier maître pour piloter
<a href="http://bristol.sourceforge.net/">Bristol</a> :</p>
<div class="highlight"><pre><span></span><code>aconnect 24 128
</code></pre></div>
<p>L'appui sur une touche sur le clavier maître provoquera alors le son (ou
l'effet) désiré.</p>
<hr>
<p>1 : th08, Imperishable Night (forcément).
2 : Ce qui est le comportement attendu, Cf. article <a href="https://blog.chibi-nah.fr/article11">touhou-08-imperishable-night-sous-gnu-linux</a>
3 : Expandeur midi matériel (Roland SC-55), branché via une interface midi-usb(M-Audio USB UNO, reconnu et fonctionnel sous GNU/Linux.</p>Conversion de polices pour le web2013-07-20T00:00:00+02:002013-07-20T00:00:00+02:00alextag:blog.chibi-nah.fr,2013-07-20:/conversion-de-polices-pour-le-web<p>En faisant l'adaptation d'un thème provenant de <a href="http://templated.co">http://templated.co</a> vers
pluxml, je me suis rendu compte que les polices de caractères utilisées sont
stockées chez google.</p>
<p>Déjà que je n'utilise pas de google-ads, google-stats (whatever the name is),
je ne vois pas pourquoi je changerais de pratique pour ces …</p><p>En faisant l'adaptation d'un thème provenant de <a href="http://templated.co">http://templated.co</a> vers
pluxml, je me suis rendu compte que les polices de caractères utilisées sont
stockées chez google.</p>
<p>Déjà que je n'utilise pas de google-ads, google-stats (whatever the name is),
je ne vois pas pourquoi je changerais de pratique pour ces fonts.</p>
<p>Donc :</p>
<ul>
<li>
<p>Premier point, vérifier si la licence me le permet, SIL Open Font License (à priori, oui, mais dans certaines conditions…),
<a href="https://github.com/theleagueof/raleway/blob/master/Open%20Font%20License%20FAQ.markdown#2-using-
ofl-fonts-for-webpages-and-online-webfont-services">https://github.com/theleagueof/raleway/blob/master/Open%20Font%20License%20FAQ.markdown#2-using-
ofl-fonts-for-webpages-and-online-webfont-services</a></p>
</li>
<li>
<p>Second point, récupérer les sources des 18 fontes (ici donc -> <a href="http://www.impallari.com/projects/overview/matt-mcinerneys-raleway-family">http://www.impallari.com/projects/overview/matt-mcinerneys-raleway-family</a> )</p>
</li>
<li>Troisième point, les générer aux différents formats<s>à la con</s>utilisés sur le www (wild wild west).</li>
</ul>
<p>Pour cela, utilisons fontforge (apt install fontforge).</p>
<p>Créons un répertoire "generated" dans src, puis utilisons cette petite
commande (ici avec bash) :</p>
<div class="highlight"><pre><span></span><code>for file in *; \
do fontforge -c 'import fontforge; \
font = fontforge.open("'$file'"); \
font.generate("../generated/'$(basename $file .otf)'-gen.ttf"); \
font.generate("../generated/'$(basename $file .otf)'-gen.woff"); \
font.generate("../generated/'$(basename $file .otf)'-gen.eot"); \
font.generate("../generated/'$(basename $file .otf)'-gen.svg");'; \
done
</code></pre></div>
<p>Quelques secondes plus tard, j'obtiens les 90 fichiers ttf, woff, eot et svg.</p>
<p>Il ne reste plus qu'à modifier la feuille de style pour pointer sur ces
polices</p>
<p>Critique de fin d'article : franchement, générer 4 fichiers pour <strong>une</strong>
police de caractère, c'est abusé. Pour être compatible avec tous les
navigateurs, ça fait 28 Mo de fonts…</p>
<p><strong>Édit 2014-07-15 23:07</strong> le format eot est pour les « anciennes » versions
d'Internet Explorer, les formats ttf et<s>wouf !</s>woff sont gérés par
<strong>presque</strong> tous les navigateurs récents, le format woff étant d'ailleurs
recommandé, le svg, c'est pour les anciennes versions de Chrome et Opera.</p>
<p>Source : <a href="http://www.w3schools.com/css/css3_fonts.asp">http://www.w3schools.com/css/css3_fonts.asp</a></p>FDT2013-07-20T00:00:00+02:002013-07-20T00:00:00+02:00alextag:blog.chibi-nah.fr,2013-07-20:/fdt<p>Voilà, c'est fait… j'ai fini par installer FDT sur mon mac et prendre le temps
de comprendre comment il fonctionne.</p>
<p>FDT [1] est une alternative à Flex/Flash Builder d'Adobe.</p>
<p>Il s'agit d'une version d'Eclipse "préconfigurée", avec des plugins chargés,
afin de créer "facilement" des applications Flex [2].</p>
<p>Bien entendu …</p><p>Voilà, c'est fait… j'ai fini par installer FDT sur mon mac et prendre le temps
de comprendre comment il fonctionne.</p>
<p>FDT [1] est une alternative à Flex/Flash Builder d'Adobe.</p>
<p>Il s'agit d'une version d'Eclipse "préconfigurée", avec des plugins chargés,
afin de créer "facilement" des applications Flex [2].</p>
<p>Bien entendu, il faut penser à aller chercher le SDK 4.6 (chez Adobe) ou 4.9
(chez Apache). Perso, je travaille toujours avec le framework en version 3.6.
Je n'ai pas encore pris le temps de regarder Gumbo plus en détail, par manque
de temps et d'intérêt [3].</p>
<p>Après quelques années passées avec Flex Builder, la transition est difficile.
Il manque pas mal de trucs faits automatiquement, ou certains éléménts ne sont
pas à la même place. Pour faire une analogie (foireuse), c'est comme passer de
Photoshop à Gimp [4].</p>
<p>Du coup : pourquoi délaisser Flex Builder ?</p>
<ul>
<li>Le coût de la licence (pas donné pour un particulier)</li>
<li>Essayer une alternative (ici, gratuite, pas une version tombée du torrent)</li>
<li>Avoir un IDE complet, donc, ne pas être obligé de jouer des scripts et de la ligne de commande pour compiler les projets.</li>
</ul>
<p>Bien entendu, je ne le délaisse pas (au bureau, en tout cas). C'est juste à
titre privé, où j'aurai la possibilité d'expérimenter des trucs en AS3, sans à
me préoccuper qu'il s'agit d'une version d'évaluation de 30 jours [5].</p>
<p>À noter, flash est en perte de vitesse, la mode actuelle est au html5.</p>
<p>[TROLL] D'ailleurs, je me mettrai au js quand il y aura le <em>support complet
des classes, des namespaces</em> (des vrais, pas des trucs simulés par jquery et
autres libs), que la doc sera <em>complète</em> et <em>accessible</em> , et que le support
de js sera <em>unifié</em> sur tous les navigateurs, sans à avoir à faire une version
pour webkit, une version pour gecko, et plein de <em>hacks</em> pour IE. [TROLL] Pour
le moment, AS3 permet tout cela [6].</p>
<p>Bref, après avoir parcouru les menus, lu la doc, etc, je trouve que la
création d'un projet n'est pas aussi aisé qu'avec FB. De même, la compilation
ne réagit pas de la même manière, au point où je me demande si elle a vraiment
réussi (rien n'est indiqué).</p>
<p>Sinon, l'autocomplétion est meilleure que celle de FB, de même que l'affichage
(partiel, version gratuite oblige) de l'ASDoc.</p>
<p>Par contre, ce n'est pas possible d'importer tel quel un projet venant de FB.
Il vaut mieux créer un nouveau projet FDT puis importer uniquement le
répertoire src, et paramétrer le projet.</p>
<p>Un petit détail avec le framework 3.6A d'Adobe, la décompression de l'archive
zip sur Mac OS X présente des problèmes au niveau des droits Unix. Certains
fichiers sont définis en 000, certain répertoires en 700. Du coup, deux coup
de find et de chmod furent nécessaires pour tout mettre en ordre, 644 pour les
fichiers, 755 pour les répertoires :</p>
<div class="highlight"><pre><span></span><code>find . -type f -exec chmod 644 \{\} \;
find . -type d -exec chmod 755 \{\} \;
</code></pre></div>
<p>En tout cas, mes templates sont fonctionnels, j'ai pu compiler le traditionnel
Hello World, ainsi que l'exemple konamiCode [7].</p>
<p>Par contre, il m'indique des warnings là où il ne devrait pas y en avoir (et
ce, malgré les nombreux clean & build). Faudra que je regarde ça de plus près.</p>
<p>La petite capture "kivabien" :</p>
<p><a href="/images//FDT_konamiCode.PNG"><img alt="Capture d'écran pour le code konami" src="/images//FDT_konamiCode_t.png"></a></p>
<hr>
<p>1 : FDT, flexible development toolkit, <a href="http://fdt.powerflasher.com/">http://fdt.powerflasher.com/</a></p>
<p>2 : Flex, un framework complet et libre, par Adobe, conçu pour créer des RIA
(applications web enrichies, presque multiplateforme). Il se base sur le
langage AS3 et la VM Flash (plugin flash).
<a href="http://www.adobe.com/fr/products/flex.html">http://www.adobe.com/fr/products/flex.html</a></p>
<p>À noter, le projet a été donné à la fondation Apache (version 4.6).
<a href="http://flex.apache.org/">http://flex.apache.org/</a></p>
<p>Attention, le SDK est libre et gratuit, Flex Builder 3 et Flash Builder 4, les
IDE basés sur Eclipse, eux, ne sont pas gratuits ni libres. On peut s'en
passer, et compiler à la main, ce qui devient vite pénible, surtout sur de
gros projets qui se comptent en centaines de milliers de lignes.</p>
<p>3 : Surtout par manque de temps, en fait. On n'a que 86 400 secondes par jour,
ce qui ne laisse pas forcément le temps de faire tout ce que l'on veut. Et
j'ai besoin de mes 8 heures de sommeil.</p>
<p>4 : Dans mon cas, ce fut l'opération inverse, passer de gimp à photoshop, qui
fut douloureuse, au point où je garde toujours un Gimp sous la main.</p>
<p>5 : Version d'évaluation de Flex Builder 3.</p>
<p>6 : Pourtant' l'Action Script, c'est le même langage que js, à peu de choses
près, les deux sont normalisés
<a href="http://fr.wikipedia.org/wiki/ECMAScript">ECMAScript</a>.</p>
<p>7 : Qui fut présenté dans un précédent article.</p>Teasing2013-07-20T00:00:00+02:002013-07-20T00:00:00+02:00alextag:blog.chibi-nah.fr,2013-07-20:/teasing<p><a href="/images/mao0/mao0.png"><img alt="capture d'écran teasing" src="/images/mao0/mao0-th.png"></a>
Plugins VST Windows sous GNU/Linux ?</p>
<p><a href="/images/mao0/tr.png"><img alt="Roland TR ?" src="/images/mao0/tr-th.png"></a>
Roland TR ?</p>
<p><a href="/images/mao0/top.jpg"><img alt="Zoom H2n ?" src="/images/mao0/top.jpg"></a>
Zoom H2n ?</p>Bon, ça, c'est fait…2013-06-09T00:00:00+02:002013-06-09T00:00:00+02:00alextag:blog.chibi-nah.fr,2013-06-09:/bon-ca-c-est-fait<p><a href="/images//DSC07813.JPG"><img alt="Comment un jeu PS2 permet d'installer un homebrew sur une carte mémoire…" src="/images//DSC07813.JPG"></a></p>
<p>Installer FreeMCBoot sur la PS2 pour bénéficier du swap magic, quand on n'a
pas de CD swap magic.</p>
<p>Du coup, ça fait plaisir de pouvoir jouer avec ses jeux import sur la PS2[1]
et non via un émulateur PS2, qui tourne à 60% de la vitesse réelle sur mon …</p><p><a href="/images//DSC07813.JPG"><img alt="Comment un jeu PS2 permet d'installer un homebrew sur une carte mémoire…" src="/images//DSC07813.JPG"></a></p>
<p>Installer FreeMCBoot sur la PS2 pour bénéficier du swap magic, quand on n'a
pas de CD swap magic.</p>
<p>Du coup, ça fait plaisir de pouvoir jouer avec ses jeux import sur la PS2[1]
et non via un émulateur PS2, qui tourne à 60% de la vitesse réelle sur mon
ordi.</p>
<p>Note : j'aurais du enlever la poussière sur l'écran avant de prendre la photo.</p>
<p><a href="/images//DSC07814.JPG"><img alt="Mushihime-sama en 16 kHz, 480i@30Hz" src="/images//DSC07814.JPG"></a>
Mushihime-sama.</p>
<p><a href="/images//DSC07817.JPG"><img alt="Trigger Heart Exelica Enhanced" src="/images//DSC07817.JPG"></a>
Trigger Heart Exelica Enhanced.</p>
<p>À noter : ce n'est pas une télévision mais un moniteur Asus (VW266H). La PS2
est branchée en YUV (YCbCr) en non en composite ou en RGB.</p>
<p>L'installation s'est faite facilement. Utilisation du jeu 007, espion pour
cible [2], dump du dvd, remplacement d'un fichier .elf par l'elf d'ulauncher,
jouer au jeu et échanger les jeux à chaud [3]. Ne pas oublier bien entendu de
brancher une clé usb contenant l'installateur.</p>
<hr>
<p>1 : PS-Two, modèle SCPH-75004.</p>
<p>2 : Acheté dans un cash à 4€</p>
<p>3 : "Hot Swap". Nécessite pour cela de bidouiller la console… ça tombait bien,
j'avais la pile de l'horloge à changer.</p>Cirno2013-05-26T00:00:00+02:002013-05-26T00:00:00+02:00alextag:blog.chibi-nah.fr,2013-05-26:/cirno<p><img alt="Cirno, from 東方 project" src="/images/cirno/cirno-2.jpg"></p>
<p>Sans commentaires.</p>
<p><img alt="Cirno, from 東方 project" src="/images/cirno/cirno-1.jpg"></p>
<p>Note pour plus tard : penser à vérifier les niveaux d'encre AVANT d'imprimer…</p>Nouveau thème2013-05-26T00:00:00+02:002013-05-26T00:00:00+02:00alextag:blog.chibi-nah.fr,2013-05-26:/nouveau-theme<p>Ayant un peu marre du thème mystique, j'ai changé de thème pluxml, pour en
mettre un un peu plus sobre et austère.</p>
<p>Tous les nouveaux articles seront visibles en entier depuis la page d'accueil.</p>SSTV2013-05-26T00:00:00+02:002013-05-26T00:00:00+02:00alextag:blog.chibi-nah.fr,2013-05-26:/sstv<p>SSTV : Slow Scan TeleVision.</p>
<p>Méthode permettant la transmission d'images en utilisant une bande passante
étroite, comme celle de la téléphonie. Cependant, comme cette bande passante
est très réduite, dans les 3 kHz, transmettre une image peut prendre entre 8
(huit) secondes et 5 (cinq) minutes, en fonction de la résolution …</p><p>SSTV : Slow Scan TeleVision.</p>
<p>Méthode permettant la transmission d'images en utilisant une bande passante
étroite, comme celle de la téléphonie. Cependant, comme cette bande passante
est très réduite, dans les 3 kHz, transmettre une image peut prendre entre 8
(huit) secondes et 5 (cinq) minutes, en fonction de la résolution et du codage
utilisé. À noter, la diffusion vidéo (analogique, SD, ntsc, pal, secam)
utilise une bande passante d'environ 6 MHz.</p>
<p>En bref :</p>
<p>Ce moyen de communication, utilisé par les radio-amateurs[1], a été conçu à la
fin des années 50 par Copthorne Macdonald, et nécessitait, jusqu'à la fin des
années 80-début 90, du matériel coûteux, comme une caméra[2] et un écran à
forte rémanence[3].</p>
<p>La particularité de ce moyen de communication, c'est qu'il utilise n'importe
quoi permettant de transmettre la parole. Autrement dit, tout moyen de
transmission de la parole est capable de transmettre des images, que cela soit
la radio FM, le téléphone (d'où la confusion avec les modems 33/56k), la CB,
et même les fichiers audio (mp3, ogg/vorbis).</p>
<p>Pour plus de renseignements, ne pas hésiter à consulter ces pages :</p>
<p><a href="http://en.wikipedia.org/wiki/SSTV">http://en.wikipedia.org/wiki/SSTV</a></p>
<p><a href="http://zebulon1er.free.fr/sstv.htm">http://zebulon1er.free.fr/sstv.htm</a></p>
<p>Reprenons le défi.</p>
<p><audio controls="" preload="none" src="images/defi/out.ogg">
</audio></p>
<p>L'analyseur de spectre montre ceci :</p>
<p><a href="/images/sstv/span.png"> <img alt="Analyseur de spectre montrant que les fréquences sont entre 1000 et 3000 Hz" src="/images/sstv/span.png"></a></p>
<p>Les fréquences qui « ressortent » le plus sont celles entre 1 200 Hz et 2 100
Hz.</p>
<p>L'oscilloscope, lui, pas grand-chose, mis à part une onde sinusoïdale.</p>
<p><a href="/images/sstv/osc.png"> <img alt="Oscilloscope montrant une onde sinusoïdale." src="/images/sstv/osc.png"></a></p>
<p>Utilisons alors un petit logiciel, comme MultiScan 2SL, permettant la
transmission et la réception d'images, et testons d'abord avec Cirno ⑨, qui
était l'indice, pour vérifier que ça fonctionne.</p>
<video controls="" height="400" preload="none" width="640">
<source src="images/sstv/cirno.mp4" type="video/mp4" />
<source src="images/sstv/cirno.webm" type="video/webm" />
</video>
<p>Ouvrir/télécharger : <a href="/images/sstv/cirno.mp4">cirno.mp4</a></p>
<p>Attention : résolution 1920x1200.</p>
<p>Ça fonctionne, parfait. Maintenant, effectuons la même chose avec le fichier
son du défi</p>
<video controls="" height="400" preload="none" width="640">
<source src="http://blog.chibi-nah.fr/images/sstv/defi.mp4" type="video/mp4" />
<source src="http://blog.chibi-nah.fr/images/sstv/defi.webm" type="video/webm" />
</video>
<p>Ouvrir/télécharger : <a href="/images/sstv/defi.mp4">defi.mp4</a></p>
<p>Et voilà le résultat :)</p>
<p>En résumé, le défi était :</p>
<ul>
<li>deviner le type de transmission</li>
<li>trouver que c'est du SSTV</li>
<li>extraire l'image</li>
<li>lire l'adresse email</li>
<li>soit m'envoyer un email à cette adresse, soit me communiquer cette adresse IRL.
<strong>Le défi étant terminé, il ne sert plus à rien d'envoyer un email à cette
adresse</strong></li>
</ul>
<p>Félicitations à ceux qui ont trouvé la bonne réponse :)</p>
<p>Aller, dernier défi, trouver où la photo a été prise :D.
Seb, tu n'as pas le droit de répondre parce que tu connais la réponse :p</p>
<hr>
<p>1: Ceux qui ont résolu le défi du mois dernier, en un rien de temps, sont des
radio-amateurs, ou des personnes connaissant ce moyen de transmission.</p>
<p>2 : Coûteux ? mais n'importe quoi. Une caméra HD, ça coûte même pas 100€ au
L**L du coin. Ne pas oublier que même dans les années 90, un caméscope, ça
coûtait horriblement cher, par rapport aux salaires. Ce n'est que récemment
que les coûts de fabrication ont fortement chutés pour devenir accessibles au
grand public, à condition qu'ils ne soient pas regardants sur la qualité.</p>
<p>3 : Comme un écran radar. Celui qui a pensé à Rayman doit se rendre le plus
vite possible « Chez le Psy » et demander Wallace :D</p>
<p>⑨ : バカ.</p>Petit défi (terminé)2013-04-13T00:00:00+02:002013-04-13T00:00:00+02:00alextag:blog.chibi-nah.fr,2013-04-13:/defi<p><strong>Défi terminé</strong></p>
<p>La réponse a été donné dans l'article suivant : SSTV</p>
<p>Petit défi. Je laisse juste un fichier son, à vous de vous débrouiller avec
(et donc, de trouver ce qu'il faut faire)…</p>
<p>Il n'y a rien à gagner, juste à se creuser (un peu) les méninges.</p>
<p><audio controls="" preload="none" src="images/defi/out.ogg" tabindex="0"></audio></p>
<p><strong>Up 2013-04-16 :</strong> Indice …</p><p><strong>Défi terminé</strong></p>
<p>La réponse a été donné dans l'article suivant : SSTV</p>
<p>Petit défi. Je laisse juste un fichier son, à vous de vous débrouiller avec
(et donc, de trouver ce qu'il faut faire)…</p>
<p>Il n'y a rien à gagner, juste à se creuser (un peu) les méninges.</p>
<p><audio controls="" preload="none" src="images/defi/out.ogg" tabindex="0"></audio></p>
<p><strong>Up 2013-04-16 :</strong> Indice (le seul proposé)</p>
<video controls="controls" height="480" tabindex="0" width="640" preload="none">
<source src="images/defi/v.mp4" type="video/mp4" />
<source src="images/defi/v.webm" type="video/webm" />
<source src="images/defi/v.ogv" type="video/ogg" />
</video>Google Reader2013-03-16T00:00:00+01:002013-03-16T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-03-16:/google-reader<p>Impossible de passer à côté de cette annonce fracassante qui a fait le tour du
monde : Google a annoncé la fin de son service Google Reader pour le premier
juillet.</p>
<p>Sans vouloir jouer les Cassandre, les annonces d'arrêt de « service dans les
nuages » risquent de se produire de plus en …</p><p>Impossible de passer à côté de cette annonce fracassante qui a fait le tour du
monde : Google a annoncé la fin de son service Google Reader pour le premier
juillet.</p>
<p>Sans vouloir jouer les Cassandre, les annonces d'arrêt de « service dans les
nuages » risquent de se produire de plus en plus dans les années à venir,
alors que la mode actuelle est de tout déporter dans des nuages.</p>
<p>Avoir ses applications qui le suivent partout, quel technophile n'en n'a pas
rêvé ? En déplacement pour le travail, à l'étranger pour des conférences,
accéder à ses emails, ses flux RSS, et maintenant à ses documents via office
365, Google Docs ou Etherpad, aujourd'hui, ce rêve est non seulement réalité,
mais l'usage est répandu. Alors, forcément, quand une grosse société annonce
l'arrêt de l'un de ces service [1], cela devient une catastrophe, bien pire
que l'annonce de Microsoft annonçant l'arrêt de MSN et invitant ses
utilitateurs à basculer sur skype [2].</p>
<p>Le gros problème de l'informatique dans les nuages, c'est qu'un coup de vent
souffle les nuages. Se baser uniquement dessus peut se révéler catastrophique,
l'actualité nous le montre encore souvent. D'où l'importance des services
décentralisés, voire carrément auto-hébergés [3].</p>
<p>Assez blablaté, concrètement, que faire pour continuer à suivre ses lux RSS ?</p>
<p>Plusieurs solutions :</p>
<ul>
<li>Utiliser une application « lourde » sur son PC, genre akregator, liferea, … ou sur son mobile.</li>
<li>Utiliser un service (pouvant être payant ou limité) comme Newsblur, par exemple.</li>
<li>Installer une solution web soi-même sur son propre serveur ou sur son PC.</li>
</ul>
<p>Laissons de côté les deux premières solutions et penchons nous sur la
dernière.</p>
<p>Le « web » n'a pas attendu la fin de google reader, ni même ses débuts pour
créer des « web-apps » [4]. Parmi ces apps, j'en utilise deux au quotidien :</p>
<ul>
<li><a href="http://signets.chibi-nah.fr/index.php?flux=1">Open Ardilla</a>, légèrement retouché (faudra que je libère les sources des modifications, même s'il s'agit de hacks crades pour résoudre les problèmes d'encodage de caractères), léger, sobre, mais limité aux titres des articles, et ne gérant pas les « lus, non lus ». Actuellement, mon préféré.</li>
<li><a href="http://leed.chibi-nah.net/">Leed</a>, plus complet que l'écureuil [5], et dont on peut changer le thème pour prendre l'apparence de Google Reader.</li>
</ul>
<p>Il en existe d'autres, comme
<a href="http://tontof.net/?2013/03/14/18/12/56-presque-nouveau-lecteur-rss-
kriss-feed-est-vraiment-tout-terrain">KrISS</a>, <a href="http://tt-
rss.org/redmine/projects/tt-rss/wiki">Tiny Tiny RSS</a>, ou
<a href="http://www.newsblur.com/">Newsblur</a>, mais je ne les ai pas testés. À noter,
certains proposent l'import depuis google reader, soit directement, soit via
un fichier intermédiaire.</p>
<p>En résumé, des alternatives existent, il « faut juste » [6] passer un peu de
temps pour trouver une alternative, et exporter ses flux depuis google Reader,
afin de ne rien perdre.</p>
<hr>
<p>1 : Ces ou ses, tout dépend si l'on considère l'un des services énuméré dans
la phrase précédente (dans ce cas, c'est « ces »), ou si l'on considère l'un
des service proposé par la société (donc, possessif, et donc « ses »). Bref,
ici, on peut utiliser l'un ou l'autre.</p>
<p>2 : Skype, racheté par Microsoft, il y a quelque temps.</p>
<p>3 : Ici, je ne parle que de l'aspect accès, je ne parle pas des problèmes
d'ordre éthique, de vie privée, ni des problème de mise en place par des
personnes ne connaissant rien en administration système.</p>
<p>4 : On ne parle plus de site web ni de scripts, mais de plus en plus
d'applications web, ou de S.A.A.S, Software As A Service, logiciel en tant que
service, pour utiliser le jargon des décideurs souvent pressés.</p>
<p>5 : Ardilla est un mot espagnol, se traduisant en écureuil en français.</p>
<p>6 : Yaka, Faucon, Moi-je</p>Sortie audio HDMI2013-02-24T00:00:00+01:002013-02-24T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-02-24:/sortie-audio-hdmi<p>Petite astuce simple et rapide pour pouvoir exploiter la sortie audio HDMI
sans utiliser PulseAudio, sous Debian 7.0 Wheezy.</p>
<p>À noter : il s'agit de la solution et non de toute la démarche effectuée pour
faire fonctionner la sortie audio.</p>
<p>Matériel utilisé :</p>
<p>HP TouchSmart TM2 1050ef, disposant de deux cartes …</p><p>Petite astuce simple et rapide pour pouvoir exploiter la sortie audio HDMI
sans utiliser PulseAudio, sous Debian 7.0 Wheezy.</p>
<p>À noter : il s'agit de la solution et non de toute la démarche effectuée pour
faire fonctionner la sortie audio.</p>
<p>Matériel utilisé :</p>
<p>HP TouchSmart TM2 1050ef, disposant de deux cartes vidéo (et donc, de deux "cartes son") [1].</p>
<p>Je trouve que PulseAudio a été écrit pour répondre à un mauvais problème. Ce
n'est que mon avis, mais si le problème était vraiment côté alsa, à quoi ça
sert d'ajouter une surcouche à Alsa au lieu de résoudre le problème dans Alsa.
À la fin, on ne sait même plus quel était le problème dans Alsa (dmix ?) [2].</p>
<p>Bref, je m'égare.</p>
<p>Ma problématique est simple :</p>
<p>En déplacement, j'utilise la carte vidéo intel, donc la carte son intel-HDA (IDT).</p>
<p>À la maison, j'utilise la carte vidéo radeon, vu que le laptop est branché sur
mon moniteur via le port HDMI. Rappel : l'utilisation du port HDMI nécessite
l'activation de la radeon, ce n'est pas possible sur la carte intel, pour des
raisons de branchement pour l'audio, je présume, parce qu'il n'y a pas ce
problème sur le port VGA.</p>
<p>Donc : si je branche mon écran en HDMI, que la vidéo passe dessus, il serait logique d'avoir l'audio qui transite également sur ce port ?</p>
<p>Et bien non.</p>
<p>Par défaut, la sortie audio HDMI est désactivée dans le module radeon. Il faut
l'activer, soit via une option dans le chargement du noyau linux (donc, à
ajouter dans grub), soit lors du chargement du module.</p>
<p>J'ai choisi lors du chargement du module.</p>
<p>J'ai donc ajouté</p>
<div class="highlight"><pre><span></span><code>options radeon audio=1
</code></pre></div>
<p>dans</p>
<div class="highlight"><pre><span></span><code>/etc/modprobe.d/radeon-kms.conf
</code></pre></div>
<p>puis redémarré l'ordi.</p>
<p>Ensuite, en root, un petit</p>
<div class="highlight"><pre><span></span><code>echo pcm.!default hdmi:HDMI > /etc/asound.conf
</code></pre></div>
<p>puis un</p>
<div class="highlight"><pre><span></span><code>mplayer .sounds/login.au
</code></pre></div>
<p>(J'ai plein de fichiers son pour les notifications que j'accumule dans
.sounds).</p>
<p>Après avoir entendu[3] le petit son de login (d'e16) via les hauts-parleurs de
l'écran (enfin, plutôt du kit 2.1 branché sur l'écran), il est temps
d'automatiser tout ça.</p>
<p>Enfin, automatiser, tout ce que je veux pour le moment, c'est : si je bascule
sur la carte radeon, alors la sortie audio par défaut est sur le port HDMI,
sinon, c'est la carte son interne.</p>
<p>Donc, modification de vga_switch :</p>
<div class="highlight"><pre><span></span><code>case "$1" in
radeon)
#radeon is known as discrete (external) card
echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch
echo "pcm.!default hdmi:HDMI" > /etc/asound.conf
echo "You must restart Xorg for applying changes"
;;
intel)
#intel is known as integrated (internal) card
echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch
echo "" > /etc/asound.conf
echo "You must restart Xorg for applying changes"
;;
</code></pre></div>
<p>Concrètement, c'est juste l'écriture de hdmi ou de vide dans le fichier
asound.conf. Rien de compliqué au final (une fois que l'on a trouvé toutes les
astuces).</p>
<p>Tout fonctionne, cependant :</p>
<p>Pas de DMIX sur la sortie hdmi ? Si une application joue dessus, une autre
application utilisera la carte son intégrée. Ça, c'est un problème, notamment
avec Clementine[4], lorsque je change manuellement de piste, où il m'indique
que la sortie audio est utilisée et donc, s'arrête sur ce message d'erreur
(répété, bien entendu).</p>
<div class="highlight"><pre><span></span><code>Impossible d'utiliser le périphérique audio pour la lecture. Celui-ci est occupé par une autre application.
</code></pre></div>
<p>Je pense que le fondu enchainé en est la cause. À mon avis[5], au lieu de
faire du mixage dans clementine, il ouvre un nouveau flux vers la carte son et
augmente le volume, tout en baissant progressivement l'ancien. Le mixage se
fait alors dans alsa, via DMIX.</p>
<p>Si je débranche l'écran HDMI, la sortie audio reste toujours configurée sur la
sortie HDMI. Il faudra que je planche sur ce problème. Si c'est possible
d'avoir une notification (pas par DBUS, merci) via Xorg comme quoi un écran
est branché sur le port HDMI (ou est débranché), sans à avoir à scruter xrandr
toutes les secondes, ça serait vraiment génial. En attendant, il faudra que je
désactive manuellement la sortie audio HDMI via mon script de gestion des
résolutions/écrans.</p>
<p><strong>UP pour le mixage audio (24 février 16h30)</strong></p>
<p>Il suffit d'utiliser :</p>
<div class="highlight"><pre><span></span><code>pcm.!default { type plug slave.pcm "dmix:1,3" }
</code></pre></div>
<p>et là, on a le mixage sur la sortie hdmi. Clementine et mplayer peuvent jouer
en même temps sur la sortie audio.</p>
<p>La ligne est condensée (quelques tests pour valider).</p>
<p>Explication rapide : On ajoute un "esclave" pcm utilisant le plugin dmix, sur
la carte 1, périphérique 3.</p>
<p>Pourquoi 1 et 3 ?</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> aplay -l
**** Liste des Périphériques Matériels PLAYBACK ****
carte 0: Intel [HDA Intel], périphérique 0: STAC92xx Analog [STAC92xx Analog]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0
carte 1: HDMI [HDA ATI HDMI], périphérique 3: HDMI 0 [HDMI 0]
Sous-périphériques: 0/1
Sous-périphérique #0: subdevice #0
</code></pre></div>
<p>Parce que la carte hdmi est la carte (son) 1, et que la sortie HDMI est défini
sur 3. Tout simplement.</p>
<p>La modification du script devient donc :</p>
<div class="highlight"><pre><span></span><code>case "$1" in
radeon)
#radeon is known as discrete (external) card
echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch
echo 'pcm.!default { type plug slave.pcm "dmix:1,3" }' > /etc/asound.conf
echo "You must restart Xorg for applying changes"
;;
intel)
#intel is known as integrated (internal) card
echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch
echo "" > /etc/asound.conf
echo "You must restart Xorg for applying changes"
;;
</code></pre></div>
<hr>
<p>1 : Cf. article de présentation.</p>
<p>2 : Je n'ai aucun problème avec alsa, tout comme avec pulse-audio, sauf quand
je veux écouter de la musique, regarder un film, utiliser jackd, jouer avec
des synthé analogique (bristol), où systématiquement, pulse-audio se met à
bouffer du CPU pour rien, voire m'empêche d'utiliser jackd ou alsa, vu qu'il
prend la main dessus en mode exclusif. Du coup, je n'installe pas pulse-audio
et je n'ai pas de problèmes. Ceci n'est bien entendu pas un troll mais ma
constatation sous debian, ubuntu et archlinux.</p>
<p>3 : Ne pas oublier d'activer le son sur la sortie hdmi, via alsamixer par
exemple. On peut chercher pendant 30 minutes pourquoi ça ne marche pas alors
que le son est simplement coupé (Mute).</p>
<p>4 : Clementine Audio Player, un lecteur audio écrit en qt4 et inspiré d'Amarok
1.4. Une excellente alternative à Amarok2 (où je trouve dommage d'avoir
abandonné le principe de l'interface de la version 1.4). Accessoirement,
fonctionnel sous Windows et Mac OS X (10.6 mini :/).</p>
<p>5 : C'est une supposition, je n'ai pas regardé la doc ni parcouru le code
source, c'est fortement probable que je me trompe. Cependant, le comportement
de l'application me fait penser que ça marche comme ça.</p>Omoplate2013-02-17T00:00:00+01:002013-02-17T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-02-17:/omoplate<p>Après la <a href="https://blog.chibi-nah.fr/article45/clavicule">clavicule</a>, l'omoplate.</p>
<p>Après avoir parlé du Clip+, attaquons-nous à un autre morceau, valant à lui
tout seul un article complet.</p>
<p>Attention, contrairement à l'habitude, cet article contient énormément de
liens vers le site de Rockbox. Non pour un quelconque plagiat ou par flemme,
mais uniquement parce que cet …</p><p>Après la <a href="https://blog.chibi-nah.fr/article45/clavicule">clavicule</a>, l'omoplate.</p>
<p>Après avoir parlé du Clip+, attaquons-nous à un autre morceau, valant à lui
tout seul un article complet.</p>
<p>Attention, contrairement à l'habitude, cet article contient énormément de
liens vers le site de Rockbox. Non pour un quelconque plagiat ou par flemme,
mais uniquement parce que cet article parle ce de firmware, et qu'il me semble
plus pertinent d'orienter les lecteurs vers leur site.</p>
<h2>Rockbox.</h2>
<p>Il s'agit d'un firmware libre et open-source (FLOSS), pouvant être installé en
alternative aux firmwares des baladeurs audio.</p>
<p>Créé en 2002, pour les baladeurs Archos, le projet s'est agrandi pour
supporter de plus en plus de lecteurs.</p>
<p>Liste des lecteurs supportés : <a href="http://www.rockbox.org/wiki/TargetStatus">http://www.rockbox.org/wiki/TargetStatus</a></p>
<p>Rockbox peut être installé sur le clip+, en dual-boot, l'appui sur la touche
"Gauche" ou "Droite" lorsqu'on allume le lecteur permet de démarrer sur
Rockbox ou sur le firmware d'origine.</p>
<p>L'installation nécessite le (re)flashage du firmware d'origine, pour pouvoir
installer le "bootloader". Une fois cette étape réalisée, l'installation ou la
mise à jour de rockbox ne nécessite plus de flashage. En effet, ce dernier
copie les fichiers nécessaire à son fonctionnement dans .rockbox.</p>
<p>Pourquoi installer Rockbox alors que le firmware d'origine suffit ?</p>
<ul>
<li>Parce que c'est libre.</li>
<li>Parce qu'il supporte plus de formats.</li>
<li>Parce qu'il est personnalisable (thèmes).</li>
<li>Parce qu'il n'effectue pas d'indexation au démarrage.</li>
<li>Parce qu'il supporte la "synthèse" vocale..</li>
</ul>
<p>Pourquoi ne pas installer Rockbox ?</p>
<ul>
<li>Parce que cela nécessite des manipulations pouvant "briquer" le lecteur.</li>
<li>Parce que la configuration par défaut est déroutante.</li>
<li>Parce qu'il faut faire plein de manipulations par la suite pour le rendre utilisable.</li>
</ul>
<p>En effet. Une fois que Rockbox est installé, il faut l'avouer, c'est
déroutant. On n'est pas au stade de passer d'une interface graphique bien
conçue à une ligne de commande obscure[1], mais presque.</p>
<p>La police de caractère est minuscule, plein d'entrées de menus sont apparues.</p>
<p><img alt="Écran du clip+" src="/images/rb/main.png"></p>
<p>Source de l'image : documentation Rockbox.</p>
<p>Heureusement, on peut changer de police de caractère, ainsi que sa taille. De
plus, avec un "bon" fichier pour la synthèse vocale, on peut utiliser le
lecteur quasiment en totalité, sans jamais le regarder [2].</p>
<p>Ce qu'apporte Rockbox par rapport au firmware d'origine.</p>
<p><em>Un "semblant" de synthèse vocale.</em></p>
<p>Semblant, car il s'appuie sur un ensemble de phrases pré-enregistrées pour les
menus (et stockée dans un fichier voice), et il épelle les noms dont il ne
trouve pas de mot ou de phrase pré-enregistrée. Cela impose, par exemple,
après avoir transféré des fichiers, de générer des fichiers .talk, associés,
afin que le lecteur puisse les lire normalement au lier de les épeler. Par
exemple, il dira "Music" au lieu d'épeler 'M', 'U', 'S', 'I', 'C'.</p>
<p>Autre détail concernant la synthèse vocale, je ne l'utilise (ainsi que le
lecteur), qu'en anglais. Si jamais, un jour, une synthèse vocale en français,
performante et libre, et ne sonnant pas comme une voix de robot sort, alors je
reconsidèrerai la possibilité de le mettre en français. En attendant,
j'utilise la synthèse vocale d'OSX (voix Alex, ha ha ha) pour générer les
fichiers .talk ainsi que le fichier voice. Résultat, la synthèse vocale est
bien meilleure que celle proposée par défaut. (Je ne sais pas si la licence
d'Apple me permet de redistribuer le fichier .voice généré. À voir).</p>
<p>Exemple de la synthèse vocale sous Rockbox : <images/rb/clip.ogg></p>
<p>Navigation dans les fichiers, petit parcours dans les paramètres audio. Le nom
de fichier "Naheulband - T'as pas le niveau' est mal lu, ce qui est "normal".
Lors de la génération des fichiers .talk, le système s'attend à des noms en
anglais, pas en français.</p>
<p>À noter, lors des silences, des sifflements aigüs sont audibles. Je ne sais
pas à quoi ils sont dus. La capture a été faite sur un macbook (carte son
interne), en raccordant la prise "entrée ligne" à la sortie audio du clip+,
avec un câble court non blindé, doté de deux prises jack 3,5mm, en réglant le
volume de sortie à -25dB, et la capture sur audacity à ~60%. Ces sifflements
ne sont pas audible lors de l'utilisation normale.</p>
<p><em>Beaucoup plus de formats audio supportés.</em></p>
<p>Là, c'est clairement une claque. Les formats supportés sont vraiment nombreux,
y compris des formats exotiques. La liste est tellement longue que je préfère
coller le lien vers la page de Rockbox plutôt que de recopier la liste à la
main. <a href="http://download.rockbox.org/daily/manual/rockbox-sansaclipplus/rockbox-buildap2.html">http://download.rockbox.org/daily/manual/rockbox-sansaclipplus/rockbox-buildap2.html</a></p>
<p>En gros, on retrouve tous les formats majeurs (mp3, wma, ogg/vorbis, flac,
wac, mp4/aac, monkey audio...), ainsi que des formats provenant du monde du
jeu vidéo (adx, spc, vgm...)</p>
<p><em>Plus de réglages pour le son.</em></p>
<p>Régler les basses fréquences ? C'est possible.</p>
<p>Régler les aigüs ? C'est possible</p>
<p>Régler plus finement à l'equalizer ? C'est possible.</p>
<p>Jouer plus rapidement/lentement les titres ? C'est possible.</p>
<p>(Soyons fous), utiliser un compresseur audio directement sur le lecteur ?
C'est possible.</p>
<p>Tout est indiqué dans le manuel de Rockbox, notamment
<a href="http://download.rockbox.org/daily/manual/rockbox-sansaclipplus/rockbox-buildch6.html">http://download.rockbox.org/daily/manual/rockbox-sansaclipplus/rockbox-buildch6.html</a></p>
<p><em>Divers</em></p>
<p>On peut changer le style, la police de caractères, le thème. Cf.
<a href="http://themes.rockbox.org/index.php?target=sansaclipplus">http://themes.rockbox.org/index.php?target=sansaclipplus</a></p>
<p>Exemples :</p>
<p><img alt="Thème Pacman" src="/images/rb/wps-pacman.png">
<img alt="Thème LSE2" src="/images/rb/wps-lse2.png">
<img alt="Thème Pika" src="/images/rb/wps-pika.png">
![Thème Tach]images/rb/wps-tach.png)</p>
<p>(noms des thèmes : pacman, lse2, pika, tachimeter)</p>
<p>On peut "jouer" dessus. Du classique "Snake" à Doom (injouable sur le clip+ à
cause de l'écran monochrome) en passant par l'émulation GameBoy, il y a de
tout, du pire au moins pire.</p>
<p>On peut enregistrer la radio (même si, je n'en vois pas l'intérêt).</p>
<p>On peut aussi utiliser la fonction dictaphone, pour enregistrer avec le micro
intégré. Cependant, l'échantillonneur semble limité matériellement à 22kHz ou
24 kHz, en mono, 16 bits. On peut toujours configurer Rockbox pour enregistrer
en 44,1 kHz ou en 48 kHz, en wav, une vérification avec un analyseur de
spectre montre clairement que les fréquences ne dépassent pas 11-12 kHz
(rappel : Théorème de Nyquist-Shannon : on échantillonne à au moins deux fois
la fréquence de la plus haute valeur).</p>
<p>De plus, quelques applis, sont fournies avec. Pour certaines, leur utilité est
discutable, mais elles font parties du "package" rockbox, et ne peuvent pas
être retirées (par conception et pour économiser des ressources, il n'y a pas
de notion de fichier exécutable (PE sous Windows, ELF sous *nix et embarqué),
ni de notion de librairie statique/dynamique).</p>
<p><em>Installation.</em></p>
<p>C'est bien beau, tout ça, mais comment on l'installe ?</p>
<p>Le plus simple, est de suivre les instructions (toujours en anglais), sur le
site de Rockbox : <a href="http://www.rockbox.org/wiki/SansaAMS">http://www.rockbox.org/wiki/SansaAMS</a></p>
<p><em>Aparté.</em></p>
<p>Je reviens rapidement sur le compresseur audio.</p>
<p>Extrait de la documentation</p>
<blockquote>
<p>The Compressor reduces, or compresses, the dynamic range of the audio
signal. This makes the quieter and louder sections closer to the same volume
level by progressively reducing the gain of louder signals. When
subsequently amplified, this has the effect of making the quieter sections
louder while keeping the louder sections from clipping. This allows
listening to the quiet sections of dynamic material in noisy environments
while preventing sudden loud sections from being overbearing.</p>
<p>There are several settings associated with the compressor. The first, and
most important, is the Threshold. The threshold is the audio input level at
which the compressor begins to act. Any level louder than the threshold will
be compressed to some extent. The maximum amount of compression, or the
quietest level at which the compressor will operate, is -24 dB. The default
of Off disables the compressor.</p>
<p>The Makeup Gain setting has two options: Off and Auto. Off means that the
compressed audio will not be amplified after compression. The default of
Auto will amplify the signal so that the loudest possible signal after
compression will be just under the clipping limit. This is desirable because
the compressed signal without makeup gain is quieter than the input signal.
Makeup Gain in Auto restores the signal to the maximum possible level and
brings the quieter audio up with it. This is what makes it possible to hear
the quieter audio in noisy environments.</p>
<p>The Ratio setting determines how aggressively the compressor reduces gain
above the threshold. For example, the 2:1 setting means that for each two
decibels of input signal above the threshold, the compressor will only allow
the output to appear as one decibel. The higher the ratio, the harder the
signal is compressed. The ratio setting of Limit means essentially a ratio
of infinity to one. In this case, the output signal is not allowed to exceed
the threshold at all.</p>
<p>The Knee setting determines how abrupt the transition is from a non-
compressed signal to a compressed signal. Hard Knee means that the
transition occurs precisely at the threshold. The Soft Knee setting smoothes
the transition from plus or minus three decibels around the threshold.</p>
<p>The Release Time setting sets the recovery time after the signal is
compressed. Once the compressor determines that compression is necessary,
the input signal is reduced appropriately, but the gain isn’t allowed to
immediately return to normal levels. This is necessary to reduce artifacts
such as “pumping.” Instead, the gain is allowed to return to normal at the
chosen rate. Release Time is the time for the gain to recover by 10 dB.</p>
</blockquote>
<hr>
<p>1 : Obscure, parce que le fond est noir, bien entendu.</p>
<p>2 : bien pratique en hiver, cela permet de régler le compresseur audio en
laissant les mains dans les poches. Pour plus de détails (en anglais),
consulter la page <a href="http://www.rockbox.org/wiki/BlindUsersIndex">http://www.rockbox.org/wiki/BlindUsersIndex</a></p>Ça, ça fait mal2013-01-15T00:00:00+01:002013-01-15T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-01-15:/ca-ca-fait-mal<p><a href="/images//Image%202.PNG"><img alt="Paralysie totale du réseau STAN." src="/images//Image%202.PNG"></a></p>
<p>En voici la cause :</p>
<p><a href="/images//20130115_195414.jpg"><img alt="Neige" src="/images//20130115_195414.jpg"></a></p>Coup de gueule sur Debian et cfdisk2013-01-11T00:00:00+01:002013-01-11T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-01-11:/coup-de-gueule-sur-debian-et-cfdisk<p>Petit (enfin gros) coup de gueule contre Debian (ça change de taper toujours
sur Archlinux).</p>
<p>La commande cfdisk est réservée exclusivement pour les CD d'installation de
Debian. Elle ne doit pas être utilisée sur un système Debian fonctionnel. Ne
cherchez pas à l'installer, on a fait exprès pour que ça …</p><p>Petit (enfin gros) coup de gueule contre Debian (ça change de taper toujours
sur Archlinux).</p>
<p>La commande cfdisk est réservée exclusivement pour les CD d'installation de
Debian. Elle ne doit pas être utilisée sur un système Debian fonctionnel. Ne
cherchez pas à l'installer, on a fait exprès pour que ça ne marche pas.</p>
<p><a href="http://packages.debian.org/wheezy/cfdisk-udeb">http://packages.debian.org/wheezy/cfdisk-udeb</a></p>
<p>C'est super, surtout quand on peut brancher plus qu'un disque dur sur un
serveur, et qu'on a besoin de cette commande pour partitionner et formater un
disque dur…</p>
<p>Analogie avec Windows : bon, on vous permet de partitionner et de formater,
mais seulement pendant l'install. Une fois que Windows est installé, vous
n'avez plus le droit de partitionner, et on vous bloque la commande.</p>
<p><strong>Mais MERDE à la fin. Ces restrictions sont CHIANTES, parce qu'elles nous
EMPÊCHENT de BOSSER EFFICACEMENT.</strong></p>
<p>Celui qui me propose d'installer fdisk, je lui donne à compiler tous les
paquets d'archlinux, sans le support de systemd… ça l'occupera pendant un bon
moment. Pourquoi ne pas utiliser ubuntu ou mac os x sur un serveur tant qu'il
y est.</p>
<p><strong>J'avoue, cet article est tapé sur le coup de la colère, et mes réactions
sont vraiment à chaud. En plus, on est vendredi, il est 22h40, j'ai un peu
autre chose à faire que de me battre contre des décisions absurdes.</strong></p>
<p>Et hop : wget partedmagic.iso, plus qu'à trouver une clé USB pour l'installer
dessus.</p>Clavicule2013-01-08T00:00:00+01:002013-01-08T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-01-08:/clavicule<p>L'article d'aujourd'hui parlera de la clavicule…</p>
<p>ou pas.</p>
<p>Et si j'écrivais plutôt un petit article sur le Sansa Clip + dont je parle de
temps en temps ? Ah ? des gens voulaient vraiment un article sur la clavicule
? Ben, tant pis pour eux alors.</p>
<p>Le Sansa Clip +, de SanDisk est une drôle …</p><p>L'article d'aujourd'hui parlera de la clavicule…</p>
<p>ou pas.</p>
<p>Et si j'écrivais plutôt un petit article sur le Sansa Clip + dont je parle de
temps en temps ? Ah ? des gens voulaient vraiment un article sur la clavicule
? Ben, tant pis pour eux alors.</p>
<p>Le Sansa Clip +, de SanDisk est une drôle de bête. J'hésite à le classer entre
lecteur d'entrée de gamme par sa taille et son aspect "cheap", limite "copie
chinoise" malgré ses origines américaines [1] (et bien fabriqué en Chine
d'ailleurs), et "tuerie audio" de par sa qualité.</p>
<p><a href="/images/rb/clip.jpg"><img alt="" src="/images/rb/clip-r.jpg"></a></p>
<p>Le clip+, avec un câble micro USB branché, et à côté d'une pile AA (pour
donner une idée de la taille du lecteur).</p>
<p>Bref, je ne vais pas trop m'étendre sur sa "qualité audio", une simple
recherche sur votre moteur de recherche préféré devrait afficher un nombre
laaaaargement suffisant d'articles [2] ne manquant pas d'éloges sur cet
appareil vendu très cher (dans la trentaine d'euros pour le modèle 2Go).</p>
<p>Donc, nous avons là un baladeur [3], lisant nativement les formats MP3, WMA
[4], Audiobooks (je ne connais pas ce format, je n'en ai jamais vu), Ogg
Vorbis et FLAC (indiqué dans cet ordre sur la boîte).</p>
<p>Détail amusant, au niveau compatibilité des systèmes d'exploitation, c'est
bien mentionné "Windows XP SP2, Mac OS X 10.3 and Linux (Mass Storage Only)".
C'est toujours plaisant de voir la mention de la compatibilité GNU/Linux (2.4
mini, je pense, sachant qu'on en est au 3.7 ou 3.8).</p>
<p>Autre détail amusant, sur la boîte, il est demandé la présence d'un lecteur
CD-ROM, pour l'installation d'applications tierces, alors qu'il n'y a pas de
CD fourni. Je pense que c'est une erreur, son prédécesseur (le Clip) semblait
être livré avec un CD.</p>
<p><em>Au niveau physique.</em></p>
<p>C'est un lecteur banal, non tactile, pas "tape-à-l'œil". Un petit écran OLED
monochrome (jaune pour la ligne du haut, bleu pour le reste). Des touches
physiques "relativement bruyantes" (au moins, on sent qu'on appuie dessus), le
bouton "power" étant sur le haut et une touche "maison" (ou home) excentrée.</p>
<p>Au niveau connectique, par contre, c'est que du standard. Un port micro USB
sur la tranche gauche, permettant l'utilisation de n'importe quel câble USB
que l'on a déjà en sa possession, genre, celui du disque dur externe), la
prise mini-jack (3,5mm) sur la tranche droite, et surtout, la présence d'un
lecteur de carte MicroSD (compatible SDHC).</p>
<p>La présence de ce lecteur de carte peut s'expliquer facilement. SanDisk semble
proposer des cartes MicroSD avec de la musique pré-chargée dessus, dans un
format (je pense) sécurisé (Slot Music). Je pense que le but était dans la
continuité de la vente de musique sur support physique, supplantant le CD
Audio, tout comme ce dernier avait éliminé la cassette audio (le vinyle
n'ayant jamais vraiment disparu).</p>
<p>Dans tous les cas, le lecteur de carte n'est aucunement limité, et on peut
très bien insérer n'importe quelle carte MicroSD (jusqu'à 32 Go ? 16, c'est
sûr), chargée de musique pour que le lecteur la reconnaisse et indexe son
contenu.</p>
<p>Et là, c'est le drame.</p>
<p>En effet, l'un des reproches fait sur ce lecteur, c'est sa tendance à vouloir
indexer tous les fichiers, lorsqu'il est allumé, lorsqu'on le débranche d'un
ordi.</p>
<p>Relativement lent, lorsqu'il s'agit des 2 Go interne, c'est atrocement lent
sur une carte de 16 Go (ça peut se compter en heures). Malheureusement, il n'y
a pas de solution de contournement [5].</p>
<p>Pourquoi indexer ? C'est très simple. Cela permet de gérer les fichiers dans
une médiathèque, avec la possibilité de trier par artiste, album. La
possibilité de parcourir l'arborescence est également possible, le lecteur n'y
touchant pas, contrairement à un certain baladeur très connu d'une marque
commençant par la lettre 'A'.</p>
<p>L'autre reproche qui lui est fait (et je confirme [6]), c'est la fragilité du
clip. Pour faire simple, il s'agit d'une "pince", permettant de l'accrocher
sur tout et n'importe quoi. Cependant, les ingénieurs ont sous-estimé la force
du ressort et n'ont pas dimensionné correctement la taille des supports en
plastique. Résultat, ces éléments sont constamment sous une pression
relativement élevée, et finissent par casser.</p>
<p><a href="/images/rb/clip2.jpg"><img alt="" src="/images/rb/clip2-r.jpg"></a></p>
<p>Dos du Clip+, on voit la cassure des deux pattes en plastique.</p>
<p>Il y a des solutions DIY [7], à base de colle, scotch (ou autre), que l'on
peut trouver facilement sur le net, et permettant de « réparer » le clip.</p>
<p>Le lecteur contient une petite batterie, non amovible [8], d'une autonomie
d'environ 15 heures.</p>
<p><em>Au niveau firmware.</em></p>
<p>Comme précisé plus haut, le firmware d'origine permet la lecture des formats
répandus, le MP3, le WMA, l'OGG Vorbis et le FLAC. On trouve également une
entrée "Slot Music" ainsi que "Slot Radio". Pour ce dernier, je ne sais pas à
quoi ça sert. On trouve également une radio FM et une fonction dictaphone.</p>
<p>Globalement, l'interface est simple et claire. Les icônes sont grosses et
lisibles. Un équalizer et un analyseur de spectre sont présents, même s'ils
sont assez limités (peu paramétrables). Pour un usage "non geek" ou "non
audiophile" [9], cela suffit amplement.</p>
<p>Pour la synchronisation des fichiers, il faut penser à régler le lecteur en
mode "UMS" et non en mode "MTP". Le mode "UMS" permet à n'importe quel système
d'exploitation de reconnaître le lecteur comme une clé USB (et un lecteur de
carte SD). Le mode "MTP" est à utiliser pour la synchronisation avec Windows
Media Player.</p>
<p>À noter : contrairement au lecteur populaire du fabriquant 'A', un logiciel de
synchronisation [11] n'est pas obligatoire.</p>
<p>Si on définit la région comme étant "Europe", lors du premier démarrage, la
limitation du volume maximum est automatiquement activée. Cela est imposé dans
l'une des nombreuses directives européenne. Pour ne pas avoir cette
limitation, il suffit de ne pas choisir "Europe". Je précise que cela est aux
risques et périls de l'utilisateur, je ne suis en rien responsable d'une
quelconque perte d'audition [12].</p>
<p>L'indexation des titres est lente, et peut même, parfois, ne pas s'achever
avant que le lecteur ne se trouve à court de batterie.</p>
<p><em>Avis global.</em></p>
<p>Au final, nous avons là un petit baladeur, pas cher, sans fioritures (pas de
lecteur vidéo, pas d'images, photos), ne faisant que de l'audio, mais la
faisant bien.</p>
<p>Les points négatifs sont :</p>
<ul>
<li>Une pince fragile</li>
<li>Une indexation obligatoire, longue et pénible.</li>
<li>Une autonomie un peu limite, mais liée à la taille du lecteur.</li>
</ul>
<p>Les points positifs sont :</p>
<ul>
<li>Formats courants supportés</li>
<li>Utilisation de standards pour tout<ul>
<li>Connectique micro USB et non connectique propriétaire</li>
<li>Lecteur de carte microSD</li>
<li>Prise jack 3,5mm</li>
<li>Modes UMS et MTP pour la synchronisation</li>
</ul>
</li>
</ul>
<hr>
<p>1 : SanDisk étant une société américaine.
2 : À lire (en anglais) <a href="http://nwavguy.blogspot.com/2011/02/sansa-clip-measured.html">http://nwavguy.blogspot.com/2011/02/sansa-clip-measured.html</a>
3 : j'aime pas le terme « lecteur mp3 ».
4 : Y compris ceux avec DRM, nécessitant une synchro avec Windows Media Player
10 ou plus, ainsi que les licences adéquates. Ce format est en perte de
vitesse, du au fait que les boutiques en ligne vendent de moins en moins des
titres avec DRM.
5 : Enfin, si, mais j'y reviendrai plus tard, genre, dans un prochain article
?
6 : Oui, j'ai eu ce problème, enfin, je l'ai toujours.
7 : Do It Yourself, littéralement : « fais-le toi-même ». En français, on
parlerait plus de bricolage ou de système D, mais pas dans le sens péjoratif.
8 : On peut, à priori, la changer, non officiellement (DIY), mais cela
nécessite le démontage du lecteur et des travaux de soudure.
9 : Je risque de lancer une guerre sur le terme audiophile. Il y a
l'audiophile "pigeon", qui pense qu'acheter du matériel à +10 000€ est
nécessaire pour bien entendre le son, alors que physiquement, il n'est plus
capable d'entendre des fréquences au delà de 14 kHz, et qui méprise
l'audiophile "technique" ; l'audiophile "technique", faisant des choix
techniques réels, pas seulement ce qu'annonce le vendeur [10] qui méprise le
premier, le considérant comme un "pigeon pas capable d'exploiter correctement
son installation audio et qui achète des trucs inutiles, voire bidonnés".
Perso, je suis juste « amateur », pas « audiophile ».
10 : De toute façon, qui croit un vendeur, sachant que son rôle, c'est de
vendre, pas de conseiller en toute objectivité.
11 : Lourd, propriétaire, et faisant n'importe quoi avec les fichiers.
12 : Avec toutes les absurdités de procès en tout genre, je prends mes
précautions, même si le "contournement" est un secret de Polichinelle.</p>Certificat SSL2013-01-06T00:00:00+01:002013-01-06T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-01-06:/certificat-ssl<p>Article en bref, pour signaler que les sites que j'héberge sont accessibles
(pour la plupart), en https.</p>
<p>Si votre navigateur affiche un avertissement sur la sécurité, c'est
probablement parce que l'autorité de certification
<a href="http://www.cacert.org/">Cacert</a> n'est pas installée chez vous.</p>
<p>Les clefs racines sont disponibles là ->
<a href="http://www.cacert.org/index.php?id=3">http://www.cacert.org/index …</a></p><p>Article en bref, pour signaler que les sites que j'héberge sont accessibles
(pour la plupart), en https.</p>
<p>Si votre navigateur affiche un avertissement sur la sécurité, c'est
probablement parce que l'autorité de certification
<a href="http://www.cacert.org/">Cacert</a> n'est pas installée chez vous.</p>
<p>Les clefs racines sont disponibles là ->
<a href="http://www.cacert.org/index.php?id=3">http://www.cacert.org/index.php?id=3</a></p>
<p>Petit problème d'ailleurs avec pluxml, il supporte mal le https. Il mélange
allègrement le http et le https. Il faudra que je regarde pourquoi.</p>
<p>Édit : ok, il y a un joli mélange de chemin absolu et relatif. Résultat, si je
change les chemins en relatif, je pète la moitié du blog.</p>
<p>Pour les anglophones ne connaissant pas cacert, lien wikipédia :
<a href="http://en.wikipedia.org/wiki/CAcert.org">http://en.wikipedia.org/wiki/CAcert.org</a></p>Bonne année 20132013-01-05T00:00:00+01:002013-01-05T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-01-05:/bonne-annee-2013<p>Avec un peu de retard (j'avoue), tous mes meilleurs vœux pour l'année 2013.</p>Flash Player et Safari 5.0.6 sous Leopard2013-01-05T00:00:00+01:002013-01-05T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-01-05:/flash-player-et-safari-5-0-6-sous-leopard<p>Solution rapide pour un problème que j'ai eu jusqu'à il y a quelques minutes.</p>
<p>En résumé : plus de flash (player) dans Safari, Dashboard, iSwiff, mais fonctionnel dans Firefox, le tout sous Leopard (osx 10.5.8).</p>
<p>Solution trouvée sur le support Apple (concernant 10.6 et java, mais ayant fonctionné …</p><p>Solution rapide pour un problème que j'ai eu jusqu'à il y a quelques minutes.</p>
<p>En résumé : plus de flash (player) dans Safari, Dashboard, iSwiff, mais fonctionnel dans Firefox, le tout sous Leopard (osx 10.5.8).</p>
<p>Solution trouvée sur le support Apple (concernant 10.6 et java, mais ayant fonctionné pour flash et 10.5).</p>
<ul>
<li>Aller dans Applications -> Utilitaires -> Préférences Java.</li>
<li>Dans l'onglet "Général", cliquer sur "Réglages par défaut".</li>
<li>Dans l'onglet "Réseau", cliquer sur "Réglages par défaut".</li>
<li>Fermer les préférences, fermer safari, ouvrir safari, charger une animation flash, et ça marche. En tout cas, ça a marché chez moi.</li>
</ul>
<p>Avant, j'avais tenté, sans succès :</p>
<ul>
<li>Réinstaller le plugin flash, release comme debug, en 10.1, 10.3</li>
<li>Désinstaller le plugin flash avec l'outil d'Adobe.</li>
<li>Effacer à la main les plugins.</li>
<li>Les coller dans /Library/Internet Plugins ou dans ~/Library/Internet Plugins</li>
<li>Effacer le com.apple.safari.plist</li>
</ul>
<p>Source :
<a href="https://discussions.apple.com/thread/2454737?start=15&tstart=0">https://discussions.apple.com/thread/2454737?start=15&tstart=0</a></p>
<p>Bref, ma question : Pourquoi le paramétrage du java arrive à foirer le plugin flash ? C'est pas Android ni JavaOS, donc je ne comprends pas.</p>
<p>Édit : ceci est le 42ème article de ce blog \o/ Joyeux 42.</p>Analogie2013-01-04T00:00:00+01:002013-01-04T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-01-04:/analogie<p>Tiré d'une discussion IRL.</p>
<p>Concrètement : qui accepterait</p>
<ul>
<li>d'acheter (fort cher) une télévision (attention, ceci cache un troll)</li>
<li>d'appeler le constructeur de la télé à chaque fois qu'il veut brancher un nouveau périphérique (lecteur BD, console, téléphone…)<ul>
<li>donc, déplacement d'un technicien (et facturation)</li>
<li>qui va retirer un petit cache derrière la …</li></ul></li></ul><p>Tiré d'une discussion IRL.</p>
<p>Concrètement : qui accepterait</p>
<ul>
<li>d'acheter (fort cher) une télévision (attention, ceci cache un troll)</li>
<li>d'appeler le constructeur de la télé à chaque fois qu'il veut brancher un nouveau périphérique (lecteur BD, console, téléphone…)<ul>
<li>donc, déplacement d'un technicien (et facturation)</li>
<li>qui va retirer un petit cache derrière la télévision</li>
<li>brancher le périphérique (lecteur bluray par exemple)</li>
<li>configurer la télévision pour accepter CE lecteur bluray (numéro de série qui passe dans le câble).</li>
</ul>
</li>
</ul>
<p>À ce niveau là, ça rigole encore.</p>
<p>MAIS</p>
<p>En effet, le cache est retiré, donc concrètement, rien n'empêche de brancher
une console, vu que la prise (hdmi ?) est accessible.</p>
<p>Et là, c'est le drame. La télévision va voir que l'appareil branché n'est pas
celui qui a été déclaré, et refusera de fonctionner.</p>
<p>Pour brancher la console, il faudra de nouveau appeler le technicien pour
qu'il refasse les manips (et payer, bien entendu)</p>
<p>Qui serait prêt à acheter cette télévision ?
plus personne...</p>
<p>Et pourtant,</p>
<p>Faites l'analogie avec l'informatique (vidéo à la demande, musique, jeux, DRM,
iPhone...) et pleurez, parce que vous êtes non seulement utilisateurs ce de
système absurde, mais en plus, vous l'adorez…</p>Free et la publicité2013-01-04T00:00:00+01:002013-01-04T00:00:00+01:00alextag:blog.chibi-nah.fr,2013-01-04:/free-et-la-publicite<p>Je ne commente jamais l'acutalité, mais là, c'est un gros appeau à trolls.</p>
<p><strong>Avec son bloqueur de pubs, free remet en cause la neutralité du net…</strong> ben
voyons, le fait que le blocage des pubs soit effectué sur la freebox, chez les
particuliers, va clairement remettre en cause la neutralité …</p><p>Je ne commente jamais l'acutalité, mais là, c'est un gros appeau à trolls.</p>
<p><strong>Avec son bloqueur de pubs, free remet en cause la neutralité du net…</strong> ben
voyons, le fait que le blocage des pubs soit effectué sur la freebox, chez les
particuliers, va clairement remettre en cause la neutralité du réseau. Que ça
soit bloqué sur la freebox ou via un plugin sur le navigateur, voire un proxy
sur le routeur (ah, tiens, c'est ce qu'a fait free), ça ne change rien. C'est
chez le particulier, point barre, pas sur le réseau, ni en collecte, ni en
transit.</p>
<p><strong>Free va faire fermer des blogs/journaux se basant sur la publicité…</strong>
mauvais plan business changer plan.</p>
<p><strong>Free ne veut pas de pubs…</strong> ha ha ha, suffit de voir les placards
publicitaires sur les offres free mobile dans les grandes villes.</p>
<p><strong>Free veut faire tomber google pour les problèmes de youtube…</strong> mon préféré.
Proxad doit être quoi ? une goutte d'eau parmi le réseau mondial. En tout cas,
ça m'étonnerait que ça dépasse le % par rapport au traffic mondial.</p>
<p>Le seul fait dérangeant, c'est du fait que cela fut <strong>activé par défaut</strong> , et
non l'inverse. Pourtant, il n'y a pas eu autant de levée de boucliers et de
protestations quand Microsoft avait proposé quelque chose de similaire, avec
l'activation par défaut de "Do Not Track" dans IE10. (tapez "Internet Explorer
10 do not track" dans votre moteur de recherche favori et souriez).</p>
<p>Le gros point positif avec toute cette médiatisation, c'est que désormais, les
gens "normaux" (pas "computeur geek" ou "nerd") savent désormais que l'on peut
bloquer l'abus publicitaire.</p>Nouveau téléphone2012-12-11T00:00:00+01:002012-12-11T00:00:00+01:00alextag:blog.chibi-nah.fr,2012-12-11:/nouveau-telephone<p>(Article mis à jour, le 31 décembre 2012)</p>
<p>Nouveau téléphone \o/</p>
<p><img alt="Photo d'un iPhone 5" src="/images/86943.jpg"></p>
<p>Source : <a href="http://lexpansion.lexpress.fr/high-tech/l-i-phone-5-face-a-ses-concurrents-le-match-des-caracteristiques-techniques_335952.html">http://lexpansion.lexpress.fr/high-tech/l-i-phone-5-face-a-ses-concurrents-le-match-des-caracteristiques-techniques_335952.html</a></p>
<p>Non, je plaisante.</p>
<p>Heureux possesseur depuis mai 2009 d'un HTC Magic, j'ai fini par craquer et me prendre un nouveau téléphone. (Je change de téléphone tous les 3-4 ans).</p>
<p>Bref, utilisateur …</p><p>(Article mis à jour, le 31 décembre 2012)</p>
<p>Nouveau téléphone \o/</p>
<p><img alt="Photo d'un iPhone 5" src="/images/86943.jpg"></p>
<p>Source : <a href="http://lexpansion.lexpress.fr/high-tech/l-i-phone-5-face-a-ses-concurrents-le-match-des-caracteristiques-techniques_335952.html">http://lexpansion.lexpress.fr/high-tech/l-i-phone-5-face-a-ses-concurrents-le-match-des-caracteristiques-techniques_335952.html</a></p>
<p>Non, je plaisante.</p>
<p>Heureux possesseur depuis mai 2009 d'un HTC Magic, j'ai fini par craquer et me prendre un nouveau téléphone. (Je change de téléphone tous les 3-4 ans).</p>
<p>Bref, utilisateur d'android depuis "longtemps", je voulais logiquement un nouveau téléphone sous Android.</p>
<p>Après avoir hésité (nexus, nexus 7, galaxy note), et surtout attendu, j'ai fini par me prendre, un… [1]</p>
<p>Mais avant, pourquoi changer un téléphone qui marche ?</p>
<p>Plusieurs raisons.</p>
<ul>
<li>J'ai un HTC Magic, modèle 32B. Ce qui signifie qu'il ne dispose "que" de 96 Mo de RAM [2]. Autant android 1.5 et 1.6 fonctionnaient sans trop de problèmes (google maps, gps, etc), autant aujourd'hui, vu les applications non optimisées, plus grand-chose ne marche ; on oublie google maps et le gps, remplacés par OpenSatNav.</li>
<li>Ce téléphone est facilement "bidouillable" (et actuellement sous android 2.3.7), mais à l'usage au quotidien, le simple fait de consulter une page web non seulement prenait du temps, mais en plus, le navigateur avait tendance à se fermer au bout de quelques pages (OOM-Killer [3], ou comme je le surnomme : ook [4])</li>
<li>À l'usage, le téléphone est assez lent (ne serait-ce que le déverrouillage, ou l'affichage de la liste des contacts).</li>
</ul>
<p>Bref, mon magic aura une seconde vie, comme téléphone "secondaire" (plus de mails, ni de navigateur, juste quelques jeux et applis non gourmandes), et a déjà reçu la sim avec le numéro L33T [5].</p>
<p>Donc, changement de téléphone.</p>
<p>Mes conditions étaient simples :</p>
<ul>
<li>Téléphone "nu" [6] (sans offre opérateur ni crédit déguisé).</li>
<li>Android (désolé, mais non, l'iPhone et sa prison dorée, s'il faut limer les barreaux à coup de jailbreak, c'est pas la peine).</li>
<li>Écran capacitif (ne pas rigoler, on trouve des tablettes Android avec des écrans résistifs).</li>
<li>La présence d'un stylet serait un plus.</li>
<li>Assez performant, pour tenir au moins 3 ans.</li>
<li>Éventuellement un clavier physique (bon courage pour en trouver avec).</li>
</ul>
<p>Avec clavier Physique, il y a bien les BB de RIM (mais pas sous android), et le Desire Z de HTC. Cependant, ce dernier est "relativement" ancien. De plus, pour avoir testé un BB, j'accroche pas au clavier physique en mode portrait.</p>
<p>Avec stylet, soit un "vieux" téléphone sous Wimo 6, soit regarder du côté de Samsung (Galaxy Note).</p>
<p>Téléphone "nu". Le prix n'est pas tellement un problème (c'est juste une
histoire d'étalement, et c'est plus rentable au final de le prendre sans offre
opérateur). Accessoirement, on a accès aux mises à jour constructeur, sans à
avoir à attendre les mises à jour des opérateurs, et surtout, on ne risque pas
d'avoir une surcouche personnalisée "Mon Super Opérateur qui remplace les
applis gratuites par ses équivalents opérateur, mais dont l'accès est défini
par des options payantes" (genre vidéo, navigation, pour plus d'informations,
regarder au rayon fruits et légumes de votre supermarché préféré.)</p>
<p>Au final, les points retenus, retrouvé sur le téléphone :</p>
<ul>
<li>Android</li>
<li>Téléphone "nu"</li>
<li>Écran capacitif</li>
<li>Stylet</li>
<li>Performant</li>
</ul>
<p>Avec ces "petits" plus :</p>
<ul>
<li>USB Host</li>
<li>NFC</li>
<li>Grand (très grand) écran</li>
<li>Sortie HDMI (via adaptateur)</li>
</ul>
<p>Petite photo pour mettre en évidence la taille du "téléphone".</p>
<p><a href="/images//dsc03348.jpg"><img alt="HTC Magic, Samsung Galaxy Note II, PSP Slim" src="/images//dsc03348m.jpg"></a>
De gauche à droite : HTC Magic, Samsung Galaxy Note 2, PSP Slim&Lite. (hors champ, clavier TypeMatrix 2030 bépo, Apple Remote, Ayu)</p>
<p>Voilà, c'est donc un Samsung Galaxy Note 2, en blanc (une constante chez moi, pour les téléphones, k610i blanc, htc magic blanc, galaxy note 2 blanc…).</p>
<p>/me se tape la tête contre le bureau. Toute la suite de l'article a été perdue (timeout de $£<em>µù$</em>***$^). En cliquant sur « Page précédente » : « ce document a expiré et n'est plus accessible ».</p>
<p><s>en cours de réécriture></s> Suite réécrite.</p>
<p>Donc, "petite" revue, présentée point par point. Ces points sont discutables,
voire carrément inutiles.</p>
<p><em>Au niveau de la lecture de vidéo.</em></p>
<p>J'ai testé rapidement diverses vidéos, pour constater au final :</p>
<ul>
<li>xbmc pour android [7] fonctionne sur le note 2, vlc, non (enfin, très mal).</li>
<li>Support des conteneurs avi, mp4, mkv nativement, ainsi qu'ogm [8] et mov avec xbmc.</li>
<li>Support des codecs h264, divx et theora (via xbmc pour ce dernier).</li>
<li>Un rip bluray [9] (1080p, h264 + aac + sous-titres, dans un conteneur mkv) passe sans aucun problème, avec le lecteur natif. Quelques soucis de sous-titres avec xbmc.</li>
</ul>
<p>Bref, à ce niveau là, une belle claque. Rien que le support des divx et mkv en natif vaut le détour.</p>
<p><em>Au niveau photo.</em></p>
<p>Je n'ai pas testé l'appareil photo, ni la capture vidéo. Le temps ne s'y prête pas vraiment en ce moment. Un flash à LED est présent.</p>
<p>À noter la présence d'une petite webcam en facade, idem, non testée.</p>
<p><em>Au niveau du stylet.</em></p>
<p>Bon, je ne vais pas insister dessus. C'est du Wacom (ISDv4, je suppose), donc la même techno que sur les Tablet-PC et PL-900. Le curseur apparaît au survol, et le stylet ne dispose que d'un seul bouton.</p>
<p>Mes autres stylets fonctionnent sur le téléphone, et celui du téléphone fonctionne sur mon tablet-pc.</p>
<p>La gestion de la pression est gérée, pas l'inclinaison du stylet.</p>
<p>À noter, le stylet Samsung n'a pas de gomme, mais la gomme des autres stylets est reconnue et gérée dans les applications de dessins, y compris S-Note de Samsung [10].</p>
<p>Au niveau de la taille de l'écran (j'aurais du commencer par ce point, c'est le premier truc que l'on remarque).</p>
<p>Lors du déballage, le premier truc qui frappe, c'est sa taille. Il est clairement énorme. Ce n'est pas une surprise, ayant pu tester un Galaxy Note (GT-N7000).</p>
<p>Je me suis dit sur le coup que je vais avoir du mal à m'y faire. Cependant, après quelques heures d'utilisation (divers tests), le retour sur le Magic fut brutal. Pour faire simple, je me suis très vite habitué aux 5,5" [11], du coup, les autres téléphones me paraissent petits, voire minuscules.</p>
<p>À noter : la résolution de l'écran : 1280x720 (720p). C'est presque la résolution de mes laptops[12], 1280x800.</p>
<p><em>Au niveau musique.</em></p>
<p>J'ai inséré la microSD de mon Sansa (pas besoin de transférer la musique). Les
formats OGG/Vorbis et FLAC sont lus via le lecteur natif. Cependant, comme sur
la plupart des téléphones/PMP, les formats exotiques ne sont pas lus/reconnus
(vgm, spc…).</p>
<p>XBMC n'est pas adapté pour l'écoute de la musique. L'interface est en plein
écran, et est difficilement accessible une fois le téléphone dans la poche.
Cependant, les plugins (genre mpd, webradio) sont pratique à l'usage.</p>
<p>Le petit haut-parleur intégré me semble assez puissant, mais c'est un avis
totalement subjectif, n'ayant pas fait de test en environnement bruyant.</p>
<p>À noter : la présence d'une prise jack 3,5 mm sur le haut du téléphone.</p>
<p>Mes écouteurs me permettent donc d'écouter un fond sonore dans les transports
en commun. Je ne sais pas si le téléphone peut "driver" un casque audio, ni
même si le rendu du téléphone est bon (sonorité neutre).</p>
<p>À noter également, une liste de paramètres d'ambiance sur le lecteur audio. En
mode manuel, il est possible de régler un Equaliser, ainsi que des effets
"3D", "Bass", "Reverb"… Malheureusement, pas de compresseur audio [13].</p>
<p><em>Au niveau de la batterie.</em></p>
<p>Là, Apple ne peut pas rivaliser. Malgré la finesse du téléphone, la batterie
est amovible. A-MO-VI-BLE. La batterie est à l'image du téléphone : énorme.
Elle fait presque la taille de l'écran du Magic (pour donner un ordre de
grandeur).</p>
<p>C'est une batterie de 3 100 mAh, ce qui donne à l'usage une autonomie assez
grande. Bien entendu, en usage ultra-intensif, l'autonomie sera (je pense)
similaire à n'importe quel smartphone, c'est à dire, courte.</p>
<p><em>Le capot arrière.</em></p>
<p>Le capot arrière est amovible (je suppose qu'on peut le changer), en plastique
assez fin (on verra sa résistance sur la durée). Une fois retiré, on a accès à
l'emplacement de la carte sim (micro-sim ?), à la batterie, et au lecteur de
carte microSD.</p>
<p>À noter : on peut insérer/retirer une microSD à chaud, sans à avoir à retirer
la batterie. Penser seulement à "démonter/éjecter" la carte via les paramètres
avant de la retirer.</p>
<p>Sur ce point là, c'est comme pour le Magic.</p>
<p><em>Point de vue système.</em></p>
<p>Le téléphone tourne sur Android Jelly Bean 4.1.1 (mise à jour en cours en
4.1.2). La surcouche TouchWiz de samsung est beaucoup moins intrusive que
MotoBlur [14] (avis personnel), et ne me dérange pas plus que ça. Mon
interface d'accueil reste "Zeam Launcher" (habitude du Magic, une interface
simple et "légère", sans fioritures ni gadgets inutiles).</p>
<p>J'ai tout de même installé Home Switcher, pour pouvoir basculer rapidement
vers TouchWiz (cas d'utilisation du stylet ou d'écoute de la musique).</p>
<p>Je ne pense pas basculer tout de suite vers une cyanogen-mod ou une rom
alternative. Le support du téléphone n'est pas encore fiable.</p>
<p><em>Au niveau des applications.</em></p>
<p>J'étais resté sur les petites applications toutes simples, et là, j'ai voulu
tester les jeux actuels… notamment les gros jeux [15].</p>
<p>Début léger : Dodonpachi Resurrection (lite, donc la démo). Le jeu est fluide,
aussi jouable que la version 360 (mais pas en HD, dommage).</p>
<p>Ensuite, Modern Combat 3. Le jeu est également fluide, pas de ralentissement.
Après, n'accrochant pas vraiment au genre CoD, je n'ai pas fait de test
poussé. Juste le début de la campagne solo.</p>
<p>Dans les applications plus "classique", test du "jeu où on lance des oiseaux à
coup de lance-pierre". Pareil, rien à redire… fluide.</p>
<p>Test de quelques émulateurs/machines virtuelles (en vrac : ScummVM, DC, N…),
pas vraiment de gros problèmes. Ça fait même bizarre de pouvoir jouer à
(insérer ici le nom d'un personnage célèbre) sur son téléphone [16].</p>
<p>Test également de Baka Reader (que j'avais déjà sur mon Magic), d'affichage de
webcomics (MT, entres autres), et de Google Books (livres dans le domaine
public, avec DRM ? WTF). L'écran est lisible, cependant, le format 16/9 n'est
pas tout à fait adapté pour les webcomics. Soit il faut faire défiler
légèrement de gauche à droite si on veut que tout l'espace vertical soit
utilisé, soit des bandes noires sont présentes en haut et en bas.</p>
<p><em>Fonction téléphone.</em></p>
<p>Et oui, malgré les apparences, ça reste un téléphone.</p>
<p>Les quelques appels effectués avec sont bons, le mode "main libres", avec les
deux microphones (un pour la réduction du bruit) semble donner un excellent
effet bocal (bien désagréable pour le correspondant).</p>
<p>Par contre, le kit piéton vendu avec le téléphone restera dans son carton. Je
ne supporte pas les "intra-auriculaire". Je ne jugerai donc pas de sa qualité.</p>
<p>Ah, j'oubliais. Il y a une LED multicolore sur le haut du téléphone, à gauche
de l'écouteur. De ce point de vue là, ça ne me dépayse pas vraiment par
rapport au Magic.</p>
<p><em>Avis final.</em></p>
<p>Au début des tests, j'avais une légère appréhension, du fait de la taille de
l'écran, mais cela ne dura pas. Mon avis global est plutôt positif.</p>
<p>Le seul reproche que je lui fait, c'est la mauvaise position de la touche
"Marche". En effet, elle est située sur la tranche du téléphone, accessible
via le pouce. Du coup, c'est pas rare que j'appuie sur cette touche par
inadvertance pendant un appel, avec le fait que l'appui sur cette touche
"raccroche" le téléphone. Donc, obligé de rappeler mon correspondant.</p>
<p><em>Caractéristiques techniques (en vrac).</em></p>
<ul>
<li>Téléphone "Candy bar", 151,1 x 80,5 x 9,4 mm (hauteur x largeur x épaisseur).</li>
<li>Poids : 180 g</li>
<li>Batterie 3 100 mAh, annoncé avec 16 heures d'autonomie en conversation, 890 heures en veille.</li>
<li>Réseau GSM (EDGE/GPRS) quad-band, 3G, HSPA+</li>
<li>Wifi 802.11 a/b/g/n</li>
<li>Bluetooth 4</li>
<li>NFC</li>
<li>S-Pen (Wacom)</li>
<li>Port micro USB (2.0, MHL, HDMI, USB Host).</li>
<li>Prise Jack 3,5mm</li>
<li>Écran Super AMOLED, diagonale 5,5", résolution 1280x720, 16,7 millions de couleurs.</li>
<li>SOC Exynos 4412, CPU ARM Cortex A9 quad core @1,6 GHz, GPU ARM Mali 400MP</li>
<li>RAM : 2 Go</li>
<li>Stockage interne : 16 Go, extensible avec une micro SD, support des cartes de 64 Go.</li>
<li>Appareil photo 8 Mpx avec autofocus, caméra frontale 1,9 Mpx</li>
<li>Divers : accéléromètre, boussole numérique, capteur de proximité, gyroscope, baromètre, A-GPS, radio FM (RDS), wireless charging (avec un capot arrière adapté)</li>
</ul>
<p><em>Mise à jour du 31 décembre.</em></p>
<p>J'ai reçu l'adaptateur mhl -> hdmi et le câble micro USB -> USB femelle.</p>
<p>La sortie HDMI fonctionne correctement, et le téléphone semble sortir un
signal 1080p. Cependant, soit le téléphone fait de la recopie d'écran
(1280x720 puis upscale 1080p, ce qui me semble le plus plausible), soit le
téléphone calcule pour deux écrans, un en 720p, l'autre en 1080p (mais cela
m'étonnerait).</p>
<p>Bref, il est donc possible de regarder des vidéos sur n'importe quel écran
possédant une entrée HDMI. Le seul truc qui manque, c'est utiliser la
télécommande de la télévision pour piloter XBMC (contrôle via HDMI). Si cet
élément là est implémenté, le téléphone pourrait alors servir de media center.</p>
<p>Pour le mode "OTG" (ou USB Host), j'ai branché un hub USB ayant sa propre
alimentation externe sur le téléphone, via l'adaptateur micro-usb -> usb.</p>
<p>Première remarque : on peut parfaitement contrôler le téléphone via le couple
clavier/souris. Ils sont reconnus et <strong>presque</strong> parfaitement gérés. Le seul
reproche : la disposition bépo n'est pas reconnue, le clavier est censé être
un azerty.</p>
<p>Seconde remarque : les disques NTFS ne sont pas reconnus nativement par le
téléphone. Au lieu de m'amuser avec la ligne de commande pour monter les
partitions, j'ai installé une petite appli (root nécessaire) le faisant à ma
place. J'ai donc pu consulter le contenu de mes disques externes, copier des
fichiers, lire des vidéos...</p>
<p>Troisième remarque : dommage, mais ma manette filaire[17] n'est pas reconnue.
Le logo X clignote en vert au lieu de se positionner sur l'un des angles.
Problème lié au noyau d'origine ? Module non compilé ? Je n'ai pas cherché.</p>
<p>Dernière remarque : on ne peut pas utiliser en même temps l'interface usb
(host) et la sortie HDMI. Pas avec les câbles vendus dans le commerce.
Cependant, il semblerait que le dock[18] le permette. À confirmer ?</p>
<p>Bref, ce téléphone tient plus de l'ordinateur de poche que du téléphone[19] .
L'évolution technologique est dingue. Impossible de deviner il y a 5 ans ce
que deviendraient nos téléphones. De même, il est impossible de prévoir à quoi
ressembleront les téléphones dans 5 ans.</p>
<hr>
<p>1 : Suspense…</p>
<p>2 : 96 Mo de ram accessible au système d'exploitation. Le téléphone dispose
théoriquement de 188 Mo de RAM, partagés entre la radio (modem), les
différentes puces et l'OS, qui lui, ne voit que ce qu'il reste.</p>
<p>3 : Out Of Memory Killer. Petit démon unix se cachant dans le noyau, et
servant à libérer les ressources mémoire, quand celles-ci sont épuisées, en
tuant le process consommant toute la mémoire.</p>
<p>4 : Oui, comme un certain bibliothécaire. Bibliothécaire tellement célèbre qu'un langage de programmation porte son nom :)</p>
<p>5 : Un numéro de téléphone contenant "1337", on le garde à tout prix.</p>
<p>6 : Attention, le simple fait de mentionner le mot "nu" rend cet article "classé 18+".</p>
<p>7 : Les tests ont été effectués avec la beta 3 de xbmc. La RC1 est sortie entretemps.</p>
<p>8 : OGM : Ogg Media, pas Organisme Génétiquement Modifié.</p>
<p>9 : Bien entendu, j'ai le film original en bluray (la disparition… pour ceux qui se posent la question)</p>
<p>10 : Je ne cherche pas à comprendre le pourquoi du comment. Pourquoi la gomme est-elle gérée pour ne pas l'inclure sur le stylet.</p>
<p>11 : Pourquoi on exprime toujours la taille des écrans en pouces et non en millimètre ? Bref, ça donne environ 141 mm de diagonale, juste pour l'écran.</p>
<p>12 : Ordinateur portable. Je n'aime pas utiliser le terme "PC", dans l'esprit des gens, PC = Windows, alors que j'ai du Mac OS X (Apple), du Windows et du GNU/Linux.</p>
<p>13 : Cf. Les petits cours de Blast, compression audio, (prochainement) disponibles sur le netophonix.</p>
<p>14 : Testé sur un Motorola Defy.</p>
<p>15 : genre, qui demandent plus de 800 Mo de stockage.</p>
<p>16 : Pas de détails, ni de réponse aux questions éventuelles.</p>
<p>17 : Microsoft Xbox 360 wired controller.</p>
<p>18 : Dock officiel par Samsung, vendu une centaire d'euros, et ayant 2 (ou 3) ports USB, une prise micro USB (pour l'alimenter) et une sortie HDMI.</p>
<p>19 : Téléphone, j'ai pensé au Nokia 3210. Une référence, à son époque.</p>Stylet Wacom (en vrac)2012-12-11T00:00:00+01:002012-12-11T00:00:00+01:00alextag:blog.chibi-nah.fr,2012-12-11:/stylet-wacom<p>Quelques informations en vrac :</p>
<ul>
<li>Le stylet PL900, ainsi que le stylet HP, fonctionnent tous les deux (pas en simultanné, faut pas exagérer) sur le Samsung Galaxy Note 2, y compris la gomme (chose qui manque sur le stylet samsung d'origine).</li>
<li>Le stylet du Galaxy Note 2 fonctionne également sur mon …</li></ul><p>Quelques informations en vrac :</p>
<ul>
<li>Le stylet PL900, ainsi que le stylet HP, fonctionnent tous les deux (pas en simultanné, faut pas exagérer) sur le Samsung Galaxy Note 2, y compris la gomme (chose qui manque sur le stylet samsung d'origine).</li>
<li>Le stylet du Galaxy Note 2 fonctionne également sur mon tablet-pc, bouton compris.</li>
<li>Un point que j'avais remarqué, et qui m'a fait pousser à poser un film de protection d'écran, les mines standards (pointes dures, noires ou blanches) des stylets ont tendance à rayer les écrans/tablettes. C'est confirmé dans un article détaillé de San Lee,accessible via</li>
</ul>
<p><a href="http://www.no-xice.com/~sanlee/informations-sur-les-mines-de-stylet-wacom/">http://www.no-xice.com/~sanlee/informations-sur-les-mines-de-stylet-wacom/</a></p>Remplacement de systemd par openrc sous Archlinux2012-10-18T00:00:00+02:002012-10-18T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-10-18:/remplacement-de-systemd-par-openrc-sous-archlinux<p><s><strong>Cet article nécessite quelques connaissances de base, notamment, comment
récupérer un accès à sa machine quand on a planté init. Savoir compiler un
noyau GNU/Linux n'est pas obligatoire, mais peut aider.</strong></s></p>
<p>Cet article est finalement publié, mais est inutile (article incomplet, j'ai
fini par laisser tomber). À ne lire …</p><p><s><strong>Cet article nécessite quelques connaissances de base, notamment, comment
récupérer un accès à sa machine quand on a planté init. Savoir compiler un
noyau GNU/Linux n'est pas obligatoire, mais peut aider.</strong></s></p>
<p>Cet article est finalement publié, mais est inutile (article incomplet, j'ai
fini par laisser tomber). À ne lire que pour le côté "amusant" de la chose.</p>
<p>Le 18 octobre, j'avais commencé à écrire un article (brouillon plus bas),
expliquant comment recompiler la cinquantaine de paquets (et quelques) ayant
des dépendances à systemd, afin de garder un système "propre", sans systemd.</p>
<p>Les paquets de base n'ont posé aucun problème (dbus-core, ancienne version
d'udev, paquet systemd-empty).</p>
<p>Là où ça s'est corsé, c'est quand j'ai vu que les drivers Xorg avaient des
dépendances à systemd. Là, gros WTF.</p>
<p>Pour ceux qui ne me croient pas :
<a href="https://www.archlinux.org/packages/extra/x86_64/xf86-video-intel/">https://www.archlinux.org/packages/extra/x86_64/xf86-video-intel/</a></p>
<p>ou encore (colonne Required By) :
<a href="https://www.archlinux.org/packages/core/x86_64/systemd/">https://www.archlinux.org/packages/core/x86_64/systemd/</a></p>
<p>Du coup, j'ai fini par laisser tomber, et cet article est parti dans les
oubliettes.</p>
<p><strong><em>Au final, j'ai viré archlinux, et ai remis une debian…</em></strong></p>
<p><strong>ATTENTION, à ne lire que pour le "fun", ne pas appliquer ce qu'il y a
dedans, cela ne fonctionnera pas. De même, je ne répondrai à aucune question
concernant un quelconque remplacement de systemd. Je suis passé à autre
chose.</strong></p>
<p><brouillon><brouillon><brouillon><brouillon><brouillon><brouillon><brouillon><brouillon></p>
<p>Il y a trois types de gens :</p>
<ul>
<li>Ceux qui suivent commes des moutons</li>
<li>Ceux qui critiquent ceux qui suivent comme des moutons</li>
<li>Ceux qui n'ont rien à faire des deux premiers types et qui font à leur manière</li>
</ul>
<p>Bref, le but de cet article est pour montrer que l'on peut utiliser ArchLinux,
sans utiliser/supporter systemd.[1]</p>
<p><strong>ATTENTION, le contenu de cet article est discutable, et tenter de reproduire
ce que je détaille peut exploser votre machine. Je ne suis en aucun cas
responsable d'un quelconque dommage, perte de productivité, etc, si vous avez
suivi ces instructions, si vous vous trouvez dans un espace temps alternatif,
si vous êtes un esper, un voyageur temporel, un alien…[2]</strong></p>
<p>Toujours là ? bon, on peut commencer.</p>
<p>Tout d'abord, pourquoi virer systemd ?</p>
<ul>
<li>Parce que… <insérer ici un argument foireux></li>
<li>D'abord… <insérer ici un autre argument foireux></li>
<li>J'utilise GNU/Linux, par GNU/Lennax</li>
<li>Vu le bloatware[3] que devient systemd, il vaut mieux prévoir une alternative.</li>
<li>Pour le fun</li>
</ul>
<p>Ensuite, comment virer systemd ? le remplacer par quoi ?</p>
<ul>
<li>J'ai commencé par installer open-rc (de gentoo), pour pouvoir virer initscripts (plus maintenu, déprécié au profit de systemd), puis ai configuré grub [5] pour démarrer dessus.</li>
</ul>
<p>Point positif d'open-rc (du point de vue du paquet dispo pour archlinux). Sa
configuration dans /etc est placée à part. Aucun fichier existant n'est
remplacé. C'est un peu déroutant au début, mais c'est assez logique à la fin.
Du coup, toute la configuration, que ça soit hostname, les init, etc, sont
situés dans /etc/openrc.</p>
<ul>
<li>Après avoir configuré correctement open-rc (boot fonctionnel, écriture/portage de mes scripts dessus), j'ai commencé à lister les dépendances à systemd. Classique : gdm, dbus-core, …</li>
<li>Récupération, dans la mesure du possible, des paquets source (via yaourt -G), retrait des options de compilation pour systemd, ou utilisation des anciennes versions (comme udev).</li>
<li>En parlant d'Udev, j'hésite à passer sur son fork, qui semble mieux maintenu qu'une ancienne version d'udev.</li>
<li>Création (pour le fun) d'un paquet "systemd-dummy", qui servira à virer systemd (replace systemd). Ce paquet sert à déterminer s'il me reste des dépendances à systemd, et aussi, pour virer systemd, une fois que tous les paquets seront recompilés. Cependant, il me faudra alors maintenir les paquets à jour, puisque toute mise à jour d'un paquet réinstallera systemd.</li>
</ul>
<hr>
<p>1 : Super, c'est le retour des notes de bas de page.</p>
<p>2 : Toute ressemblance avec (etc)</p>
<p>3 : Et oui, maintenant, il y a un serveur web (basé sur libmicrohttpd) et un générateur de code QR dans l'init[4]. Après xinetd, cron, syslog, sysv, udev, … ça sera quoi la prochaine fois ? l'intégration de wayland ? xorg ?</p>
<p>4 : Malheureusement vrai, cf. <a href="http://comments.gmane.org/gmane.linux.redhat.fedora.devel/169082">http://comments.gmane.org/gmane.linux.redhat.fedora.devel/169082</a></p>
<p>5 : Oui, grub 0.99, la version soit disant "dépassée", mais qui fonctionne correctement et me permet de garder un menu "simple" et "propre"</p>En vrac2012-10-12T00:00:00+02:002012-10-12T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-10-12:/en-vrac<p>Quelques notes en vrac. En résumé, abandon de Leopard par la MOFO, stylet PL900 compatible avec le Galaxy Note, après systemd, au tour d'udev de casser ?</p>
<p>Fin du support de Mac OS X 10.5 par Mozilla.</p>
<p><a href="http://support.mozilla.org/fr/kb/firefox-fonctionne-plus-mac-os-x-105">http://support.mozilla.org/fr/kb/firefox-fonctionne-plus-mac-os-x-105</a></p>
<p>je cite : « nous vous conseillons de …</p><p>Quelques notes en vrac. En résumé, abandon de Leopard par la MOFO, stylet PL900 compatible avec le Galaxy Note, après systemd, au tour d'udev de casser ?</p>
<p>Fin du support de Mac OS X 10.5 par Mozilla.</p>
<p><a href="http://support.mozilla.org/fr/kb/firefox-fonctionne-plus-mac-os-x-105">http://support.mozilla.org/fr/kb/firefox-fonctionne-plus-mac-os-x-105</a></p>
<p>je cite : « nous vous conseillons de passer à un nouvel ordinateur compatible Mac OS X Lion Mountain (10.8) ».</p>
<p>Sans commentaires…</p>
<p>Après quelques tests rapides, il s'est avéré que les stylets du TM2 (origine HP et Wacom) sont compatibles avec le Galaxy Note.</p>
<p>Il faudra que je teste quand je pourrai avec le Galaxy Note 2 (ce qui me ferait un point supplémentaire pour m'en prendre un.</p>
<p>Le stylet se trouve sur le site de Wacom-Europe, via Accessoires -> PL-Series -> PL-900 (stylet de rechange).</p>
<p><strong>Préparez le popcorn !</strong></p>
<p><a href="https://lkml.org/lkml/2012/10/2/303">https://lkml.org/lkml/2012/10/2/303</a></p>Migration terminée2012-10-11T00:00:00+02:002012-10-11T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-10-11:/migration-terminee<p>Voilà, les sites, les emails et le DNS sont désormais gérés par Ayaka (lourde
tâche pour toi, désolé d'avance)</p>
<p>Au final, juste une petite coupure due à la propagation des DNS :)</p>L'une des raisons pour laquelle la migration est lente…2012-08-21T00:00:00+02:002012-08-21T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-08-21:/l-une-des-raisons-pour-laquelle-la-migration-est-lente<p><img alt="Hack the Mugunghwa" src="/images/steam/succes2.png"></p>
<p><img alt="Vous avez déverrouillé tous les succès disponibles." src="/images/steam/succes.png"></p>
<p>Sans commentaires :D</p>Archlinux et systemd2012-08-19T00:00:00+02:002012-08-19T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-08-19:/archlinux-et-systemd<h2><strong>ATTENTION : ARTICLE TOUCHANT UN SUJET HAUTEMENT TROLLIFÈRE</strong></h2>
<p>Mon avis <strong>personnel</strong> sur l'évolution d'Archlinux.</p>
<p>J'insiste <strong>LOURDEMENT</strong> sur le fait ce que n'est <strong>que mon avis personnel</strong>.</p>
<p>Toute personne consultant régulièrement la ML d'Archlinux ou DLFS (Die Linux
Französische Seite) aura pu constater que la distribution GNU/Linux Archlinux
fait l'objet d'une …</p><h2><strong>ATTENTION : ARTICLE TOUCHANT UN SUJET HAUTEMENT TROLLIFÈRE</strong></h2>
<p>Mon avis <strong>personnel</strong> sur l'évolution d'Archlinux.</p>
<p>J'insiste <strong>LOURDEMENT</strong> sur le fait ce que n'est <strong>que mon avis personnel</strong>.</p>
<p>Toute personne consultant régulièrement la ML d'Archlinux ou DLFS (Die Linux
Französische Seite) aura pu constater que la distribution GNU/Linux Archlinux
fait l'objet d'une guerre de clochers, encore plus énorme que l'éternel débat
« vi contre emacs ».</p>
<p>D'abord, un peu d'histoire (sur lequel, je vais tenter d'être neutre). J'ai
vérifié mes sources diverses et je ne pense pas me tromper. Les approximations
rencontrées sont dues au fait que je tente de résumer (ou « vulgariser »).</p>
<ul>
<li>Avant 2003 : Création de GNU/Linux, architecture type unix, lsb, blablabla, écosystème bordélique, chacun implémentant les choses comme il le veut, création de distributions majeures, telles que red hat, debian, gentoo, slackware…</li>
<li>2000 : Sortie de KDE 2. Parmi les nouveautés, il faut noter un système de communication entre applications nommé DCOP. [1]</li>
<li>2003 : Création des spécifications de D-Bus.</li>
<li>2003 : Création d'udev, pour gérer (correctement) les périphériques d'un ordinateur.</li>
<li>2004 : Création de polypaudio [2], un serveur de sons, similaire à ESD (Enlightened Sound Daemon).</li>
<li>2006 : Changement du nom de polypaudio. Ce démon s'appelle désormais "Pulse Audio" [3].</li>
<li>2006 : Intégration des "conteneurs à processus" dans le noyau GNU/Linux, puis renommé par la suite en "CGroups". Proposé au départ par des développeurs travaillant pour Google, ces outils permettent d'isoler l'exécution d'applications.</li>
<li>2008 : Intégration de Pulse Audio dans Ubuntu. Problème : l'intégration est bancale, pour ne pas dire désastreuse, car PA n'est pas encore pleinement utilisable. Il faut noter que la gestion du son sous Linux a toujours été « bordélique », et ce qui marchait plus ou moins bien s'est mis à ne plus fonctionner du tout. Le développeur principal ayant un avis plutôt tranché sur l'univers Linux, cf. entretien de 2011 [4], cela n'aide pas à la compréhension du projet. Certains le qualifient (PA) de « bloatware »[5].</li>
<li>2010 : Création d'une bidouille[6], dénomée "sched_autogroup", se basant sur les cgroups, et permettant d'avoir une machine toujours fonctionnelle, même en cas d'application plantée et consommant toutes les ressources.</li>
</ul>
<p>Par exemple, compiler un noyau linux sur une machine mono-core avec un make -j 128. Cela lance 128 processus de compilation, donc, 128 concurrents pour
prendre le contrôle du processeur pour s'exécuter. Sans cette bidouille, la machine devient inutilisable, par exemple, impossible d'utiliser mozilla firefox. Avec cette bidouille, les ressources sont divisées de manière "équitable", où les processus sont regroupés par "lieu d'utilisation" (console graphique, console texte, pty…).
Cependant, certains administrateurs système considéraient cette bidouille comme n'étant pas suffisamment souple (du au groupement), ils commencèrent à bidouiller les cgroups par « démon unix» (comme apache, ou les outils de virtualisation.)</p>
<ul>
<li>2010 : Création de systemd (system daemon). Cet outil est un énième "remplaçant" au SystemV d'Unix [7].</li>
<li>2011 : sortie de Gnome 3. L'évolution majeure de l'environnement de bureau Gnome tranche radicalement les avis des utilisateurs. Épuré pour certains, inutilisable pour d'autres, car trop de fonctionnalités retirées. Tout comme systemd et PA, il ne laisse pas indifférent. Il suffit de voir les forks qui eurent lieu, notamment Mate ou MGSE, voire carrément le remplacement de Gnome par XFCE [8].</li>
<li>Sans date précise, mais entre 2004 et 2008: Création de ConsoleKit et de PolicyKit (pour répondre à une problématique étant « À définir » [9]), remplacement de dcop par d-bus…</li>
<li>2012 : Intégration de systemd dans la plupart des distributions majeures, remplaçant tous les systèmes de démarrage existant (casse de la compatibilité).</li>
<li>2012 : Udev est désormais intégré dans systemd (ce ne sont plus des projets indépendants, systemd a "absorbé" udev).</li>
</ul>
<p>Ces projets semblent bien distincts, mais il ne faut pas oublier quelques
détails. En effet, une partie de ces projets sont créés ou maintenus, en
partie par des développeurs de Red Hat (Red Hat, Fedora), notamment PA,
systemd et gnome.</p>
<p>Ok, tout ce blabla est bien beau, mais quel rapport avec le titre : "Archlinux et systemd" ? Et c'est quoi cette histoire de guerre de clochers ?</p>
<p>Archlinux a été créé en 2003, avec pour philosophie : "Keep It Simple and Stupid" (KISS, garder les choses simples et claires).</p>
<p>Les principaux atouts d'Archlinux furent donc :</p>
<ul>
<li>Patcher au minimum les sources des logiciels (versions dites "vanilla")</li>
<li>Fournir une distribution GNU/Linux optimisée i686 (en 2003, optimisée pour Intel Pentium MMX ou PII, à l'époque où la plupart étaient compilées pour le i486, donc gain de performances pour les machines récentes, au détriment de la compatibilité).</li>
<li>Utiliser un gestionnaire de paquets simple (pacman).</li>
<li>Permettre aux utilisateurs de créer facilement leurs propres paquets logiciels, et de les proposer à la communauté Archlinux (AUR/ABS)</li>
<li>Mise à jour en continu. Pas de version "truc.machin", les logiciels disponibles sont toujours à la dernière version, et non, comme pour la plupart des distributions GNU/Linux, des versions figées jusqu'à la mise à jour "majeure" de la distribution. Un peu comme le dépot "Experimental" de Debian, les risques de casser le système en moins.</li>
<li>Facile à configurer (la plupart des éléments de base se trouvant dans /etc/rc.conf).</li>
<li>Un init « à la BSD »[10], avec des scripts simples et clairs, faciles à écrire.</li>
<li>Une architecture (/etc, /home, /usr…) simple et découlant de la tradition "Unix".</li>
<li>Un support utilisateur simple et rapide (irc, pages de documentation complètes).</li>
<li>Similaire au "rolling release" (mise à jour en continu), l'intégration rapide des nouveautés.</li>
</ul>
<p>Et voilà, nous y sommes : "intégration rapide des nouveautés".</p>
<p>Cette petite phrase, semblant anodine révèle les raisons de la guerre des clochers énoncée tout au début.</p>
<p>L'intégration rapide des nouveautés, ici, systemd, divise les utilisateurs d'archlinux en deux groupes : Ceux qui sont contents, et ceux qui ne sont pas contents.</p>
<p>Point de vue de ceux qui sont contents :</p>
<ul>
<li>Démarrage plus rapide.</li>
<li>Organisation des fichiers de configuration "logique", la configuration du réseau doit être dans le répertoire "réseau", l'affichage dans "affichage", la disposition du clavier dans "clavier", etc…</li>
<li>Cela rendra uniforme la manière de démarrer un système Linux, que ça soit maegia/mandriva, Archlinux, Fedora/Red Hat…</li>
<li>Il n'y a plus de scripts shell d'exécutés, les directives sont dans des fichiers décrivant le "service", ainsi que ses dépendances.</li>
<li>Une gestion automatique des "dépendances". Par exemple, ça sert à rien de démarrer le serveur web si le réseau n'est pas actif.</li>
<li>La gestion simple du "respawn". Si un process plante, il faut le relancer aussitôt.</li>
<li>Utilisation "intelligente" des cgroup</li>
<li>Archlinux, du fait de sa mise à jour en continu ne DOIT PAS être installé sur un serveur en production.</li>
</ul>
<p>Point de vue de ceux qui ne sont pas contents :</p>
<ul>
<li>Osef du démarrage plus rapide. On ne passe pas son temps à redémarrer son ordi toutes les 10 minutes, et en dualboot, Linux est tout de même plus rapide à démarrer que Windows.</li>
<li>La configuration était simple, puisque les <strong>fonctionnalités de base</strong> sont présentes en un seul endroit (non, faire en sorte que l'ordinateur joue la « marche slave » (de Tchaikovski) quand un email arrive n'est pas considéré comme étant une fonctionnalité de base). Je caricature à peine avec cet exemple, certains utilisateurs voulaient pouvoir configurer le wifi et autres joyeusetés dans le rc.conf.</li>
<li>Afin de permettre la compatibilité avec systemd, on est en train de détruire le rc.conf, en collant les paramètres un peu partout dans /etc.</li>
<li>On arrive déjà pas à compiler une application pour qu'elle fonctionne sur plusieurs distributions. Mettre un init et une configuration exactement identique à toutes les distributions ne sert qu'à détruire le rôle des distributions. Pourquoi s'emm*** à utiliser Archlinux alors que Fedora fournit exactement la même chose, la même config, et est soutenue par une entreprise majeure du monde Linux.</li>
<li>Les scripts shells sont faciles à écrire.</li>
<li>Les dépendances sont relativement faciles à résoudre, via le paramètres "DAEMONS" dans le rc.conf, puis qu'ils sont exécutés dans l'ordre.</li>
<li>Si un service plante, ce n'est pas sans raison (on est pas sous Windows). Vaut-il mieux garder un serveur apache "vautré" plutôt que de tenter de le relancer en permanence, et d'entrer dans une boucle (démarrage -> crash -> redémarrage -> crash…).</li>
<li>Archlinux, pas sur un serveur ? Pourtant, Gentoo, étant également en "mise à jour en continu" fonctionne très bien depuis de nombreuses années sur des serveurs en production.</li>
</ul>
<p>Parmi les "pas contents", certains ont des arguments plus discutables, notamment :</p>
<ul>
<li>Point de vue "Logique" : Doit-on laisser un logiciel à peine mature, s'occupant de 36 000 choses différentes, n'étant pas forcément de son ressort, remplacer un service hautement critique qu'est l'init ? Rappel : tout problème dans le processus init se résume à un "Kernel Panic", donc un plantage total de la machine, sans possibilité de récupération.</li>
<li>Point de vue "Politique" : Doit-on remplacer par la force (via son intégration extrêmement poussée dans les logiciels, notamment Gnome) un système qui fonctionne par un nouveau système n'ayant pas fait ses preuve et n'étant pas considéré comme "mature" ?</li>
<li>Point de vue "Philosophie" : systemd casse totalement la tradition "unix". Non modulaire, monolitique, s'occupant de 36 000 choses différentes et non d'une seule (une seule, et correctement), sachant que son créateur affiche ouvertement qu'il se fout complètement de cette philosophie, et qu'il ne s'encombre pas de la compatibilité *bsd.</li>
<li>Point de vue "Conception" : dépendance à D-Bus notamment. D-Bus n'est pas indispensable sur un serveur. Il ne faut pas oublier que Linux n'est pas utilisé QUE pour faire tourner un bureau Gnome. Il peut être utilisé sur un serveur en production.</li>
<li>Point de vue "Système" : systemd ne supporte pas le fait que la partition /usr soit séparé de la partition /. À quand la même chose pour les partitions /var et /home ?</li>
<li><strong>/!\TROLL</strong> Les produits Red-Hat ne sont pas KISS (penser à Network-Manager) *<em>TROLL/!*</em></li>
</ul>
<p>De mon point de vue personnel :</p>
<p>Nous sommes à un tournant important de l'histoire d'Archlinux.</p>
<p>Mes déconvenues ont commencé avec le déplacement de /lib (librairies <strong>de
base</strong> , utilisées par les outils de base, quand /usr n'est pas encore monté)
dans /usr/lib.</p>
<p>Comme je compile à la main mes noyaux GNU/Linux (obligé de patcher certains
pilotes de périphérique, dernièrement, le driver wacom, en plus du pilote
synaptics, pour les faire fonctionner sur ma machine), la mise à jour de la
libc, déplaçant /lib dans /usr/lib a échoué, et au redémarrage, je me suis
retrouvé avec un système linux complètement planté, inutilisable (puisque
cherchant ses modules dans /lib). Ça m'a fait revenir à l'utilisation de
Windows 7, présent sur la même machine, en dualboot, pendant deux semaines.
Cependant, c'est un peu de ma faute aussi, vu que je suis en archlinux-
testing, et pourtant, j'ai lu la note sur le retrait de /lib.</p>
<p>Le fait de passer systemd « en force », sous prétexte que « c'est mieux »,
désolé, mais ça, je n'accepte pas. Pourquoi aucun autre init déjà existant n'a
été implémenté par toutes les distributions en remplacement d'InitV, c'est
peut être parce que chaque distribution a une orientation particulière. Plus
orienté "Bureau", plus "Serveur", plus "utilisateur Gourou"…</p>
<p>La destruction progressive de ce que je considérais comme étant un point
essentiel : la configuration centralisée de la base dans /etc/rc.conf, afin
d'être compatible systemd, et surtout, compatible avec des outils de
configuration graphique (mais WTF ?)</p>
<p>Casser la philosophie Unix, ayant plus de 30 ans d'héritage, ça se discute. Je
suis attaché à cette tradition (un outil = une tâche). Je ne vais pas me
mettre à utiliser un couteau suisse à 36 fonctions (tournevis, lampe de poche,
couverts) pour remplacer mes tournevis (qui ne servent qu'à un seul type de
vis), ni l'utiliser comme marteau, sachant que ce "couteau" ne fera pas
correctement usage de marteau :D</p>
<p>Philosophie… Tradition… le mot « Religion » est proche. D'où l'utilisation du
terme « guerre de clochers » en début d'article. Je pense que cela peut
expliquer pourquoi cette guéguerre est si virulente. À croire qu'il n'y a que
deux possibilités : accepter systemd ou refuser systemd. Je pencherais plus
pour une troisième voie : systemd est là, ok, des utilisateurs veulent
l'utiliser ; comme des<s>moutons</s>Apple Addict attendent le dernier iPhone
super trop à la mode et la tablette iPad qui est trop une tuerie.
Faire avec, soit, mais faire en sorte que son impact soit réduit au minimum.
En effet, rien ne garanti que systemd ne sera qu'un effet de mode, et que,
comme toute mode, cela ne s'essouffle au bout de quelque temps, ou pire, qu'il
se révèlera désastreux sur le long terme.</p>
<p>Je ne parlerai pas du créateur de systemd. Je n'ai rien contre lui, il
participe au développement de l'écosystème Linux. Son approche peut être
considérée comme étant "extrême", tout comme les fortes personnalités du monde
libre (sur d'autres points de vue, notamment au niveau licences, au niveau
ouverture du matériel…). Le fait que systemd soit développé par x, y ou z, à
vrai dire, je m'en moque complètement. Si un logiciel est bien conçu, je
l'utilise. Si j'estime que le logiciel ne correspond pas à mes attentes, je ne
l'utilise pas. POINT ! Par exemple, pulse-audio ne me convient pas, je ne
l'utilise pas. POINT !</p>
<p>Nous voilà donc à mon dernier point de vue : Si cela correspond à mes
attentes, j'utilise. Sinon, j'utilise autre chose. En 12 ans, j'ai utilisé
plusieurs distributions. Notamment Mandrake 7.2, puis Mandrake 8.0, 8.1, 8.2.
Puis j'ai testé diverses distributions, avant de me fixer sur Debian (Woody je
crois). Puis, utilisation en parallèle (sur des ordinateurs différents) de
Gentoo et d'Ubuntu (Dapper Drake). Retour d'Ubuntu vers Debian, après le
passage rapide à fedora, et un peu plus long à Suse, puis passage de Gentoo à
Archlinux.</p>
<p>Ce qui m'a plu dans Archlinux, ce sont les raisons énumérées en haut. Cela
correspondant pas mal à mes attentes d'une distribution Linux « moderne ».</p>
<p>Cependant, les orientations prises ces derniers mois me conviennent de moins
en moins. J'ai commencé par bloquer les initscript, bloquer netcfg. La gestion
du noyau Linux étant bloquée dès le début, grâce à un paquet créé de toute
pièce, faisant croire à pacman que j'utilise la version 3.99 du noyau :D, afin
de ne pas être embêté. La fusion de systemd et d'udev (composant critique à
mes yeux) ne me plait pas du tout, car rien n'empêche une future évolution
d'udev pour n'être compatible qu'avec systemd. Je suis peut être paranoïaque
sur ce point là, mais ce n'est pas impossible que ça arrive dans un futur plus
ou moins proche.</p>
<p>À présent, je me demande que faire :</p>
<ul>
<li>Gérer moi-même les initscript ?</li>
<li>Passer à systemd et "à-dieu-vat" ?</li>
<li>Changer de distrib (genre, slackware) ?</li>
</ul>
<p>Pour le moment, le système reste "utilisable", avec les blocages effectués,
mais je pense sérieusement migrer vers Slackware (ou une de ses dérivées,
comme Salix). J'ai déjà installé Salix sur une autre partition, histoire de me
mettre dans le bain, et de voir une nouvelle approche (autre que celles que je
connais déjà, comme gentoo, arch, debian ou suse).</p>
<p>« Le chemin est long, mais la voie est libre. »</p>
<hr>
<p>1 : À noter un "équivalent" sous Gnome : Bonobo, basé sur CORBA.</p>
<p>2 : <a href="http://www.freedesktop.org/wiki/Software/PulseAudio/OldNews">http://www.freedesktop.org/wiki/Software/PulseAudio/OldNews</a> tout en bas de la page.</p>
<p>3 : Même page que pour [1].</p>
<p>4 : Se référer à l'entretien pour LinuxFr. <a href="http://linuxfr.org/news/un-entretien-avec-lennart-poettering">http://linuxfr.org/news/un-entretien-avec-lennart-poettering</a>.</p>
<p>5 : « Les termes boufficiel, inflagiciel et obésiciel tentent de traduire le
terme anglais bloatware désignant tantôt un logiciel utilisant une quantité
excessive de ressources système, tantôt un logiciel accumulant une quantité
importante de fonctionnalités disparates. » Source :
<a href="http://fr.wikipedia.org/wiki/Bloatware">http://fr.wikipedia.org/wiki/Bloatware</a></p>
<p>6 : Je devrais parler de "hack", mais dans l'esprit des gens, « hack =
piratage », et « hackeur = pirate informatique ne souhaitant que destruction
et récupération des numéro de carte de crédit ». Tout comme la définition de «
geek », qui définissait au départ un passionné (de LEGO, de littérature, de
cinéma), puis qui a été assimilé à « passionné d'informatique ». Désormais, «
geek » signifie soit « j'ai un compte facebook et j'utilise twitter », soit «
j'ai passé 12 heures à farmer sur WoW, je suis trop un geek ! ».</p>
<p>7 : Avant lui, il y a eu : SystemV, Upstart, initng, launchd… consulter la
page (en anglais) <a href="http://en.wikipedia.org/wiki/Init#Replacements_for_init">http://en.wikipedia.org/wiki/Init#Replacements_for_init</a></p>
<p>8 : Cf. <a href="http://www.phoronix.com/scan.php?page=news_item&px=MTE1NTk">http://www.phoronix.com/scan.php?page=news_item&px=MTE1NTk</a></p>
<p>9 : Oui, : « À définir ». En tout cas, c'est ce qu'indique la page de
desciption du projet sur freedesktop.
<a href="http://www.freedesktop.org/software/ConsoleKit/doc/ConsoleKit.html#id312242">http://www.freedesktop.org/software/ConsoleKit/doc/ConsoleKit.html#id312242</a></p>
<p>10 : Plus d'informations (en anglais) sur
<a href="http://en.wikipedia.org/wiki/Init#BSD-style">http://en.wikipedia.org/wiki/Init#BSD-style"</a> et <a href="https://wiki.archlinux.org/index.php/Arch_Boot_Process">https://wiki.archlinux.org/index.php/Arch_Boot_Process</a>, en espérant que cette page ne soit pas supprimée rapidement, suite au passage à systemd.</p>Migration (encore)2012-08-18T00:00:00+02:002012-08-18T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-08-18:/migration-encore<p>Encore quelques soucis avec la réécriture d'URL pour le blog (passage d'apache
à lighttpd oblige).</p>
<p>Je pense que cette règle devrait corriger les problèmes.</p>
<div class="highlight"><pre><span></span><code>url.rewrite-once = (
"\/feed\/([a-z\/]+)$" => "feed.php?$1",
"\/([a-z0-9-/]+)$" => "index.php?$1"
)
</code></pre></div>Windows 8 RTM maintenant disponible2012-08-16T00:00:00+02:002012-08-16T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-08-16:/windows-8-rtm-maintenant-disponible<p>Microsoft a mis officiellement à disposition des développeurs, la version
finale (RTM) de Windows 8, version PC via MSDN.</p>
<p>Bien entendu, il faut disposer d'un compte MSDN (ou TechNet pro) pour pouvoir
y avoir accès, le grand public ne pourra l'acheter qu'à partir du 26 octobre
2012.</p>
<p><a href="http://blogs.msdn.com/b/windowsappdev/archive/2012/08/15/windows-8-rtm-is-available-for-developers.aspx">http://blogs.msdn …</a></p><p>Microsoft a mis officiellement à disposition des développeurs, la version
finale (RTM) de Windows 8, version PC via MSDN.</p>
<p>Bien entendu, il faut disposer d'un compte MSDN (ou TechNet pro) pour pouvoir
y avoir accès, le grand public ne pourra l'acheter qu'à partir du 26 octobre
2012.</p>
<p><a href="http://blogs.msdn.com/b/windowsappdev/archive/2012/08/15/windows-8-rtm-is-available-for-developers.aspx">http://blogs.msdn.com/b/windowsappdev/archive/2012/08/15/windows-8-rtm-is-available-for-developers.aspx</a></p>
<p>À noter également, la sortie de Visual Studio 2012, également via MSDN.</p>Maintenance du serveur2012-08-10T00:00:00+02:002012-08-10T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-08-10:/maintenance-du-serveur<p>Le serveur est en cours de migration.</p>
<p>Les sites sont redirigés de manière temporaire vers chibi-nah.net</p>Maintenance du serveur-bis2012-08-10T00:00:00+02:002012-08-10T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-08-10:/maintenance-du-serveur<p>Le serveur est en cours de migration. Tous les sites seront inaccessibles, emails compris.</p>Touche ctrl droite non fonctionnelle2012-06-25T00:00:00+02:002012-06-25T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-06-25:/touche-ctrl-droite-non-fonctionnelle<p>Petite astuce si la touche contrôle, à droite du clavier, ne fonctionne plus correctement sous ArchLinux, avec la disposition clavier fr-oss.</p>
<p>La touche contrôle droit est mappée sur "ISO_Level5_Shift" et non plus sur "Control_R". Ce modificateur permet d'insérer des "espaces insécables" (en html : &#nbsp; ou  ) si elle est utilisée conjointement …</p><p>Petite astuce si la touche contrôle, à droite du clavier, ne fonctionne plus correctement sous ArchLinux, avec la disposition clavier fr-oss.</p>
<p>La touche contrôle droit est mappée sur "ISO_Level5_Shift" et non plus sur "Control_R". Ce modificateur permet d'insérer des "espaces insécables" (en html : &#nbsp; ou  ) si elle est utilisée conjointement avec la touche "espace".</p>
<p>Question stupide : quel est l'intérêt de modifier le comportement de cette touche (en modificateur donc) alors que ce n'est que pour altérer le fonctionnement d'une seule touche (espace) ?</p>
<p>Quitte à pousser le raisonnement (absurde) jusqu'au bout, il aurait été plus simple de modifier le comportement de la touche ctrl droite, de façon à ce qu'elle insère directement un espace insécable.</p>
<p>Bref, pour remettre le comportement "normal" de cette touche, il suffit de modifier le fichier "/usr/share/X11/xkb/symbols/fr" (nécessite les droits root), puis de commenter la ligne</p>
<div class="highlight"><pre><span></span><code>include "level5(rctrl_switch)"
</code></pre></div>
<p>(Chez moi, c'est à la ligne 133).</p>
<p>Une fois commenté, la ligne est comme cela :</p>
<div class="highlight"><pre><span></span><code> // include "level5(rctrl_switch)"
</code></pre></div>
<p>Origine de la solution : forum archinux.fr
(<a href="http://forums.archlinux.fr/topic11131.html">http://forums.archlinux.fr/topic11131.html</a>)</p>Personnaliser le message de bienvenue de fish2012-05-24T00:00:00+02:002012-05-24T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-05-24:/personnaliser-le-greeting-de-fish<p>Une petite astuce rapide afin de personnaliser le message de bienvenue de fish, the <strong>f</strong> riendly <strong>i</strong> nteractive <strong>sh</strong> ell.</p>
<p>Rappel : le message de bienvenue ne s'affiche qu'une seule fois, lors de l'ouverture du shell. À ne pas confondre avec le "prompt" (l'invite de commande), qui lui, s'affiche à chaque …</p><p>Une petite astuce rapide afin de personnaliser le message de bienvenue de fish, the <strong>f</strong> riendly <strong>i</strong> nteractive <strong>sh</strong> ell.</p>
<p>Rappel : le message de bienvenue ne s'affiche qu'une seule fois, lors de l'ouverture du shell. À ne pas confondre avec le "prompt" (l'invite de commande), qui lui, s'affiche à chaque commande exécutée.</p>
<p>Par défaut, le shell affiche ceci :</p>
<p><a href="/images/fish/fish.png"><img alt="Console affichant Welcome to fish, the friendly interactive shell. Type help for instructions on how to use fish." src="/images/fish/fish.png"></a></p>
<p>Le message de bienvenue peut être édité de deux manières différentes.</p>
<p>Première solution, via la variable "fish_greeting". Par exemple :</p>
<div class="highlight"><pre><span></span><code>set fish_greeting "Ceci prouve que l'on peut changer le message d'accueil"
</code></pre></div>
<p>Le résultat obtenu est <strong>presque</strong> conforme aux attentes. À noter que même en échappant les apostrophes avec \, cela ne change rien au résultat.</p>
<p><a href="/images/fish/fish1.png"><img alt="Console affichant Ceci prouve que lon peut changer le message daccueil" src="/images/fish/fish1.png"></a></p>
<p>Seconde solution, via le fichier .config/fish/functions/fish_greeting.fish</p>
<p>Cette fois, je vais compliquer un peu. Par exemple, je voudrais qu'il affiche le message par défaut, suivi de l'uptime en magenta et une fortune en cyan. Après une consultation rapide des codes de couleur, cf. <a href="https://blog.chibi-nah.fr/article5/linux-logo">Linux_logo</a>, le fichier
ressemble à cela :</p>
<div class="highlight"><pre><span></span><code>function fish_greeting
echo -e "\e[1;37mWelcome to fish, the friendly interactive shell"
echo -e "\e[1;37mType \e[32mhelp\e[1;37m for instructions on how to use fish"
set_color magenta
echo Uptime :(uptime)
set_color cyan
fortune -e
set_color normal
end
</code></pre></div>
<p>Le résultat obtenu est :</p>
<p><a href="/images/fish/fish2.png"><img alt="Console affichant le message de bienvenue, l'uptime et une fortune." src="/images/fish/fish2-s.png"></a>
<a href="/images/fish/fish3.png"><img alt="Console affichant le message de bienvenue, l'uptime et une autre fortune." src="/images/fish/fish3-s.png"></a></p>
<p>La seule limite est désormais l'imagination…</p>Bonnes pratiques2012-05-23T00:00:00+02:002012-05-23T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-05-23:/bonnes-pratiques<p>Suite à une discussion sur IRC, j'ai pensé qu'écrire un condensé de "bonnes pratiques" à adopter en informatique, surtout en développement logiciel serait une excellente idée.</p>
<p>Toute ressemblance avec des faits existants ou ayant existé ne serait pas vraiment fortuite. Dans le doute, consulter The Daily WTF, <a href="http://thedailywtf.com/">http://thedailywtf.com …</a></p><p>Suite à une discussion sur IRC, j'ai pensé qu'écrire un condensé de "bonnes pratiques" à adopter en informatique, surtout en développement logiciel serait une excellente idée.</p>
<p>Toute ressemblance avec des faits existants ou ayant existé ne serait pas vraiment fortuite. Dans le doute, consulter The Daily WTF, <a href="http://thedailywtf.com/">http://thedailywtf.com</a>.</p>
<h5>Petit guide des "bonnes pratiques" à adopter en développement logiciel</h5>
<p>aussi appelé "How to write shitty code".</p>
<p>Mots clés : génie logiciel, développement, analyste programmeur, chef de projet, maitre d'œuvre, tout ça…</p>
<p>Attention : ces règles sont écrites "en vrac" et ne sont pas ordonnées.</p>
<p><strong>Règle numéro un :</strong> ne pas documenter son code.</p>
<p><strong>Règle numéro deux :</strong> ne pas tester son code.</p>
<p><strong>Règle numéro trois :</strong> faire un commit sur master toutes les demi-heures (dans le cas où l'équipe utilise un gestionnaire de version, ce qui est une mauvaise pratique. Le bon codeur connaît son code et n'a pas besoin de le versionner, car il ne fait jamais d'erreurs).</p>
<p><strong>Règle numéro quatre :</strong> écrire dans le message de commit : "à remplir ; lol". Le bon codeur lit le diff, c'est plus rapide que d'essayer de comprendre la description des modifications.</p>
<p><strong>Règle numéro cinq :</strong> s'arranger pour faire péter la compilation, de préférence avant une livraison. Pour reprendre un slogan célèbre : "travaillez plus pour gagner plus". Cette règle permet effectivement de travailler plus.</p>
<p><strong>Règle numéro six :</strong> écrire des requêtes SQL illisibles, de préférence utilisant énormément les vues, si possible, utilisation des curseurs et de procédures stockées exécutant du code sql dynamique. Les CPU ont tendance à trop dormir et les faire travailler n'est pas superflu. Effet de bord intéressant : cela permet de faire des économies de chauffage en hiver.</p>
<p><strong>Règle numéro sept :</strong> laisser plein de code commenté, ça peut toujours servir plus tard et cela évite de réinventer la roue. De toute façon, les commentaires sont ignorés à la compilation. À noter tout de même que Flex Builder a tout de même tendance à laisser quand même les commentaires lors de la génération des swf, donc raison de plus de ne pas commenter. Cf règle numéro un.</p>
<p><strong>Règle numéro huit :</strong> si utilisation d'un tracker (trac, redmine, …) ne jamais le remplir car cela remplirait la base de données. La BDD devrait plutôt être consacrée à l'application à livrer et non à des futilités.</p>
<p><strong>Règle numéro neuf :</strong> ne pas indenter son code, ou alors, mélanger différentes longueur, confondre espace et tabulation. Cela permet d'aller plus vite pour coder, "Le temps, c'est de l'argent". De plus, seuls les langages "mal conçus" se basent sur les espaces et tabulations.</p>
<p><strong>Règle numéro dix :</strong> ne pas aligner les accolades. On a tendance à les confondre avec les parenthèses après avoir passé huit heures à coder.</p>
<p><strong>Règle numéro onze :</strong> utiliser des noms de variables les plus courts possible, utiliser au maximum une ou deux lettres. Si nécessaire, griffoner sur un post-it™ à quoi correspondent les variables b1, c2 et aa. Cela permet d'économiser des caractères dans le code et de taper moins de code (donc, le code va plus vite, cf. un célèbre outil de développement logiciel).</p>
<p><strong>Règle numéro douze :</strong> parfois, il peut être utile que le code s'auto-documente (la simple lecture permet de comprendre ce qu'il fait). Utiliser par exemple, lors de l'évaluation d'un booléen</p>
<div class="highlight"><pre><span></span><code>if(test == true)
</code></pre></div>
<p>au lieu de</p>
<div class="highlight"><pre><span></span><code>if(test)
</code></pre></div>
<p>Faire de même pour false.</p>
<p><strong>Règle numéro treize :</strong> ne pas utiliser les "inline if", préférer l'écriture
d'une fonction à la place. Par exemple, n'écrivez pas</p>
<div class="highlight"><pre><span></span><code>(test)?"ok":"erreur"
</code></pre></div>
<p>Écrivez à la place :</p>
<div class="highlight"><pre><span></span><code>{if(test == true) {return "ok";} if(test == false) {return "erreur";}}
</code></pre></div>
<p><strong>Règle numéro quatorze :</strong> concernant les rapports de bugs, écrire en sujet : "ça ne marche pas", dans le corps du texte : "regarder les captures d'écran que j'ai attaché", et attacher un fichier MS Word[1] ou MS Powerpoint[1].</p>
<p><strong>Règle numéro quinze :</strong> concernant les captures d'écran : les prendre au format gif (de préférence) ou jpeg (compression 30 ou 40%), les insérer dans un fichier .doc ou .ppt, et envoyer par email. Au pire, les attacher sur un ticket de rapport de bug (mauvaise pratique, cf. règle numéro huit).</p>
<p><strong>Règle numéro seize :</strong> lors de l'échange de documents, privilégier les formats word 97 ou word 2013.</p>
<p><strong>Règle numéro dix-sept :</strong> s'il faut exporter dans un format conservant la mise en page, privilégier le format .xps.</p>
<p><strong>Règle numéro dix-huit :</strong> si des commentaires doivent être écrits, privilégier le Klingon, le Quenya ou le Sindarin. Cela permettra à ces langues de survivre et de ne pas tomber dans l'oubli. Pour les plus lettrés, il est possible d'utiliser le latin.</p>
<p><strong>Règle numéro dix-neuf :</strong> afin de ne pas réinventer la roue, il faut recopier bêtement les exemples trouvable sur le net pour répondre à des problématiques.</p>
<p><strong>Règle numéro vingt :</strong> lors de développement web, privilégier le développement pour IE6, car, qui peut le plus, peut le moins. Accessoirement, IE est installé sur la majeure partie des ordinateurs de la planète.</p>
<p><strong>Règle numéro vingt-et-un :</strong> (toujours dans le webdev) ne pas tester les requêtes sql qui proviennent du navigateur. Tout prétraitement sur la requête ralentira son exécution. Il ne faut surtout pas échapper/doubler les quotes.</p>
<p><strong>Règle numéro vingt-deux :</strong> les injections SQL sont toujours sur les autres sites, et donc, "cela n'arrive qu'aux autres".</p>
<p><strong>Règle numéro vingt-trois :</strong> autoriser les scripts php à écrire dans un répertoire accessible depuis un navigateur web. Pas d'inquiétude, les écritures de fichiers dans ces reps n'arrivent que dans wordpress.</p>
<p><strong>Règle numéro vingt-quatre :</strong> si le choix est possible entre http et https, privilégier le http. On a bien vu l'an dernier les problèmes posés dans certains pays sur le https (facebook, gmail, etc).</p>
<p><strong>Règle numéro vingt-cinq :</strong> lors du déploiement d'un site web, privilégier les images au format .bmp, afin de garder la meilleure qualité d'image. La taille ne posera pas de problèmes, grâce aux connexion haut-débit.</p>
<p><strong>Règle numéro vingt-six :</strong> si vous utilisez un hébergeur gratuit, profitez-en pour ajouter le maximum de publicités.</p>
<p><strong>Règle numéro vingt-sept :</strong> usez et abusez du js, faites en sorte que votre site soit illisible sans le js actif.</p>
<p><strong>Règle numéro vingt-huit :</strong> vous ne voulez pas apprendre le html/css/js ? L'informatique vous dépasse ? Vous maitrisez Paint ? Alors, créez votre site avec PowerPoint [2].</p>
<p><strong>Règle numéro vingt-neuf :</strong> pour de la programmation de "clients lourds", privilégier le java ou le C# / .net. Cela simplifie le développement, et respecte la règle du : "programmez une fois, déployez partout".</p>
<p><strong>Règle numéro trente :</strong> si ce que vous codez vous semble bizarre ou semble mener dans une impasse, ne demandez pas au client ou au chef de projet, ils savent parfaitement ce qu'il faut faire et ça a été défini correctement, donc continuez de coder sans soucis.</p>
<p><strong>Règle numéro trente-et-une :</strong> toutes les règles précédentes sont à caractère humoristique et ne sont, bien entendu, à ne pas appliquer.</p>
<p>Remerciements à Bacardi55 pour son aide à la préparation de cet article.</p>
<p>Si vous avez d'autres idées de règles, ne pas hésiter à les ajouter en commentaires :D</p>
<hr>
<p>[1] Logiciels de Microsoft donnés à titre d'exemple. Noms et marques déposées et reconnues par Microsoft partout dans le monde ou quasiment. /mention légale.</p>
<p>[2] J'avoue, ça m'arrive de faire des maquettes (mockup) avec Keynote ou Powerpoint.</p>mc, htop et slurm2012-05-18T00:00:00+02:002012-05-18T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-05-18:/mc-htop-et-slurm<p>Trois petits outils en mode texte, bien pratique au quotidien, et disponible
dans toutes les bonnes crèmeries.</p>
<h5>mc</h5>
<p>Midnignt Commander, ressemblant à Norton Commander (pour ceux qui ont connu
les Norton Utilities sous MS-Dos). Cet outil permet de gérer simplement et
graphiquement [1] ses fichiers, en affichant deux colonnes, permettant …</p><p>Trois petits outils en mode texte, bien pratique au quotidien, et disponible
dans toutes les bonnes crèmeries.</p>
<h5>mc</h5>
<p>Midnignt Commander, ressemblant à Norton Commander (pour ceux qui ont connu
les Norton Utilities sous MS-Dos). Cet outil permet de gérer simplement et
graphiquement [1] ses fichiers, en affichant deux colonnes, permettant de
comparer, copier, déplacer, supprimer (etc) fichiers et répertoires.</p>
<p>Commande :</p>
<div class="highlight"><pre><span></span><code>mc
</code></pre></div>
<p><a href="/images/mc/mc.png"><img alt="Capture d'écran de Midnight Commander." src="/images/mc/mc-s.png"></a></p>
<p>Site officiel : <a href="http://www.midnight-commander.org/downloads/">http://www.midnight-commander.org/downloads/</a>
Github : <a href="https://github.com/MidnightCommander/mc">https://github.com/MidnightCommander/mc</a></p>
<h5>htop</h5>
<p>htop est un outil permettant de gérer les processus (les applis en cours
d'exécution). C'est plus agréable à utiliser que top, car il permet simplement
de trier les process par usage (%cpu, %ram, %pid), d'afficher les process sous
forme d'arborescence (j'ai tué $$$$ mais il respawn sans arrêt, avec l'arbre,
on voit qu'il est lancé par $$**).</p>
<p>Commande :</p>
<div class="highlight"><pre><span></span><code>htop
</code></pre></div>
<p><a href="/images/mc/htop.png"><img alt="Capture d'écran de htop." src="/images/mc/htop-s.png"></a></p>
<p>Site officiel : <a href="http://htop.sourceforge.net/">http://htop.sourceforge.net/</a></p>
<h5>slurm</h5>
<p>slurm permet d'afficher le traffic réseau en mode texte. Il faudra que je le
teste plus longtemps pour trouver ses subtilités.</p>
<p>Commande :</p>
<div class="highlight"><pre><span></span><code>slurm -i eth0
</code></pre></div>
<p>Penser à remplacer eth0 par le nom de l'interface à surveiller.</p>
<p><a href="/images/mc/slurm.png"><img alt="Capture d'écran de slurm." src="/images/mc/slurm-s.png"></a></p>
<p>Github : <a href="https://github.com/mattthias/slurm">https://github.com/mattthias/slurm</a></p>
<hr>
<p>1: ha ha ha, graphiquement, en mode texte</p>UP-817E2012-05-15T00:00:00+02:002012-05-15T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-05-15:/up-817e<p>Cela va faire un peu plus de 5 mois que j'utilise un UP-817E. Mais qu'est-ce que ce truc au nom barbare ?</p>
<p>Tout simplement un stylet Wacom UP-817E, que j'utilise avec mon Tablet-PC.</p>
<p>Par rapport au stylet HP d'origine, c'est le jour et la nuit.</p>
<p>Les avantages :</p>
<ul>
<li>Meilleure sensibilité.</li>
<li>Meilleure prise …</li></ul><p>Cela va faire un peu plus de 5 mois que j'utilise un UP-817E. Mais qu'est-ce que ce truc au nom barbare ?</p>
<p>Tout simplement un stylet Wacom UP-817E, que j'utilise avec mon Tablet-PC.</p>
<p>Par rapport au stylet HP d'origine, c'est le jour et la nuit.</p>
<p>Les avantages :</p>
<ul>
<li>Meilleure sensibilité.</li>
<li>Meilleure prise en main.</li>
<li>Deux boutons au lieu d'un seul.</li>
<li>Vendu avec un jeu de pointes et un extracteur.</li>
</ul>
<p>Les inconvénients :</p>
<ul>
<li>Ne rentre pas dans l'emplacement du stylet d'origine.</li>
</ul>
<p>Je ne considère pas le prix comme étant un avantage ou un inconvénient, vu que ce n'est pas une "dépense" (consommable), mais un "investissement" (amortissement sur 3 ans, etc).</p>
<p>L'inclinaison ne semble pas gérée sous Gimp, mais le stylet d'origine ne la gérait pas non plus. Ce n'est donc ni un avantage, ni un inconvénient.</p>
<p>À l'usage, je n'arrive plus à utiliser le stylet d'origine, j'ai l'impression de devoir appuyer "comme un bourrin" sur l'écran. C'est flagrant sur Osu!</p>
<p>Mode pub : Dispo sur le store de Wacom Europe, dans les accessoires, catégorie Tablet-PC, PL-900</p>
<p><a href="/images/up817e/DSC04581.jpg"><img alt="Photo montrant les deux stylets." src="/images/up817e/DSC04581-s.jpg"></a></p>
<p>En haut, celui d'origine (HP), en bas, celui de Wacom.</p>
<p><a href="/images/up817e/DSC04583.JPG"><img alt="Autre photo montrant les deux stylets." src="/images/up817e/DSC04583-s.JPG"></a></p>
<p>Les différences au niveau du(des) bouton(s) sont visibles.</p>setfacl: Operation not supported2012-05-12T00:00:00+02:002012-05-12T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-05-12:/setacl<p>Si comme moi, vous avez ce message qui surgit quand vous essayez d'accéder à une clé usb/disque dur externe depuis PCManFM</p>
<div class="highlight"><pre><span></span><code>Command-line `setfacl -m "u:alex:rx" "/run/media/alex"' didn't exit normally: setfacl: /run/media/alex: Operation not supported
</code></pre></div>
<p>et que vous avez un kernel linux compilé …</p><p>Si comme moi, vous avez ce message qui surgit quand vous essayez d'accéder à une clé usb/disque dur externe depuis PCManFM</p>
<div class="highlight"><pre><span></span><code>Command-line `setfacl -m "u:alex:rx" "/run/media/alex"' didn't exit normally: setfacl: /run/media/alex: Operation not supported
</code></pre></div>
<p>et que vous avez un kernel linux compilé à la main, vérifiez que le support des ACL est bien actif pour le système de fichiers tmpfs.</p>
<div class="highlight"><pre><span></span><code>File systems --->
Pseudo filesystems --->
-*- Tmpfs virtual memory file system support (former shm fs)
[*] Tmpfs POSIX Access Control Lists
</code></pre></div>Grub2012-05-11T00:00:00+02:002012-05-11T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-05-11:/grub<p>Les joies de l'informatique, l'évolution des logiciels, l'abandon sur le bord
de la route des anciennes versions considérées comme étant obsolètes, je
m'égare… Bref, un<s>ticket</s>article pour dire encore que <strong>c'était mieux
avant</strong> , en regardant le cas de GRUB "Legacy" et Grub "2"</p>
<p>GRUB, pour GRand Unified Bootloader, est …</p><p>Les joies de l'informatique, l'évolution des logiciels, l'abandon sur le bord
de la route des anciennes versions considérées comme étant obsolètes, je
m'égare… Bref, un<s>ticket</s>article pour dire encore que <strong>c'était mieux
avant</strong> , en regardant le cas de GRUB "Legacy" et Grub "2"</p>
<p>GRUB, pour GRand Unified Bootloader, est un petit "logiciel", qui s'exécute au
démarrage de l'ordinateur [1], entre le moment où le BIOS/EFI [2] donne la
main et qu'un système d'exploitation [3] démarre.</p>
<p>GRUB permet (entre autres)</p>
<ul>
<li>De choisir un Système d'Exploitation [4]</li>
<li>De choisir un autre chargeur de démarrage (pratique pour "chaîner" les bootloaders [5]</li>
<li>De passer en mode "ligne de commande" et de booter n'importe quoi n'importe comment [6]</li>
</ul>
<p>GRUB existe en deux versions :</p>
<ul>
<li>GRUB Legacy, "l'ancienne" version</li>
<li>GRUB2, la "nouvelle" version</li>
</ul>
<p>La principale différence entre les deux (point de vue administration) est dans
la configuration. Les autres innovations sont au niveau du support des gros
disques, de gpt et d'autres trucs que je n'ai pas retenu.</p>
<h5>GRUB Legacy</h5>
<p>Un seul fichier, simple, clair, parfaitement lisible et éditable depuis un
liveCD/USB, situé dans /boot/grub/menu.lst</p>
<p>Genre :</p>
<div class="highlight"><pre><span></span><code># Config file for GRUB - The GNU GRand Unified Bootloader
# /boot/grub/menu.lst
# DEVICE NAME CONVERSIONS
#
# Linux Grub
# -------------------------
# /dev/fd0 (fd0)
# /dev/sda (hd0)
# /dev/sdb2 (hd1,1)
# /dev/sda3 (hd0,2)
#
# FRAMEBUFFER RESOLUTION SETTINGS
# for more details and different resolutions see
# http://wiki.archlinux.org/index.php/GRUB#Framebuffer_Resolution
# general configuration
timeout 10
default 1
color light-blue/black light-cyan/blue
# boot sections follow
# each is implicitly numbered from 0 in the order of appearance below
#-*
# (0) Arch Linux
title Arch Linux (RC)
root (hd0,5)
kernel /boot/vmlinuz-3.4-rc6-yue root=/dev/sda6 ro
# (1) Arch Linux
title Arch Linux (Stable)
root (hd0,5)
kernel /boot/vmlinuz-3.2.7-yue root=/dev/sda6 ro
# (2) Arch Linux
title Arch Linux (Old stable)
root (hd0,5)
kernel /boot/vmlinuz-3.2.6-yue root=/dev/sda6 ro
# (3) Windows
title Windows
rootnoverify (hd0,0)
#makeactive
chainloader +1
# (4) Meego (default kernel)
title Meego
root (hd0,6)
kernel /boot/vmlinuz-2.6.38.2-8.26-adaptation-pinetrail root=/dev/sda7
# (5) Meego (custom kernel)
title "Meego-yue"
root (hd0,6)
kernel /boot/vmlinuz-2.6.38-yue root=/dev/sda7
#configfile /boot/grub/menu.lst
</code></pre></div>
<h5>GRUB2</h5>
<p>Un brol monstre dans /etc, avec des fichiers éparpillés dans grub.d, genre
(tiré d'Ubuntu 11.10)</p>
<p>dans /boot/grub</p>
<div class="highlight"><pre><span></span><code>$ ls
915resolution.mod gcry_tiger.mod parttool.mod
acpi.mod gcry_twofish.mod password.mod
affs.mod gcry_whirlpool.mod password_pbkdf2.mod
afs.mod gettext.mod pbkdf2.mod
afs_be.mod gfxblacklist.txt pci.mod
aout.mod gfxmenu.mod play.mod
at_keyboard.mod gfxterm.mod png.mod
ata.mod gptsync.mod probe.mod
ata_pthru.mod grldr.img pxe.mod
befs.mod grub.cfg pxeboot.img
befs_be.mod grubenv pxecmd.mod
biosdisk.mod gzio.mod raid.mod
bitmap.mod halt.mod raid5rec.mod
bitmap_scale.mod hashsum.mod raid6rec.mod
blocklist.mod hdparm.mod read.mod
boot.img hello.mod reboot.mod
boot.mod help.mod regexp.mod
bsd.mod hexdump.mod reiserfs.mod
btrfs.mod hfs.mod relocator.mod
bufio.mod hfsplus.mod scsi.mod
cat.mod hwmatch.mod search.mod
cdboot.img iorw.mod search_fs_file.mod
chain.mod iso9660.mod search_fs_uuid.mod
cmostest.mod jfs.mod search_label.mod
cmp.mod jpeg.mod sendkey.mod
command.lst kernel.img serial.mod
configfile.mod keylayouts.mod setjmp.mod
core.img keystatus.mod setpci.mod
cpio.mod legacycfg.mod sfs.mod
cpuid.mod linux.mod sleep.mod
crypto.lst linux16.mod squash4.mod
crypto.mod lnxboot.img tar.mod
cs5536.mod loadenv.mod terminal.lst
date.mod locale terminal.mod
datehook.mod loopback.mod terminfo.mod
datetime.mod ls.mod test.mod
diskboot.img lsacpi.mod test_blockarg.mod
dm_nv.mod lsapm.mod testload.mod
drivemap.mod lsmmap.mod tga.mod
echo.mod lspci.mod trig.mod
efiemu.mod lvm.mod true.mod
efiemu32.o mdraid09.mod udf.mod
efiemu64.o mdraid1x.mod ufs1.mod
elf.mod memdisk.mod ufs2.mod
example_functional_test.mod memrw.mod uhci.mod
ext2.mod minicmd.mod usb.mod
extcmd.mod minix.mod usb_keyboard.mod
fat.mod minix2.mod usbms.mod
font.mod mmap.mod usbserial_common.mod
fs.lst moddep.lst usbserial_ftdi.mod
fshelp.mod msdospart.mod usbserial_pl2303.mod
functional_test.mod multiboot.mod usbtest.mod
g2hdr.img multiboot2.mod vbe.mod
gcry_arcfour.mod nilfs2.mod vga.mod
gcry_blowfish.mod normal.mod vga_text.mod
gcry_camellia.mod ntfs.mod video.lst
gcry_cast5.mod ntfscomp.mod video.mod
gcry_crc.mod ntldr.mod video_bochs.mod
gcry_des.mod ohci.mod video_cirrus.mod
gcry_md4.mod part_acorn.mod video_fb.mod
gcry_md5.mod part_amiga.mod videoinfo.mod
gcry_rfc2268.mod part_apple.mod videotest.mod
gcry_rijndael.mod part_bsd.mod xfs.mod
gcry_rmd160.mod part_gpt.mod xnu.mod
gcry_seed.mod part_msdos.mod xnu_uuid.mod
gcry_serpent.mod part_sun.mod xzio.mod
gcry_sha1.mod part_sunpc.mod zfs.mod
gcry_sha256.mod partmap.lst zfsinfo.mod
gcry_sha512.mod parttool.lst
</code></pre></div>
<p>Dans /etc/grub.d</p>
<div class="highlight"><pre><span></span><code>$ ls
00_header 05_debian_theme 10_linux 20_linux_xen 20_memtest86+ 30_os-prober 40_custom 41_custom README
</code></pre></div>
<p>Le contenu de grub.cfg (attention les yeux)</p>
<div class="highlight"><pre><span></span><code>#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
set default="0"
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function recordfail {
set recordfail=1
if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}
function load_video {
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
}
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
if loadfont /usr/share/grub/unicode.pf2 ; then
set gfxmode=auto
load_video
insmod gfxterm
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
set locale_dir=($root)/boot/grub/locale
set lang=fr_FR
insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ]; then
set timeout=-1
else
set timeout=10
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30; then
clear
fi
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
if [ ${recordfail} != 1 ]; then
if [ -e ${prefix}/gfxblacklist.txt ]; then
if hwmatch ${prefix}/gfxblacklist.txt 3; then
if [ ${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
export linux_gfx_mode
if [ "$linux_gfx_mode" != "text" ]; then load_video; fi
menuentry 'Ubuntu, avec Linux 3.0.0-12-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
set gfxpayload=$linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
linux /boot/vmlinuz-3.0.0-12-generic root=UUID=279b47e5-8d60-4520-aba9-aef38ec9e3b5 ro quiet splash vt.handoff=7
initrd /boot/initrd.img-3.0.0-12-generic
}
menuentry 'Ubuntu, avec Linux 3.0.0-12-generic (mode de dépannage)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
echo 'Chargement de Linux 3.0.0-12-generic ...'
linux /boot/vmlinuz-3.0.0-12-generic root=UUID=279b47e5-8d60-4520-aba9-aef38ec9e3b5 ro recovery nomodeset
echo 'Chargement du disque mémoire initial ...'
initrd /boot/initrd.img-3.0.0-12-generic
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
linux16 /boot/memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
linux16 /boot/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###
### BEGIN /etc/grub.d/30_os-prober ###
if [ "x${timeout}" != "x-1" ]; then
if keystatus; then
if keystatus --shift; then
set timeout=-1
else
set timeout=0
fi
else
if sleep --interruptible 3 ; then
set timeout=0
fi
fi
fi
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
</code></pre></div>
<p>Dès que l'on a modifié une entrée dans un fichier, il faut exécuter une
commande, grub-mkconfig, qui va regénérer la config de GRUB. On se croirait
<strong>PRESQUE</strong> revenu sur LILO, la légèreté en moins. (LILO au moins est clair).</p>
<p>L'avantage serait : "Cela permet de définir des options dans différents
fichiers, et le script de mise à jour génère automatiquement un fichier de
config propre. Pourquoi pas, mais que ça génère alors un truc léger et propre,
pas un truc quasiment illisible.</p>
<p>Il faudrait regarder sur des autres distributions (genre maegia, fedora, suse)
pour voir si c'est aussi "bordélique".</p>
<hr>
<p>Notes :</p>
<p>[1]: Type PC x86, à quelques exceptions près (rEFIt) pour les MacIntel. Cela
n'inclut pas les téléphones, les mainframe AS/400 ni Skynet.</p>
<p>[2]: Le truc qui affiche des lignes genre "AMI truc, Phoenix machin, 2048MB
Found, ou qui affiche le logo du constructeur du PC</p>
<p>[3]: Vu ce que l'utilisateur doit faire comme tâches d'administration, je
confirme en disant qu'il s'agit d'un Système d'Exploitation de l'Utilisateur.
</troll></p>
<p>[4]: Et oui, de nos jours, on peut choisir à quelle sauce on sera mangé, c'est
beau le progrès…</p>
<p>[5]: Au boot : GRUB, permettant de choisir entre le GRUB d'ubuntu, le GRUB
d'ArchLinux et le GRUB de Meego</p>
<p>[6]: Celui qui se demande l'intérêt de cette possibilité n'a jamais vu de boot
cassé suite à la mise à jour d'un noyau sous GNU/Linux.</p>[Coup de gueule] Obsolescence programmée.2012-04-14T00:00:00+02:002012-04-14T00:00:00+02:00alextag:blog.chibi-nah.fr,2012-04-14:/obsolescence-programmee<p>(ou La politique d'Apple vis à vis de<s>ses clients</s>s consommateurs).</p>
<p>Note : cette note n'est que ma propre opinion et n'est aucunement liée à mes
employeurs, actuels, passés ou futurs.</p>
<p>En janvier 2009, en remplacement de mon iBook G4 (disque dur ayant rendu l'âme
et ayant besoin d'une machine …</p><p>(ou La politique d'Apple vis à vis de<s>ses clients</s>s consommateurs).</p>
<p>Note : cette note n'est que ma propre opinion et n'est aucunement liée à mes
employeurs, actuels, passés ou futurs.</p>
<p>En janvier 2009, en remplacement de mon iBook G4 (disque dur ayant rendu l'âme
et ayant besoin d'une machine lpvp), j'ai eu la "brillante" idée de me prendre
un macbook unibody (renommé par la suite macbook pro).</p>
<p>Petit pc portable, léger, compact, pratique, toujours sous osx, compatible
GNU/Linux (appelé UGU/Linux dans mon linux_logo, uguu~), ayant une bonne
autonomie, etc, bref, un petit joujou pour "geek" (j'aime pas ce terme,
n'importe qui capable de s'acheter un iTruc ou d'utiliser FB s'auto-proclamme
"geek").</p>
<p>Re bref : habitué à osx et de certains outils (keynote, pages, garageband)
dont je n'ai pas trouvé d'équivalent sous Windows ou GNU/Linux, en plus du
côté "pas prise de tête d'osx", cela n'aidant pas pour changer de système.</p>
<p>Cependant, dans ce monde idyllique, se cache une bête sombre et sournoise :
l'obsolescence.</p>
<p>En effet, je n'ai pas suivi l'appel du loup, n'étant pas mouton, et je n'ai
pas <strong>acheté la "mise à jour"</strong> (enfin, "les"), qu'est appelée "snow leopard",
celui-ci étant présenté comme "ne comprenant aucune nouvelle fonctionnalité",
Cf. <a href="http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars">http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars</a>, donc ne
présentant aucun intérêt à court et moyen terme.</p>
<p>Nous sommes en 2012, le successeur de snow leopard est sorti, entraînant son
changement de paradigme, ses nouveautés et ses nouvelles API (non, API n'est
pas le copain d'Adibou), et a collé leopard dans le rang des OS Obsolètes
(ainsi qu'une charette de machines Apple). Cela semble invisible au premier
abord, la machine fonctionne très bien (si j'oublie le problème de LVDS,
faudra que je poste les photos, ça vaut le détour), les logiciels fonctionnent
toujours, <strong>MAIS</strong> :</p>
<ul>
<li>La moitié ne fonctionnent plus après qu'ils se soient mis à jour. Obligé de fouiller les backup (time machine, quand on y pense) ou le site d'origine pour retrouver une version "archivée" et interdire les mises à jour.</li>
<li>Plus de mise à jour de sécurité (java, plugin flash entre autres).</li>
<li>Certains logiciels utilisant les nouvelles API ne fonctionnent pas avec leopard (erreur 0x800000022) "ce programme a été ciblé pour leopard, mais pas les libs".</li>
<li>Le fait de devoir recompiler une partie des logiciels libres, en espérant que ça passera (ce qui n'est plus le cas de clementine, dommage).</li>
</ul>
<p>Point positif, macports fonctionne toujours.</p>
<p>Je vois d'ici la réponse : « achète la mise à jour vers snow-leopard, c'est
pas la mort (20 euros, c'est quoi ? le prix d'un livre ou de trois mangas) ».</p>
<p>Certes, mais ce n'est qu'une fuite en avant… Quand mountain lion (osx 10.8)
sortira, rebelotte, snow leopard sera à son tour obsolète.</p>
<p>Quelles sont les alternatives ?</p>
<ul>
<li>Me débarrasser définitivement des Mac. Difficile, mais les prochaines machines ne seront plus des machines avec une pomme.</li>
<li>Laisser tomber et faire avec ? Ça tombe bien, eclipse refuse de démarrer parce qu'il ne trouve pas le jdk 1.6, pour bosser, c'est super… et le "fixed in snow leopard", ça n'aide pas. (Votre voiture ne vous permet pas de passer la 4e vitesse depuis que l'on a changé la composition du gazole ? Pas grave, achetez le nouveau modèle.)</li>
<li>Remettre UGU/Linux en dual-boot ? chiant de rebooter à la longue, et il faudrait que je réorganise mes partitions.</li>
<li>Installer UGU/Linux et virtualiser osx ?</li>
</ul>
<p>je sais, écrit comme ça, cela donne l'impression de "tomber de la dernière
pluie", mais fallait que j'écrive ce coup de gueule. Après, quand on sort la
tête de l'informatique et que l'on regarde le gaspillage des ressources,
l'obsolescence programmée est présente tout autour de soi </mode écolo></p>
<p>Ce qui me dérange au final, c'est de considérer comme obsolète, un OS datant
d'il y a à peine 3 ans (osx 10.5.8 est sorti le 12 août 2009). Pendant ce
temps, le support de XP (datant de 2001) se terminera en 2016. Cela parait
complètement fou, 15 ans de support en comparaison.</p>
<p>Accessoirement, le problème n'est pas nouveau, après l'abandon du xserve, le
flou total sur les macpro, la vaste blague de fcpx, les "pros" se posent des
questions sur la sérénité des produits. Le hackintosh n'étant pas une
solution, une remise en question (me) sera nécessaire au niveau des outils…</p>
<p><strong>Édit le 15 mai 2012.</strong> Comme par hasard, à cause de flashback (rootkit)
présent sous osx, Apple a finalement sorti un correctif pour Leopard (flash et
java). Ce correctif ne fait que vérifier si le plugin flash est inférieur ou
égal à 10.1.102.64, le désactive et invite l'utilisateur à passer chez Adobe
pour le mettre à jour.</p>
<p>Et c'est là que l'on se rend compte que la plupart des "mac users" souhaitent
une prise en charge de l'OS à 5 ans et non "au petit bonheur la chance", soit
moins de 3 ans actuellement.</p>Code Konami sous Flex2012-03-20T00:00:00+01:002012-03-20T00:00:00+01:00alextag:blog.chibi-nah.fr,2012-03-20:/codekonami<p><strong>Article (encore) mis à jour avec un <em>vrai</em> exemple.</strong></p>
<p><strong>Article mis à jour avec une solution un rien plus propre.</strong></p>
<p>Petit bout de code permettant d'intercepter le "code konami" et d'exécuter une méthode dans une application Flex (code ActionScript 3).</p>
<p><strong>DISCLAIMER : ce bout de code n'est pas un tutoriel, et …</strong></p><p><strong>Article (encore) mis à jour avec un <em>vrai</em> exemple.</strong></p>
<p><strong>Article mis à jour avec une solution un rien plus propre.</strong></p>
<p>Petit bout de code permettant d'intercepter le "code konami" et d'exécuter une méthode dans une application Flex (code ActionScript 3).</p>
<p><strong>DISCLAIMER : ce bout de code n'est pas un tutoriel, et sera à adapter en fonction des besoins.</strong></p>
<p>Dans la classe désirée (celle qui contient l'application par exemple) :</p>
<div class="highlight"><pre><span></span><code>private var keys:Array = [];
private var seq:String = "38,38,40,40,37,39,37,39,66,65";
</code></pre></div>
<p>Dans l'appel lors du CreationComplete :</p>
<div class="highlight"><pre><span></span><code>this.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown, false, 0, true);
</code></pre></div>
<p>puis :</p>
<div class="highlight"><pre><span></span><code>private function onKeyDown(event:KeyboardEvent):void
{
keys.push(event.keyCode);
if(keys.join(',').indexOf(seq)>=0)
{
Alert.show("Code konami");
keys = [];
}
}
</code></pre></div>
<p>Origine du code (en javascript) : <a href="http://mattkirman.com/2009/05/11/how-to-recreate-the-konami-code-in-javascript/">http://mattkirman.com/2009/05/11/how-to-recreate-the-konami-code-in-javascript/</a></p>
<p><strong>Mise à jour :</strong></p>
<p>Utiliser un tableau, c'est bien, mais si l'utilisateur saisit une très longue phrase, ou son chat s'amuse avec le clavier,<s>le tableau va s'étendre à l'infini,</s>l'application risquera de planter (mémoire insuffisante), même si avec des machines avec beaucoup de mémoire vive, ça risque de prendre du temps avant de planter…</p>
<p>La séquence tient sur 0xA codes clavier. L'astuce est simple : on ne stocke que les 10 derniers codes claviers dans le tableau.</p>
<p>Concrètement, au niveau algo, ça serait quelque chose du genre « si la longueur du tableau est supérieure à 10 éléments, alors on enlève le premier élément du tableau, puis on ajoute le nouveau à la fin. »</p>
<p>Modification du code :</p>
<div class="highlight"><pre><span></span><code>private function onKeyDown(event:KeyboardEvent):void
{
if(keys.length > 9)
keys.shift();
keys.push(event.keyCode);
if(keys.join(',') == seq)
{
Alert.show("Code konami");
keys = [];
}
}
</code></pre></div>
<p>La méthode "shift" retourne (et retire) le premier élément du tableau.</p>
<p>Avec cette modification toute simple, le tableau ne dépassera pas 10 éléments.</p>
<p>Accessoirement, la comparaison avec la chaîne de caractères contenant le code des touches est simplifiée ; au lieu de chercher la présence de cette chaîne à l'intérieur du tableau, on la compare directement.</p>
<p>Exemple (Ne pas oublier de cliquer dedans pour donner le focus au plugin flash) :</p>
<p>Code source : <images/konami/srcview/></p>
<p>Archive zip : <images/konami/srcview/konamiCode.zip></p>
<p>Concernant le code source, j'ai fait le choix d'utiliser un de mes templates (pour faire de vraies RIA) et pas créer un mxml « hello world » comme on en trouve par milliers, et ce, pour une raison simple : un hello world montre que le code compile dans un cas simple. Quand on code des applications avec des centaines de classes, on n'est plus dans le même domaine, et les exemples montrent vite leurs limites (en fait, ça ne marche pas si on est en pur AS3).</p>Comment apprendre à compiler un noyau GNU/Linux2012-03-15T00:00:00+01:002012-03-15T00:00:00+01:00alextag:blog.chibi-nah.fr,2012-03-15:/comment-apprendre-a-compiler-un-noyau-gnu-linux<p>Tout simplement, en lisant "<a href="http://www.kroah.com/lkn/">Linux Kernel in a Nutshell</a>", de Greg Kroah-Hartman.</p>
<p>Le livre est un peu ancien (kernel 2.6.18), mais les remarques s'appliquent toujours. Il faudra adapter un peu dans certains cas.</p>
<p>Dans tous les cas, ne <strong>JAMAIS</strong> compiler le noyau avec l'utilisateur root, ni compiler le …</p><p>Tout simplement, en lisant "<a href="http://www.kroah.com/lkn/">Linux Kernel in a Nutshell</a>", de Greg Kroah-Hartman.</p>
<p>Le livre est un peu ancien (kernel 2.6.18), mais les remarques s'appliquent toujours. Il faudra adapter un peu dans certains cas.</p>
<p>Dans tous les cas, ne <strong>JAMAIS</strong> compiler le noyau avec l'utilisateur root, ni compiler le noyau dans /usr/src. <strong>TOUJOURS</strong> le compiler dans le ~ d'un utilisateur.</p>Problème bizarre2012-01-06T00:00:00+01:002012-01-06T00:00:00+01:00alextag:blog.chibi-nah.fr,2012-01-06:/probleme-bizarre<p><strong>Article mis à jour avec la solution.</strong></p>
<p>Je rencontre un problème bizarre. Un modem routeur ADSL qui plante quand je
tente de regarder une vidéo sur Youtube.</p>
<p><strong>ATTENTION : article écrit en mode "36-15 MaVie"</strong></p>
<p>Seb> Alex, tu pourrais passer à la maison ? J'ai des problèmes de connexion internet. Là, j'en …</p><p><strong>Article mis à jour avec la solution.</strong></p>
<p>Je rencontre un problème bizarre. Un modem routeur ADSL qui plante quand je
tente de regarder une vidéo sur Youtube.</p>
<p><strong>ATTENTION : article écrit en mode "36-15 MaVie"</strong></p>
<p>Seb> Alex, tu pourrais passer à la maison ? J'ai des problèmes de connexion internet. Là, j'en suis à 20 coupures en une heure, je dois débrancher et rebrancher le modem pour que la connexion remarche.</p>
<p>Alex> Je t'installe un outil de surveillance, laisse le tourner pendant une semaine et on pourra déterminer s'il s'agit du modem ou de la connexion Orange.</p>
<p>Seb> Ok.</p>
<p>[…]</p>
<p><em>Quelques jours plus tard.</em></p>
<p>Seb> Bizarre, depuis que c'est sous "surveillance", il n'y a pas eu une seule coupure.</p>
<p>Alex> En effet, sur les courbes, ça parait stable. Dans le doute, je configure mon Linksys, je te le prête et je récupère ton Belkin.</p>
<p>[…]</p>
<p><em>Installation du Linksys</em></p>
<p>Alex> Voilà, c'est branché, configuré et fonctionnel. Laisse le tourner et préviens moi si ça déconnecte.</p>
<p>[…]</p>
<p><em>Installation du Belkin chez moi</em></p>
<p>Alex> Bon, pas moyen de configurer le modem en ADSL2+, il saute en ADSL… tant pis, je le force en ADSL2, le débit sera moins élevé mais ça suffira pour tester.</p>
<p>Alex> Seb, aucun problème avec le modem chez moi. De ton côté, ça fonctionne toujours ?</p>
<p>Seb> Aucun problème, la connexion est parfaitement stable.</p>
<p>[…]</p>
<p><em>Le lendemain</em></p>
<p>Nina> Alex, tu devrais regarder cette vidéo sur youtube.</p>
<p><em>Clic sur le lien</em></p>
<p><em>Perte de la liaison réseau</em></p>
<p><em>ping 8.8.8.8</em></p>
<p>Timeout</p>
<p><em>ping 192.168.2.254</em></p>
<p>Timeout</p>
<p>Alex> Bizarre, ça. Bon, je débranche et je rebranche le modem, mais je pense avoir une idée…</p>
<p><em>Débranchement et rebranchement du modem.</em></p>
<p>Alex> Fermons toutes les applications, pidgin, adium, irc, puis testons avec une autre vidéo…</p>
<p><em>Nouveau crash du modem.</em></p>
<p><em>Débranchement et rebranchement du modem.</em></p>
<p>Alex> Bon, l'affichage d'une vidéo Youtube semble faire planter le modem…</p>
<p><em>Recherche google</em></p>
<p>Alex> Super, je ne suis pas le seul à rencontrer ce problème. Plus qu'à faire les manips de base, comme réinitialiser le modem (configuration usine), reflasher son firmware, appuyer sur reset, …</p>
<p>[…]</p>
<p><em>Quelques jours plus tard…</em></p>
<p>Alex> Bon, aucune manip ne fonctionne, ça plante toujours. Il reste la solution du démontage (de toute façon, ça fait longtemps qu'il n'est plus sous garantie). Mais avant, autant demander l'avis de son propriétaire.</p>
<p>Alex> Seb, je pense avoir trouvé le problème de plantage… Tu ne regardais pas des vidéos quand le modem plantait ?</p>
<p>Seb> Probablement, pourquoi ?</p>
<p>Alex> Je viens de faire des tests, et le simple fait de regarder une vidéo suffit à faire planter le modem. Pas moyen de corriger ce problème. Je peux toujours le démonter, mais sans grand-espoir.</p>
<p>Seb> Forcément… Le plus simple, c'est d'acheter un nouveau modem ? Le réparer ne servirait pas à grand-chose, vu son âge.</p>
<p>Alex> C'est le plus simple…</p>
<p>Alex> En attendant, garde mon modem, je le récupèrerai plus tard.</p>
<p><strong>Update :</strong> Je viens de passer du temps pour tenter de reproduire ce plantage inexpliqué, surtout que ce n'est pas à chaque fois que ça plante.</p>
<p>Une petite analyse des URL via firebug me donne ça :</p>
<div class="highlight"><pre><span></span><code>http://ams03s07.ams03s08.ams03s11.ams03s12.ams04s07.ams04s08.ams04s09.ams04s10.ams03s09.ams03s10.ams03s13.ams03s14.ams03s15.ams03s16.ams04s11.ams04s12.o-o.v23.lscache3.c.youtube.com
</code></pre></div>
<p><a href="/images/belkin/youtube.png"><img alt="Capture d'écran de youtube" src="/images/belkin/youtube-t.png"></a></p>
<p>La taille de l'URL est absolument énorme, et dès que Firefox tente d'ouvrir cette url, ça plante. Ni une ni deux, je lance wireshark après avoir débranché et rebranché le modem, et je surveille les trames.</p>
<p><a href="/images/belkin/wireshark.png"><img alt="Capture d'écran de wireshark" src="/images/belkin/wireshark-t.png"></a></p>
<p>Tiens tiens, aucune réponse du dns, et des paquets perdus juste après (tcp retransmission). J'arrête wireshark, je débranche et rebranche le modem, et lance une console.</p>
<div class="highlight"><pre><span></span><code>alex@Yue ~
$ ping 8.8.8.8
Envoi d'une requête 'Ping' 8.8.8.8 avec 32 octets de données :
Réponse de 8.8.8.8 : octets=32 temps=32 ms TTL=56
Réponse de 8.8.8.8 : octets=32 temps=32 ms TTL=56
^C
alex@Yue ~
$ nslookup ams03s07.ams03s08.ams03s11.ams03s12.ams04s07.ams04s08.ams04s09.ams04s10.ams03s09.ams03s10.ams03s13.ams03s14.ams03s15.ams03s16.ams04s11.ams04s12.o-o.v3.lscache7.c.youtube.com
;; connection timed out; no servers could be reached
alex@Yue ~
$ ping 8.8.8.8
Envoi d'une requête 'Ping' 8.8.8.8 avec 32 octets de données :
^C
alex@Yue ~
$
</code></pre></div>
<p>Je pense avoir trouvé le problème. Le modem Belkin intègre un serveur dns, et il semble planter sur un lookup avec une URL très longue.</p>
<p>Pour le confirmer, effectuons un test simple : utilisons les DNS de google (dont tout le monde devrait connaître l'IP, ceux qui ne la connaissent pas le font vraiment exprès, parce que 8.8.8.8, c'est pas difficile à retenir) à la place du DNS du modem.</p>
<p>Sous Windows : Connexion réseau, paramétrage de la carte, IPv4, DNS : 8.8.8.8</p>
<p>Nouveau redémarrage du modem (j'aurais du fermer ma session irc, ça n'a pas arrêté de faire des timeout), nouvelle tentative sur youtube, et là…</p>
<h1>W00T !!!!!!!</h1>
<p><a href="/images/belkin/youtube2.png"><img alt="Capture d'écran de youtube" src="/images/belkin/youtube2-t.png"></a></p>
<p>Plus de plantage, la vidéo passe sans problème, l'url à rallonge est toujours là, mais ÇA MARCHE !!!!!</p>
<p>Maintenant, il reste à trouver une solution de contournement avant de restituer le modem à son propriétaire.</p>
<p>Lui demander d'utiliser un dns sur son pc, pourquoi pas, mais il faudra qu'il pense à refaire la manipulation si quelqu'un vient chez lui… et lui demander d'installer un serveur dns (genre, bind ?) serait exagéré.</p>
<p>Belkin ne fournissant pas les sources du firmware pour ce modem (Belkin G Wireless Modem Router, Model F5D7634-4, ver 1000ed), je ne peux malheureusement pas en recompiler un, en tentant de corriger (ou de mettre à jour) le service dns.</p>
<p>En conclusion, le problème n'était pas forcément évident à trouver. Qui aurait pu penser qu'il s'agirait d'un problème de DNS et non d'un problème matériel comme je le supposais.</p>Bonne année 20122012-01-01T00:00:00+01:002012-01-01T00:00:00+01:00alextag:blog.chibi-nah.fr,2012-01-01:/bonne-annee-2012<p>Tous mes meilleurs vœux pour la nouvelle année. Plein de projets, plein de geekeries, plein de bonheur.</p>Le TRUC qui me saoule le plus2012-01-01T00:00:00+01:002012-01-01T00:00:00+01:00alextag:blog.chibi-nah.fr,2012-01-01:/le-trucqui-me-saoule-le-plus<p>C'est écrire un long article en mode en ligne. Au moment de le valider, je me
prends un "session timeout". Je retape mon mot de passe, et PAF ! Tout ce que
j'ai écrit a disparu.</p>
<p>Voilà comment j'ai perdu la moitié de mon article précédent.</p>Adobe Flex Builder 3 et Windows 72011-11-20T00:00:00+01:002011-11-20T00:00:00+01:00alextag:blog.chibi-nah.fr,2011-11-20:/adobe-flex-builder-3-et-windows-7<p><strong>Solution :</strong> <em>Désactiver le service "Panneau de saisie Tablet PC" résoudra les problèmes d'affichage.</em></p>
<p>À des fins de tests, il m'a fallu installer Flex Builder 3 sur mon pc portable fonctionnant sous Windows 7, 64 bits.
Bizarrement, aucun problème sur les machines du bureau, et de gros problèmes sur la mienne …</p><p><strong>Solution :</strong> <em>Désactiver le service "Panneau de saisie Tablet PC" résoudra les problèmes d'affichage.</em></p>
<p>À des fins de tests, il m'a fallu installer Flex Builder 3 sur mon pc portable fonctionnant sous Windows 7, 64 bits.
Bizarrement, aucun problème sur les machines du bureau, et de gros problèmes sur la mienne.</p>
<p>Problèmes constatés : des boutons qui disparaissent, impossible d'ajouter un SDK, plus de débogueur, l'interface d'import d'un projet reste vide, etc…</p>
<p>Une petite recherche google indique que le problème est connu, mais personne ne semble avoir de solution, mis à part passer à Flash Builder 4.</p>
<p>Pour certaines personnes, le fait de tuer l'application Logitech semble résoudre le problème, mais là, même sur un Windows 7 fraichement installé, je n'ai pas branché ma souris et encore moins installé le pilote.</p>
<p>Après avoir comparé les différentes machines, j'ai testé différentes solutions.</p>
<p>Machine fonctionnelle : AMD Phenom II X4 64 bits, ATI/AMD Radeon HD, Windows 7 64 bits
Machine non fonctionnelle : mon tablet PC.</p>
<p>Tuer le process qui gère le touchpad : aucun effet
Changer de carte graphique (Intel, Radeon) : aucun effet
Basculer en mode "classique" : aucun effet
Désactiver la composition et tous les effets graphiques : aucun effet
Désactiver le service "Panneau de saisie Tablet PC" : w00t</p>
<p>En désactivant ce service, Flex 3 semble fonctionner.</p>
<p>Test avancé : J'ai tout réactivé.
J'ai démarré Flex Builder.
Je suis allé sur Window -> Preferences -> Flex -> Installed Flex SDKs
La liste est vide, il n'y a pas de bouton pour ajouter un SDK.
Si je redimensionne la fenêtre, la liste des sdk apparaît parfois. Toujours
pas de bouton "Add…"
Je ferme la fenêtre, je vais dans la liste des services Windows, je désactive
le service Tablet PC.
Je bascule sous Flex Builder (que je n'avais pas fermé), je retourne dans la
liste des SDK, et là, w00t, aucun bug d'affichage.</p>
<p>Le problème semble lié à ce service. Comme il n'est pas actif sur les autres PC, il n'y avait pas ce problème.</p>
<p>Conclusion :
Avant de démarrer Flex Builder 3 sous Windows 7, il faut désactiver le mode tablet pc, puis le réactiver quand on a terminé.</p>
<p>Truc à faire :</p>
<ul>
<li>écrire un script qui désactivera le service tablet pc avant de lancer eclipse.</li>
<li>Tenter d'utiliser la version 6 du jdk.</li>
<li>Mettre à jour les pilotes Wacom.</li>
</ul>
<p><strong>Édit :</strong> Passer à la version 6 du jdk (en le collant à la main dans le répertoire d'eclipse) ne change rien, tout comme la mise à jour des pilotes wacom.</p>Récupérer des fichiers "perdus" qui ne sont pas perdus.2011-10-15T00:00:00+02:002011-10-15T00:00:00+02:00alextag:blog.chibi-nah.fr,2011-10-15:/recuperer-des-fichiers-perdus-qui-ne-sont-pas-perdus<p>En jouant avec ma carte micro SD (un coup dans le téléphone, un coup dans le lecteur mp3), j'ai fini par la retirer de l'un de ces deux appareils sans la "démonter" (umount, "Éjecter"…). Manque de chance, 1> la carte est formatée en FAT32, 2> les données ont été corrompues …</p><p>En jouant avec ma carte micro SD (un coup dans le téléphone, un coup dans le lecteur mp3), j'ai fini par la retirer de l'un de ces deux appareils sans la "démonter" (umount, "Éjecter"…). Manque de chance, 1> la carte est formatée en FAT32, 2> les données ont été corrompues. Résultat: 6,86 Go de données de perdues.</p>
<p>Un petit tour sous Windows XP (seule machine sous la main à ce moment là), et une vérification de disque avec recherche de secteurs défectueux, corriger les erreurs (ou des noms d'options comme ça), et je me retrouve avec un joli dossier FOUND.001 contenant à priori mes fichiers disparus.</p>
<p>Seul problème: les noms des fichiers sont perdus, et à la place, je me retrouve avec plein plein de fichiers "FILE0001.CHK", "FILE0002.CHK", dont la taille varie entre 4 ko et 85 Mo.</p>
<p>Pour retrouver quel fichier correspond à quoi, j'ai d'abord utilisé la commande "file", disponible sous n'importe quel OS un rien évolué (donc, pas sous Windows).</p>
<p>Ci-dessous, un petit exemple de résultat de la commande "file". Les noms des fichiers sont discontinus, car j'ai déjà récupéré une partie des fichiers, Cf. plus bas.</p>
<div class="highlight"><pre><span></span><code>FILE0844.CHK: GIF image data, version 89a, 77 x 15
FILE0845.CHK: GIF image data, version 89a, 219 x 63
FILE0846.CHK: data
FILE0847.CHK: GIF image data, version 89a, 88 x 31
FILE0848.CHK: data
FILE0849.CHK: HTML document text
FILE0851.CHK: data
FILE0852.CHK: GIF image data, version 89a, 88 x 31
FILE0853.CHK: GIF image data, version 89a, 77 x 15
FILE0854.CHK: GIF image data, version 89a, 219 x 63
FILE0855.CHK: data
FILE0856.CHK: GIF image data, version 89a, 88 x 31
FILE0857.CHK: data
FILE0870.CHK: data
FILE0871.CHK: JVT NAL sequence
FILE0930.CHK: data
FILE0931.CHK: data
FILE0932.CHK: data
FILE0936.CHK: data
FILE0943.CHK: XML 1.0 document text
FILE0955.CHK: HTML document text
FILE0956.CHK: data
FILE0957.CHK: GIF image data, version 89a, 88 x 31
FILE0958.CHK: GIF image data, version 89a, 77 x 15
FILE0959.CHK: GIF image data, version 89a, 219 x 63
FILE0960.CHK: data
FILE0961.CHK: GIF image data, version 89a, 88 x 31
FILE0965.CHK: HTML document text
FILE0968.CHK: data
FILE0969.CHK: GIF image data, version 89a, 88 x 31
FILE0970.CHK: GIF image data, version 89a, 77 x 15
FILE0971.CHK: GIF image data, version 89a, 219 x 63
FILE0972.CHK: data
FILE0973.CHK: GIF image data, version 89a, 88 x 31
FILE0983.CHK: PNG image data, 500 x 453, 8-bit/color RGB, non-interlaced
FILE0984.CHK: data
FILE0985.CHK: data
FILE0986.CHK: data
FILE1001.CHK: data
FILE1002.CHK: JVT NAL sequence
FILE1041.CHK: data
FILE1042.CHK: JVT NAL sequence
FILE1045.CHK: data
FILE1050.CHK: data
FILE1051.CHK: data
FILE1053.CHK: data
FILE1068.CHK: data
FILE1070.CHK: data
FILE1076.CHK: data
FILE1077.CHK: JVT NAL sequence
FILE1084.CHK: data
FILE1092.CHK: data
FILE1093.CHK: data
FILE1095.CHK: data
FILE1132.CHK: data
FILE1136.CHK: data
FILE1137.CHK: JVT NAL sequence
FILE1154.CHK: data
FILE1155.CHK: data
FILE1156.CHK: JVT NAL sequence
FILE1169.CHK: data
FILE1170.CHK: JVT NAL sequence
FILE1177.CHK: data
FILE1178.CHK: JVT NAL sequence
FILE1179.CHK: XWD X Window Dump image data, 2686976x6647399x1296891904
FILE1180.CHK: XWD X Window Dump image data, "F", 327680x7156068x1160839168
FILE1181.CHK: XWD X Window Dump image data, 327680x7156068x1160839168
FILE1182.CHK: XWD X Window Dump image data, "CON", 1507328x6647399x1296891904
FILE1183.CHK: XWD X Window Dump image data, 327680x7156068x1160839168
FILE1184.CHK: XWD X Window Dump image data, 2686976x6647399x1296891904
FILE1186.CHK: data
FILE1187.CHK: JVT NAL sequence
FILE1210.CHK: data
FILE1211.CHK: data
FILE1212.CHK: JVT NAL sequence
FILE1220.CHK: data
FILE1232.CHK: data
FILE1251.CHK: data
FILE1262.CHK: data
FILE1263.CHK: JVT NAL sequence
FILE1276.CHK: GIF image data, version 89a, 400 x 336
FILE1277.CHK: data
FILE1278.CHK: JVT NAL sequence
FILE1281.CHK: data
FILE1282.CHK: JVT NAL sequence
FILE1289.CHK: data
FILE1290.CHK: JVT NAL sequence
FILE1292.CHK: data
FILE1293.CHK: JVT NAL sequence
FILE1294.CHK: data
FILE1295.CHK: JVT NAL sequence
FILE1296.CHK: AppleDouble encoded Macintosh file
FILE1297.CHK: AppleDouble encoded Macintosh file
FILE1298.CHK: AppleDouble encoded Macintosh file
FILE1299.CHK: AppleDouble encoded Macintosh file
FILE1300.CHK: AppleDouble encoded Macintosh file
FILE1301.CHK: AppleDouble encoded Macintosh file
FILE1302.CHK: AppleDouble encoded Macintosh file
FILE1303.CHK: AppleDouble encoded Macintosh file
FILE1304.CHK: AppleDouble encoded Macintosh file
FILE1305.CHK: AppleDouble encoded Macintosh file
FILE1306.CHK: AppleDouble encoded Macintosh file
FILE1307.CHK: AppleDouble encoded Macintosh file
FILE1308.CHK: AppleDouble encoded Macintosh file
FILE1309.CHK: AppleDouble encoded Macintosh file
FILE1310.CHK: AppleDouble encoded Macintosh file
FILE1311.CHK: AppleDouble encoded Macintosh file
FILE1312.CHK: AppleDouble encoded Macintosh file
FILE1313.CHK: AppleDouble encoded Macintosh file
FILE1314.CHK: AppleDouble encoded Macintosh file
FILE1350.CHK: data
FILE1351.CHK: JVT NAL sequence
FILE1352.CHK: data
FILE1353.CHK: JVT NAL sequence
FILE1388.CHK: data
FILE1389.CHK: JVT NAL sequence
FILE1394.CHK: PNG image data, 600 x 600, 8-bit/color RGB, non-interlaced
FILE1398.CHK: data
FILE1422.CHK: data
FILE1423.CHK: JVT NAL sequence
</code></pre></div>
<p>Première nouvelle, les fichiers sont "lisibles", ou tout du moins, reconnus.</p>
<p>Dans un premier temps, il serait bon de trier les fichiers. j'ai d'abord créé des répertoires, un par type de fichiers, notamment mp3, mp4, ogg, flac, jpg, png, etc…</p>
<p>Ensuite, avec quelques petites boucles for (sans les 3 ours cette fois (private joke)), j'ai copié les fichiers de type "mp3" dans le répertoire mp3, de type mp4 vers le dossier mp4, etc…</p>
<p>Par exemple, pour les fichiers .gif :</p>
<div class="highlight"><pre><span></span><code>for file in $(file * | grep "GIF" | cut -d':' -f1); do mv $file gif/; done
cd gif
for file in *.CHK; do mv "$file" "${file%.CHK}.gif"; done
</code></pre></div>
<p>À noter que j'ai d'abord copié les fichiers, puis renommé ces fichiers. J'aurais pu faire ces deux opérations en une fois, mais sur le coup, je n'y avais pas pensé (facepalm en écrivant cet article)</p>
<p>Maintenant, je me retrouve avec des fichiers "FILE0042.flac", "FILE0457.ogg", etc… Ces fichiers sont lisibles, mais il faudrait les renommer correctement. Par exemple, "Bitches - Mindless Self Indulgence - Frankenstein Girls Will Seem Strangely Sexy.flac" est plus parlant que "FILE0035.flac</p>
<p>La suite, pour renommer automatiquement les fichiers à partir de leurs "tags" est en cours de rédaction.</p>Nouvelle connexion Internet2011-08-31T00:00:00+02:002011-08-31T00:00:00+02:00alextag:blog.chibi-nah.fr,2011-08-31:/nouvelle-connexion<p>Merci 3G / Wifi pour tes services rendus, bonjour ADSL2+.</p>
<p><img alt="Download : 14,18Mbps, Upload : 0,96Mbps" src="/images/adsl/1459380390.png"></p>
<div class="highlight"><pre><span></span><code>--- System Information ---
Vendor: Linksys
ModelName: WAG160Nv2
Firmware Version: A2.00.20 , 2010-06-30T21:05:56
GUI Version: A2.00.20_007
Boot Version: 1.0.37-5.4
Hardware Version: 0.01
--- DSL Information ---
DSL Driver Version: AnnexA version - A2pB023k.d21d
DSL VPI/VCI …</code></pre></div><p>Merci 3G / Wifi pour tes services rendus, bonjour ADSL2+.</p>
<p><img alt="Download : 14,18Mbps, Upload : 0,96Mbps" src="/images/adsl/1459380390.png"></p>
<div class="highlight"><pre><span></span><code>--- System Information ---
Vendor: Linksys
ModelName: WAG160Nv2
Firmware Version: A2.00.20 , 2010-06-30T21:05:56
GUI Version: A2.00.20_007
Boot Version: 1.0.37-5.4
Hardware Version: 0.01
--- DSL Information ---
DSL Driver Version: AnnexA version - A2pB023k.d21d
DSL VPI/VCI: 8/35
DSL Status: Showtime
DSL Mode: ADSL2+
DSL Channel:
DSL Upstream Rate: 1121 Kbps
DSL Downstream Rate: 16671 Kbps
Down up
DSL Noise Margin: 9.4 dB 10.6 dB
DSL Attenuation: 23.0 dB 10.4 dB
DSL Transmit Power: 18.8 dBm 12.6 dBm
--- Wireless Information ---
Wireless Driver Version: 1.3.1.174
Wireless Tools Version: 28
Wireless Status: Enabled
Wireless Wide Channel: 3
Wireless Standard Channel: 1- 2.412GHZ
Wireless SSID: ********
--- Dynamic Information ---
LAN Mac Address: 98:FC:11:XX:YY:ZX
WAN Mac Address: 98:FC:11:XX:YY:ZZ
Wireless Mac Address: 98:FC:11:XX:YY:ZY
---
</code></pre></div>
<p>Je n'ai pas (encore) flashé le modem routeur sous Open-WRT, il y a quelques risques de brick, Cf. <a href="http://wiki.openwrt.org/toh/linksys/wag160nv2">http://wiki.openwrt.org/toh/linksys/wag160nv2</a></p>
<div class="highlight"><pre><span></span><code>no pid2
WARNING!! - FIRMWARE HAD BEEN DESTORYED!!
YOU NEED RE-DOWNLOAD FIRMWARE!!
</code></pre></div>
<p>À priori, on peut réinstaller le firmware sans passer par le jtag, en forçant le mode "download". Je testerai ça quand j'aurai et du temps et un autre modem sous la main.</p>Mozilla Firefox2011-08-19T00:00:00+02:002011-08-19T00:00:00+02:00alextag:blog.chibi-nah.fr,2011-08-19:/mozilla-firefox<p>Quelques trucs sur Mozilla Firefox (ceci constitue plus un "aide mémoire" qu'autre chose).
Notes en vrac, pas de mise en page, pas à jour, et pas complet non plus</p>
<p>Note : si les clés n'existent pas, les créer au besoin. Le type est précisé en dessous.</p>
<p>Afficher le protocole "http://" dans …</p><p>Quelques trucs sur Mozilla Firefox (ceci constitue plus un "aide mémoire" qu'autre chose).
Notes en vrac, pas de mise en page, pas à jour, et pas complet non plus</p>
<p>Note : si les clés n'existent pas, les créer au besoin. Le type est précisé en dessous.</p>
<p>Afficher le protocole "http://" dans la barre d'adresse (Firefox 7)</p>
<p>about:config</p>
<p>Changer la valeur de la clé "browser.urlbar.trimURLs" en "false". (Boolean).</p>
<p>Désactiver la vérification de la compatibilité de version des extensions (ou j'en ai marre de rester bloqué pendant deux semaines au bureau sans pouvoir utiliser les extensions pour déboguer mon code à chaque changement de version de Firefox, soit toutes les 4 à 8 semaines).</p>
<p>about:config</p>
<p>Changer la valeur de la clé "extensions.checkCompatibility" en "false" (Boolean).</p>Astuces diverses concernant la tablette wacom2011-08-15T00:00:00+02:002011-08-15T00:00:00+02:00alextag:blog.chibi-nah.fr,2011-08-15:/astuces-diverses-concernant-la-tablette-wacom<p><strong>Updated</strong> En cherchant une solution (qui marche) pour l'astuce 7 de l'article précédent, j'ai joué un peu avec xinput et les propriétés de la tablette.</p>
<p>Tout d'abord, listons les périphériques disponibles :</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave …</code></pre></div><p><strong>Updated</strong> En cherchant une solution (qui marche) pour l'astuce 7 de l'article précédent, j'ai joué un peu avec xinput et les propriétés de la tablette.</p>
<p>Tout d'abord, listons les périphériques disponibles :</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Wacom ISDv4 E3 Finger touch id=11 [slave pointer (2)]
⎜ ↳ Wacom ISDv4 E3 Pen stylus id=12 [slave pointer (2)]
⎜ ↳ Microsoft X-Box 360 pad id=15 [slave pointer (2)]
⎜ ↳ Logitech USB Laser Mouse id=16 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=18 [slave pointer (2)]
⎜ ↳ Wacom ISDv4 E3 Pen eraser id=20 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Video Bus id=8 [slave keyboard (3)]
↳ Power Button id=9 [slave keyboard (3)]
↳ Sleep Button id=10 [slave keyboard (3)]
↳ HP Webcam id=13 [slave keyboard (3)]
↳ Microsoft X-Box 360 pad (keys) id=14 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=17 [slave keyboard (3)]
↳ HP WMI hotkeys id=19 [slave keyboard (3)]
</code></pre></div>
<p>Concentrons nous sur le stylet.</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> xinput list-props "Wacom ISDv4 E3 Pen stylus"
Device 'Wacom ISDv4 E3 Pen stylus':
Device Enabled (152): 1
Coordinate Transformation Matrix (154): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Accel Profile (274): 0
Device Accel Constant Deceleration (275): 1.000000
Device Accel Adaptive Deceleration (276): 1.000000
Device Accel Velocity Scaling (277): 10.000000
Wacom Tablet Area (283): 0, 0, 26112, 16320
Wacom Rotation (284): 0
Wacom Pressurecurve (298): 0, 0, 100, 100
Wacom Serial IDs (285): 227, 0, 2, 0
Wacom Serial ID binding (286): 0
Wacom Capacity (287): -1
Wacom Pressure Threshold (288): 27
Wacom Sample and Suppress (289): 2, 4
Wacom Enable Touch (290): 1
Wacom Hover Click (299): 0
Wacom Enable Touch Gesture (291): 0
Wacom Touch Gesture Parameters (292): 50, 20, 250
Wacom Tool Type (293): "STYLUS" (296)
Wacom Button Actions (294): "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0)
Wacom Debug Levels (295): 0, 0
</code></pre></div>
<p>Je souhaite retrouver le même comportement que sous Windows : un appui sur le
bouton du stylet simule un clic droit de la souris, sans toucher l'écran. Par
défaut, il faut appuyer sur le bouton puis tapoter sur l'écran avec le stylet.</p>
<p>Utilisons alors la propriété Wacom Hover Clic</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> xinput set-prop "Wacom ISDv4 E3 Pen stylus" "Wacom Hover Click" 1
alex@yue ~>
</code></pre></div>
<p>Désormais, le comportement du stylet correspond à ce que je souhaite.</p>
<p>Parfois, il peut être utile de désactiver le mode tactile de l'écran.</p>
<p>Effectuons la même chose que pour le stylet :</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> xinput list-props "Wacom ISDv4 E3 Finger touch"
Device 'Wacom ISDv4 E3 Finger touch':
Device Enabled (152): 1
Coordinate Transformation Matrix (154): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Accel Profile (274): 0
Device Accel Constant Deceleration (275): 1.000000
Device Accel Adaptive Deceleration (276): 1.000000
Device Accel Velocity Scaling (277): 10.000000
Wacom Tablet Area (283): 0, 0, 2611, 1632
Wacom Rotation (284): 0
Wacom Serial IDs (285): 227, 1, 3, 0
Wacom Serial ID binding (286): 0
Wacom Capacity (287): -1
Wacom Pressure Threshold (288): 27
Wacom Sample and Suppress (289): 2, 4
Wacom Enable Touch (290): 1
Wacom Enable Touch Gesture (291): 1
Wacom Touch Gesture Parameters (292): 50, 20, 250
Wacom Tool Type (293): "TOUCH" (273)
Wacom Button Actions (294): "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0), "None" (0)
Wacom Debug Levels (295): 0, 0
</code></pre></div>
<p>La propriété est bien entendu "Wacom Enable Touch".</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> xinput set-prop "Wacom ISDv4 E3 Finger touch" "Wacom Enable Touch" 0
alex@yue ~>
</code></pre></div>
<p>Pour réactiver l'écran tactile, il suffit de remettre la propriété à "1".</p>
<p>À noter que le stylet,a la gomme et le tactile sont totalement indépendants les uns des autres.</p>
<p>Pour que les changements soient permanents, il suffit d'écrire un petit script qui sera exécuté lors de l'ouverture de la session.</p>
<p>Pour revenir sur l'objectif de départ : faire en sorte que le stylet ne soit utilisable que sur un seul écran, au lieu de s'étendre sur les deux.</p>
<p><s>J'ai testé les deux méthodes :</s></p>
<p><s>xinput set-prop "Wacom ISDv4 E3 Pen stylus" --type=float "Coordinate Transformation Matrix" 0.4 0 0.6 0 0.666667 0 0 0 1</s></p>
<div class="highlight"><pre><span></span><code>xsetwacom set "Wacom ISDv4 E3 Pen stylus" MapToOutput "LVDS1"
</code></pre></div>
<p><s>Aucune différence pour les deux, le curseur est toujours instable, et saute d'un écran à l'autre, que ça soit avec la carte intel ou la carte ati.
Je laisse tomber pour le moment.</s></p>
<p><strong>Bonne nouvelle</strong> : J'ai refait des tests (le 5 janvier 2012), et cela fonctionne, en tout cas, avec la carte AMD. En "mappant" le stylet sur l'écran LVDS, le stylet reste bien sur l'écran du laptop, il n'y a plus le phénomène de "jitter" ou de saut d'un écran à l'autre qui se produit. J'ai pu dessiner sous Gimp sur mon écran tout en "regardant" une vidéo sur l'autre écran.</p>
<p>Regardant entre guillements, parce que c'est difficile de regarder les deux écrans en même temps, tout en étant concentré sur un seul :D.</p>Jazz Jack Rabbit 2 et Touhou 08 - Imperishable Night sous GNU/Linux.2011-08-15T00:00:00+02:002011-08-15T00:00:00+02:00alextag:blog.chibi-nah.fr,2011-08-15:/touhou-08-imperishable-night-sous-gnu-linux<p>J'ai fini par craquer, et j'ai réactivé le support du 32 bits (options dans le noyau linux + dépot multilib sous arch64), pour jouer à Jazz Jack Rabbit 2 (il ne fonctionne pas pour des raisons que j'ignore sous Windows 7 64bits, malgré les différentes options de compatibilité). J'en ai profité …</p><p>J'ai fini par craquer, et j'ai réactivé le support du 32 bits (options dans le noyau linux + dépot multilib sous arch64), pour jouer à Jazz Jack Rabbit 2 (il ne fonctionne pas pour des raisons que j'ignore sous Windows 7 64bits, malgré les différentes options de compatibilité). J'en ai profité pour installer la démo de th08.</p>
<p>Note : les deux jeux sont disponibles via AUR. Par contre, cela installe un nouveau préfixe wine pour chaque jeu, et l'installation n'est pas uniformisée : Jazz2 est installé dans /opt sur une image disque, th08 est installé dans /usr/share…</p>
<p>De plus, th08 passe par timidity++ pour jouer les musiques (au format midi). J'ai une préférence pour fluidsynth (il me semble moins gourmand en ressources), donc j'ai tellement modifié les scripts que j'ai fini par retirer le paquet th08 (et jazz2) pour faire les installations à la main, dans un préfixe .wine situé sur mon ~.</p>
<div class="highlight"><pre><span></span><code>alex@yue ~/.w/drive_c> tree -d
.
|-- games
| |-- Jazz2
| | |-- Cache
| | |-- HTML
| | |-- JCSHelp
| | `-- Tiles
| |-- th08
| | |-- backup
| | |-- replay
| | `-- th08man
| | `-- html
…
</code></pre></div>
<p>Je passerai les détails sur l'installation, pour me concentrer sur la configuration de th08, Jazz2 ne posant pas de problèmes particuliers.</p>
<p>Installer fluidsynth, si ce n'est déjà fait, puis installer une soundfont (sf2), soit depuis les dépots(fluidr3 par exemple), soit depuis Internet. J'ai une légère préférence pour MegaDrive.sf2</p>
<p>J'ai ensuite codé ce petit script :</p>
<p>alex@yue ~> cat /usr/local/bin/th08</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="c1">#Launcher for touhou 08</span>
<span class="c1">#Path to sf2 file</span>
<span class="nv">SOUNDFONT</span><span class="o">=</span>/usr/share/soundfonts/fluidr3/FluidR3GM.SF2
fluidsynth<span class="w"> </span>-i<span class="w"> </span>-a<span class="w"> </span>alsa<span class="w"> </span>-m<span class="w"> </span>alsa_seq<span class="w"> </span>-s<span class="w"> </span><span class="nv">$SOUNDFONT</span><span class="w"> </span><span class="p">&</span>
<span class="nv">FSPID</span><span class="o">=</span><span class="nv">$!</span>
<span class="nb">cd</span><span class="w"> </span>~/.wine/drive_c/games/th08
<span class="nv">LANG</span><span class="o">=</span>ja_JP.UTF8<span class="w"> </span>wine<span class="w"> </span>th08.exe
<span class="nb">kill</span><span class="w"> </span>-SIGTERM<span class="w"> </span><span class="nv">$FSPID</span>
</code></pre></div>
<p>Rien de compliqué dans tout ça. J'utilise la variable SOUNDFONT pour indiquer où elle se situe (ici, celle de fluidr).</p>
<p>FSPID récupère le PID de fluidsynth, pour pouvoir l'arrêter quand on arrête de jouer.</p>
<p>Les jeux étant installés dans mon ~, il faut s'y déplacer. À noter que j'aurais pu les mettre dans /opt ou /usr/local, mais cela imposerait d'autoriser l'écriture dans certains de ces répertoires, ce qui est HORS DE QUESTION.</p>
<p>Le jeu étant en japonais, il est toujours utile de le lancer avec la locale ja_JP.UTF8 (ne serait-ce que pour afficher le titre dans la fenêtre, par exemple).</p>
<p>À noter également quelques bugs graphiques : le texte ne s'affiche pas durant les dialogues, et la liste des titres dans la "music room" ne s'affiche pas non plus. <a href="http://bugs.winehq.org/show_bug.cgi?id=24610">http://bugs.winehq.org/show_bug.cgi?id=24610</a>.</p>
<p>À priori, cela viendrait du pilote ati libre.</p>
<div class="highlight"><pre><span></span><code>fixme:d3d:check_fbo_compat Format WINED3DFMT_R16_FLOAT with rendertarget flag is not supported as FBO color attachment, and no fallback specified.
</code></pre></div>
<p><a href="/images/th08/jazz2-1.png"><img alt="" src="images/th08/jazz2-1.png"></a>
<a href="/images/th08/jazz2-2.png"><img alt="" src="images/th08/jazz2-2.png"></a>
<a href="/images/th08/jazz2-3.png"><img alt="" src="images/th08/jazz2-3.png"></a>
<a href="/images/th08/th08-1.png"><img alt="" src="images/th08/th08-1.png"></a>
<a href="/images/th08/th08-2.png"><img alt="" src="images/th08/th08-2.png"></a>
<a href="/images/th08/th08-3.png"><img alt="" src="images/th08/th08-3.png"></a></p>À la recherche du clavier tactile idéal.2011-05-18T00:00:00+02:002011-05-18T00:00:00+02:00alextag:blog.chibi-nah.fr,2011-05-18:/a-la-recherche-du-clavier-tactile-ideal<p>Tout est dans le titre :</p>
<p>Pour résumer, je cherche un clavier tactile (une application) utilisable sous GNU/Linux.</p>
<p>J'avoue avoir été bluffé par le clavier tactile sous Windows 7, bien conçu pour être utilisable au stylet ou avec les doigts.</p>
<p>Malheureusement, sous Linux, je cherche encore le clavier miracle.</p>
<p>Commençons …</p><p>Tout est dans le titre :</p>
<p>Pour résumer, je cherche un clavier tactile (une application) utilisable sous GNU/Linux.</p>
<p>J'avoue avoir été bluffé par le clavier tactile sous Windows 7, bien conçu pour être utilisable au stylet ou avec les doigts.</p>
<p>Malheureusement, sous Linux, je cherche encore le clavier miracle.</p>
<p>Commençons par un rapide état des lieux.</p>
<p>Sous Linux, il en existe plusieurs, tous plus ou moins utilisable au quotidien
(et j'insiste sur ce point : au quotidien signifie plus de 10 minutes dans la
journée). Concrètement, le clavier idéal doit être accessible en un minimum
d'opérations (genre, un clic sur une icône présente en permanence sur
l'écran), doit être suffisamment grand pour pouvoir être utilisé avec les
doigts, mais ne doit pas non plus recouvrir tout l'écran. Concrètement, il
doit être dans sa propre fenêtre, ou flottant, mais en aucun cas, ancré sur un
bord d'écran. Il doit également pouvoir disparaître instantanément sans que
l'on aie à faire des combinaisons de touches à la Emacs ou vi (genre
<ctrl><x><ctrl><c> ou <esc>:q!).</p>
<p>Concrètement, je cherche un clavier comme ça :
<a href="http://live.gnome.org/GnomeShell/Design/Whiteboards/ScreenKeyboard">http://live.gnome.org/GnomeShell/Design/Whiteboards/ScreenKeyboard</a></p>
<p>Liste des claviers virtuels ayant retenu mon attention (et pouvant fonctionner aussi bien sous Gnome3 que sous WindowMaker).</p>
<h4>Cellwriter</h4>
<p>Utilisable avec les doigts: oui</p>
<p>Utilisable avec le stylet: oui</p>
<p>Les plus: redimensionnable à la taille que l'on veut, accessible depuis un
dock/boîte à miniatures/systray. Le petit extra: la reconnaissance des
caractères manuscrits, mais pas aussi poussé que sous Windows.</p>
<p>Le gros moins: disposition qwerty uniquement (pas d'accès aux caractères accentués).</p>
<p>Résultat: dommage pour la disposition qwerty, parce qu'il correspondait presque à ce que je cherchais.</p>
<p>Site web: <a href="http://risujin.org/cellwriter/">http://risujin.org/cellwriter/</a></p>
<p><a href="http://images.chibi-nah.fr/images/201107222258.png"><img alt="Cellwriter" src="http://images.chibi-nah.fr/thumbs/201107222258.png"></a></p>
<h4>Eekboard</h4>
<p>Utilisable avec les doigts: difficilement avec la disposition azerty ou bépo, sans problèmes avec la map par défaut (qwerty)</p>
<p>Utilisable avec le stylet: oui</p>
<p>Les plus: Supporte la disposition clavier de l'utilisateur connecté (en gros, support de l'azerty, du bépo). Utilise de base les dispositions xkb, et permet d'écrire ses propres maps via des fichiers xml. Skinnable via un fichier .css.</p>
<p>Le gros moins: non redimensionnable.</p>
<p>Résultat: clavier prometteur (à suivre de près), je pense que je l'utiliserai sous Gnome 3 une fois les maps créées.</p>
<p>Site web: <a href="https://fedorahosted.org/eekboard/">https://fedorahosted.org/eekboard/</a></p>
<p><a href="http://images.chibi-nah.fr/images/201107222301.png"><img alt="Eekboard" src="http://images.chibi-nah.fr/thumbs/201107222301.png"></a></p>
<h4>Maliit</h4>
<p>Utilisable avec les doigts: aucune idée</p>
<p>Utilisable avec le stylet: aucune idée</p>
<p>Les plus: aucune idée</p>
<p>Le gros moins: nécessite Qt ? (à confirmer)</p>
<p>Résultat: Il s'agit du clavier virtuel de Meego. N'ayant pas (encore) trouvé le moyen de le compiler proprement (problèmes de dépendances) je n'ai pas pu le tester. Peut-être qu'il s'agira du meilleur dans le futur.</p>
<p>Site web: <a href="http://www.jonnor.com/2011/04/introducing-maliit-on-screen-keyboard-in-gnome-3/">http://www.jonnor.com/2011/04/introducing-maliit-on-screen-keyboard-in-gnome-3/</a></p>
<h4>Caribou</h4>
<p>Utilisable avec les doigts: aucune idée</p>
<p>Utilisable avec le stylet: aucune idée</p>
<p>Les plus: intégration avec Gnome 3</p>
<p>Le gros moins: en cours de développement (quasiment inutilisable en l'état).
"This is an early release intended for people to preview the UI interaction.
Caribou is not currently usable as a primary text input application."</p>
<p>Résultat: Non utilisable.</p>
<p>Site web: <a href="http://live.gnome.org/Caribou">http://live.gnome.org/Caribou</a></p>
<h4>Florence</h4>
<p>Utilisable avec les doigts: oui</p>
<p>Utilisable avec le stylet: oui</p>
<p>Les plus: intégration avec Gnome 2</p>
<p>Le gros moins: je cherche…</p>
<p>Résultat: Bizarre. Je l'ai testé il y a un moment, mais je l'ai désinstallé peu de temps après. Il faudra que je le réinstalle, pour retrouve LE principal défaut qui m'a fait renoncer à l'utiliser.</p>
<p>Site web: <a href="http://florence.sourceforge.net/english.html">http://florence.sourceforge.net/english.html</a></p>
<p>UPDATE : je l'ai réinstallé, et je n'ai pas retrouvé de défaut. Parfaitement
utilisable avec les doigts (je tape avec en ce moment d'ailleurs), déplaçable,
peut être agrandi /réduit (zoom), fonctionne très bien avec WindowMaker. Le
clavier idéal en somme ?</p>
<p>À noter un petit détail : les touches à afficher sont paramétrables en 2 clicks (touches de fonction, de navigation, pavé numérique)…</p>
<p><a href="http://images.chibi-nah.fr/images/201107222246.png"><img alt="Florence" src="http://images.chibi-nah.fr/thumbs/201107222246.png"></a></p>
<h4>GOK</h4>
<p>Utilisable avec les doigts: oui</p>
<p>Utilisable avec le stylet: oui</p>
<p>Les plus: intégration avec Gnome 2/gdm</p>
<p>Le gros moins: Ergonomie</p>
<p>Résultat: Un clavier virtuel assez ancien (annoncé en 2001) par rapport aux autres, mais qui souffre d'un gros problème (à mon avis). Il n'est pas simple d'accès et je ne le trouve pas ergonomique/agréable à utiliser.</p>
<p>Site: <a href="http://www.gok.ca/">http://www.gok.ca/</a></p>
<h4>onBoard</h4>
<p>Utilisable avec les doigts: aucune idée</p>
<p>Utilisable avec le stylet: probablement</p>
<p>Les plus: ?</p>
<p>Le gros moins: ?</p>
<p>Résultat: Non testé, mais d'après les captures d'écran que j'ai vu, il me semble limité.</p>
<p>Site:
<a href="https://help.ubuntu.com/community/Accessibility/OnboardAndMousetweaksAtGDM">https://help.ubuntu.com/community/Accessibility/OnboardAndMousetweaksAtGDM</a></p>
<h4>En conclusion</h4>
<p>Il serait faux de prétendre qu'il n'existe pas de clavier virtuel sous
GNU/Linux. Le seul problème est (je pense, et ce n'est que mon propre avis)
qu'ils ont été prévu dès le départ pour être utilisés via une souris et non
via un écran tactile.</p>
<p>Les deux claviers qui se démarquent sont : cellwriter et eekboard. Je garde un
espoir pour Maliit (tout comme pour Meego).</p>
<p>Pour le moment, je pense que je vais utiliser eekboard avec mon tablet-pc, une
fois que j'aurai compris comment écrire une map clavier (le fichier xml de la
map qwerty est presque illisible, il me faudra un peu de temps pour comprendre
la logique).</p>
<p>J'avais prévu au début de faire des captures d'écrans, mais je pense que je
les mettrais par la suite, quand j'aurai pu installer les 3 claviers non
testés. En attendant, les captures peuvent être trouvées (parfois
difficilement) sur les sites web.</p>
<p>UPDATE : Au final, après avoir réinstallé Florence, je pense qu'il s'agira du
clavier que j'utiliserai lors des séances de « surf », ou lors des tests et
des démos avec la tablette.</p>
<p>UPDATE 2 : J'ai ajouté quelques captures.</p>Astuces en vrac2011-05-18T00:00:00+02:002011-05-18T00:00:00+02:00alextag:blog.chibi-nah.fr,2011-05-18:/astuces-en-vrac<p>Quelques astuces en vrac. (J'avais la flemme d'écrire un article complet pour chacune de ces astuces, alors je les colle ici).</p>
<ul>
<li>Utilisation de touches quasiment inutilisées (ou rappel de leur existence).</li>
<li>
<p>Colorier les logs avec ccze</p>
</li>
<li>
<p>Partager une connexion internet depuis un modem usb</p>
</li>
<li>Verrouiller le clickpad du TM2 sous …</li></ul><p>Quelques astuces en vrac. (J'avais la flemme d'écrire un article complet pour chacune de ces astuces, alors je les colle ici).</p>
<ul>
<li>Utilisation de touches quasiment inutilisées (ou rappel de leur existence).</li>
<li>
<p>Colorier les logs avec ccze</p>
</li>
<li>
<p>Partager une connexion internet depuis un modem usb</p>
</li>
<li>Verrouiller le clickpad du TM2 sous ArchLinux.</li>
<li><strong>Updated:</strong> Astuce pour le stylet du TM2 lors de l'utilisation avec un écran externe.</li>
</ul>
<p>Quelques petites astuces livrées en vrac, sans aucun ordre, et pour lesquelles, je trouvais qu'il était inutile d'écrire un article pour chacune de ces astuces.</p>
<p>Sur un PC (pas sur un Mac), on retrouve souvent des touches inutilisées, avec des noms d'origine barbare (Scroll Lock, System Request, Pause par exemple).</p>
<p><em><strong>Astuce 1 :</strong></em></p>
<p>La touche SysRq peut être utilisée en cas de kernel panic (pratique quand on a bidouillé son noyau ou xorg et que tout est planté, le clavier ne répond plus et on a pas d'autre machine avec ssh sous la main). L'astuce pour tenter de redémarrer proprement : Alt + SysRq + R, E, I, S, U, B.</p>
<p>Il faut garder appuyer les touches Alt + SysRq, puis appuyer sur R, puis E, puis I, puis S, puis U, puis B. Penser à laisser quelques secondes entre chaque touches, notamment entre S (Sync), U (Umount) et B (reBoot).</p>
<p>Petite détail concernant ArchLinux : le raccourci clavier est désactivé par défaut (pour des raisons de sécurité ?). Pour le réactiver, changer dans le fichier /etc/sysctl.conf, la ligne</p>
<div class="highlight"><pre><span></span><code>kernel.sysrq = 0
</code></pre></div>
<p>en</p>
<div class="highlight"><pre><span></span><code>kernel.sysrq = 1
</code></pre></div>
<p><strong><em>Astuce 2 :</em></strong></p>
<p>Définir un raccourci clavier sur la touche "Pause" pour verrouiller sa session (par exemple, via la commande xlock, ou xscreensaver-command -lock)</p>
<p><em><strong>Astuce 3 :</strong></em></p>
<p>Avec synergy, la touche "Scroll Lock" est utilisée (par défaut) pour "verrouiller" la souris sur l'écran en cours d'utilisation. Elle ne changera plus d'écran. Un nouvel appui sur "Scroll Lock" la déverouillera. Si vous ne savez pas ce qu'est synergy, jetez un œil sur <a href="http://synergy-foss.org/">http://synergy-foss.org</a></p>
<p><em><strong>Astuce 4 :</strong></em></p>
<p>Utiliser ccze pour colorier les logs de syslog-ng dans la console tty12.</p>
<p>installer ccze, décommenter les lignes concernant tty12 dans syslog-ng.conf.</p>
<p>Remplacer ensuite la ligne</p>
<div class="highlight"><pre><span></span><code>destination console_all { file("/dev/tty12"); };
</code></pre></div>
<p>par :</p>
<div class="highlight"><pre><span></span><code>destination console_all { program("ccze -r >> /dev/tty12"); };
</code></pre></div>
<p>Origine de l'astuce : <a href="http://blog.bacardi55.org/2012/08/hello-world/">http://blog.bacardi55.org/2012/08/hello-world/</a></p>
<p><em><strong>Astuce 5 :</strong></em></p>
<p>Partager la connexion internet vers un second pc quand on a un pc sous GNU/Linux et un modem USB. Autrement dit : comment accéder à Internet quand un certain OS propriétaire est incapable d'utiliser un modem USB (non, ça ne commence pas forcément par un 'W').</p>
<p>Nécessite : un modem usb (ou assimilé, compatible CDC ECM ou CDC EEM), un pc sous GNU/Linux, un autre pc (ou mac), un câble ethernet, un accès root, iptables et dnsmasq installés sur le pc sous GNU/Linux. Le pc client doit juste avoir une carte ethernet et doit être configuré en dhcp. La config de dnsmasq sera donnée plus bas.</p>
<p>La méthode que j'utilise (entièrement à la main, pas du tout automatisé ni optimisé) :</p>
<ul>
<li>
<p>Configurer la connexion du modem. Dans mon cas, le modem apparaît sur usb0, la carte ethernet sur eth0.</p>
</li>
<li>
<p>en root, taper :</p>
<p>ifconfig eth0 up
ifconfig eth0 192.168.1.1</p>
<p>iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables -A FORWARD -i usb0 -o eth0 -j ACCEPT
iptables -A FORWARD -o usb0 -i eth0 -j ACCEPT</p>
</li>
<li>
<p>Démarrer dnsmasq.</p>
</li>
</ul>
<p>Si le dns passe mais pas la connexion sur le réseau, vérifiez que</p>
<div class="highlight"><pre><span></span><code>/proc/sys/net/ipv4/ip_forward
</code></pre></div>
<p>contient '1' et non '0' (cela vous évitera de perdre une heure à essayer de comprendre pourquoi ssh, ping, nslookup passe, mais pas le reste (http, ftp, ssh…).</p>
<p>EDIT pour ArchLinux : on peut aussi vérifier dans /etc/sysctl.conf que la ligne suivante est présente, ou ne contient pas la valeur '0':</p>
<div class="highlight"><pre><span></span><code>net.ipv4.ip_forward=1
</code></pre></div>
<p>Configuration de dnsmasq.</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> cat /etc/dnsmasq.conf
domain-needed
interface=eth0
listen-address=192.168.1.1
expand-hosts
domain=yue.local
dhcp-range=192.168.1.10,192.168.1.30,255.255.255.0,12h
dhcp-option=3, 192.168.1.1
cache-size=150
log-queries
</code></pre></div>
<p>RTFM pour les détails de la config de dnsmasq.</p>
<p><strong><em>Astuce 6 :</em></strong></p>
<p>Désactiver le clickpad du TM2 en tapotant deux fois sur la led en haut à gauche (Pour Archlinux)</p>
<p>Soit : installer le paquet synaptics led (dispo sur aur), soit : récupérer le patch (depuis aur, pastebin, lkml, …), patcher soi-même le noyau (2.6.39 ou 3.0) et activer l'option dans la config</p>
<div class="highlight"><pre><span></span><code>'Device Drivers -> Input device support -> Mice'
-*- Synaptics PS/2 mouse protocol extension
[*] Support embedded LED on Synaptics devices
</code></pre></div>
<p>Puis installer le driver synaptics-clickpad (toujours sur aur)</p>
<p>Liens sur aur:</p>
<p><a href="https://aur.archlinux.org/packages.php?ID=49284">https://aur.archlinux.org/packages.php?ID=49284</a></p>
<p><a href="https://aur.archlinux.org/packages.php?ID=38120">https://aur.archlinux.org/packages.php?ID=38120</a></p>
<p><em><strong>Astuce 7 :</strong></em></p>
<p>Utilisation du stylet avec un écran externe branché.</p>
<p><s><strong>UPDATE</strong> : attention : cette astuce ne semble pas fonctionner correctement. Mon curseur de souris se dédouble ou saute régulièrement (plusieurs fois par secondes). Au final, le stylet est <strong>inutilisable</strong>. Il faudra que je regarde plus en détails pourquoi. Il faut probablement redéfinir la surface de l'écran, Cf. <a href="http://sourceforge.net/apps/mediawiki/linuxwacom/index.php?title=Dual_and_Multi-Monitor_Set_Up">http://sourceforge.net/apps/mediawiki/linuxwacom/index.php?title=Dual_and_Multi-Monitor_Set_Up</a></s></p>
<p><strong>UPDATE :</strong> Bonne nouvelle. J'ai refait des tests le 5 janvier 2012, et cela fonctionne.</p>
<p>Version des paquets (pour référence) : xf86-input-wacom 0.12.0-1, Xorg-Xserver 1.11.3, noyau linux 3.2.0.</p>
<p><s>(Note pour moi-même : s'il faut s'amuser à énumérer tous les cas de figure que je rencontre (un écran externe, deux écrans externe, de résolution identique ou différentes, l'écran du TM2 souvent retourné par rapport aux autres), bon courage avec les calculs matriciels.)</s>Inutile, il suffit de spécifier sur quel écran le stylet devra être utilisé.</p>
<p>Quand on utilise un écran externe, le truc pénible est que la saisie avec le stylet utilise les deux écrans.
Concrètement, la moitié de la surface de l'écran du TM2 est utilisée pour l'écran externe, et l'autre moitié pour l'écran "interne".
Il y a une astuce que je détaillerai dans un prochain article<s>(quand il n'y aura plus de problèmes de curseur)</s>, mais je colle ici la solution "en vrac"<s>( ne fonctionne pas du tout chez moi)</s>fonctionne très bien :</p>
<div class="highlight"><pre><span></span><code>xsetwacom set "Wacom ISDv4 E3 Pen stylus" MapToOutput LVDS-0
xsetwacom set "Wacom ISDv4 E3 Pen eraser" MapToOutput LVDS-0
xsetwacom set "Wacom ISDv4 E3 Finger touch" MapToOutput LVDS-0
</code></pre></div>
<p><s>J'ai modifié mon script "redefResolution", je le mettrai en ligne d'ici peu.</s></p>HP TouchSmart TM22011-04-17T00:00:00+02:002011-04-17T00:00:00+02:00alextag:blog.chibi-nah.fr,2011-04-17:/hp-touchsmart-tm2<p>Un article<s>court</s>pour présenter ce petit pc portable convertible en
tablette (plus connu sous le nom de « tablet pc »).
Après quelques mois d'utilisations (depuis juin 2010 en fait), je pense avoir
suffisamment de recul pour pouvoir faire un petit retour d'expérience.</p>
<p>Le HP TouchSmart TM2 (ici, le 1050ef, commercialisé …</p><p>Un article<s>court</s>pour présenter ce petit pc portable convertible en
tablette (plus connu sous le nom de « tablet pc »).
Après quelques mois d'utilisations (depuis juin 2010 en fait), je pense avoir
suffisamment de recul pour pouvoir faire un petit retour d'expérience.</p>
<p>Le HP TouchSmart TM2 (ici, le 1050ef, commercialisé en france) est un pc
portable de 12,1", pesant 2,15 kg. Il est doté d'un écran pivotant et pouvant
se rabattre sur le clavier et devenant de ce fait une tablette. Le
lecteur/graveur DVD est externe, ce qui, au final, est loin d'être une
contrainte… vu le peu de fois où je m'en suis servi. Le CPU est un Intel
Core2Duo SU7300 ULV (basse consommation), tournant à 1,3 GHz. Le disque dur
est de 500 Go, et la ram de 4 Go, extensible à 8Go (DDR3 1066MHz).</p>
<p><a href="/images/touchsmartTM2/hp-touchsmart-tm2-9-pr.jpg"><img alt="HP TouchSmart TM2" src="/images/touchsmartTM2/hp-touchsmart-tm2-9-pr.png"></a>
<a href="/images/touchsmartTM2/hp-touchsmart-tm2-2001-2.jpg"><img alt="HP TouchSmart TM2" src="/images/touchsmartTM2/hp-touchsmart-tm2-2001-2.png"></a>
<a href="/images/touchsmartTM2/hp-touchsmart-tm2-novembre-2010-lps-1.jpg"><img alt="HP TouchSmart TM2" src="/images/touchsmartTM2/hp-touchsmart-tm2-novembre-2010-lps-1.png"></a>
<a href="/images/touchsmartTM2/hp-touchsmart-tm2-zero-force-tablet-laptop.jpg"><img alt="HP TouchSmart TM2" src="/images/touchsmartTM2/hp-touchsmart-tm2-zero-force-tablet-laptop.png"></a></p>
<p>(Origine des photos : HP, Laptop Spirit)</p>
<p>Cette machine est loin d'être parfaite, surtout sur ces points :</p>
<ul>
<li>Le poids est assez mal réparti [1] : quand j'incline l'écran, il n'est pas rare que l'ordi bascule en arrière ¬_¬'.</li>
<li>La dalle de l'écran : il s'agit d'une dalle TN brillante, et dont l'angle de vision est assez faible. C'est assez pénible au début, mais à la longue, on trouve la position pour pouvoir l'utiliser en mode "portrait".</li>
<li>L'épaisseur : elle n'est pas régulière, la machine est surélevée au niveau de la batterie, et c'est assez désagréable quand on l'utilise en mode portrait, posé sur un bureau.</li>
</ul>
<p>Sinon, globalement, j'en suis assez satisfait, il est assez silencieux, l'autonomie est correcte (5 heures annoncés, entre 3h et 3h30 de film en HD en pratique).</p>
<p>Vendu avec un Windows 7 64 bits préinstallé, et bien entendu, pollué avec tout
un tas de "crapwares", logiciels totalement inutiles, dispensables, consommant
inutilement des ressources [2]… bref, comme n'importe quel PC (au moins, là,
je ne suis pas dépaysé), mes premiers réflexes furent :</p>
<ul>
<li>Créer les 4 DVDs de restauration "au cas où" (au prix du DVD vierge, et au fait de devoir payer la taxe "culture major "dessus [3], j'adore le fait qu'ils ne soient pas fournis avec >.<)</li>
<li>Sauvegarder dans un coin le répertoire SwSetup (il contient les pilotes et surtout les logiciels importants, comme… euh, en fait, les crapwares cités plus haut… bon, inutile de copier ce répertoire vu que les pilotes sont disponible sur le site de HP).</li>
<li>Faire un backup de windows, et surtout, noter la clé de la licence windows dans un coin [4].</li>
<li>Formater le disque dur, installer un windows "propre" et faire du ménage dans les partitions (4 primaires : la boot, windows, restauration et celle contenant les outils de diagnostic de HP).</li>
<li>Tester vite-fait la compatibilité avec GNU/Linux (avec un live-CD d'Ubuntu 10.04).</li>
</ul>
<p>Concernant Windows, quelques trucs à retenir :</p>
<ul>
<li>
<p>Cet OS est toujours aussi dépendant du bon vouloir des fabriquants à fournir des pilotes… pas de pilotes = rien qui marche [5]</p>
</li>
<li>
<p>La tablette fonctionne plutôt bien, le multitouch également (avec Microsoft Surface). La reconnaissance d'écriture manuscrite fonctionne relativement bien, et arrive à déchiffrer mes gribouillis… après, le stylet fourni dispose de peu de niveaux de pressions, il semble plus orienté pour l'écriture que pour le dessin.</p>
</li>
<li>
<p>À noter qu'un petit logiciel est à installer d'office : TM2Control, disponible sur <a href="http://sites.google.com/site/tm2control/">http://sites.google.com/site/tm2control/</a> Il est assez pratique à utiliser quand on est en mode "tablette".</p>
</li>
</ul>
<p>Attaquons-nous maintenant à la partie importante : la compatibilité avec
GNU/Linux, plus particulièrement ArchLinux (64 bits).</p>
<p>Commençons par les classiques lspci et lsusb.</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> lspci
00:00.0 Host bridge: Intel Corporation Mobile 4 Series Chipset Memory Controller Hub (rev 07)
00:01.0 PCI bridge: Intel Corporation Mobile 4 Series Chipset PCI Express Graphics Port (rev ff)
00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
00:1a.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 03)
00:1a.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 03)
00:1a.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 03)
00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 03)
00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 03)
00:1c.1 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 2 (rev 03)
00:1d.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 03)
00:1d.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 03)
00:1d.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03)
00:1d.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 93)
00:1f.0 ISA bridge: Intel Corporation ICH9M-E LPC Interface Controller (rev 03)
00:1f.2 SATA controller: Intel Corporation ICH9M/M-E SATA AHCI Controller (rev 03)
00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 03)
01:00.0 VGA compatible controller: ATI Technologies Inc M93 [Mobility Radeon HD 4500 Series] (rev ff)
01:00.1 Audio device: ATI Technologies Inc RV710/730 (rev ff)
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 03)
03:00.0 Network controller: Intel Corporation Centrino Wireless-N 1000
</code></pre></div>
<p>Bon, que du classique : de l'Intel ICH9 au niveau chipset, du SATA pour le
disque dur, du Realtek pour la carte Ethernet, de l'Intel HDA pour l'audio, de
l'Intel N1000 pour le wifi… de ce point de vue là, pas de problèmes de
compatibilité. À noter tout de même la présence de deux cartes vidéo, une
Intel GMA 4500MHD et une ATI/AMD Radeon Mobility HD4550.</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 174f:1118 Syntek
Bus 002 Device 003: ID 0bda:0158 Realtek Semiconductor Corp. USB 2.0 multicard reader
Bus 003 Device 002: ID 138a:0005 Validity Sensors, Inc. VFS301 Fingerprint Reader
Bus 004 Device 002: ID 056a:00e3 Wacom Co., Ltd
Bus 002 Device 004: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 002 Device 005: ID 1058:0704 Western Digital Technologies, Inc. Passport External HDD
Bus 002 Device 006: ID 046d:c062 Logitech, Inc. LS1 Laser Mouse, corded
Bus 002 Device 008: ID 0bb4:0ffe High Tech Computer Corp. Desire HD (modem mode)
Bus 007 Device 002: ID 03f0:231d Hewlett-Packard
</code></pre></div>
<p>Bon, les lignes à ignorer sont le Hub, le téléphone, la souris et le disque
dur externe.</p>
<p>Donc, un lecteur de carte mémoire, le lecteur d'empreintes digitales (faut pas
rêver, rien n'est disponible pour GNU/Linux à ce niveau là, le fabriquant ne
fournissant pas de specs), et le plus important, la ligne "056a:00e3 Wacom
Co., Ltd". La tablette graphique intégrée est une tablette Wacom (rien que
ça…) donc au niveau fonctionnalités/performances/support sous GNU/Linux,
aucune inquiétude à avoir. Concernant la ligne "03f0:231d Hewlett-Packard", il
s'agit juste du module bluetooth. À noter que le "kill switch" active à la
fois le wifi et le bluetooth.</p>
<p>Cela n'apparaît pas, mais le touchpad est un "ClickPad" de Synaptics. Le
ClickPad est un touchpad particulier, dans le sens où il n'y a plus de
"bouton", façon MacBook Pro. C'est la position du doigt qui indique s'il
s'agit d'un clic gauche/milieu/droit. Pour le faire fonctionner correctement,
il faut installer le driver synaptics clickpad pour Xorg depuis aur. Le driver
côté noyau a été mis à jour depuis le 2.6.36 ou 37. À noter que le défilement
avec deux doigts fonctionne également [6].</p>
<p>Rapidement, un cat /proc/cpuinfo</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Genuine Intel(R) CPU U7300 @ 1.30GHz
stepping : 10
cpu MHz : 800.000
cache size : 3072 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dts tpr_shadow vnmi flexpriority
bogomips : 2594.02
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Genuine Intel(R) CPU U7300 @ 1.30GHz
stepping : 10
cpu MHz : 800.000
cache size : 3072 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dts tpr_shadow vnmi flexpriority
bogomips : 2593.58
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
</code></pre></div>
<p>Globalement, il m'a fallu pas mal d'heures de bidouillages et de scripts pour
que tout fonctionne (ou presque). Les principaux problèmes furent notamment la
gestion des deux cartes graphiques (se référer à l'article sur
vga_switcheroo), et la gestion de la rotation de l'écran.</p>
<p>Pour la gestion de la luminosité, il m'a fallu bidouiller le /etc/acpi/handler.sh, et ajouter dans le "case" :</p>
<div class="highlight"><pre><span></span><code> video)
event="$2"\ "$3"
case "$event" in
"LCD 00000087"*)
acpi_fakekey $KEY_BRIGHTNESSDOWN
/usr/local/bin/backlight down
logger "backlight --"
;;
"LCD 00000086"*)
acpi_fakekey $KEY_BRIGHTNESSUP
/usr/local/bin/backlight up
logger "backlight ++"
;;
esac
;;
</code></pre></div>
<p>Le script backlight est un script récupéré sur le web pour la gestion de la
luminosité avec le chipset i915. Il est dispo dans la section "vrac", je ne
l'ai quasiment pas retouché, il fonctionne tel-quel.</p>
<p>Concernant le reste, pas de problèmes en particulier, le wifi est géré via
wicd, le mode tactile est reconnu comme une souris (pas encore de support du
multitouch, mais ça arrive), le stylet est parfaitement géré sous gimp
(stylet, gomme, niveaux de pression). La webcam fonctionne également, même si
c'est rare que je l'utilise…</p>
<p>Les drivers libres fonctionnent correctement (UT2004 fonctionne sous
GNU/Linux), je n'ai pas testé le driver ATI propriétaire. À noter que pour
pouvoir utiliser la sortie vidéo HDMI, il faut basculer sur la carte ATI.</p>
<p>Petit truc amusant : les accéléromètres sont reconnus sous GNU/Linux, et il
est possible de les utiliser avec le jeu NeverBall. Cependant, je pense qu'il
doit y avoir un conflit quelque part, parce que la caméra tourne en permanence
autour de la sphère, et rend le jeu absolument injouable. Il faudra que je
regarde ça plus en détails…</p>
<hr>
<p>[1] : Comme la plupart des PCs portables, à l'exception des machines Apple.</p>
<p>[2] : Si seulement, il s'agissait de logiciels libres, genre Firefox, Gimp, Thunderbird, LibreOffice, VLC…, je n'aurais rien à redire, mais là : "Norton Internet Security demo 60 jours", "Microsoft Office 2010 Démo 30 jours", "CyberLink DVD"…</p>
<p>[3] : Le seul "Major" que j'admire, adore et respecte, c'est le Major Kusanagi.</p>
<p>[4] : Je ne comprendrai jamais pourquoi les fabriquants laissent toujours l'étiquette SOUS le portable et non derrière la batterie, résultat : l'étiquette et la clé s'effacent au bout d'un mois, à moins qu'il ne s'agisse d'une conspiration pour faire perdre les licences et obliger à les <s>tipiaker</s>racheter…</p>
<p>[5] : Et après, on dit que c'est pire sous GNU/Linux… alors que sous Linux, soit ça marche du premier coup, soit ça marche après bidouille, soit ça ne marche pas.</p>
<p>[6] : Ça me rappelle un de mes vieux post sur ubuntu-fr, où il fallait bidouiller le xorg.conf pour avoir cette fonctionnalité. Sauf qu'aujourd'hui, plus besoin de bidouiller, ça fonctionne directement, sous Gnome 3.</p>VGA_Switcheroo (ou le changement de carte graphique à chaud sous GNU/Linux)2011-04-16T00:00:00+02:002011-04-16T00:00:00+02:00alextag:blog.chibi-nah.fr,2011-04-16:/vga-switcheroo<p>Attention : ce qui suit est totalement discutable, et n'est pas à prendre tel-
quel. Un minimum de connaissances peut être nécessaire à la compréhension de
cet article (genre, savoir compiler un noyau Linux, et plus important : faire
en sorte qu'il fonctionne). De plus, un seul type de configuration a été …</p><p>Attention : ce qui suit est totalement discutable, et n'est pas à prendre tel-
quel. Un minimum de connaissances peut être nécessaire à la compréhension de
cet article (genre, savoir compiler un noyau Linux, et plus important : faire
en sorte qu'il fonctionne). De plus, un seul type de configuration a été testé
et il n'est aucunement garanti que cela refonctionnera, y compris sur la même
machine. Inutile de préciser que la ligne de commande sera le seul moyen de
parvenir à nos fins.</p>
<p>Si vous êtes encore là, vous pouvez lire la suite…</p>
<p>Commençons par définir le contexte :</p>
<p>J'ai un Tablet PC HP TouchSmart TM2 1050ef (france), doté de deux cartes
graphiques, une Intel GMA 4500MHD (consommant peu mais au niveau performances
lamentables [1]) et une ATI/AMD Radeon HD4550M (consommant laaargement plus,
mais plus performante [2]).</p>
<p>À noter que le CPU est un Intel Core2Duo ULV [3] (donc, pas un i3/5/7) et ne
comprend pas de partie graphique intégrée, Cf.
<a href="http://ark.intel.com/Product.aspx?spec=SLGYV">http://ark.intel.com/Product.aspx?spec=SLGYV</a></p>
<p>Confirmons les dires via une petite commande.</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
01:00.0 VGA compatible controller: ATI Technologies Inc M93 [Mobility Radeon HD 4500 Series] (rev ff)
</code></pre></div>
<p>Deux cartes graphiques, situées sur le bus PCI aux adresses "00:02.0" et
"01:00.0". Cette information est importante et sera réutilisée par la suite.</p>
<p>Par défaut, les deux cartes sont alimentées, et fonctionnent (enfin,
fonctionnent, façon de parler, l'une des deux tourne à vide). Résultat : la
consommation d'énergie explose (autonomie estimée à environ une heure), et le
pc chauffe pas mal (~ 60°C au lieu de 40°C… oui, je SAIS, mon MBU [4] tourne,
lui, entre 50 et 78°C, donc le "pas mal", c'est par rapport à Windows sur
cette même machine).</p>
<p>Commençons donc les choses sérieuses.</p>
<p>Tout d'abord, vérifier que vga_switcheroo n'est pas déjà présent (j'ai eu
cette bonne surprise sur une OpenSuse, en testant SMEEGOL), via cette petite
commande :</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> ls /sys/kernel/debug/vgaswitcheroo/switch
/sys/kernel/debug/vgaswitcheroo/switch
</code></pre></div>
<p>Si "switch" est présent, c'est tout bon, et vous pouvez ignorer la suite et
passer directement à la partie amusante.</p>
<p>Sinon, il va falloir compiler le noyau Linux. Récupérez le code source d'un
noyau récent (2.6.37 ou supérieur), éventuellement celui utilisé par votre
distrib accompagné de ses patches [5].</p>
<p>NOTE IMPORTANTE : Si vous ne savez pas ce que signifie "patch", "compiler",
"noyau", mais connaissez le sens de "pépin", arrêtez tout de suite avant de
faire une grosse erreur. Normalement, vous auriez du vous arrêter au chapô au
lieu de continuer de lire cet article.</p>
<p>Configurer le noyau comme suit :</p>
<div class="highlight"><pre><span></span><code>Device Drivers --->
Graphics support.
<*> /dev/agpgart (AGP Support) --->
<*> Intel 440LX/BX/GX, I8xx and E7x05 chipset support
(16) Maximum number of GPUs
[*] Laptop Hybrid Graphics - GPU switching support
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
<M> ATI Radeon
[*] Enable modesetting on radeon by default - NEW DRIVER
<*> Intel 8xx/9xx/G3x/G4x/HD Graphics
[*] Enable modesetting on intel by default
</code></pre></div>
<p>Explications rapide :</p>
<p>Je suis obligé d'activer le support AGP pour le driver Intel, sinon il refuse
de fonctionner.</p>
<p>Le nombre maximum de GPU a été laissé à 16 par défaut, il faudra que je
regarde ce qu'il se passe si je change cette valeur, par exemple avec les
valeurs "1" ou "2".</p>
<p>Le support du changement de GPU est actif.</p>
<p>Je laisse le driver radeon en tant que module, et colle le driver intel en
dur. La raison est simple : je veux que par défaut, ça soit la carte graphique
Intel qui soit utilisée, puis la radeon au besoin et non l'inverse. Ce n'est
pas du tout à cause du fait que la sortie vidéo soit reliée à un
"multiplexeur" et que la carte intel est la carte par défaut :D [6]</p>
<p>Tant qu'on y est, on active le support KMS.</p>
<p>À ne pas oublier : Dans Kernel Hacking, activer "Debug Filesystem" pour
pouvoir accéder à /sys/kernel/debug/.</p>
<p>Compiler et installer le noyau, rebooter dessus.</p>
<p>Tout s'est bien passé ? alors on peut alors attaquer la partie amusante.</p>
<p>À partir de maintenant, on peut jouer avec le changement de carte à chaud.</p>
<p>Monter (si ce n'est pas déjà fait) le système de fichiers debug (en root, bien
entendu) via</p>
<div class="highlight"><pre><span></span><code>mount -t debugfs none /sys/kernel/debug
</code></pre></div>
<p>Vérifier le contenu de switch :</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> cat /sys/kernel/debug/vgaswitcheroo/switch
0:IGD:+:Pwr:0000:00:02.0
1:DIS: :Off:0000:01:00.0
</code></pre></div>
<p>Là, j'avoue, j'ai effectué le "cat" alors que tout est configuré et
fonctionnel. Normalement, à ce stade, les deux cartes devraient être sur
"Pwr". Le '+' indiquant la carte active.</p>
<p>Notez le "00:02.0" et "01:00.0". Cela ressemble bizarrement à</p>
<div class="highlight"><pre><span></span><code>00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
01:00.0 VGA compatible controller: ATI Technologies Inc M93 [Mobility Radeon HD 4500 Series] (rev ff)
</code></pre></div>
<p>Et cela est confirmé par IGD et DIS : IGD désignant la carte Intégrée (soudée
sur la carte mère), et DIS la carte Discrète (non, pas discrète dans le sens
"ne se fait pas remarquer", mais dans le sens "Carte externe branchée sur un
port d'extension").</p>
<p>Pour éteindre la carte inutilisée, il suffit (en root) d'écrire la valeur
"OFF" :</p>
<div class="highlight"><pre><span></span><code>echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
</code></pre></div>
<p>Vérifier que "Off" est bien en face de la carte non utilisée. Si vous êtes sur
batterie, l'estimation de l'autonomie devrait être réévaluée.</p>
<p>Un moyen simple pour vérifier quelle carte est active (sous Xorg) :</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> glxinfo | grep OpenGL
OpenGL vendor string: Tungsten Graphics, Inc
OpenGL renderer string: Mesa DRI Mobile Intel® GM45 Express Chipset
OpenGL version string: 2.1 Mesa 7.11-devel
OpenGL shading language version string: 1.20
OpenGL extensions:
</code></pre></div>
<p>Bon, là, c'est confirmé, c'est bien la carte Intel.</p>
<p>Et là, comment faire pour passer sur la radeon ?</p>
<p>Il suffit alors de dire au système : « bascule sur la radeon », simplement
via la commande :</p>
<div class="highlight"><pre><span></span><code>echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch
</code></pre></div>
<p>et pour revenir sur la carte Intel :</p>
<div class="highlight"><pre><span></span><code>echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch
</code></pre></div>
<p>À noter que le changement de carte n'est pas géré à chaud avec Xorg. Il faudra
fermer sa session pour que le changement de carte soit effectif.</p>
<div class="highlight"><pre><span></span><code>alex@yue ~> glxinfo | grep OpenGL
OpenGL vendor string: X.Org
OpenGL renderer string: Gallium 0.4 on AMD RV710
OpenGL version string: 2.1 Mesa 7.11-devel
OpenGL shading language version string: 1.20
OpenGL extensions:
</code></pre></div>
<p>Récapitulons :</p>
<p>Pour le changement de carte à chaud, il faut :</p>
<ul>
<li>Avoir les droits root sur sa machine.</li>
<li>Les bonnes options dans le noyau Linux (debug, vga_switcheroo, driver intel et radeon).</li>
<li>Écrire les mots magiques dans /sys/kernel/debug/vgaswitcheroo/switch.</li>
<li>Espérer que l'ACPI ne soit pas complètement foireux.</li>
<li>Redémarrer Xorg.</li>
</ul>
<p>Il est donc temps de scripter un peu pour automatiser tout ça.</p>
<p>Le "choix" de la carte par défaut étant effectué via la différenciation entre
"compilé en dur" et "compilé en tant que module", c'est déjà une contrainte en
moins.</p>
<p>Pendant la séquence de démarrage, il faut donc, après le chargement du module
"radeon", monter le système de fichiers du noyau "debug", et éteindre la
radeon. À noter qu'il faut que le module radeon soit chargé, sinon une seule
carte apparaîtra et il ne sera pas possible de l'éteindre.</p>
<p>Sous ArchLinux :</p>
<p>Dans /etc/rc.conf, ajouter "radeon" dans la liste des modules si le module ne
se charge pas automatiquement. (Je ne l'ai pas dans mon /etc/rc.conf en tout
cas).</p>
<p>Récupérer le fichier vga_switch-init disponible dans la section "vrac", le
lire puis le coller dans /etc/rc.d.</p>
<p>Récupérer également le fichier vga_switch, le lire puis le coller dans
/usr/local/bin.</p>
<p>Rendre les deux scripts exécutable, et ajouter "vga_switch-init" dans la liste
des démons à lancer au démarrage.</p>
<p>Sur son environnement de bureau (Gnome, KDE, WindowMaker, …), on peut ajouter
des entrées de menu ou définir des raccourcis clavier pour changer de carte
graphique sans à avoir à taper la moindre ligne de commande. Utiliser
simplement le script "vga_switch", éventuellement via sudo.</p>
<p>Sous WindowMaker, j'ai ajouté deux entrées de menu comme suit :</p>
<div class="highlight"><pre><span></span><code>Écran -> Choix de la carte graphique -> Intel GMA 4500
Écran -> Choix de la carte graphique -> ATI/AMD Radeon HD 4550
</code></pre></div>
<p>avec l'exécution de</p>
<div class="highlight"><pre><span></span><code>xterm -e "/usr/bin/sudo /usr/local/bin/vga_switch intel"
</code></pre></div>
<p>pour basculer sur la carte Intel, et</p>
<div class="highlight"><pre><span></span><code>xterm -e "/usr/bin/sudo /usr/local/bin/vga_switch radeon"
</code></pre></div>
<p>pour basculer sur la carte ATI.</p>
<p>Bien entendu, j'ai modifié mon sudoers pour exécuter ce script sans demander
de mot de passe. Le fait de lancer un xterm m'a servi pour tester le script.
Il est tout à fait possible d'afficher une boîte de dialogue, via zenity par
exemple, pour inviter à se déconnecter pour que le changement de carte soit
effectif.</p>
<hr>
<p>[1] : Peu importe les progrès effectués, une carte Intel sera toujours
merdique au niveau performances (à noter que ceci est MON PROPRE AVIS, et ne
reflète en rien une quelconque vérité, mon avis étant basé sur mon expérience
utilisateur)</p>
<p>[2] : La comparaison effectuée entre les deux cartes a été effectuée via une
unité pifométrique et avec un outil de benchmark totalement discutable,
puisqu'il s'agit du (vieux) jeu Unreal Tournament 2004 sous Windows 7, avec
toutes les options graphiques activées, et avec une résolution de 1920x1200.
La radeon fait tourner le jeu sans broncher, l'intel par contre, ¬_¬'</p>
<p>[3] : ULV pour Ultra Low Voltage… Les processeurs basse consommation d'Intel.
Consommant peu, et étant moins performant que les modèles classique (compter
environ 12-13 minutes pour compiler un noyau Linux 2.6.38 avec un make -j 4).
Je précise pour le CPU, car sur les dernières architectures des CPU Intel,
notamment à partir des Core i3/5/7, la puce "northbridge" (comprenant le
contrôleur de mémoire, la gestion du PCI Express et éventuellement la puce
graphique intégrée) est désormais sur le CPU. Du coup, la partie graphique qui
se trouvait sur la puce sur la carte mère se retrouve maintenant directement
sur le processeur. Cf.
<a href="http://en.wikipedia.org/wiki/Arrandale_%28microprocessor%29">http://en.wikipedia.org/wiki/Arrandale_(microprocessor)</a></p>
<p>[4] : MBU pour MacBook Unibody, le prédécesseur du MacBook Pro 13"</p>
<p>[5] : Avis personnel : je préfère utiliser la version vanilla, sans aucun
patch provenant de kernel.org, et patcher moi-même si nécessaire. Cela évite
des effets de bord avec un noyau déja patché sur lequel on veut ajouter des
patches récupérés sur la liste de diffusion du noyau). À noter la présence
d'un patch pour le noyau qui agit au niveau de l'ACPI pour éteindre la carte
graphique inutilisée. Ce patch est surtout utilisé avec la techno Optimus de
nVidia, car à l'heure actuelle, cette techno ne fonctionne pas sous Linux. Ce
patch ne DOIT PAS être appliqué pour faire fonctionner vga_switcheroo.</p>
<p>[6] : extrait du patch initial :</p>
<div class="highlight"><pre><span></span><code>From: Dave Airlie <airlied@linux.ie>
Date: Mon, 1 Feb 2010 15:38:10 +1000
Subject: [PATCH] vga_switcheroo: initial implementation (v11)
Many new laptops now come with 2 gpus, one to be used for low power modes and one for gaming/on-ac applications. These GPUs are typically wired to the laptop panel and VGA ports via a multiplexer unit which is controlled via ACPI methods.
</code></pre></div>
<p>Source :
<a href="http://people.freedesktop.org/%7Eairlied/vgaswitcheroo/0001-vga_switcheroo-initial-implementation-v11.patch">http://people.freedesktop.org/~airlied/vgaswitcheroo/0001-vga_switcheroo-initial-implementation-v11.patch</a></p>Linux_logo2011-03-27T00:00:00+01:002011-03-27T00:00:00+01:00alextag:blog.chibi-nah.fr,2011-03-27:/linuxlogo<p>UPDATE : ajout de la séquence ansi pour que le curseur clignote dans la
console tty.</p>
<p>Un petit truc amusant à faire sous GNU/Linux, c'est afficher une petite image
en ascii-art sur sa console tty.</p>
<p><img alt="Capture d'écran montrant linux_logo à l'action." src="/images/linux_logo/kirby.png"></p>
<p>C'est bien beau tout ça, mais comment on met le tout en place ?</p>
<p>D'abord, installer …</p><p>UPDATE : ajout de la séquence ansi pour que le curseur clignote dans la
console tty.</p>
<p>Un petit truc amusant à faire sous GNU/Linux, c'est afficher une petite image
en ascii-art sur sa console tty.</p>
<p><img alt="Capture d'écran montrant linux_logo à l'action." src="/images/linux_logo/kirby.png"></p>
<p>C'est bien beau tout ça, mais comment on met le tout en place ?</p>
<p>D'abord, installer le paquet "linux_logo" (via apt, yum, yaourt, urpmi,
pacman, …)
Exécuter ensuite linux_logo dans un terminal. Suivant la distrib, cela
affichera un logo debian (sous debian), un tux (sous la plupart des distribs)</p>
<p>Ci dessous, quelques captures d'écran de linux_logo</p>
<p><img alt="bannière Linux obtenue avec linux_logo" src="/images/linux_logo/banner.png"></p>
<p><img alt="Bannière Debianobtenue avec linux_logo" src="/images/linux_logo/debian-banner.png"></p>
<p><img alt="Logo Debian obtenu avec linux_logo" src="/images/linux_logo/debian.png"></p>
<p><img alt="Logo GNU/Linux obtenu avec linux_logo" src="/images/linux_logo/gnu_linux.png"></p>
<p>À savoir, certaines distributions n'incluent pas tous les logos. Si on veut
tous les avoir, il suffit d'aller chercher le code source de linux_logo. Les
logos supplémentaires sont dans le répertoire "logos" et dans ses sous-
répertoires. Il suffit d"utiliser la commande linux_logo -D <chemin vers le
fichier .logo> pour afficher le .logo désiré.</p>
<p>Et si je veux personnaliser mon logo / je veux ton kirby qui est affiché en
haut de l'article.</p>
<p>Pour personnaliser un logo, il suffit de le créer (ha ha ha). Plus
sérieusement, pour afficher du texte en couleurs, il faut utiliser les codes
ANSI (Cf.<a href="http://en.wikipedia.org/wiki/ANSI_escape_code">Wikipédia</a>).</p>
<p>Pour résumer, j'ai mis la capture suivante, qui indique le code à utiliser et
son résultat :</p>
<p><img alt="Grille montrant les couleurs qui peuvent être affichées dans un terminal." src="/images/linux_logo/couleurs.png"></p>
<p>Attention : avant le crochet ouvrant '[', il faut insérer la séquence
d'échappement ^[. Comme il s'agit d'un caractère de contrôle (code ascii
\033), on ne peut pas le taper directement au clavier. Diverses méthodes sont
possibles, celle que j'utilise est :
Dessiner/récupérer le logo dans un éditeur de texte, puis ajouter du code perl
tout autour (Cf. kirby.pl ou pacman.pl pour avoir une idée).
Exécuter ensuite le code et vérifier. Quand tout est bon, je "l'exporte" dans
un fichier, "kirby.pl > kirby.logo".
Après, il n'y a plus qu'à ajouter les instructions pour linux_logo, et
éventuellement une version du logo sans code de couleurs (Cf. kirby.logo ou
pacman.logo)</p>
<p>Note : le script couleurs.pl et les logos sont comme d'hab, dans la section
"vrac".</p>
<p><img alt="Une partie d'un niveau de Pacman obtenu avec linux_logo" src="/images/linux_logo/pacman.png"></p>
<p><img alt="Un Pacman obtenu avec linux_logo" src="/images/linux_logo/pacman2.png"></p>
<p>Ça serait bien d'avoir un logo sur son écran de login tty comme sous les
vieilles mandrake.</p>
<p>Certaines distribs proposent des scripts tout prêt, et mettant à jour le logo
au boot (inittab affichant le /etc/issue), et d'autres non</p>
<p>Pour ceux qui n'ont pas de script, j'ai mis le mien dans le vrac
(update_logo). Avant de l'exécuter, le lire et le relire, et le modifier en
conséquence.</p>
<p>Pour que linux_logo génère par défaut le "bon" logo, il suffit de modifier le
fichier "/etc/linux_logo.conf". Dans le mien, j'ai juste</p>
<p>-D /etc/kirby.logo -F "#O version #V\nCompiled #C\n#N #M #X #T #P, #R RAM\nHP TouchSmart TM2 1050ef (VY574EA)"</p>
<p>-D : chemin vers le fichier .logo à utiliser
-F "" : Chaîne de caractère contenant les infos à afficher
Pour le détail de la chaîne, lisez la page de manuel.</p>
<p>UPDATE : Il manque un tout petit truc dans le logo. En effet, à l'usage, je me
suis rendu compte que le curseur a disparu, ce qui est assez pénible quand on
veut éditer une commande.</p>
<p>Pour le faire réapparaître, il suffit d'ajouter la séquence ^[[?25h à la fin du logo.</p>
<p>^[ étant le code ESC bien entendu.</p>Gestion de la rotation avec un Tablet PC HP TM2 (Sous Linux)2010-12-17T00:00:00+01:002010-12-17T00:00:00+01:00alextag:blog.chibi-nah.fr,2010-12-17:/gestion-de-la-rotation-avec-un-tablet-pc<p>Juste une note rapide pour expliquer comment faire pour que l'écran se retourne automatiquement quand je bascule mon laptop en mode "tablette".</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">la rotation de l'écran est effectuée via xrandr (truc standard).</p>
</div>
<p>Par contre, la rotation de la saisie (tactile, stylet, gomme) est gérée par xsetwacom. À adapter au …</p><p>Juste une note rapide pour expliquer comment faire pour que l'écran se retourne automatiquement quand je bascule mon laptop en mode "tablette".</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">la rotation de l'écran est effectuée via xrandr (truc standard).</p>
</div>
<p>Par contre, la rotation de la saisie (tactile, stylet, gomme) est gérée par xsetwacom. À adapter au besoin...</p>
<p><strong>Attention: cet article a été écrit pour un Tablet PC doté d'une tablette WACOM. Il est inutile de l'essayer avec un PC doté d'une tablette NTrig, ça ne
fonctionnera pas.</strong></p>
<p>Il y avait deux possibilités :</p>
<p>La plus répandue (en tout cas, celle que je trouve presque partout sur le web) :
surveiller la valeur de <cite>/sys/devices/platform/hp-wmi/tablet</cite></p>
<p>Si le fichier contient "0", c'est en mode "laptop", si "1", mode "tablet".</p>
<p>Simple, mais nécessite de faire tourner un daemon unix qui va surveiller le changement de cette valeur (truc lourd...)</p>
<p>L'autre solution (celle que j'ai retenu) : quand je rabat l'écran, un "keycode" est généré. Il suffit de le récupérer et de le transformer en scancode, pour que Xorg puisse le traiter.</p>
<p>Remarque : ici, j'utilise XF86Back et XF86Forward. Comme je n'ai pas ces touches sur mon clavier, ça ne me dérange pas. Par contre, si cela pose un problème avec les navigateurs web/client email/pigeons voyageurs, il suffit d'utiliser un autre code inutilisé.</p>
<p>Pour cela : il suffit de récupérer les deux codes (via les logs du noyau), puis de scripter un peu.</p>
<p>Dans le rc.local : ajouter</p>
<pre class="literal-block">
setkeycodes e058 158 # mode "tablet" xorg : mappe sur 166 XF86Back
setkeycodes e059 159 # mode "laptop" xorg : mappe sur 167 XF86Forward
</pre>
<p>Récupérer le script "rotate" (depuis le vrac : <a class="reference external" href="http://vrac.chibi-nah.net/">http://vrac.chibi-nah.net/</a> ) et le coller, par exemple, dans
/usr/local/bin</p>
<p>À noter que lorsque je pivote l'écran, je désactive le touchpad.</p>
<p>Il n'y a plus qu'une chose a faire, c'est associer les événements XF86Back et XF86Forward à "affichage par défaut" et "rotation de 180°" (en gros, utiliser des raccourcis claviers pour lancer un programme).</p>
<p>Pour cela, consultez la doc de votre Environnement de bureau (Gnome, KDE) ou Gestionnaire de Fenêtres (Window Maker, Fluxbox, ...).</p>
<p>Je prends l'exemple de Window Maker :</p>
<p>Lancer l'outil WPrefs, aller sur "Personnalisation du menu de lancement".</p>
<p>Ajouter un sous-menu "Rotation".</p>
<p>Créer ces entrées et modifier les commandes associées :</p>
<table border="1" class="docutils">
<colgroup>
<col width="16%" />
<col width="49%" />
<col width="35%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Nom</th>
<th class="head">Lancer le programme</th>
<th class="head">Raccourci clavier</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>"Normal"</td>
<td>/usr/local/bin/rotate 0</td>
<td>XF86Forward</td>
</tr>
<tr><td>"90°"</td>
<td>/usr/local/bin/rotate 90</td>
<td> </td>
</tr>
<tr><td>"180°"</td>
<td>/usr/local/bin/rotate 180</td>
<td>XF86Back</td>
</tr>
<tr><td>"270°"</td>
<td>/usr/local/bin/rotate 270</td>
<td> </td>
</tr>
</tbody>
</table>
<p>Si vous avez un bouton pour gérer la rotation, on peut ajouter :</p>
<table border="1" class="docutils">
<colgroup>
<col width="18%" />
<col width="50%" />
<col width="32%" />
</colgroup>
<tbody valign="top">
<tr><td>"Rotation"</td>
<td>/usr/local/bin/rotate rotate</td>
<td>XF86RotateWindows</td>
</tr>
</tbody>
</table>
<p>(À condition bien entendu que le bouton soit mappé sur "XF86RotateWindows").</p>
<p>Du coup, le menu devrait se présenter sous cette forme :</p>
<img alt="" src="images/rotation.jpg" />
<p>Voilà</p>
<p>Si l'écran pivote automatiquement, c'est gagné.</p>
<p>On peut aussi pivoter l'écran manuellement, en naviguant dans le menu.</p>
ManServer2010-10-11T00:00:00+02:002010-10-11T00:00:00+02:00alextag:blog.chibi-nah.fr,2010-10-11:/manserver<p>Note rapide sur "comment afficher les pages de manuel dans Firefox."</p>
<p>Étant utilisateur de KDE depuis une longue date, j'ai bien aimé la fonctionnalité de konqueror, afficher une page de manuel via <strong>man://</strong></p>
<p>Comme j'ai retiré KDE 4.5 (lancer un démon mysql, désolé, mais non : halte au sur-armement), il …</p><p>Note rapide sur "comment afficher les pages de manuel dans Firefox."</p>
<p>Étant utilisateur de KDE depuis une longue date, j'ai bien aimé la fonctionnalité de konqueror, afficher une page de manuel via <strong>man://</strong></p>
<p>Comme j'ai retiré KDE 4.5 (lancer un démon mysql, désolé, mais non : halte au sur-armement), il m'a fallu trouver une alternative.</p>
<p>L'alternative s'appelle donc manserver.</p>
<p>Cela consiste en une application écrite en perl, tournant en arrière plan sous forme de démon, et écoutant sur le port 8888 (configurable).</p>
<p>Il est disponible à l'adresse suivante :</p>
<p><a href="http://www.squarebox.co.uk/users/rolf/download/manServer.shtml">http://www.squarebox.co.uk/users/rolf/download/manServer.shtml</a></p>
<p>Sous ArchLinux, il est dispo sur aur.</p>
<p>À noter que manserver utilise le man path. Si seules les pages de manuel en anglais apparaissent, et que l'on est sûr d'avoir les pages en français, vérifier que la ligne <code>MANDB_MAP /usr/share/man/fr</code> est bien présente dans le fichier "/etc/manpath.config".</p>
<p>Un redémarrage de manserver, et les pages en français devraient être alors disponibles.</p>
<p>Quel intérêt de consulter les pages de manuel dans firefox alors qu'une console et man suffit ?</p>
<p>Réponse : aucun. Cependant, la lecture est plus confortable (à tout hasard, la page de manuel de bash).</p>Presse papier et Linux2010-10-11T00:00:00+02:002010-10-11T00:00:00+02:00alextag:blog.chibi-nah.fr,2010-10-11:/presse-papier-et-linux<p>Utilisant quotidiennement Linux[1], je me suis rendu compte qu'il y avait "deux presse-papiers".</p>
<p>Celui où on "sélectionne" et "middle click", et celui où on fait "copier-coller".</p>
<p>Le problème, c'est que les deux ne sont pas synchronisés, ce qui pose problème avec synergy ou même entre firefox et un terminal …</p><p>Utilisant quotidiennement Linux[1], je me suis rendu compte qu'il y avait "deux presse-papiers".</p>
<p>Celui où on "sélectionne" et "middle click", et celui où on fait "copier-coller".</p>
<p>Le problème, c'est que les deux ne sont pas synchronisés, ce qui pose problème avec synergy ou même entre firefox et un terminal.</p>
<p>La solution existe. Il s'agit de "Autocutsel", dispo via http://www.nongnu.org/autocutsel/ (ou via les paquets de votre distrib,
cherchez un peu...).</p>
<p>Il suffit de l'ajouter dans le script lancé au démarrage de sa session graphique.</p>
<p>Pour moi (Window Maker), j'ai juste eu à ajouter dans mon
~/GNUstep/Library/WindowMaker/autostart</p>
<h1>synchroniser le presse papiers avec la sélection primaire</h1>
<p>autocutsel -fork
autocutsel -selection PRIMARY -fork</p>
<p>et sans oublier</p>
<p>killall autocutsel
dans ~/GNUstep/Library/WindowMaker/exitscript</p>
<p>Un redémarrage de WindowMaker plus tard, les deux presses-papier sont
synchronisés.</p>
<p>1: oui, j'écris Linux et non GNU/Linux, et alors ?</p>Premier article2010-10-09T00:00:00+02:002013-01-03T00:00:00+01:00alextag:blog.chibi-nah.fr,2010-10-09:/premier-article<p>Édit du 5 janvier <s>2012</s> 2013 : je viens seulement de me rendre compte que cet article n'a jamais été publié. Il était vraiment temps que je le mette en ligne.</p>
<p>Finalement, quitte à écrire n'importe quoi, autant tenir un blog :)</p>
<p>Malheureusement, tout ce que j'avais tapé avant est perdu dans …</p><p>Édit du 5 janvier <s>2012</s> 2013 : je viens seulement de me rendre compte que cet article n'a jamais été publié. Il était vraiment temps que je le mette en ligne.</p>
<p>Finalement, quitte à écrire n'importe quoi, autant tenir un blog :)</p>
<p>Malheureusement, tout ce que j'avais tapé avant est perdu dans les méandres du web (le bon vieux temps de multimania… souvenirs).</p>