Warning: Input PNG does not have an 8 bit input depth

Lors du packaging d’une application, XCode vérifie les caractéristiques des images embarquées avec l’application. En interactif on ne voit rien, mais lorsque l’on scripte les opérations de fabrication, ce type de messages apparaît :

CopyPNGFile build/Release-iphoneos/Ipad.app/interview-frP05-100-2.png Ipad/Images/Interview/Portrait/100/interview-frP05-100-2.png 
libpng warning: Warning: Input PNG does not have an 8 bit input depth. Please convert your PNG to 8-bit for optimal performance on iPhone OS

Si on regarde d’un peu plus près on se rend compte que les images concernées sont toutes du même type.

L’application contient un entretien “PDF” zoomable stocké sous forme d’images 2048×1538. Pour améliorer les performances à l’affichage ces images ont été découpées en tuiles. Au zoom maximal, certaines zones sont assez vides ou monochromes, en particulier les bords d’images.

Les images sont découpées avec ImageMagick. Un examen des images avec warning montre qu’elles n’ont pas les mêmes caractériques que les images qui ne causent pas d’erreur.

Une image sans erreur

identify -verbose Ipad/Images/Interview/Landscape/100/interview-frL02-100-13.png Image: IpadCorporate/Images/Essentiel/Interview/Landscape/100/interview-frL02-100-13.png
  Format: PNG (Portable Network Graphics)
  Class: DirectClass
  Geometry: 256x256+0+0
  Resolution: 72x72
  Print size: 3.55556x3.55556
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: RGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit

L’image la plus à gauche, qui ne contient quasiment que tu texte en gris est en GrayScale 

identify -verbose Ipad/Images/Interview/Portrait/100/interview-frP01-100-1.png Image: IpadCorporate/Images/Essentiel/Interview/Portrait/100/interview-frP01-100-1.png
  Format: PNG (Portable Network Graphics)
  Class: PseudoClass
  Geometry: 256x256+0+0
  Resolution: 72x72
  Print size: 3.55556x3.55556
  Units: Undefined
  Type: Grayscale
  Base type: Grayscale
  Endianess: Undefined
  Colorspace: Gray
  Depth: 8-bit
  Channel depth:
    gray: 8-bit

Certaines autres images sont en Bilevel (Black & White) 

identify -verbose Ipad/Images/Interview/Landscape/100/interview-frL02-100-32.png Image: IpadCorporate/Images/Essentiel/Interview/Landscape/100/interview-frL02-100-32.png
  Format: PNG (Portable Network Graphics)
  Class: PseudoClass
  Geometry: 256x256+0+0
  Resolution: 72x72
  Print size: 3.55556x3.55556
  Units: Undefined
  Type: Bilevel
  Base type: Bilevel
  Endianess: Undefined
  Colorspace: Gray
  Depth: 8/1-bit
  Channel depth:
    gray: 1-bit

ImageMagick cherche le format le plus adapté ce qui revient parfois à transformer l’image en niveaux de gris voir en Noir et Blanc si elle n’a pas de contenu.

Une première solution

J’ai d’abord tenté de forcer la profondeur à 8-bits avec la syntaxe png8:nom-fichier

convert interview-frP01-100.png -crop 256x256 +repage +adjoin png8:interview-frP01-100-%d.png

Cette option supprime bien les warnings mais ne rend pas un très bon résultat. Sur l’image réassemblée, le dégradé sur le fond est remplacé par un effet psychédélique assez laid.

L’image est postérisée car le nombre de couleurs est réduit.

identify -verbose generated_images/Interview/Portrait/100/interview-frP01-100-10.png Image: generated_images/Interview/Portrait/100/interview-frP01-100-10.png
  Format: PNG (Portable Network Graphics)
  Class: PseudoClass
  Geometry: 256x256+0+0
  Resolution: 72x72
  Print size: 3.55556x3.55556
  Units: Undefined
  Type: Palette
  Endianess: Undefined
  Colorspace: RGB
  Depth: 8/4-bit
  Channel depth:
    red: 4-bit
    green: 4-bit
    blue: 4-bit

Ceci dit cette option marche bien sur un autre jeu de tuiles qui ne contient que des images monochromes.

La solution correcte

J’ai ensuite tenté diverses options (-depth, -colorspace, -type, -define png:bit-depth). En fait, CopyPNGFile semble rejeter le colorscale Gray mais je n’ai pas réussi à convaincre ImageMagick de ne pas changer le colorscale des tuiles très simples.

L’issue est dans le pngN: mais il faut lui donner les bonnes valeurs.

Le build veut 8 bits par canal de couleur.

Les images en RGB (Red Green Bleu le color scale le plus courant) comportent 3 canaux :
  • un qui contient la valeur du rouge,
  • un qui contient la valeur du vert (Green)
  • et un qui contient la valeur du bleu.

Chaque pixel est codé sur 8 bits soit une valeur entre 0 et 255. La combinaison de la valeur de chaque canal produit la couleur souhaitée parmi 16 millions de couleurs (256x256x256).

Pour les images transparentes, elles comportent un quatrième canal, le canal alpha, qui indique la transparence du pixel.

Si on veut 8 bits par canal il faut indiquer png24 (3×8) pour une image sans transparence, ou png32 (4×8) pour une image avec un canal alpha.

convert interview-frP01-100.png -crop 256x256 +repage +adjoin png24:interview-frP01-100-%d.png

Cette option supprime les warnings et ne dégrade pas l’image.

L’image de gauche en niveau de gris devient

identify -verbose Ipad/Images/Interview/Portrait/100/interview-frP01-100-1.png Image: IpadCorporate/Images/Essentiel/Interview/Portrait/100/interview-frP01-100-1.png
  Format: PNG (Portable Network Graphics)
  Class: DirectClass
  Geometry: 256x256+0+0
  Resolution: 72x72
  Print size: 3.55556x3.55556
  Units: Undefined
  Type: Grayscale
  Base type: Grayscale
  Endianess: Undefined
  Colorspace: RGB
  Depth: 8-bit
  Channel depth:
    gray: 8-bit

et la plupart des images ressemblent à ce qui suit

identify -verbose Ipad/Images/Interview/Portrait/100/interview-frP01-100-10.png Image: IpadCorporate/Images/Essentiel/Interview/Portrait/100/interview-frP01-100-10.png
  Format: PNG (Portable Network Graphics)
  Class: DirectClass
  Geometry: 256x256+0+0
  Resolution: 72x72
  Print size: 3.55556x3.55556
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: RGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit

Voici les slides de la présentation que j’ai faite au Geneva JUG à Genève et au JUGL à Lausanne.

L’enregistrement fait au JUGL est en ligne sur parleys http://www.parleys.com/#st=5&id=2695&sl=3

badge softshake speakerJ’anime un ateliersur la mise en place d’une usine logicielle à SoftShake lundi après midi.Cet atelier montrera comment mettre en place un projet XCode, faire du TDD avec OCUnit, mettre en place le repo Git; faire un makefile, l’intégrer dans Jenkins et déployer Over the Air via une
Si vous voulez pouvoir coder en même temps sur votre machine , voici les pré-requis.Pas de pré-requis pour participer en auditeur.Pour coder et faire du TDD
- Mac OS X 10.6
- XCode 4
- un peu connaître Objective-CPour la partie intégration avec le repo Git et le makefile
- XCode 4 avec les outils en ligne de commande (dev tools ou system tools selon les versions)
- rake avec les gems json et plist (sudo gem install json plist)
- git et gitx
- avoir un compte github ou un autre repo git accessible en lecture
par tous (pour le CI)
- si possible cloner https://github.com/ValtechTechno/ios-software-factoryLe reste de l’usine (Jenkins, Mobile Store) est trop long a mettre en place en atelier. Tous les éléments de l’usine logicielle et des informations de mise en oeuvre sont partagés sur le github de Valtech, team iOS https://github.com/ValtechTechno/ios-software-factory sous licence Apache 2. Les pré-requis sont dans les readme.

La présentation se trouve ici.

 

Le JUG Summer Camp vient de se terminer. Une journée de conférences intéressantes dans superbe cadre. Au menu du Java, mais on aussi pas mal parlé de Cloud cette année.

Une sélection de quelques sessions auxquelles j’ai assisté.

Lascaux II - Hall of The Bulls

Antonio Goncalves : Keynote d’ouverture

Antonio a retracé l’histoire de l’information dessinée sur des parois grottes en Australie, sur du papier, des cartes perforées, stockées dans des ordinateurs et finalement on ne sais où dans le Cloud par ce qu’il en a trop. Pour que les êtres humains puissent échanger cette information, ils doivent se mettre d’accord sur son sens et les normes apparaissent. De plus en plus d’information, de plus en plus de volume, du Cloud, mais un Cloud sans normes qui met les applications en situation de Cloud Locking. Et Antonio est un homme libre, il n’aime pas le Cloud Locking ;-)

Et Java dans tout ça ? Java sera Cloud (entre autres la liste de toutes ses prédictions a été largement relayée sur Twitter). L’expert group JavaEE se penche sur le sujet. Donc on vous le dit : Java sera Cloud !

Michaël Figuière : Les applications et architectures d’entreprise de demain

Les architectures sont en train de changer depuis quelques années. Michaël nous a livré ses reflexions sur les possibilités nouvelles qu’elles nous offrent.

Arrivée de la mobilité. Les smartphone permettent d’avoir un accès permanent à Internet et possèdent des capteurs qui permettent la détection du mouvement, de la vitesse et une géolocalisation précise. Ces fonctions sont utilisées pour faciliter la vie de l’utilisateur,  ne pas avoir à préciser son adresse lorsque l’on commande un taxi G7, éviter de refaire la même recherche parce que le système a mémorisé la demande et envera une notification s’il y a un changement ou une information utile.

Les informations collectées sur l’utilisateur peuvent aussi être analysées pour sélectionner les services à lui proposer, lui recommander des achats comme sur Amazon. Il s’agit là de filtrer, trier et appliquer des technique proches de l’IA sur d’énormes masses de données. Twitter gère des millions de tweets par jour. Et justement grace au NoSQL et au Cloud on dispose maintenant de bases de données et d’infrastructures qui peuvent monter en puissance.

Des outils qui permettent de traiter ces volumes de données :
Esper est outil d’analyse d’événements temps réel (analyse des actions des utilisateurs, surveillance de système, données de flux financiers …)
Mahout basé sur Hadoop est un outil d’analyse de données basé sur Hadoop (je l’ai déjà traité dans mon post Devoxx 2010).

Ces changements impactent aussi la conception. Ce besoin de temps réel nécessite de mieux gérer la disponibilité. Les applications doivent être plus résiliantes. A l’opposé du design classique qui considère que l’infrastructure marchera et n’a pas de moyens d’action lorsque des sous systèmes qui ne répondent pas ou mal, le Design for failure accepte que le système puisse avoir des défaillances techniques et les gère pour qu’ils aient le moins d’impact possible. De nouveaux mécanismes apparaissent comme les circuit breakers (coupe-circuits).

La présentation

Nicolas De Loof : Ma forge++ : on the cloud

Nicolas est venu nous présenter Cloudbees une plate-forme qui permet d’avoir une forge logicielle et un environnement d’exécution Java de test ou de production dans le Cloud.

Nicolas reprend la forge idéale qu’il nous avait présenté l’an dernier (Maven, jenkins …). Elle est efficace mais il y a beaucoup de composants à installer pour chaque projet. Comment faire ? Cloner ? Automatiser l’installation ? Ou bien utiliser une forge toute prête en SAAS comme  DEV@cloud.

Mathieu Ancelin : Weld-OSGi, OSGi en toute simplicité

Weld est l’implémentation de référence de CDI (Context and Dependency Injection), la spécification  Java™ Specification Request (JSR) 299. L’injection de dépendance permet de créer dynamiquement (injecter) les dépendances entre les différentes classes en s’appuyant sur une description par des annotations ou un fichier de configuration). Cette technique permet par exemple de choisir une implémentation particulière d’une interface lors de l’exécution. Si vous avez besoin d’une mise à niveau vous pouvez regarder le tutorial d’Antonio Goncalves sur CDI.

OSGI est une spécification gérée par un consortium d’entreprises qui permet de réaliser des applications modulaires orientées service. Elle repose sur un modèle de gestion du cycle de vie d’une application, un répertoire de services, un environnement d’exécution et des modules (les services). L’usage typique est de choisir de dépployer dynamiquement des services dans un serveur et de sélectionner à l’exécution les services que l’application doit proposer. OSGI permet d’identifier les dépendances entre modules et les versions.

Mathieu Ancelin nous a fait une présentation très claire d’OSGI (ce qui n’est pas simple). Il nous a ensuite un peu plus parlé de Weld-OSGI.

Weld-OSGI est un projet Open Source dont l’objectif est de régler quelques problèmes techniques d’intégration entre les deux mondes et de fournir une API plus simple de manipulation des services OSGI. L’intégration permet de découvrir dynamiquement des services OSGI. Concrètement ces modules sont des jar et sont chargés dynamiquement dans le class loader. CDI permet ensuite d’injecter une classe de ce module dans la classe qui utilise le service.

Mathieu a fait une démo assez bluffante d’application Web de réservation d’hôtel (JAX-RSJQuery) où il modifie dynamiquement les services présentés en arrêtant/démarrant les modules. Et tout ça avec une centaine de lignes de code.

Romain Maton : Optimiser votre site Web sur mobile

Romain a fait un tour d’horizon très complet des contraintes techniques du Web Mobile et des outils qui peuvent nous aider. La présentation est très dense et contient beaucoup d’informations techniques. Elle sera mise à disposition sur Web Tambouille et sur le site du JUG Summer Camp.

En résumé très rapide, les smartphones  disposent de peu de mémoire, peu de CPU et peu de bande passante réseau. C’est au développeur de faire attention pour que le site soit agréable à utiliser. Il doit faire attention aux aspects techniques (optimisation du HTML, du CSS, des images et être parcimonieux avec le JavaScript). Comme on est très loin des capacités disponibles sur les sites Web classiques, il va falloir choisir, recentrer l’application sur sa fonction centrale, éliminer les fonctions qui ne sont pas utilisées sur un mobile. Des validateurs de code et des outils d’analyse des pages permettent de corriger les erreurs de codage ou de configuration des caches.

Nicolas Martignole : Keynote de fermeture

La présentation de Nicolas est impossible à raconter. Il faudra aller la voir en vidéo. Il se projète en 2021 et nous présente une émission “10 ans après” sur le métier de développeur. L’occasion de parler avec beaucoup d’humour de la situation actuelle.

logo jugsummercamp

Les présentations et les vidéos seront bientôt disponibles sur Parleys et le site du JUG Summer Camp.

Merci au Poitou-Charentes Java User Group et à Serli pour l’organisation et à l’année prochaine, on l’espère.

J’ai fait une présentation Déploiement Continu au Breizhcamp en juin.

Vous la trouverez sur Slide Share : Déploiement Continu en production – Breizhcamp

J’ai fait une présentation Déploiement Continu en production à Agile France fin mai.

Vous la trouverez sur Slide Share : Déploiement Continu en production – Agile France 2011

J’ai assisté à Mix-IT la semaine passée.

Une conférence très conviviale, impeccablement organisée grâce à la dizaine de personnes du JUG Lyon et du CARA (le Club Agile Rhône Alpes) qui y ont mis toute leur énergie, mais aussi à l’impressionnant soutien des étudiants de l’Epitech présents à tous les étages.

Et à la présence du soleil ;-)

Cette première édition présentait 25 sessions organisées en 5 tracks parallèles

  • Techy : Java et son écosystème,
  • Agility : Agilité pour débutants et passionnés,
  • Trendy : Tendances novatrices et avant-gardistes,
  • Mixy : Le meilleur de l’agilité et des technologies Java,
  • Gamy : jeux agiles et coding dojos

Avec la préparation de l’anniversaire de Duchess France je n’ai pas le temps de faire un retour très documenté, mais voici quelques retours au feeling sur les diverses sessions que j’ai suivies.

Les tests du futur

Mathilde Lemée nous a présenté Spock, un framework de test basé sur Groovy qui permet de clarifier l’écriture des tests unitaires. Grâce aux labels Java, les tests peuvent être écrits selon un formalisme given / when / then explicite. Elle a également rapidement présenté Geb un outil de test fonctionnel.

Comme Mathilde a fait plusieurs articles sur Spock, le plus simple est d’aller voir ça sur son site directement : http://www.java-freelance.fr/tag/spok

Grails from scratch to production

Pour la deuxième session, j’avais déjà vu la présentation HTML5 de Cédric Beurtheret et Alain Duval déjà jouée au Paris JUG.

J’ai donc opté pour la session Grails. Grails n’est pas tout nouveau. J’ai déjà un peu joué avec le tutoriel Grails, mais je me disais qu’il y aurait peut être quelques informations sur le “en production”. En fait, la présentation d’Aurélien Maury était surtout sur le “from scratch”.

J’ai quand même eu la réponse à une question qui m’intriguait en voyant les exemples de configuration Grails. La configuration a toujours l’air en dur et quand ça part dans un war ça ne doit pas être très pratique. En fait, la réponse était déjà écrite par l’intervenant. Elle est là : Grails Tips Externalise la-configuration.

Introduction à Clojure

Après le repas, un des sujets qui me motivait le plus, Clojure. Laurent Petit nous a présenté ce langage dynamique tournant dans la JVM,   simple, fiable, performant et ultra-expressif !

Les speakers avait quand même ajouté :

Le truc ? Facile : sortez de votre zone de confort et pensez simple, le jeu en vaut la chandelle !

Et il faut vraiment sortir de sa zone de confort, car c’est quand même très différent de ce qu’on manipule tous les jours. Pour ceux qui ont fait du LISP, il y a un air de famille, mais pour les autres ça doit être proche du Vulcain. La présentation était très claire, mais très technique car elle faisait appel à des notions sur la théorie des langages.

(defn read-file [file]
    (with-input-stream (new FileInputStream file)
        (fn [is]... corps de la methode)))

A vrai dire, c’est plus facile lorsque l’on a une motivation. J’ai depuis longtemps dans mon GTD le projet d’utiliser Incanter pour quelques scripts que j’utilise pour analyser mes résultats de test de performance pluôt que R. R et Incanter sont des outils d’analyse statistique. R est inspiré de Scheme. C’est un environnement très complet mais assez loin de Java. Incanter est un outil plus récent  implémenté en Clojure. Il tourne dans une JVM et serait plus facile à interfacer avec d’autres programmes en Java.

Clojure est un langage à base  fonctionnelle avec des données immuables et des structures de données persistantes. Un mécanisme permet de gérer des changements d’états contrôlés sur un mode transactionnel si nécessaire.

Je n’ai pas trouvé la présentation de cette session, mais si Clojure vous intéresse vous pouvez lire l’interview donné par les speakers sur le site de Duchess France http://jduchess.org/duchess-france/blog/session-clojure-a-mix-it/ et la retranscription par Olivier Croisier d’une conférence sur Clojure à Paris avec une discussion en Google Wave qui compare Clojure et Scala http://thecodersbreakfast.net/index.php?post/2010/02/08/Conf%C3%A9rence-Clojure-chez-Zenika-%3A-le-compte-rendu

Félicitations à Laurent Petit qui a assumé tout seul 2 sessions à la suite et bon rétablissement à Christophe Grand absent pour un problème de santé.

Intelligence collective avec Apache Mahout

Mahout est un outil d’apprentissage automatique et d’analyse de données. C’est le type d’outil qui est utilisé pour faire de la catégorisation de textes dans les moteurs de recherche par exemple ou pour les systèmes de recommandation des sites sociaux ou de commerce. A noter ce projet Apache est co-dirigé par une femme, Isabel Drost.

La présentation de Michaël Figuière a présenté les usages que l’ont pouvait faire de ce framework et les bases de l’utilisation de l’API. ça a l’air très simple à mettre en oeuvre. a essayer un jour.

Le mouvement devops

Bien sûr je n’y suis pas allée pour découvrir le concept. J’assiste au sessions du devops group à Paris depuis la première édition. C’était l’occasion de rencontrer Gildas Le Nadan le leader de devops Lille.

Pour ceux qui n’en auraient pas entendu parler devops est un mouvement émergeant qui vise à rapprocher les équipes de développement et les opérations (la production en français) pour mieux résoudre les problèmes de déploiement et de suivi de production.

La présentation était plutôt destinée à la cible Agile de Mix-IT. Mais les imitations de sysadmin bougon de Gildas sont franchement très réalistes. A ne rater sous aucun prétexte !

La présentation de Mix-IT se trouve ici http://devops.fr/mixit/slides.pdf

Vous trouverez des ressources sur devops en français sur le site de devops Paris http://parisdevops.fr/ et des pointeurs sur les sites en anglais sur le site de Gildas http://devops.fr

Pour les gens qui habitent Lille ou Paris, vous pouvez vous rapprocher des groupes ci-dessous

A quand un groupe devops en Rhône Alpes ?

Mix-IT Lyon c’est fini pour cette année.

On attend impatiemment l’année prochaine. Mais dans l’intervalle d’autres manifestations en province s’organisent : le BreizhCamp à Rennes le 17 juin, le JUG Summer Camp à La Rochelle le 16 septembre, et j’ai même entendu parler d’une idée de Mix-IT au Luxembourg.

Anniversaire du Paris JUG

Posted: 28 février 2011 in Duchess, JUG, Valtech

Derniers préparatifs avant la soirée du Paris JUG ce soir. On a bien travaillé mais il y a tant de choses à gérer, les speakers, les sponsors, les inscrits, le buffet, l’after, le timing …

Donc beaucoup de stress mais une superbe soirée qui s’annonce, et une très longue soirée où j’espère vous rencontrer nombreuses et nombreux.

Mardi 21 Décembre je ferai une présentation sur les performances, les tests et JMeter au Lyon JUG.

Pour les gens qui sont par là vous pouvez trouver les détails et vous inscrire ici : http://www.lyonjug.org/evenements/performances

Vous trouverez la présentation en SlideShare ici
Et la présentation en téléchargement et les exemples là Les éléments de la présentation.

paris-devops Le premier décembre s’est tenu le premier meetup devops à Paris suivant de peu le meetup de Lille plus proche du berceau devops en Belgique.

Devops est un mouvement émergeant dont le nom a été crée par Patrick Debois dont le but est de rapprocher les équipes de développement et les opérations (la production en français).

Quels sont les problèmes que ces groupes veulent aborder ?

La siloïsation de l’informatique qui empêche toute synergie, les problèmes de déploiement, le phénomène “It works on my computer !“, la peur du changement qui bloque toute démarche de part et d’autre. La solution passe par une collaboration, les échanges de point de vue autour d’une pizza, l’intégration des ops dans les projets, la montée en compétence des ops sur les tâches de dev et des devs sur les tâches d’ops et au final une meilleure compréhension des contraintes des uns et des autres. D’une certaine manière cela reprend la démarche Agile mais vers les opérations au lieu du client. Ce mouvement s’adresse aussi aux responsables projets qui composent les équipes afin qu’ils contribuent à réduire les silos.

Le premier meetup devops parisien s’est déroulé mercredi 1er décembre dans les locaux de la société Theodo.

Une première réunion pour faire connaissance et essayer de définir les attentes. Certains venant de la communauté “Infrastructure as Code” pensent à s’organiser depuis des mois, d’autres viennent juste de découvrir à CITCon, Devoxx ou JSConf.

paris-devops

Un tour de table a permis à chacun de se présenter. Contrairement aux craintes de certains nous sommes à peu près moitié devs, moitié ops, venant d’horizon divers, éditeurs, sociétés de service et même le milieu de la recherche. Même les devs sont assez diversifiés puisque l’on trouve tous types de langages.

Après ces présentations et les commandes de pizzas, un mini open space a été organisé par les Agilistes présents. 9 sujets sur 3 salles en 60mn, un peu improbable mais tout de même intéressant pour les lister les sujets a aborder.

On n’a pas tout traité mais on a précieusement conservé les post-its.

Parmi les sujets dont on reparlera Puppet, Chef, le déploiement des applications, la gestion des configurations applicatives, …

On a ensuite continué à discuter très tard et c’est seulement vers la fin que j’ai pensé à prendre quelques photos. Elles sont assez moches (j’avais oublié mon appareil photo) mais c’est une trace de cette première réunion.

Le prochain meetup à Paris devrait se tenir mi-janvier. D’autres groupes se créeront en France, je pense, n’hésitez pas à contacter les user groups.

Les google groups (à ce jour)

Quelques informations pratiques

Le talk Devoxx est en ligne

Le planet réunissant les blogs devops

Quelques autres liens de présentations