tag:linuxfr.org,2005:/tags/format/publicLinuxFr.org : les contenus étiquetés avec « format »2023-07-28T17:50:14+02:00/favicon.pngtag:linuxfr.org,2005:News/415572023-06-24T21:35:20+02:002023-06-26T10:41:27+02:00Des formats d'imageLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Les formats d’image classiques datent des années 1990 : après le format GIF en 1987, sont apparus le JPEG en 1992, le PNG en 1996 et le SVG en 1998. Leur adoption progressive s’est faite dans le contexte de la première guerre des navigateurs.</p>
<p>Ces formats couvrant <em>à peu près</em> tous les usages, les choses en sont restées là pendant plus de dix ans. Mais le paysage a commencé à changer dans les années 2010, avec l’introduction d’un nouveau format d’image moderne, WebP, pensé pour répondre à tous les besoins courants et pouvoir supplanter à la fois JPEG et PNG. Depuis, les nouveautés s’enchaînent, avec HEIF en 2015, AVIF en 2019 et JPEG XL en 2022.</p>
<p>Voici de quoi y voir plus clair.</p>
</div><ul><li>lien nᵒ 1 : <a title="https://developer.mozilla.org/fr/docs/Web/Media/Formats/Image_types" hreflang="fr" href="https://linuxfr.org/redirect/112338">Guide des types et formats d'image, par Mozilla</a></li><li>lien nᵒ 2 : <a title="https://developers.google.com/speed/webp" hreflang="fr" href="https://linuxfr.org/redirect/112339">WebP</a></li><li>lien nᵒ 3 : <a title="https://jpegxl.info/" hreflang="en" href="https://linuxfr.org/redirect/112340">JPEG XL</a></li><li>lien nᵒ 4 : <a title="https://www.w3.org/Graphics/SVG/" hreflang="en" href="https://linuxfr.org/redirect/112341">SVG</a></li><li>lien nᵒ 5 : <a title="https://imagemagick.org/script/formats.php" hreflang="en" href="https://linuxfr.org/redirect/112342">Formats supportés par ImageMagick</a></li><li>lien nᵒ 6 : <a title="http://www.graphicsmagick.org/formats.html" hreflang="en" href="https://linuxfr.org/redirect/112343">Formats supports par GraphicsMagick</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<a href="#toc-formats-dimages-matricielles-">Formats d'images matricielles </a><ul>
<li><a href="#toc-gif--graphics-interchange-format-">GIF – Graphics Interchange Format </a></li>
<li><a href="#toc-jpeg--joint-photographic-experts-group-">JPEG – Joint Photographic Experts Group </a></li>
<li><a href="#toc-png--portable-network-graphics-">PNG – Portable Network Graphics </a></li>
<li><a href="#toc-jpeg-2000">JPEG 2000</a></li>
<li><a href="#toc-jbig2--joint-bi-level-image-group-">JBIG2 – Joint Bi-level Image Group </a></li>
<li><a href="#toc-webp-">WebP </a></li>
<li><a href="#toc-heic--hevc-dans-un-conteneur-heif-">HEIC – HEVC dans un conteneur HEIF </a></li>
<li><a href="#toc-avif--av1-image-file-format-">AVIF – AV1 Image File Format </a></li>
<li><a href="#toc-jpeg-xl-">JPEG XL </a></li>
</ul>
</li>
<li>
<a href="#toc-formats-dimages-vectorielles-">Formats d’images vectorielles </a><ul>
<li><a href="#toc-eps--encapsulated-postscript-">EPS – Encapsulated PostScript </a></li>
<li><a href="#toc-pdf--portable-document-format-">PDF – Portable Document Format </a></li>
<li><a href="#toc-svg--scalable-vector-graphics-">SVG – Scalable Vector Graphics </a></li>
</ul>
</li>
<li><a href="#toc-outils-">Outils </a></li>
<li>
<a href="#toc-conclusion-">Conclusion </a><ul>
<li><a href="#toc-photos-">Photos </a></li>
<li><a href="#toc-photos-d%C3%A9tour%C3%A9es-">Photos détourées </a></li>
<li><a href="#toc-dessins-bd--">Dessins, BD, … </a></li>
<li><a href="#toc-dessins-et-sch%C3%A9mas-vectoriels-">Dessins et schémas vectoriels </a></li>
</ul>
</li>
</ul>
<h2 id="toc-formats-dimages-matricielles-">Formats d'images matricielles </h2>
<h3 id="toc-gif--graphics-interchange-format-">GIF – Graphics Interchange Format </h3>
<p>Publié en 1987, avant même l’invention du Web, le format GIF permet de compresser sans perte une image avec une palette comptant au maximum 256 couleur et une transparence tout-ou-rien.</p>
<p>Le format GIF a longtemps été le seul format largement supporté permettant de stocker des animations, et il est resté utilisé pour cela pendant une trentaine d’années. Aujourd’hui, cette fonctionnalité est disponible avec le format WebP, et GIF peut enfin prendre une retraite bien méritée.</p>
<p>GIF est pris en charge par tous les navigateurs et probablement tous les logiciels d’affichage et de traitement d’image. En revanche, ce format ne présente plus aucun intérêt pour un usage courant, puisqu’il a été complètement supplanté par PNG, qui est lui-même ringard.</p>
<h3 id="toc-jpeg--joint-photographic-experts-group-">JPEG – Joint Photographic Experts Group </h3>
<p>Publié en 1992 comme norme ISO, le format JPEG sert à compresser des photos avec pertes. Il permet de représenter des images en niveau de gris sur 8 bits ou en RVB sur 24 bits. Il ne supporte aucun mode de transparence. Ce format peut être utilisé au sein d’un document PDF, ce qui est utile pour la composition de documents avec des images, par exemple en LaTeX compilé directement en PDF.</p>
<p>JPEG est pris en charge par tous les navigateurs et tous les logiciels d’affichage et de traitement d’image. Ceci dit, ce format ne présente plus aucun intérêt pour la plupart des usages courants, et peut être remplacé par WebP pour les nouvelles images.</p>
<h3 id="toc-png--portable-network-graphics-">PNG – Portable Network Graphics </h3>
<p>Publié en 1996 par le W3C, le format PNG a été conçu pour remplacer GIF, qui souffrait de limitations techniques et de problèmes de brevets. Il permet de compresser sans perte une image avec une palette de 8 ou 256 couleurs, en niveau de gris sur 1 à 16 bits ou en RVB sur 8 ou 16 bits par canal, avec une transparence optionnelle par canal alpha sur 8 ou 16 bits.</p>
<p>Comme JPEG, ce format peut être utilisé dans un document PDF.</p>
<p>PNG est une recommandation du W3C, également reprise sous la forme d’une RFC puis d’une norme ISO. Il est pris en charge par tous les navigateurs et tous les logiciels d’affichage et de traitement d’image. Ceci dit, ce format ne présente plus aucun intérêt pour la plupart des usages courants, et peut être remplacé par WebP pour les nouvelles images.</p>
<p>Il a également été étendu par deux formats d’animation qui ont longtemps souffert d’une querelle qui explique l’utilisation persistante de l’antique format GIF :</p>
<ul>
<li>MNG – Multiple-image Network Graphics – initialement supporté par les logiciels Mozilla ; </li>
<li>APNG – Animated PNG – aujourd’hui largement supporté. </li>
</ul>
<h3 id="toc-jpeg-2000">JPEG 2000</h3>
<p>Publié en… 2000, ce format visait à remplacer JPEG, avec une compression plus performante. L’accès payant à sa spécification, ainsi que des soupçons de problèmes de brevets, ont largement contribué à la très faible adoption de ce format.</p>
<p>Ce format a pourtant un intérêt anecdotique, puisqu’à l’instar de JPEG et PNG, il peut être utilisé dans un document PDF.</p>
<p>Le format JPEG 2000 est assez peu connu et donc supporté par peu de logiciels en dehors de ceux spécifiquement conçus avec le souci de pouvoir traiter des images dans un maximum de formats.</p>
<h3 id="toc-jbig2--joint-bi-level-image-group-">JBIG2 – Joint Bi-level Image Group </h3>
<p>Publié également en 2000, ce format sert à compresser avec ou sans pertes des images en noir et blanc. Il s’agit ici de vrai noir et blanc, et non de niveaux de gris.</p>
<p>Ce rôle très spécifique limite beaucoup son utilisation, mais il reste intéressant pour stocker avec une efficacité redoutable des textes numérisés en très haute définition. Il peut également être intégré dans un document PDF, ce qui est très utile pour l’archivage de documents.</p>
<p>Comme JPEG 2000, JBIG2 est assez peu connu et supporté par peu de logiciels.</p>
<h3 id="toc-webp-">WebP </h3>
<p>En 2010, Google est venu bousculer ce paysage à peu près stable, en proposant un format moderne, conçu pour s’imposer comme une solution universelle.</p>
<p>Dérivé du format vidéo VP8, WebP est donc un format ouvert, qui permet de compresser de façon efficace avec ou sans perte, en RVB sur 24 bits, avec un canal alpha optionnel (à noter que ce dernier peut être compressé sans perte même pour une image compressée avec pertes). Il permet également de stocker des animations.</p>
<p>Aujourd’hui, WebP est pris en charge par tous les navigateurs et par la majorité des logiciels d’affichage et de traitement d’image. Il peut déjà être considéré comme un format universel largement utilisable.</p>
<h3 id="toc-heic--hevc-dans-un-conteneur-heif-">HEIC – HEVC dans un conteneur HEIF </h3>
<p>Le format HEIF – High Efficiency Image File Format – est un conteneur, principalement conçu pour le stockage d’images compressées avec HEVC — High Efficiency Video Codec. L’ensemble est publié depuis 2015. Il permet de compresser avec ou sans perte, avec un canal alpha optionnel, et supporte les animations.</p>
<p>Ce format est une norme ISO, issue du travail du groupe MPEG, et souffre de problèmes de brevets. Il n’est pris en charge par aucun navigateur et seulement par certains logiciels d’affichage et de traitement d’image.</p>
<p>Ce format a peu de chance de réellement s’imposer, en dehors du cercle de certains environnements logiciels propriétaires spécifiques comme celui d’Apple.</p>
<h3 id="toc-avif--av1-image-file-format-">AVIF – AV1 Image File Format </h3>
<p>Publié en 2019 par l’Alliance for Open Media fondée par Amazon, Google, Cisco, Microsoft, Mozilla et Netflix, ce format utilise le conteneur HEIF pour stocker des images compressées avec AV1. Comme les autres formats modernes, il permet de compresser avec ou sans pertes les images en niveaux de gris et en couleur, avec un canal alpha optionnel, et supporte les animations. Il permet également l’intégration d’un profil de couleurs et le stockage de grandes gammes de couleurs, jusqu’à 12 bits par couleur.</p>
<p>Ce format est ouvert et disponible sans problème de brevet. Il est pris en charge par tous les navigateurs modernes et par certains logiciels d’affichage et de traitement d’image.</p>
<p>Il est peut-être un peu tôt pour en juger, mais ce format pourrait s’imposer avec une prise en charge assez large.</p>
<h3 id="toc-jpeg-xl-">JPEG XL </h3>
<p>Finalisé en 2022, ce format a été conçu par le groupe JPEG pour remplacer le format JPEG premier du nom. Il supporte l’ensemble des fonctionnalités modernes : niveaux de gris, couleur, alpha optionnel et animations, et apporte des fonctionnalités utiles pour des usages plus avancés, telles que le support des couleurs en CMJN, des espaces de couleurs larges ou encore les grandes gammes dynamiques. Ce format présente également une fonctionnalité qui apparaît particulièrement intéressante pour la compression d’images existantes, puisqu’il permet de recompresser sans nouvelles pertes une image JPEG, avec évidemment un gain d’espace de stockage. </p>
<p>C’est un format ouvert, apparemment disponible sans problème de brevets. Il commence à être pris en charge par des navigateurs, à savoir Firefox nightly et Safari, ainsi que par bon nombre de logiciels d’affichage et de traitement d’image dans leurs versions récentes.</p>
<p>En clair, ce format est un peu trop jeune pour qu’on puisse compter sur une large prise en charge, mais cela viendra sans doute dans les années à venir.</p>
<h2 id="toc-formats-dimages-vectorielles-">Formats d’images vectorielles </h2>
<h3 id="toc-eps--encapsulated-postscript-">EPS – Encapsulated PostScript </h3>
<p>Conçu par Adobe, le format PostScript encapsulé est dérivé du PostScript, qui a connu son heure de gloire il y a une ou deux décennies, pour le stockage d’images destinées à être intégrées dans un flux de production de documents.</p>
<p>Il était notamment utile pour intégrer des images vectorielles (ou non !) dans un document LaTeX. Il est aujourd’hui largement supplanté pour ces usages par le format PDF.</p>
<h3 id="toc-pdf--portable-document-format-">PDF – Portable Document Format </h3>
<p>Inutile de présenter le format PDF, également conçu par Adobe, normalisé et très largement répandu. Je préciserai simplement qu’il permet entre autres de stocker des images vectorielles avec transparence. Il est utile dans cet usage pour stocker des schémas destinés à être intégrés dans un document, par exemple un document LaTeX compilé directement en PDF.</p>
<p>En revanche, son usage habituel étant plutôt celui du stockage de documents de plusieurs pages, il n'est pas utilisable pour intégrer des dessins dans une page Web. Il est bien supporté par tous les navigateurs modernes, mais plutôt dans une optique d’intégration de document externe.</p>
<h3 id="toc-svg--scalable-vector-graphics-">SVG – Scalable Vector Graphics </h3>
<p>Le format SVG a été publié en 1998 par le W3C. C’est le format standard d’images vectorielles, utilisé nativement par nombre de logiciels de dessin. Il est supporté par tous les navigateurs modernes et par la plupart des logiciels d’affichage d’image. Il est supporté par tous les logiciels de dessin vectoriel libre, et probablement également par les logiciels de dessin propriétaire puisqu’il serait assez indécent de fournir un logiciel de dessin qui ne puisse pas au minimum importer ce format standard.</p>
<h2 id="toc-outils-">Outils </h2>
<p>Pour convertir des images d’un format matriciel à un autre, vous pouvez utiliser : </p>
<ul>
<li>
<a href="https://imagemagick.org/">ImageMagick</a> ou <a href="http://www.graphicsmagick.org/">GraphicsMagick</a> ; </li>
<li>les outils spécialisés pour chaque format, par exemple ceux de <a href="https://developers.google.com/speed/webp/">WebP</a>.</li>
</ul>
<p>Pour stocker des images matricielles JPEG, PNG ou JPEG 2000 en PDF, sans recodage, vous pouvez utiliser <a href="https://gitlab.mister-muffin.de/josch/img2pdf">img2pdf</a>. Je ne connais pas de solution simple pour stocker une image JBIG2 dans un document PDF. Pour convertir des dessins vectoriels en PDF, le plus simple est d’utiliser la fonctionnalité d’export PDF de son logiciel de dessin vectoriel. Celle d’Inkscape est utilisable en ligne de commande.</p>
<h2 id="toc-conclusion-">Conclusion </h2>
<h3 id="toc-photos-">Photos </h3>
<p>Pour stocker une photo existante, gardez l’image JPEG existante. Si vous avez des contraintes de stockage, utilisez JPEG XL. Pour publier une photo ou une création, oubliez JPEG et utilisez WebP. Ou, si vous voulez faire moderne, AVIF. <br>
N’utilisez pas HEIC, ce format n’a pas été correctement conçu pour s’imposer et fait déjà partie des perdants.</p>
<h3 id="toc-photos-détourées-">Photos détourées </h3>
<p>Pour stocker et diffuser une photo avec de la transparence (votre visage ?), utilisez WebP. Ou, si vous voulez faire dans la modernité, AVIF. Oubliez PNG, ce format n’est pas adapté et n’était utile dans ce domaine qu’avant l’arrivée de WebP qui a l’avantage d’être vraiment adapté à cet usage.</p>
<h3 id="toc-dessins-bd--">Dessins, BD, … </h3>
<p>Pour stocker une image existante, vous pouvez bien garder le PNG existant. Si vous avez des contraintes de stockage, utilisez JPEG XL. Pour publier une image existante ou une création, utilisez WebP ou AVIF. Oubliez PNG, WebP en mode sans perte est juste mieux.</p>
<h3 id="toc-dessins-et-schémas-vectoriels-">Dessins et schémas vectoriels </h3>
<p>Pour le stockage comme pour la publication d’images vectorielles, le format standard SVG est presque toujours la meilleure option, sinon la seule. Si vous voulez utiliser un schéma dans un document LaTeX, le mieux est de l’exporter en PDF, en conservant le SVG original. Oubliez le PostScript encapsulé, ce format a été complètement supplanté par PDF pour ses cas d’usage.</p>
</div><div><a href="https://linuxfr.org/news/des-formats-d-image.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/131651/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/des-formats-d-image#comments">ouvrir dans le navigateur</a>
</p>
🚲 Tanguy Ortoloorfenorvmagninbobble bubbletedLtrlghttps://linuxfr.org/nodes/131651/comments.atomtag:linuxfr.org,2005:Post/428842022-05-12T08:59:13+02:002022-05-12T21:46:10+02:00application de convention d'écriture<p>Bonjour à tous,<br>
je suis à la recherche d'un ou plusieurs outils pour donner à l'utilisateur la possibilité de vérifier que son code est conforme et pourra être déposé sur notre dépôt git. </p>
<h2 id="toc-contexte">contexte</h2>
<p>Je travaille sur le développement d'un logiciel d'acquisition, visualisation, analyse et diagnostic de données provenant du système d'acquisition d'un imageur médical. Jusqu'à présent je travaillais seul sur ce projet, mais à l'avenir des collègues vont me prêter main forte car le projet commence à grossir et les demandes utilisateurs aussi :) C'est évidement une excellente nouvelle !</p>
<p>Comme je travaillais seul, j'avais la quasi-certitude que les conventions étaient respectées; je connais bien le dev et sa rigueur personnelle :) Mais maintenant que l'équipe grossit il faut mettre en place des outils pour s'assurer de la cohérence du code. </p>
<p>Le projet est écrit en c++ et utilise Qt et root (cern).</p>
<p>Pour la mise en forme du code j'utilise clang-format. Ça, c'est carrément un outil génial et qui marche bien. Je suis parfois bluffé par sa puissance.</p>
<p>J'utilise aussi cppcheck pour faire de l'analyse statique de code. </p>
<p>Il n'y a pas de code coverage et le code est versionné avec git/gitlab.</p>
<h2 id="toc-ma-recherche">ma recherche</h2>
<p>Je cherche un outil qui me permette de mettre en place des règles simples et peu nombreuses dont voici un sous ensemble.<br>
* snake_case PARTOUT (nom de fichier, variable, fonction, classe, enum… TOUT !!!)<br>
* pas de préfixe my<br>
* extension des fichiers<br>
* nom des fichiers <br>
* utilisation de caractères ascii (regexp [a-z0-9])</p>
<p>J'ai fait des recherches, mais je ne converge pas vraiment et c'est pour ça que je me permets de venir vous voir pour trouver de l'aide.</p>
<p>Je vous remercie d'avance pour votre aide.</p>
<p>Olivier </p>
<div><a href="https://linuxfr.org/forums/programmation-c/posts/application-de-convention-d-ecriture.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127719/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-c/posts/application-de-convention-d-ecriture#comments">ouvrir dans le navigateur</a>
</p>
Olivier LEMAIREhttps://linuxfr.org/nodes/127719/comments.atomtag:linuxfr.org,2005:Post/428012022-04-10T15:41:56+02:002022-04-10T15:42:30+02:00Peut-on (et comment) définir un format personnalisé pour la numérotation des pages?<p>Bonjour.</p>
<p>J'ai beau fouiller la documentation de LibreOffice mais, comme d'habitude, je ne parviens que rarement à y trouver ce que je cherche. J'ai fait plusieurs tentatives en m'aventurant dans les propriétés de numérotation, les variables, les formules… rien n'y fait.</p>
<p>Mon document contient des pages d'annexe, pour lesquelles je souhaite une numérotation avec le préfixe A, de sorte que les numéros des pages d'annexe s'affichent «A1», «A2», etc… y compris dans la table des matières. Comment puis-je faire ça?</p>
<p>Merci d'avance pour toute suggestion.</p>
<div><a href="https://linuxfr.org/forums/general-general/posts/peut-on-et-comment-definir-un-format-personnalise-pour-la-numerotation-des-pages.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127442/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/general-general/posts/peut-on-et-comment-definir-un-format-personnalise-pour-la-numerotation-des-pages#comments">ouvrir dans le navigateur</a>
</p>
FantastIXhttps://linuxfr.org/nodes/127442/comments.atomtag:linuxfr.org,2005:Diary/402082022-03-24T22:22:06+01:002022-03-25T07:07:44+01:00[LWN] Une porte de sortie pour a.outLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Ceci est une traduction de l'article <strong>LWN</strong> <a href="https://lwn.net/SubscriberLink/888741/5e43489d7ebeda7f/">A way out for a.out</a>, rédigé et publié par <strong>Jonathan Corbet</strong>.</p>
<p>Contrairement à ma précédente tentative, j'ai cette fois ci l'autorisation de l'éditoriat de LWN (cf fin du journal).</p>
<hr>
<p>Le <a href="https://fr.wikipedia.org/wiki/A.out">format d'exécutable a.out</a> date des tout premiers jours de Linux—et même avant. Il n'a pas été utilisé sérieusement depuis plusieurs décennies, mais le support existe toujours dans le noyau Linux et a résisté à toutes les tentatives de suppression. En Janvier, Borislav Petkov <a href="https://lwn.net/ml/linux-kernel/20220113160115.5375-1-bp@alien8.de/">essaya à nouveau</a> de retirer le support de ce format, amenant à une autre longue discussion. Il y a cependant une différence cette fois, les efforts pour se débrarasser du support de a.out pourraient bien porter leur fruit.</p>
<p>Le format a.out date de la première édition de Unix. Quand MINIX arriva, il a naturellement réutilisé ce format pour ses fichiers exécutables ; ce qui amena Linux à utiliser aussi ce format à son tour. C'est un format simple, et son implémentation dans Linux l'est encore plus. Parmis d'autres choses, chaque librairie partagée sous Linux devait se faire assigner de manière centralisée une portion de l'espace d'adressage, puisque les librairies ne pouvaient pas être transférée à une autre adresse au runtime. Quand bien même, Linux utilisa a.out pendant quelques temps, jusqu'à ce que le support du tout nouveau format ELF fut ajouté à la version de développement 0.99.13 du noyau en 1993.</p>
<p>Il fut un temps ou les plus fous d'entre nous on converti manuellement nos systèmes Slackware de a.out vers ELF, dans le but d'être en mesure de l'essayer et de bénéficier de ses avantages avant que les distributions ne soient mises à jour. Ils portent toujours les cicatrices de cette époque. Non pas que votre éditeur admettrait connaître qui que ce soit qui ce serait engagé dans une telle activité.</p>
<p>ELF est devenu le format exécutable standard sur Linux sur la plupart des architectures depuis 1995. On pourrait penser que cela aurait fournit assez de temps pour tout utilisateur des binaires a.out de migrer à contrecoeur vers ELF ; son adoption peut être jugée comme n'étant pas une mode passagère à ce point. Mais dans le monde réel, les surprises rôdent.</p>
<p>La conversation initiale sur la suppression de a.out se dissipa rapidement mais fut relancée quand Eric Biederman <a href="https://lwn.net/ml/linux-kernel/87ilsmdhb5.fsf_-_@email.froward.int.ebiederm.org/">publia un patch</a> désactivant le support de a.out sur 2 architectures (Alpha et m68k) qui l'activaient toujours par défaut. Ce patch ne supprime pas le support, il le désactive juste pour voir si quelqu'un se mettrait à hurler. Si des protestations se faisaient entendre, le support pourrait être réactivé rapidement et facilement ; sans quoi, une suppression complète pourrait être réalisée.</p>
<p>Linus Torvald <a href="https://lwn.net/ml/linux-kernel/CAHk-=wg+TYsns5JvNds6BVG7ezdg8uM_z9m8uJBcRDANdd7csw@mail.gmail.com/">repondit</a> rapidement qu'il était "plutôt certain qu'on ne pouvait pas faire ça". Il souligna que le format d'exécutable natif sur les systèmes Alpha exécutant le Unix de Digital était essentiellement du a.out, même si il était désigné par son nouveau nom ECOFF. Le loader a.out de Linux peut exécuter des programmes ECOFF en ignorant certaines nouvelles fonctionalités de ECOFF ; le supprimer casserait n'importe quel système utilisant encore ce support. On pourrait penser que le nombre d'utilisateurs qui font toujours tourner un CPU Alpha, exécutant des binaires ECOFF et maintenant leur noyau à jour des dernières versions serait un nombre plutôt bas, mais on ne sait jamais.</p>
<p>Kees Cook fit <a href="https://lwn.net/ml/linux-kernel/202203091358.775E158C@keescook/">une petite recherche</a> sur, il semblerait, la seule distribution supportant encore Alpha (Gentoo), et découvrit que les seuls fichiers ECOFF présent contenait un firmware, qui ne s'exécute pas sur le CPU de toute façon. Il concluat qu'il n'y aurait aucun problème a retirer le support de a.out sur cette plateforme : "Let's do it".</p>
<p>Il semblerait que ce soit une règle universelle que quelqu'un doivent venir pour casser l'ambiance. Cette fois ci, alors qu'il semblait ne plus avoir aucun obstacle, James Jones <a href="https://lwn.net/ml/linux-kernel/4c449fab-8135-5057-7d2c-7b948ce130cc@theinnocuous.com/">se pointa</a> pour faire savoir qu'il utilisait toujours a.out :</p>
<blockquote>
<p>Le cas d'usage est de faire tourner un ensemble de vieux outils pour compiler des programmes pour l'Atari Jaguar. Notamment, l'assembleur d'Atari (mac) et l'éditeur de lien (aln). L'alternative serait d'exécuter les versions Windows dans dosbox, ou d'utiliser un remplacement qui a été développé sur une version encore plus ancienne avec moins de fonctionnalités du code source de mac et aln, mais qui n'a toujours pas réussi à réintroduire les fonctionnalités nécessaire pour compiler certains programmes ou utiliser les outils de debug d'Atari (également disponible uniquement au format a.out).</p>
</blockquote>
<p>Il donna quelques détails supplémentaires sur le pourquoi du besoin de ces outils dans <a href="https://lwn.net/ml/linux-kernel/785a6348-e1c5-7900-78bc-af8b6923cc8a@theinnocuous.com/">un message ultérieur</a>.</p>
<p>Migrer un programme vers un nouveau format exécutable est normallement juste une question de recompilation. Mais recompiler est une tâche bien plus difficile en l'absence de code source. Se retrouver coincé à essayer de faire tourner des logiciels vieux de plusieurs décennies sur des systèmes modernes est juste une des joies réservées aux utilisateurs de systèmes propriétaires—mais beaucoup de gens se sont retrouvés dans cette position à un moment ou un autre. Ce sont de légitimes utilisateurs de Linux, et il n'y a aucun désir de casser leurs systèmes. Donc Petkov <a href="https://lwn.net/ml/linux-kernel/Yi3b%2FGpUuhkI5lv7@zn.tnic/">abandonna</a> dûment et demanda à Jones de documenter son utilisation de a.out pour ceux qui pourraient essayer de le supprimer dans le futur.</p>
<p>Cook, cependant, ne fut pas si pressé de jeter l'éponge ; il analysa les programmes en question, on <a href="https://lwn.net/ml/linux-kernel/202203151150.1CDB1D8DA@keescook/">conclut</a> qu'il était possible d'écrire un wrapper ELF qui pourrait charger et exécuter un vieux binaire a.out. Un jour plus tard, il <a href="https://lwn.net/ml/linux-kernel/202203161523.857B469@keescook/">publia ce programme</a>, précisant qu'il était capable d'exécuter <code>aln</code> au moins assez loin pour qu'il se plaigne des arguments de la ligne de commande. Jones <a href="https://lwn.net/ml/linux-kernel/59fb3d14-423a-d39b-04cb-1e60ee67d3f1@theinnocuous.com/">l'essaya</a> et fut satisfait du résultat :</p>
<blockquote>
<p>Oui, cela fonctionne parfaitement, merci. J'aime l'idée d'utiliser cela bien plus que de recevoir un e-mail à chaque fois que quelqu'un veut à nouveau supprimer le code de a.out. Considérez mon cas d'usage comme retiré. J'ai déjà mis à jour mon projet jaguar-sdk pour utiliser cet outil à la place.</p>
</blockquote>
<p>Donc le retrait du support de a.out est de <a href="https://lwn.net/ml/linux-kernel/YjMKsM6LzEmpGTzN@zn.tnic/">retour dans les plans</a> du noyau 5.18. Peut être que les efforts porteront leur fruit cette fois, bien qu'il n'y ait toujours aucune garantie ; il pourrait y avoir des utilisateurs de a.out non conscient de la prochaine apocalypse et n'ont pas fait connaître leur objection. Si ces utilisateurs n'ont pas connaissance ou ne veulent pas utiliser le wrapper de Cook, le retrait du support de a.out pourrait bien, encore une fois, être reporté à une future version du noyau.</p>
<hr>
<p>Suite à ma précédente tentative, j'ai contacté l'équipe de LWN pour leur demander l'autorisation (chose que j'aurais du faire avant), ci-joint leur réponse :</p>
<blockquote>
<p>Hi David,</p>
<p>On 2022 mar 24 at 21:12:36 +0100 David Delassus wrote:</p>
<blockquote>
<p>My name is David Delassus, I've been a Linux user for the past 15<br>
years and I follow your website silently for quite a while.</p>
<p>Thank you for the great content!</p>
</blockquote>
<p>Glad you like it!</p>
<blockquote>
<p>I'm contacting you because I've written a translation of one of your<br>
articles:</p>
<ul>
<li>
<em>Original :</em>
<a href="https://lwn.net/SubscriberLink/888741/5e43489d7ebeda7f/">https://lwn.net/SubscriberLink/888741/5e43489d7ebeda7f/</a>
</li>
<li>
<em>French Translation :</em>
<a href="//linuxfr.org/users/linkdd/journaux/lwn-une-porte-de-sortie-pour-a-out">https://linuxfr.org/users/linkdd/journaux/lwn-une-porte-de-sortie-pour-a-out</a>
</li>
</ul>
<p>But I've been reminded that content on LWM is copyrighted and I might<br>
have infrighted such copyright. I am sorry for this.</p>
<p>Therefore, I've asked the moderation to unpublish the article, unless<br>
I get your authorization to publish this translation.</p>
</blockquote>
<p>Well, normally we would rather that you wait to translate/publish<br>
articles until after the subscription window is up (one week after the<br>
weekly edition it is published in … April 8 in this case) … after<br>
that, all of our articles are CC BY-SA 4.0 so you can freely translate<br>
them under those terms …</p>
<p>but, in this case, we will grant you permission to publish your<br>
translation with a link (subscriber link as you have above is fine) and<br>
credit it to Jonathan Corbet and LWN …</p>
<p>thanks,</p>
<p>jake</p>
</blockquote>
<p>Merci à l'équipe de LWN pour sa rapidité et sa compréhension.</p>
<div><a href="https://linuxfr.org/users/linkdd/journaux/lwn-une-porte-de-sortie-pour-a-out-63380a9d-20e0-44de-979d-74afcb6f3910.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127278/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/linkdd/journaux/lwn-une-porte-de-sortie-pour-a-out-63380a9d-20e0-44de-979d-74afcb6f3910#comments">ouvrir dans le navigateur</a>
</p>
David Delassushttps://linuxfr.org/nodes/127278/comments.atomtag:linuxfr.org,2005:Diary/393362020-09-13T15:56:17+02:002020-09-13T15:56:17+02:00Python, Lies and Video FilesLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-">▶</a></li>
<li><a href="#toc----">■ ⏪ ■ ▶</a></li>
<li><a href="#toc-----1">■ ⏩ ■ ▶</a></li>
<li><a href="#toc--1">⏸</a></li>
<li><a href="#toc--">▶ ⏺</a></li>
<li><a href="#toc--2">⏸</a></li>
</ul>
<p><em>Attention: ami lecteur, ce journal est très long, contient des termes en anglais, et les noms d'éditeurs et de logiciels propriétaires ont été traduits plus ou moins littéralement, parce que ça m'amuse.<br>
Le titre de ce journal est <a href="https://en.wikipedia.org/wiki/Sex,_Lies,_and_Videotape">inspiré d'un titre de film</a> célèbre, et je n'affirme nullement que qui que ce soit ait menti dans l'histoire qui suit.</em></p>
<h2 id="toc-">▶</h2>
<p>Je bosse dans le monde des <a href="https://fr.wikipedia.org/wiki/M%C3%A9dias_de_masse">médias</a>, dans un secteur plutôt informatisé nommé la <a href="https://fr.wikipedia.org/wiki/postproduction" title="Définition Wikipédia">postproduction</a> qui est, en très gros, tout ce qui se passe après un tournage et avant une diffusion: acquisition, <a href="https://fr.wikipedia.org/wiki/Montage_vid%C3%A9o">montage</a>, une partie des <a href="https://fr.wikipedia.org/wiki/Effets_visuels">VFX</a>, <a href="https://en.wikipedia.org/wiki/Color_grading">étalonnage vidéo</a>, <a href="https://fr.wikipedia.org/wiki/Mixage_audio">mixage audio</a>, etc. Avec la "convergence des médias", nous fournissons potentiellement des services à tout le monde, mais, dans la pratique, ça se limite presque uniquement aux gens de la TV, les personnes de la radio ayant des besoins assez différents, et celles du Web snobant toutes les autres (humour). Nous gérons également la diffusion des sujets des émissions TV en direct lorsque cette diffusion a lieu sur notre site géographique, pour des raisons pratiques. Les moyens de diffusion depuis les cars-régies en déplacement sont fournis par d'autres équipes. Inutile de préciser que tout est à 1000000% propriétaire.</p>
<p>Mon domaine, c'est la postproduction audio, particulièrement—mais pas uniquement—l'enregistrement et le mixage son, que je nommerai simplement "mixage" par la suite.</p>
<p>Voici quelque temps, nous sommes passés de la version "A" d'un logiciel de montage vidéo propriétaire bien connu—appelons-le Boue Première—à la version "B". Il se trouve que le mixage doit pouvoir importer les fichiers <a href="https://fr.wikipedia.org/wiki/Advanced_Authoring_Format">AAF</a> exportés par ce logiciel de montage, et qu'il semble y avoir eu des changements à ce niveau.</p>
<h2 id="toc----">■ ⏪ ■ ▶</h2>
<p>Nous employons un <a href="https://fr.wikipedia.org/wiki/Enterprise_service_bus">bus d'entreprise</a> qui sert de lien entre tous les îlots technologiques—le montage vidéo et le mixage audio, par exemple. L'échange de données se fait par-dessus ce bus à l'aide de connecteurs, dont celui qui équipe mon périmètre a été développé par l'équipe d'intégration. Ce connecteur établit le lien entre le bus et notre logiciel de mixage audio désormais vieillissant, que nous appellerons Belle Lumière.</p>
<p>Belle Lumière a deux vilains défauts. Premièrement, il est sale: si on lui permet d'accéder à un répertoire en écriture, il va y écrire des fichiers partout, comme <a href="https://fr.wikipedia.org/wiki/Thumbs.db">certains</a> <a href="https://fr.wikipedia.org/wiki/.DS_Store">systèmes</a> connus. Deuxièmement, il a un comportement erratique lorsqu'il n'a pas accès en écriture à tous les répertoires d'un volume désigné comme accessible en écriture. Il a donc été décidé qu'il serait limité à un partage précis du stockage centralisé de la postproduction, dans lequel tous les répertoires lui seraient accessibles en écriture. L'ennui, c'est qu'il doit pouvoir accéder aux médias qui sont situés hors de ce partage, et qu'il a donc fallu créer des liens symboliques côté serveur pour qu'il puisse accéder à ça et à rien d'autre. En très simplifié, du point de vue d'une station de montage sous Fenêtres, on a donc quelque chose comme ceci:</p>
<pre><code>Z: (\\stockage\postproduction)
|-- partage
|
|-- medias <..........
|-- mixage :
| :
|-- medias (symlink)..
|-- projets
|-- montage
|
|-- projets
</code></pre>
<p>Et du point de vue d'une station de mixage, également sous Fenêtres:</p>
<pre><code>Z: (\\stockage\postproduction\mixage)
|
|-- medias (symlink)
|-- projets
</code></pre>
<p>C'est là que AAF s'est montré plus ennuyeux que d'habitude.</p>
<p>AAF, il faut voir ça comme un historique de la postproduction: on y trouve des <em>timelines</em>, des clips, des transitions… Les médias<sup id="fnref1"><a href="#fn1">1</a></sup> peuvent y être imbriqués ou être des références à des fichiers externes. C'est le second cas qui est employé chez nous. Mais voilà, les chemins renseignés dans le AAF sont fort logiquement fonction de la machine qui a servi à le concevoir. Or, le montage accède au partage racine, et un média <code>fubar.mxf</code> aura pour lui le chemin <code>Z:\partage\medias\fubar.mxf</code>, alors que Belle Lumière doit y accéder en suivant le lien symbolique <code>Z:\medias</code>, ce qui donne pour chemin absolu <code>Z:\medias\fubar.mxf</code>. Pour Belle Lumière, les fichiers renseignés dans le AAF sont donc simplement introuvables.</p>
<p>Vous me direz, pourquoi ne pas imbriquer les médias? Simplement parce que ça prend plus longtemps lorsqu'on veut juste mettre à jour un petit bout de son: il faut alors effectuer une nouvelle restitution du son <strong>et</strong> de la vidéo, et imbriquer le tout dans le AAF<sup id="fnref2"><a href="#fn2">2</a></sup>. Quand on produit un journal télévisé, ça n'est pas acceptable. La place occupée sur le stockage aurait également une fâcheuse tendance à croître.</p>
<p>Pour pallier ce nouveau problème, l'équipe d'intégration a écrit un autre outil, à l'aide du <a href="http://aaf.sourceforge.net/">SDK de référence AAF</a>, qui serait <em>Open Source</em><sup id="fnref3"><a href="#fn3">3</a></sup> (le choix du vocabulaire est le leur). Malheureusement, AAF, c'est apparemment du <a href="https://en.wikipedia.org/wiki/COM_Structured_Storage">Structured Storage</a> auquel on accède à l'aide dudit SDK via <a href="https://fr.wikipedia.org/wiki/Component_Object_Model">COM</a>. Ce n'est pas bien différent d'un fichier de la suite Microsoft Office, autrement dit une sorte de base de données d'objets <a href="https://fr.wikipedia.org/wiki/S%C3%A9rialisation">sérialisés</a> dans un fichier plat. Seuls les types des objets et leurs relations diffèrent. Ce SDK est relativement compliqué, mal documenté, a 20 ans, doit être <em>patché</em> pour compiler avec un compilateur moderne, et on attend toujours certains exemples d'utilisation évoqués en 2004. Sous GNU/Linux, une implémentation minimale de COM est fournie avec le SDK. C'est déjà ça.</p>
<p>Quoi qu'il en soit, l'équipe d'intégration a écrit un outil qui a le mérite de fonctionner, en C#—ce qui rend peut-être l'emploi de COM moins pénible—et qui modifie les chemins dans les AAF afin que Belle Lumière puisse trouver ses petits. Dans le même temps, parce que Belle Lumière ne tolère la présence que d'une seule piste vidéo dans un projet, l'outil supprime toutes les pistes vidéos du AAF, et en insère une nouvelle qui contient une référence à la vidéo issue du montage. On passe de quelque chose comme ça:</p>
<pre><code>[v3][effet] [effet]
[v2][ réf.1 ] [ réf.3 ][ réf.4 ]
[v1] [ réf.2 ]
</code></pre>
<p>A quelque chose comme ça:</p>
<pre><code>[v1][réf.1 vers la vidéo restituée exportée par Boue Première]
</code></pre>
<h2 id="toc-----1">■ ⏩ ■ ▶</h2>
<p>Passage à la version "B" de Boue Première, donc.</p>
<p>Depuis, certains des projets ouverts dans Belle Lumière sont vides. Rien n'est présent selon lui: ni <em>timeline</em>, ni référence vers le moindre média; comme si le fichier AAF ne contenait rien, alors que le monteur vidéo a bien exporté quelque chose. Catastrophe, mais qu'à cela ne tienne: après quelques semaines et beaucoup de grincements de dents, l'équipe d'intégration nous donne une nouvelle version de son outil, contournant le problème qui serait dû à des pistes de longueur nulle exportées par Boue Première. Désormais, le montage exporte donc un AAF qui ne contient que des références aux clips vidéos (qui sont toujours remplacées par une unique référence comme décrit ci-dessus), et un <a href="https://fr.wikipedia.org/wiki/Open_Media_Framework_Interchange">OMF</a> qui contient des références aux sons. OMF, c'est un peu l'ancêtre de AAF, mais il se limite au son et est encore plus mal documenté. Au moins, on peut tout importer manuellement en cas de problème, ce qui n'était pas le cas avec les AAF fournis depuis la mise à jour du montage.</p>
<p>Fantastique, c'est donc réglé! En fait non. Contrairement à AAF, OMF ne contient pas de <a href="https://fr.wikipedia.org/wiki/Timecode_(temporel)">timecode</a> source: il débutera donc là où vous le placerez sur votre <em>timeline</em>. Quand il y a du son dès le début du projet—ce qui est très fréquent—ça ne se remarque pas. Quand il n'y a pas de son au début du projet, et que le connecteur cale tout au même <em>timecode</em>, la vidéo et le son… ne sont plus synchrones.</p>
<p>Au lieu d'avoir une <em>timeline</em> comme ça:</p>
<pre><code>[v1][ vidéo ]
[a1] [audio 1] [audio 3]
[a2] [audio 2]
</code></pre>
<p>On se retrouve avec ça:</p>
<pre><code>[v1][ vidéo ]
[a1][audio 1] [audio 3]
[a2] [audio 2]
</code></pre>
<p>La solution? Jusqu'à présent, aucune, si ça n'est synchroniser à la main. Pour une grosse production où plusieurs jours sont dédiés au mixage son, il suffit que l'ingénieur du son s'entretienne avec le monteur pour savoir à quel moment débute le son. Pour des productions où il faut aller très vite, comme un journal télévisé où le mixage audio d'un sujet se termine parfois 30 secondes avant son passage à l'antenne, c'est impensable.</p>
<p>Après une petite discussion, il nous a été expliqué que le problème viendrait de Boue Première, dont les AAF seraient "foireux" et dont on ne parviendrait pas à lire certaines métadonnées.</p>
<p>Sceptique et curieux de nature, j'ai commencé à me renseigner sur AAF et, après m'être arraché les cheveux, j' ai vaguement compris l'agencement employé par Boue Première, même s'il reste très nébuleux. En tout cas, je le comprends suffisamment pour tenter de répliquer le travail de l'équipe d'intégration afin de voir si je bute sur le même problème.</p>
<h2 id="toc--1">⏸</h2>
<p>C'est là que je me suis rendu compte de l'absence de documentation et d'exemples du SDK de référence. En particulier, il n'existe pas vraiment d'exemple fonctionnel montrant comment créer une <em>timeline</em> vidéo référençant simplement un fichier externe. L'intégrer au AAF, oui. Le référencer, non. L'exemple le plus proche concerne le référencement d'un fichier wav. Je me suis donc dit que l'intégration était partie de ça, mais pour référencer des fichiers de la sorte, il faut les greffons du SDK, qui sont fournis avec le reste du code, mais qui sont absents de l'installation de l'outil développé en interne. Sans ces greffons, et sans les avoir initialisés, il n'est pas possible de référencer ou d'intégrer des médias: on obtient systématiquement une erreur <em>invalid codec</em>. Ce n'est donc pas la méthode employée par nos intégrateurs.</p>
<p>En fouillant un peu, je me rends compte que notre outil crée des fichiers XML qui correspondent aux fichiers AAF. Le SDK fournit justement un outil de transformation vers et depuis XML. J'imagine donc que l'intégration a recours à l'astuce suivante: convertir le AAF en XML, transformer le XML, convertir le résultat en AAF. Elle me soutient que ça n'est pas le cas, mais je soupçonne que le problème de projets vides provienne d'une telle étape, à moins qu'ils n'attaquent directement le <em>Structured Storage</em>, ce que C# rend probablement assez facile… et dangereux. Je ne pourrai en tout cas affirmer que cette transformation est problématique que si je parviens moi-même à traiter les AAF sans rencontrer les mêmes difficultés.</p>
<p>Reste que l'absence de documentation n'aide en rien: même quand je finis par comprendre comment ajouter cette piste vidéo, je ne trouve aucune documentation sur les <a href="https://registry.smpte-ra.org/view/draft/docs/Register%20(Types)/Individual%20Types%20entries%20(EXCEPTIONS%20etc)/">AUID</a> et les <code>typedef</code> des <a href="https://fr.wikipedia.org/wiki/Format_conteneur">conteneurs</a> et <a href="https://fr.wikipedia.org/wiki/Compression_vid%C3%A9o">algorithmes de compression</a> supposés être employés pour décrire les fichiers vidéo que nous produisons. La verbosité et le typage faible de COM me rendent très peu productif. Le temps passe…</p>
<p>Après quelques jours avec ce SDK, j'ai une meilleure compréhension de AAF, je peux modifier les chemins vers les médias, supprimer les pistes vidéo, en ajouter une, mais toujours pas référencer de fichier vidéo. Je me tourne alors vers un projet nettement moins frustrant, à savoir <a href="https://github.com/PixarAnimationStudios/OpenTimelineIO">OpenTimelineIO</a> ("OTIO"), mené par Pixar et particulièrement prometteur… si on n'a pas un grand besoin de AAF. En effet, lors de mes essais, le plugin AAF de OTIO ne permettait pas encore de gérer les transitions, et mes tentatives pour modifier les chemins vers des médias externes se soldaient systématiquement par des <code>MissingReference</code> en lieu et place des <code>NetworkLocator</code> que j'espérais trouver. Pixar n'utilise pas de <em>live action</em>, les AAF sont donc sans doute employés uniquement pour le <a href="https://en.wikipedia.org/wiki/Sweat_box">Sweat Box</a>, qui peut franchement se passer de transitions, on imagine du coup facilement qu'ils ne fassent pas de AAF la priorité (mais <a href="https://github.com/PixarAnimationStudios/OpenTimelineIO/projects/1">le projet</a> est actif).</p>
<p>Dépité, je me suis tourné à contrecœur vers Java et <a href="https://github.com/AMWA-TV/maj">MAJ</a>, développé par l'<a href="https://www.amwa.tv/">AMWA</a> tout comme le SDK AAF. Après l'avoir installé ainsi que ses dépendances—<a href="https://poi.apache.org/">Apache POI</a>, principalement—et ignoré les tests automatiques qui échouent parce qu'ils ne gèrent pas l'heure d'été, je débute par un test très simple afin d'éviter de perdre du temps comme précédemment: ouvrir un AAF et l'enregistrer sans le modifier le moins du monde… et je récolte une <code>StackOverflowError</code> dans une méthode récursive, que mes compétences en Java et mes connaissances de AAF ne me permettent pas de régler rapidement. Peut-être que les AAF en question sont <strong>vraiment</strong> pourris? C'est possible, mais je remarque que Boue Première emploie le même SDK AAF que nous: il a beau être un peu archaïque, il est strict et les fichiers qu'il produit devraient être sémantiquement corrects, à défaut d'avoir un agencement exploitable par Belle Lumière.</p>
<p>Reste alors le dernier espoir: <a href="https://github.com/markreidvfx/pyaaf2">PyAAF2</a>, qui est le moyen via lequel OTIO gère les AAF. PyAAF2 est en pur Python—donc <strong>nettement</strong> plus agréable et expressif que COM—mais n'est pas non plus très documenté, et j'avais déjà tenté de l'employer de manière infructueuse: il butait dans du code de bas niveau, dans la couche FAT, que je ne connais pas non plus. Cependant, son auteur semble <strong>très</strong> bien connaître AAF, et le projet est actif, j'ai donc tenté un <em>git pull</em>… et une mise à jour a été téléchargée, qui semblait avoir corrigé le problème que je rencontrais. Grâce à beaucoup de <code>type(item)</code>, <code>help(item)</code> et <code>dir(item)</code>, je finis par comprendre la structure des AAF exportés par Boue Première. Je peux dès lors la reproduire après avoir supprimé les pistes vidéos, modifié les chemins vers les sons, et surtout ajouté cette fameuse référence vidéo… sans problème. Je peux même ouvrir les AAF résultants dans le relativement strict Conception Magienoire Résoudre de Vinci, alors que ceux générés par notre outil interne mènent immédiatement à un <a href="https://fr.wikipedia.org/wiki/SIGSEGV" title="Définition Wikipédia">SIGSEGV</a>. Sans entrer dans des détails que je ne maîtrise pas, et de mémoire, ça se présente à peu près comme ça:</p>
<pre><code>-- IAAFHeader
-- IAAFDictionary
-- IAAFContentStorage
|-- IAAFMob (vecteur)
</code></pre>
<p>Les <code>IAAFMob</code> peuvent être des <code>IAAFMasterMob</code>, des <code>IAAFSourceMob</code>, des <code>IAAFCompositionMob</code>… mais je ne m'intéresse qu'aux deux derniers.</p>
<pre><code> |-- IAAFSourceMob (vecteur)
|-- IAAFEssenceDescriptor (dont ceux qui m'intéressent sont des IAAFFileDescriptor)
|-- IAAFLocator (vecteur, dont ceux qui m'intéressent sont des IAAFNetworkLocator)
</code></pre>
<pre><code> |-- IAAFCompositionMob (vecteur)
|-- IAAFTimelineMobSlot (vecteur)
|-- IAAFNestedScope
|-- IAAFSequence
|-- IAAFSourceClip (contient des références vers les IAAFSourceMob)
</code></pre>
<h2 id="toc--">▶ ⏺</h2>
<p>Une fois un petit outil de 327 lignes de Python<sup id="fnref4"><a href="#fn4">4</a></sup> écrit dans mon temps libre, j'ai employé <a href="https://en.wikipedia.org/wiki/GNU_parallel">GNU parallel</a> pour l'exécuter sur les quelques centaines de fichiers qui ont posé problème avant la mise en place du correctif. Ils ont tous été copiés et transformés sans encombre. Reste à tester le résultat dans Belle Lumière en présence d'un ingénieur du son. Ça sera au mieux mercredi, télétravail oblige.</p>
<p>Le code est trop long et probablement inutile pour tout le monde sauf moi-même, mais, grâce à Python, on reste dans quelque chose d'une grande simplicité:</p>
<pre><code class="python"><span class="k">class</span> <span class="nc">AAFTransform</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="o">...</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">"AAFTransform"</span>
<span class="k">def</span> <span class="nf">transform</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Using @abstractmethod would be a much better idea</span>
<span class="k">raise</span> <span class="bp">NotImplemented</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">logging</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Running {transform}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">transform</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">transform</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">AAFRemoveVideo</span><span class="p">(</span><span class="n">AAFTransform</span><span class="p">):</span>
<span class="c1"># This class doesn't require too much external code, so let's paste it ;)</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exceptions</span><span class="p">,</span> <span class="n">project_id</span><span class="p">,</span> <span class="n">aaf_file</span><span class="p">,</span> <span class="n">aaf_filepath</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">AAFRemoveVideo</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">project_id</span><span class="p">,</span>
<span class="n">aaf_file</span><span class="p">,</span>
<span class="n">aaf_filepath</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exceptions</span> <span class="o">=</span> <span class="n">exceptions</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">"AAFRemoveVideo"</span>
<span class="k">def</span> <span class="nf">is_removable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slot</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">slot</span><span class="p">,</span> <span class="n">aaf2</span><span class="o">.</span><span class="n">mobslots</span><span class="o">.</span><span class="n">TimelineMobSlot</span><span class="p">)</span>
<span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">slot</span><span class="o">.</span><span class="n">segment</span><span class="p">,</span> <span class="n">aaf2</span><span class="o">.</span><span class="n">components</span><span class="o">.</span><span class="n">NestedScope</span><span class="p">)</span>
<span class="ow">and</span> <span class="s2">"Picture"</span> <span class="o">==</span> <span class="n">slot</span><span class="o">.</span><span class="n">media_kind</span>
<span class="ow">and</span> <span class="n">slot</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">exceptions</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">collect_slots</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mob</span><span class="p">):</span>
<span class="c1"># whenever a slot is popped, all the following slots are</span>
<span class="c1"># shifted down, so we don't increase the index when we find</span>
<span class="c1"># a removable slot, that way everything will fall into place</span>
<span class="n">current_index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">indexes</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">slot</span> <span class="ow">in</span> <span class="n">mob</span><span class="o">.</span><span class="n">slots</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_removable</span><span class="p">(</span><span class="n">slot</span><span class="p">):</span>
<span class="n">indexes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">current_index</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">current_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">indexes</span>
<span class="k">def</span> <span class="nf">remove_slots</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mob</span><span class="p">,</span> <span class="n">indexes</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">indexes</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Removing MobSlot </span><span class="se">\"</span><span class="s2">{s}</span><span class="se">\"</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">s</span><span class="o">=</span><span class="n">mob</span><span class="o">.</span><span class="n">slots</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="n">mob</span><span class="o">.</span><span class="n">slots</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">True</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"Failure while trying to remove a slot."</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">False</span>
<span class="k">def</span> <span class="nf">transform</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">top_mob</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_toplevel</span><span class="p">()</span>
<span class="n">indexes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">collect_slots</span><span class="p">(</span><span class="n">top_mob</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_slots</span><span class="p">(</span><span class="n">top_mob</span><span class="p">,</span> <span class="n">indexes</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">AAFInsertVideo</span><span class="p">(</span><span class="n">AAFTransform</span><span class="p">):</span>
<span class="o">...</span>
<span class="k">class</span> <span class="nc">AAFRelinkAudio</span><span class="p">(</span><span class="n">AAFTransform</span><span class="p">):</span>
<span class="o">...</span>
<span class="k">class</span> <span class="nc">AAFProcessor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="o">...</span>
<span class="k">def</span> <span class="nf">process_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">...</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">copy_and_read_file</span><span class="p">()</span>
<span class="n">transform_ops</span> <span class="o">=</span> <span class="p">[</span><span class="n">AAFRemoveVideo</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">aaf_file</span><span class="p">,</span> <span class="o">...</span><span class="p">),</span>
<span class="n">AAFInsertVideo</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">aaf_file</span><span class="p">,</span> <span class="o">...</span><span class="p">),</span>
<span class="n">AAFRelinkAudio</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">aaf_file</span><span class="p">,</span> <span class="o">...</span><span class="p">)]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">all</span><span class="p">([</span><span class="n">op</span><span class="o">.</span><span class="n">run</span><span class="p">()</span> <span class="k">for</span> <span class="n">op</span> <span class="ow">in</span> <span class="n">transform_ops</span><span class="p">]):</span>
<span class="n">logging</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"One or more transformations didn't go all the way."</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"Oops. I didn't quite catch that."</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">save_and_move_file</span><span class="p">()</span>
<span class="k">if</span> <span class="s2">"__main__"</span> <span class="o">==</span> <span class="vm">__name__</span><span class="p">:</span>
<span class="n">AAFProcessor</span><span class="p">(</span><span class="n">aaf_file_name</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span><span class="o">.</span><span class="n">process_file</span><span class="p">(</span><span class="o">...</span><span class="p">)</span></code></pre>
<p>Je ne prétends pas qu'il s'agisse de bon code, ni qu'il soit idiomatique, mais il est bref, fonctionne, et est relativement extensible.</p>
<p>Ironie du sort, chez nous, Python est considéré comme une sorte de <a href="https://fr.wikipedia.org/wiki/GW-BASIC">GW-BASIC</a> pour Linux, un jouet pour ceux qui ne sont pas de <a href="https://xkcd.com/378/">vrais programmeurs</a>. Ça montre à quel point la télévision est en retard niveau informatique, et ce conservatisme explique peut-être en partie pourquoi elle semble suivre la voie tracée par GW-BASIC vers les tréfonds de la non-pertinence (désolé pour les aficionados de GW-BASIC).</p>
<h2 id="toc--2">⏸</h2>
<p>S'il s'avère que ça fonctionne, il aura été démontré que Boue Première n'est pas la source du problème, mais qu'elle se situe plutôt au niveau du SDK<sup id="fnref5"><a href="#fn5">5</a></sup> ou de l'outil développé en interne. Dans ces deux cas, il reviendra à l'équipe d'intégration de trouver une solution, soit en contournant le bug du SDK, soit en corrigeant le code de son outil.</p>
<p>La suite dans un prochain journal, donc, si j'ai un peu de temps au boulot.</p>
<div class="footnotes">
<hr>
<ol>
<li id="fn1">
<p>Les fichiers vidéo, audio, de sous-titres… <a href="#fnref1">↩</a></p>
</li>
<li id="fn2">
<p>C'est du moins le comportement qui serait induit par le connecteur reliant le montage au bus. <a href="#fnref2">↩</a></p>
</li>
<li id="fn3">
<p>il l'est probablement, mais je n'ai pas eu le courage de lire la licence jusqu'au bout. Elle est lisible à l'adresse <a href="https://github.com/dneg/aaf/blob/master/LEGAL/AAFSDKPSL.TXT">https://github.com/dneg/aaf/blob/master/LEGAL/AAFSDKPSL.TXT</a>. <a href="#fnref3">↩</a></p>
</li>
<li id="fn4">
<p>Selon <a href="https://directory.fsf.org/wiki/Sloccount">SLOCCount</a>. <a href="#fnref4">↩</a></p>
</li>
<li id="fn5">
<p>Douteux, car pratiquement tous les logiciel qui prennent en compte AAF l'utilisent, et il n'a pas beaucoup bougé depuis des années. <a href="#fnref5">↩</a></p>
</li>
</ol>
</div>
<div><a href="https://linuxfr.org/users/cpbx/journaux/python-lies-and-video-files.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/121590/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/cpbx/journaux/python-lies-and-video-files#comments">ouvrir dans le navigateur</a>
</p>
cpbxhttps://linuxfr.org/nodes/121590/comments.atomtag:linuxfr.org,2005:Bookmark/11972020-02-27T13:59:08+01:002020-02-27T14:00:19+01:00VLC et gendarmerie : avec la dernière version, Windows plus nécessaire pour certains formats<a href="https://www.zdnet.fr/blogs/l-esprit-libre/les-gendarmes-et-la-justice-utilisateurs-du-logiciel-libre-vlc-39899783.htm">https://www.zdnet.fr/blogs/l-esprit-libre/les-gendarmes-et-la-justice-utilisateurs-du-logiciel-libre-vlc-39899783.htm</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/119517/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/ysabeau/liens/vlc-et-gendarmerie-avec-la-derniere-version-windows-plus-necessaire-pour-certains-formats#comments">ouvrir dans le navigateur</a>
</p>
Ysabeau 🧶 🧦https://linuxfr.org/nodes/119517/comments.atomtag:linuxfr.org,2005:News/388452018-10-11T09:56:23+02:002018-10-11T12:38:28+02:00mat2 0.4.0Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>mat2 est la nouvelle itération du défunt MAT, une suite logicielle pour nettoyer les métadonnées d’une multitude de formats de fichiers.</p>
<p>La récente sortie de la version 0.4.0 (3 octobre 2018) est l’occasion de faire découvrir ce projet, en deuxième partie de dépêche.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f7069782e746f696c652d6c696272652e6f72672f75706c6f61642f6f726967696e616c2f313533393230313531382e706e67/1539201518.png" alt="Logo de mat2" title="Source : https://pix.toile-libre.org/upload/original/1539201518.png"></p>
</div><ul><li>lien nᵒ 1 : <a title="https://0xacab.org/jvoisin/mat2" hreflang="en" href="https://linuxfr.org/redirect/102861">Site officiel</a></li><li>lien nᵒ 2 : <a title="https://dustri.org/b/mat2-040.html" hreflang="en" href="https://linuxfr.org/redirect/102862">Billet de blog annonçant la 0.4.0</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-une-bonne-histoire">Une bonne histoire…</a></li>
<li><a href="#toc-historique">Historique</a></li>
<li>
<a href="#toc-mat2">mat2 ?</a><ul>
<li><a href="#toc-le-format-pdf">Le format PDF</a></li>
<li><a href="#toc-le-format-ooxml">Le format OOXML</a></li>
<li><a href="#toc-le-reste">Le reste</a></li>
</ul>
</li>
<li><a href="#toc-interface-utilisateur">Interface utilisateur</a></li>
<li><a href="#toc-la-suite">La suite ?</a></li>
</ul>
<h2 id="toc-une-bonne-histoire">Une bonne histoire…</h2>
<p>Un bon article commence souvent par une bonne histoire. <a href="https://www.theregister.co.uk/2012/04/13/fbi_track_anon_from_iphone_photo/">Notre histoire</a> parle d’un petit malin et de sa bande, <em>CabinCr3w</em>, qui ont cru bon d’aller pirater des sites Internet de forces de l’ordre aux États‐Unis. Le tout, afin de laisser fuiter des informations personnelles (identité, adresses et numéros de téléphones) de policiers, mais également de défigurer le site afin de signer leurs forfaits, avec une image d’une femme ne montrant que le haut de son bikini, sous lequel on peut lire « <em>PwNd by w0rmer & CabinCr3w <3 u BiTch’s!</em> ».</p>
<p>Le souci pour nos larrons, c’est que la police a regardé les métadonnées contenues dans la photo, prise avec un iPhone, et y a trouvé des coordonnées GPS, lui permettant d’aller rendre visite au domicile de la femme et d’attraper le malandrin, qui est maintenant en prison.</p>
<h2 id="toc-historique">Historique</h2>
<p>La plupart des fichiers contiennent des métadonnées : images, vidéos, documents bureautiques, torrents, audio, etc., et parfois, on aimerait bien que ça ne soit pas le cas.</p>
<p>C’est pourquoi le projet <a href="https://tails.boum.org">Tails</a> a proposé à un étudiant, dans le cadre du <a href="https://summerofcode.withgoogle.com/">Google Summer of Code</a> 2011, d’écrire un outil permettant de « nettoyer » les fichiers de leurs métadonnées. Le GSoC a été une réussite, donnant naissance au logiciel <em>MAT</em>, pour <em>Metadata Anonymisation Toolkit</em>, empaqueté dans Debian, présent dans Tails, maintenu et utilisé… jusqu’en octobre 2016, où il <a href="https://dustri.org/b/mat-is-currently-on-hold.html">a été annoncé</a> la fin de sa maintenance.</p>
<p>Mais en juin 2018 est <a href="https://dustri.org/b/mat-is-dead-long-live-mat2.html">apparu</a> mat2, le sujet de cet article !</p>
<h2 id="toc-mat2">mat2 ?</h2>
<p>Écrit en Python 3, utilisant des outils d’analyse statique comme <a href="http://mypy-lang.org/">mypy</a> et <a href="https://www.pylint.org/">pylint</a>, et avec une couverture de tests unitaires de 100 %, mat2 est résolument mieux codé et plus robuste que son ancêtre. Tout comme lui, il est disponible sous licence LGPL v3, prend en charge un grand nombre de formats de fichiers (audio, vidéo, bureautique, images, torrent…) et s’échine à en ôter un maximum de métadonnées.</p>
<h3 id="toc-le-format-pdf">Le format PDF</h3>
<p>Par exemple, prenons le <a href="https://fr.wikipedia.org/wiki/Portable_Document_Format">format PDF</a>. Avec ses <a href="https://www.adobe.com/devnet/pdf/pdf_reference.html">spécifications à rallonge</a>, c’est une horreur à gérer : il est possible d’y embarquer du JavaScript, des images, des vidéos, des rendus 3D, de compresser les données, d’en chiffrer d’autres… C’est pour ça que mat2 utilise <a href="https://www.cairographics.org/">Cairo</a> et <a href="https://poppler.freedesktop.org/">Poppler</a>, afin d’effectuer un rendu, page par page, du fichier PDF, sur une surface PNG, pour ensuite rassembler le tout, dans un nouveau fichier. Ainsi, plus aucune métadonnée ne sera présente dans le fichier de sortie. Le côté négatif, c’est qu’il n’est plus possible de sélectionner du texte, le PDF étant maintenant composé d’images. Mais mat2 fournit un mode de nettoyage plus léger, pouvant laisser des métadonnées, mais permettant de sélectionner du texte.</p>
<h3 id="toc-le-format-ooxml">Le format OOXML</h3>
<p>Un autre exemple serait le format <a href="https:/fr.wikipedia.org/wiki/Office_Open_XML">Office Open XML</a> de Microsoft, qui est également un enfer à part entière : bien qu’il y ait le terme <em>Open</em> dedans, personne (pas même Microsoft, dans sa suite Office) ne l’implémente dans sa version stricte. Il s’agit d’un gros tas de fichiers XML, entassés dans une archive ZIP, avec plein de balises, d’attributs, de paramètres, de fichiers, et d’options dans tous les sens, pouvant embarquer une quantité invraisemblable de formats de fichier différents : images, audio, vidéo, polices…</p>
<p>Dans ce cas‐ci, mat2 ne peut pas tricher en demandant à une bibliothèque de faire le rendu pour lui, donc, tout est géré à la main :</p>
<ul>
<li>certains fichiers sont supprimés de manière systématique, comme par exemple <code>word/people.xml</code> ;</li>
<li>certains attributs et balises, comme les <a href="https://blogs.msdn.microsoft.com/brian_jones/2006/12/11/whats-up-with-all-those-rsids/">rsid</a>, sont supprimés ;</li>
<li>les attributs XML sont ordonnés lexicographiquement, car les différents outils permettant de consulter des OOXML (MS Office, Abiword, LibreOffice, OpenOffice…) ont tendance à les écrire dans un ordre bien spécifique ;</li>
<li>les fichiers sont eux aussi ordonnés lexicographiquement dans l’archive ZIP, pour la même raison que ci‐dessus ;</li>
<li>certains fichiers sont conservés ou supprimés suivant leur type <a href="https://fr.wikipedia.org/wiki/MIME" title="Définition Wikipédia">MIME</a> interne, comme défini dans un des fichiers de l’archive faisant office de dictionnaire ;</li>
<li>les révisions sont supprimées ;</li>
<li>les métadonnées propres au format ZIP sont également supprimées ;</li>
<li>certains fichiers ne peuvent pas être supprimés, et doivent contenir du XML valide, pour éviter que la suite Office de Microsoft n’affiche un avertissement lors de l’ouverture du document, ils sont donc réécrits pour ne contenir que le strict minimum.</li>
</ul>
<h3 id="toc-le-reste">Le reste</h3>
<p>Les fichiers torrents utilisent le format <a href="https://fr.wikipedia.org/wiki/Bencode">Bencode</a>, pour lequel il est plus facile d’écrire son propre analyseur XML plutôt que d’en utiliser un déjà disponible en Python 3. Les fichiers audio sont gérés par la ô combien formidable bibliothèque <a href="https://mutagen.readthedocs.io/en/latest/">mutagen</a>, et les images via <a href="https://developer.gnome.org/gdk-pixbuf/">GDK-PixBuf</a>.</p>
<h2 id="toc-interface-utilisateur">Interface utilisateur</h2>
<p>Pour les personnes habituées à la ligne de commande, mat2 propose… une interface en ligne de commande. Mais mat2 est avant tout écrit pour les « gens normaux ». Après le succès mitigé des multiples réécritures d’interfaces graphiques pour la première itération de mat (les seules personnes en ayant dit du bien étaient des personnes malvoyantes), mat2 propose une extension à <em><a href="https://wiki.gnome.org/Apps/Files">Fichiers</a></em> (anciennement Nautilus), le gestionnaire de fichiers du projet GNOME : il suffit maintenant d’un simple clic droit, puis <em>nettoyer</em>, pour supprimer les métadonnées des fichiers sélectionnés !</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6475737472692e6f72672f622f696d616765732f6d6174322f6d6174325f6e617574696c75735f6d656e752e706e67/mat2_nautilus_menu.png" alt="Exemple d’utilisation de l’extension pour Nautilus" title="Source : https://dustri.org/b/images/mat2/mat2_nautilus_menu.png"></p>
<h2 id="toc-la-suite">La suite ?</h2>
<p>Pour la suite, il est probable que d’autres gestionnaires de fichiers bénéficient d’une extension, et que d’autres formats de fichiers soient ajoutés, comme les vidéos ou encore les archives. Les formats de fichiers sont également régulièrement passés au crible, afin de voir s’il subsiste des métadonnées.</p>
</div><div><a href="https://linuxfr.org/news/mat2-0-4-0.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/115466/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/mat2-0-4-0#comments">ouvrir dans le navigateur</a>
</p>
jvoisinNils Ratusznikpalm123ZeroHeureDavy Defaudbubar🦥https://linuxfr.org/nodes/115466/comments.atomtag:linuxfr.org,2005:Diary/366672016-06-17T16:14:58+02:002016-06-17T16:14:58+02:00Playtag : paramètres de lecture audio/vidéo en métadonnéesLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Salut à tous,</p>
<p>J'ai écrit un petit programme nommé <a href="https://github.com/nahoj/playtag">Playtag</a> qui permet de mettre des paramètres de lecture d'un fichier audio ou vidéo (ex : le volume) dans un tag de ce fichier, puis de le lire en appliquant ces paramètres.</p>
<p>Le tag Playtag est une ligne de texte qui contiendra par exemple :</p>
<pre><code>v1; t = 0:26; vol = +3dB
</code></pre>
<p>qui signifie que la lecture commencera à 26 secondes du début du fichier et que le volume sera augmenté de 3 décibels.</p>
<ul>
<li><a href="https://github.com/nahoj/playtag">Playtag sur GitHub</a></li>
</ul><h2 id="motivation">Motivation</h2>
<p>Lors de la lecture d'un fichier audio ou vidéo, un lecteur tel que MPlayer ou VLC expose à l'utilisateur un certain nombre de paramètres : le volume, le fait de ne lire qu'une partie du fichier, etc.</p>
<p>Ces paramètres, s'ils ne concernent qu'un fichier en particulier, doivent être réglés lors de la lecture, à chaque lecture du fichier. S'il veut rendre le paramétrage persistant, l'utilisateur doit éditer le fichier dans une application séparée et le réencoder en un nouveau fichier.</p>
<p>L'édition de fichier audio et vidéo a des inconvénients : elle peut prendre un temps de calcul important et/ou induire une perte de qualité et/ou la perte d'une propriété technique de l'encodage d'origine dont l'utilisateur n'avait pas conscience, et bien sûr elle empêche de revenir à l'original si la modification consiste à tronquer le fichier par exemple.</p>
<p>À l'inverse, le fait de stocker de tels paramètres comme métadonnées, dans les tags d'un fichier, ne nécessite aucun calcul, n'entraine aucune perte de données, et est tout aussi efficace dans certains cas.</p>
<h2 id="et-donc">Et donc ?</h2>
<p><a href="https://github.com/nahoj/playtag#player">Le programme</a> (en Python, sous licence MIT) est un wrapper pour MPlayer et VLC qui permet de lire les fichiers avec (ou sans) tag Playtag en passant au lecteur choisi les paramètres nécessaires. Il intègre aussi des fonctions d'édition du tag en ligne de commande.</p>
<p><a href="https://github.com/nahoj/playtag#tag-format">Le format</a> du tag ne contient pour l'instant que quelques paramètres qui correspondent à mes propres besoins. Le format se veut naturellement ouvert, pour permettre en théorie à quelqu'un qui le souhaite de réaliser une implémentation indépendante compatible, intégrée à un lecteur par exemple.</p>
<p>Commentaires bienvenus :-)</p><div><a href="https://linuxfr.org/users/nahoj/journaux/playtag-parametres-de-lecture-audio-video-en-metadonnees.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/109274/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/nahoj/journaux/playtag-parametres-de-lecture-audio-video-en-metadonnees#comments">ouvrir dans le navigateur</a>
</p>
nahojhttps://linuxfr.org/nodes/109274/comments.atomtag:linuxfr.org,2005:Post/351442015-03-25T12:29:24+01:002015-03-25T12:29:24+01:00Avidemux - Erreur d'ouverture d'un fichier WAV<p>Bonjour !</p>
<p>J'essaye d'utiliser Avidemux pour remplacer le son d'une vidéo. <br>
Lorsque j'ouvre le fichier audio (qui est pourtant au format WAV) en passant par Audio/piste principale, le logiciel n'arrive pas à l'ouvrir : "échec d'ouverture de fichier - ce n'est pas un fichier WAV?"</p>
<p>A quoi cela peut-il etre du ?</p>
<p>Je vous remercie !!!</p><div><a href="https://linuxfr.org/forums/linux-debutant/posts/avidemux-erreur-d-ouverture-d-un-fichier-wav.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/105207/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-debutant/posts/avidemux-erreur-d-ouverture-d-un-fichier-wav#comments">ouvrir dans le navigateur</a>
</p>
zoutalors2015https://linuxfr.org/nodes/105207/comments.atomtag:linuxfr.org,2005:News/359912015-01-02T14:21:33+01:002015-01-02T15:15:11+01:00Je crée mon jeu vidéo E14 : formats de donnéesLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>«Je crée mon jeu vidéo» est une série d'articles sur la création d'un jeu vidéo, depuis la feuille blanche jusqu'au résultat final. On y parlera de tout : de la technique, du contenu, de la joie de voir bouger des sprites, de la lassitude du développement solitaire, etc. Vous pourrez suivre cette série grâce au <a href="//linuxfr.org/tags/gamedev/public">tag gamedev</a>.</p>
<p>Dans l'<a href="//linuxfr.org/news/je-cree-mon-jeu-video-e13-un-an-premier-bilan">épisode 13</a>, on a fait le bilan d'une année de développement. Un des constats était que le temps manquait, et au vu de la durée entre cet épisode-là et celui-ci, on peut dire que c'est toujours le cas. Dans ce nouvel épisode, on va discuter non seulement de formats de données, mais aussi de compilation croisée.</p></div><ul><li>lien nᵒ 1 : <a title="http://www.akagoria.org/" hreflang="en" href="https://linuxfr.org/redirect/92659">Akagoria, la revanche de Kalista</a></li><li>lien nᵒ 2 : <a title="http://linuxfr.org/tags/gamedev/public" hreflang="fr" href="https://linuxfr.org/redirect/92660">le tag gamedev</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<a href="#formats-de-donn%C3%A9es">Formats de données</a><ul>
<li><a href="#%C3%89tat-des-lieux">État des lieux</a></li>
<li><a href="#solution">Solution</a></li>
<li><a href="#quelle-r%C3%A9ponse-au-probl%C3%A8me-global">Quelle réponse au problème global ?</a></li>
</ul>
</li>
<li><a href="#compilation-crois%C3%A9e-pour-windows">Compilation croisée pour Windows</a></li>
<li><a href="#dici-%C3%A0-la-prochaine-fois">D'ici à la prochaine fois</a></li>
</ul><h2 id="formats-de-données">Formats de données</h2>
<h3 id="État-des-lieux">État des lieux</h3>
<p>Actuellement, dans Akagoria, trois formats de données sont gérés directement ou indirectement : XML, Protobuf et YAML. Le terme <a href="http://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Format_de_s%C3%A9rialisation_de_donn%C3%A9es">format de sérialisation de données</a> serait probablement plus approprié, puisque pour chacun de ces formats, il peut y avoir plusieurs dialectes.</p>
<p>Concrètement :</p>
<ul>
<li>
<a href="http://fr.wikipedia.org/wiki/Extensible_Markup_Language">XML</a> est utilisé pour la carte à travers le dialecte TMX, défini par Tiled. J'utilise ma propre bibliothèque, <code>libtmx</code>, pour avoir une vue de la carte indépendante du XML. La bibliothèque utilise elle-même <a href="http://www.grinninglizard.com/tinyxml2/">TinyXML-2</a>.</li>
<li>
<a href="http://fr.wikipedia.org/wiki/Protocol_Buffers">Protocol Buffers</a> est utilisé par le format Nanim de <a href="//linuxfr.org/users/devnewton">devnewton</a>. Dans les dernières versions, Nanimstudio peut exporter les données en JSON plutôt qu'en Protocol Buffers. Actuellement, j'utilise <a href="https://code.google.com/p/protobuf/">protobuf</a> couplée avec l'analyseur lexical généré depuis <code>nanim.proto</code>.</li>
<li>
<a href="http://fr.wikipedia.org/wiki/YAML">YAML</a> est utilisé pour les autres données du jeu, dans des formats que j'ai défini moi-même. J'utilise <a href="https://code.google.com/p/yaml-cpp/">yaml-cpp</a> qui est relativement simple à utiliser. Je l'avais déjà utilisé dans MapMaker avec satisfaction et je préfère ce format à XML car moins verbeux.</li>
</ul><p>Et pour le futur, il y aura sans doute d'autres données à gérer. Par exemple, les dialogues. Dans Andor's Trail, ils sont gérés en JSON. Comme on peut le voir sur un <a href="https://code.google.com/p/andors-trail/source/browse/AndorsTrail/res/raw/conversationlist_erinith.json">exemple</a>, le format gère aussi les récompenses et l'enchaînement des quêtes. On peut aussi penser au format des sauvegardes, au format de la configuration du joueur, etc.</p>
<h3 id="solution">Solution</h3>
<p>La solution serait de n'avoir qu'un seul format de sérialisation, ce qui réduirait le nombre de bilbiothèques utilisées à une seule. Et on voit bien le problème :</p>
<ul>
<li>soit il faut choisir XML puisque c'est celui utilisé par Tiled, ce qui veut dire qu'il faut transformer les autres données en XML. J'imagine déjà la tête de devnewton si je lui dis qu'il me faut un export XML dans NanimStudio.</li>
<li>soit il faut coder un convertisseur depuis les différents formats vers celui choisi, mettons YAML. Dans cette deuxième hypothèse, pour Nanim, on peut utiliser l'export JSON qui est à peu près un sous-ensemble de YAML.</li>
</ul><p>La deuxième hypothèse a d'énormes avantages : pas de dépendance forte à un format externe, facilité de lecture puisque tout se ressemble. Mais elle a aussi quelques inconvénients notables : obligation de redéfinir des dialectes dans le format unique, obligation de réécrire des <a href="http://fr.wikipedia.org/wiki/Analyse_s%C3%A9mantique">analyseurs sémantiques</a> pour ces dialectes. Ces inconvénients sont une variante de la <a href="http://fr.wikipedia.org/wiki/R%C3%A9inventer_la_roue">réinvention de roue</a>.</p>
<h3 id="quelle-réponse-au-problème-global">Quelle réponse au problème global ?</h3>
<p>En fait, il y a une question à laquelle nous n'avons pas répondu : pourquoi s'emmerder avec des formats de fichiers ? Pourquoi ne pas tout coder en dur ? Bonne question. La réponse usuelle est que des données à part permettent de faire des changements sans avoir à recompiler le jeu. En particulier, les données dans des fichiers permettent à des non-informaticiens de pouvoir les manipuler assez facilement. Bon, ça c'est quand on développe un jeu avec des non-informaticiens. Quand on développe un jeu à peu près tout seul, la non-recompilation est un avantage en soi.</p>
<p>Mais surtout quand on fait du libre, on aime les formats ouverts, mais aussi les formats standardisés, parce qu'ils permettent par la suite de créer des outils génériques pour les manipuler. Et ce qui manque le plus dans les jeux libres, ce sont ces formats standardisés. Au final, chacun refait la même chose dans son coin et on n'avance pas. On ne peut pas capitaliser sur un ensemble de formats communs. Et surtout, on n'a aucun outil pour les manipuler.</p>
<p>L'exemple de Tiled est parlant. Le format TMX est à peu près le seul format sur lequel tout le monde s'appuie dans pas mal de jeux libres. Certes il n'est pas parfait, mais son système de propriétés fait qu'on peut lui ajouter des fonctionnalités à peu de frais, tout en restant compatible avec le seul éditeur du format connu jusqu'à présent. Mais est-ce bien suffisant ? La communauté du libre a toujours trouvé les ressources pour pallier ce genre de problème mais dans le cas des jeux vidéos, elle reste assez inerte.</p>
<p>Les grands studios ne développent pas que des jeux, ils développent aussi beaucoup d'outils. Certains moteurs libres de jeux proposent également des éditeurs, mais le problème des formats est toujours posé. Choisir un moteur de jeu, c'est choisir les formats qui vont avec et donc se lier à une technologie en particulier. Ce que je dis sonne un peu comme un <a href="http://fr.wiktionary.org/wiki/yakafokon">yakafokon</a>, parce que standardiser des formats de ce genre relève du parcours du combattant et nécessite une expérience que je suis sans doute très loin d'avoir.</p>
<p>En attendant une solution globale, je peux au moins éliminer Protobuf et utiliser l'export JSON de NanimStudio.</p>
<h2 id="compilation-croisée-pour-windows">Compilation croisée pour Windows</h2>
<p>Après des premiers essais infructueux dûs à des bugs dans les outils de compilation, j'avais mis de côté cet aspect des choses, à savoir fournir un binaire pour Windows. Mais il y a eu des mises à jour, notamment de Ming, et j'ai retenté. J'utilise l'excellent <a href="https://pypi.python.org/pypi/crossroad">crossroad</a> qui a été <a href="//linuxfr.org/news/a-la-croisee-des-chemins-crossroad-environnement-de-cross-compilation">présenté ici-même</a> il y a quelques temps (et qui a changé un peu donc lisez la doc si vous l'utilisez).</p>
<p>Première chose à dire, il faut vraiment s'armer de patience quand on tente ce genre de compilation. Parce qu'on tombe sur des erreurs de compilation qu'on ne trouve pas ailleurs. Alors bon, des fois, c'est tellement cryptique que la seule solution, c'est petit patch en mode « la Rache ». Et dans d'autres cas, c'est tout à fait légitime. Par exemple, le compilateur a l'air plus strict sur les standards. Saviez-vous qu'il n'y avait pas les constantes genre <code>M_PI</code> dans <a href="http://en.cppreference.com/w/cpp/header/cmath"><code><cmath></code></a> ? En fait, elles sont dans les <a href="http://pubs.opengroup.org/onlinepubs/7908799/xsh/math.h.html">spécifications Unix</a> et du coup, quand on les utilise et qu'on veut compiler pour un système non-Unix, ça provoque une erreur de compilation parce que la constante n'existe pas.</p>
<p>Autre chose à prendre en compte, on compile beaucoup de choses. Parce que même s'il y a déjà des paquets disponibles (grâce à OpenSuse), il manque beaucoup de choses. Pour cet essai, j'ai dû recompiler SFML, Box2D, protobuf, tinyxml2 et yaml-cpp. Sans compter mes propres bibliothèques. Il faut faire attention à plein de choses, il faut compiler le strict minimum pour que ça se passe au mieux. Et surtout, on a plein d'avertissements sur des pages et des pages ! Bref, on serre les fesses à chaque commande.</p>
<p>Au final, on se retrouve avec un joli zip de 40 Mio qui contient tous les binaires et les fichiers de développement. Et… Kaboum ! Ça ne marche toujours pas. Bon ben, faute de temps, je retenterai une prochaine fois. Mais je suis assez content de crossroad. Il fait exactement ce qu'on attend de lui et il aide juste ce qu'il faut pour la compilation croisée.</p>
<h2 id="dici-à-la-prochaine-fois">D'ici à la prochaine fois</h2>
<p>N'oubliez pas que le week-end du 23 au 25 janvier 2015 a lieu la <a href="http://globalgamejam.org/">Global Game Jam</a>. C'est un exercice amusant, et il y a de plus en plus de sites <a href="http://globalgamejam.org/2015/jam-sites?title=&country=FR&locality=">partout en France</a>, n'hésitez pas à y faire un tour. Personnellement, je serai à Besançon, avec mes étudiants qui organisent le site.</p></div><div><a href="https://linuxfr.org/news/je-cree-mon-jeu-video-e14-formats-de-donnees.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/104361/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/je-cree-mon-jeu-video-e14-formats-de-donnees#comments">ouvrir dans le navigateur</a>
</p>
rewindNils RatusznikBenoît Sibaudpalm123https://linuxfr.org/nodes/104361/comments.atomtag:linuxfr.org,2005:Diary/354532014-12-08T16:45:00+01:002014-12-08T16:45:00+01:00Nouveau format d'image BPGLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Fabrice Bellard a écrit un <a href="http://bellard.org/bpg/">nouveau format d'image BPG</a> basé sur la norme vidéo <a href="https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding">HEVC</a> (H.265). Cette nouvelle norme a été finalisée il y a 2 ans : <a href="//linuxfr.org/news/h-265-est-finalise">H.265 est finalisé</a>, cet article présente les principales évolutions par rapport à H.264. Je note surtout "<em>La fin des macro-blocs pour un découpage des pixels adapté à chaque fonction</em>" qui se voit sur les galleries BPG. Le codec vidéo <a href="https://en.wikipedia.org/wiki/X265">x265</a> implémente cette norme qui produit des vidéos plus compactes.</p>
<p>Le format BPG compresse mieux que JPEG, voir le comparatif d'une photo de référence ("Lena") : <a href="http://bellard.org/bpg/lena.html">BPG/JPEG comparison on the Lena picture</a>. Le format supporte la transparence et la compression sans perte : <a href="http://bellard.org/bpg/gallery2.html">BPG examples with alpha channel</a>.</p>
<p>Fabrice Bellard nous ayant déjà démontré ses talents de développeurs Javascript avec une implémentation de Qemu en Javascript (<a href="http://bellard.org/jslinux/">jslinux</a>), il a écrit un décodeur BPG en Javascript (notamment utilisé sur le site de BPG).</p>
<p>Côté technique, BPG semble être au top : jusqu'à 14 bits par canal de couleur, meilleurs résultats dans un comparatif de compression sans perte, etc. Lire le site BPG pour plus d'information.</p>
<p>Le secteur des codecs vidéo est très concurrentiel et férocement protégé par des brevets. HEVC n'est pas exempt de brevet : il faut à priori acquérir une licence pour utiliser la norme, lire <a href="https://finance.yahoo.com/news/mpeg-la-offers-hevc-patent-182200249.html">MPEG LA Offers HEVC Patent Portfolio License</a>. D'ailleurs, le site de BPG indique que certains algorithmes de HEVC peuvent être protégés par des brevets dans certains pays. Il est conseillé d'utiliser du matériel implémentant ce codec pour utiliser BPG dans ce cas (le site indique que le support matériel de HEVC est courant, ah bon ?).</p>
<p>libbpg et bpgenc sont distribués sous la licence LGPL (la partie FFmpeg est sous licence LGPL, la partie spécifique BPG sous licence BSD). bpgenc est distribué sous la license BSD. (Euh, on dirait que bpgenc est distribué sous LGPL <strong>et</strong> BSD ? le README n'est pas clair).</p><div><a href="https://linuxfr.org/users/vstinner/journaux/nouveau-format-d-image-bpg.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/104177/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/vstinner/journaux/nouveau-format-d-image-bpg#comments">ouvrir dans le navigateur</a>
</p>
Victor STINNERhttps://linuxfr.org/nodes/104177/comments.atomtag:linuxfr.org,2005:Post/345462014-10-24T22:49:36+02:002014-11-08T23:25:11+01:00Format de fichier de recette ?<p>Bonjour,</p>
<p>J'ai beaucoup trop de recettes de cuisine sous format papier, ce n'est pas toujours pratique, en particulier pour les partager.<br>
C'est pourquoi j'ai eu l'idée d'entreprendre de les retranscrire numériquement.</p>
<p>Et tant qu'à faire autant que ce soit dans un format de fichier ouvert facilement parsable afin que, dans un futur quelconque, les gens puissent s'échanger des recettes en envoyant un simple fichier ".cook". Le fichier pourrait être facilement localisable, on pourrait les passer du français à l'anglais en passant par le russe en utilisant un dictionnaire contenant le bon vocabulaire et les unités seraient convenablement converties.</p>
<p>On pourrait imaginer que les utilisateurs auraient un logiciel s'appelant <s>Song</s> Cook Bird et voudraient importer/exporter leur recette, les noter, les commenter et même utiliser du "versionning" (comment dit-on en français ?) pour les forker, les ajuster etc.</p>
<p>Du coup je me demandais: </p>
<p>En fait, est-ce que ça existe pas déjà ?</p>
<p>Je vous le demande aussi.</p>
<h4 id="update-1">Update 1</h4>
<p>Après une petite réflexion :</p>
<ul>
<li>Un seul fichier identifiable avec une extension (ex: marecette.cook).</li>
<li>Avec un container (pour pouvoir mettre un ou plusieurs fichiers texte, et une ou plusieurs images).</li>
<li>Format de fichier en claire, non compressé, pour qu'il puisse très très facilement être manipulé. Il n'y aurait pas un équivalent du ".tar" en native sur tous les systèmes ?</li>
<li>Sans mise en page prédéfinie. On veut juste une succession d'éléments (sans réelle ordre) comme : titre -> image -> liste d'ingrédient -> image -> préparation, etc.</li>
<li>Une seule recette (plusieurs préparations possibles, comme pâte/nappage/etc), et non un album de recettes.</li>
</ul><div><a href="https://linuxfr.org/forums/programmationautre/posts/format-de-fichier-de-recette.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/103729/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmationautre/posts/format-de-fichier-de-recette#comments">ouvrir dans le navigateur</a>
</p>
Muchachohttps://linuxfr.org/nodes/103729/comments.atomtag:linuxfr.org,2005:Post/343542014-09-03T10:37:05+02:002014-09-03T17:46:53+02:00[ Résolu] RAccourcis couleur police sous Openoffice<p>Bonjour à tous,<br>
J'utilise Open Office 3.5.7.2 sur un mini ordinateur portable Linux (je serai incapable de vous donner le nom de la version que j'utilise). </p>
<p>Comme je l'utilise pour mes cours de droit, j'ai souvent besoin de changer de couleurs de police. <br>
Pour cela, j'ai vu qu'on pouvait créer des raccourcis clavier, mais aussi des raccourcis dans le menu outils, qui permet de gagner du temps. <br>
C'est surtout ces raccourcis outils qui m'intéressent : j'aimerais créer un "bouton" rouge, un vert, un bleu et un noir. <br>
Seulement voilà j'ai su créer ces raccourcis, mais à coté de chacun d'eux apparaît un pourcentage. Je ne sais pas à quoi il correspond car même quand je mets 100% , rien ne se passe, la couleur de la police ne change pas…(CF image jointe ici <a href="http://hpics.li/18a5691">http://hpics.li/18a5691</a>) </p>
<p>C'est assez désespérant de savoir qu'une astuce qui puisse me faciliter la vie existe, mais que je n'arrive pas à l'installer.</p>
<p><strong>Pourriez-vous m'aider svp?<br>
C'est assez urgent car les cours reprennent sur les chapeaux de roue!<br>
Merci d'avance !</strong> </p><div><a href="https://linuxfr.org/forums/linux-general/posts/resolu-raccourcis-couleur-police-sous-openoffice.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/103179/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-general/posts/resolu-raccourcis-couleur-police-sous-openoffice#comments">ouvrir dans le navigateur</a>
</p>
Yourkihttps://linuxfr.org/nodes/103179/comments.atomtag:linuxfr.org,2005:News/355432014-07-17T11:01:06+02:002014-07-17T11:01:06+02:00Simplification des démarches administrativesLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Jusqu'au 15 septembre 2014, on peut proposer des idées pour simplifier les démarches administratives. C'est l'occasion de proposer des idées qui peuvent faire avancer le Libre.</p>
<p>On peut par exemple suggérer de ne plus proposer le téléchargement du lecteur PDF d'Adobe Reader sur les sites Web des administrations mais des lecteurs PDF libres. Si vous avez d'autres idées pour faire progresser le libre, les formats ouverts, l'interopérabilité, l'accessibilité des sites Web, l'Open Data… il suffit de faire une proposition en tant que particulier ou entreprise. Chaque proposition est ensuite acceptée ou rejetée. Si elle est rejetée, vous pouvez quand même faire un commentaire (non soumis à modération).</p>
<p>Si vous avez posté une proposition ou si vous avez des idées, merci de les noter sur le Pad (éventuellement avec le lien vers votre proposition lorsqu'elle a été validée). La FSFE pourra ainsi faire un suivi des propositions.</p></div><ul><li>lien nᵒ 1 : <a title="http://www.faire-simple.gouv.fr/" hreflang="fr" href="https://linuxfr.org/redirect/91080">Faire une proposition</a></li><li>lien nᵒ 2 : <a title="http://lite4.framapad.org/p/faire-simple.gouv.fr" hreflang="fr" href="https://linuxfr.org/redirect/91081">Le Pad pour le suivi par la FSFE</a></li><li>lien nᵒ 3 : <a title="http://www.goall.fr/simplification-demarches-administratives-choc" hreflang="fr" href="https://linuxfr.org/redirect/91082">L'article sur le site de l'association GOALL</a></li></ul><div></div><div><a href="https://linuxfr.org/news/simplification-des-demarches-administratives.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/102789/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/simplification-des-demarches-administratives#comments">ouvrir dans le navigateur</a>
</p>
ScoubidouNÿcohttps://linuxfr.org/nodes/102789/comments.atomtag:linuxfr.org,2005:Diary/344952013-11-14T18:09:14+01:002013-11-14T18:09:14+01:00TVA réduite uniquement sur les livres numériques vendus dans des formats ouverts ?Licence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr<p>Les députés écologistes ont déposé <a href="http://www.assemblee-nationale.fr/14/amendements/1395C/AN/22.asp">un amendement</a> au projet de loi de financement 2014 visant à ne pas appliquer la TVA réduite de 5,5% sur les livres numériques « comport[a]nt des mesures techniques de protection […] ou s'il ne sont pas dans un format de données ouvert[…]. ».</p>
<p>Vous allez me dire que cet amendement a juste le mérite d'exister, mais se fera bouler en moins de 2. Et bien figurez-vous que… il vient de passer ! Et ce, malgré l'avis défavorable du rapporteur et du gouvernement.</p>
<p>Pour info, cela deviendra applicable au 1 janvier 2015, pour se coordonner avec la date à partir de laquelle la TVA sera payée dans le pays de l'acheteur et non plus dans le pays du vendeur (cf. l'exposé sommaire de l'amendement)</p>
<ul>
<li><a href="http://www.assemblee-nationale.fr/14/textes/1395C.asp#D_Article_55">Article 55 du PLF 2014</a></li>
<li><a href="http://legifrance.gouv.fr/affichCode.do;jsessionid=90703352007CBFD468C504EBE8A2D941.tpdjo08v_3?idSectionTA=LEGISCTA000006191654&cidTexte=LEGITEXT000006069577&dateTexte=20131114">Article du Code Général des Impôts parlant du taux réduit pour les livres</a></li>
</ul><div><a href="https://linuxfr.org/users/windu2b/journaux/tva-reduite-uniquement-sur-les-livres-numeriques-vendus-dans-des-formats-ouverts.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/100349/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/windu2b/journaux/tva-reduite-uniquement-sur-les-livres-numeriques-vendus-dans-des-formats-ouverts#comments">ouvrir dans le navigateur</a>
</p>
windu.2bhttps://linuxfr.org/nodes/100349/comments.atom