You are on page 1of 132
POSTGRESQL ole ee ok as Le eT Tl MAGAZINE / FRANCE Cea tetera) LA BOITE A OUTILS INDISPENSABLE ! > VERSIONNING ee octane Peet tcc LIBREOFFICE / BASH 1 15066. 15H-F: 14,90 € 2 " 4 pats Y i i PN eel ee Pee eae Sieg Sala -Yoliifolg] o res Dijon 2019 Terre dinnovation et de partage DU.3/AU 6 DECEMBRE LP} ALO} Somers ULES www.jres.org cide ha JOURNESS RESESU» DE L’ENSEIGNEMENT ET DE LA RECHERCHE a . day . Coir == pa: ea Kote OMEAS oa 43d S01 =N 1, =o etd ea Oe \Veritable forum d'échange et de transfert de compdtences par la conttontation des expériences etl présentation de technologies et services innovants, les LIRES sont un événement unique en France, vecteur de connaissances et de transmissions d' expertise au sein de la communauté Enseignement et Recherche STC te monn FO ee ee ce ee Le Pendant jours les JRES proposeront un état e art dela transformation numérique au sein des éablissements dela communauté académigue aussi bien So Re ee ee crn te Sa grou tutes ns pubatons Dit ity) sur wow d-iamond.com ‘oNUILinux Magazine Hor Série ‘step Len Eon Dlamond 10, los 6 Cattrl-£2000Comar-Fanoa ‘Tel 10367 100020/ Fax: 0367 100021 smal; cies samen com ‘eceusaignummag com ‘Servis commercial: sdosgnuinuenas.com Stes : wi gnulrusmag com Director de publication :Anaus etaler ‘Chet de édactons Denis Bodor Rdactour en cha: Tistan Colombo Responsable Service Infographie: ath Sea Responsable pubic : Ta 0367100027 Impression: pra, rack und Medi Dinstistingen Gmbh nea, Atorapre| Distrution France: (iquement pour es doses de peso) LP Résssort:PlteSrne de Saint Barley. Ao, Tak c0261 27 9 12 Plate foae de San Quer Fala, Teh :08 74 826308 IMPRINE on Alonagne - PRINTED in Germany Dépstigal: Aparuton risen ore2ce64 ‘Commission Para :K78 976 | Periods : Bereta Ceri rede vent: 14.90 Eos Le i man th Ate the |geteror commana parmus nos aregaan tat sos ne ass dane CRU Hgrs Pre ese (Sniper ws mots cst dan ests 8M {oceans Fancast aon nan rot ee, ‘eye ts nkrn poet os ren ‘sn tn tari ssw ros Sb at ‘cpt Sp eenoan sane mage nacre coir et at mea “es res non sgt cents dan namo digs pares membres segue addon des Eaton Damen Retrouvez-nous sur egnulinuxmag © Sretmatonans GQ eentrarsnie @ erstoresetanmontcon vn gnulinuemag com vo ections shaman ft www.ed-diamond.com “Tout est toujours une histoire de compromis en Informatique 1 Vais je prvégir la vitesse cexécution ou minimisor utitsaton fa RAM 7 1 Usiser une architecture complexe et forteent main tenable ou développer rapidement un pet script «a jelable» ? Ete Récemment jai di configuer mon nouvel ordinateur portable avec toutes los galéres inhérentes 8 installation d'un Linux (et plus encore une Debian) avec des avers proprétates pour le moindre composant. Ja pris Phabitude de chi frer mon dsque dur, ce qui paraltautant plus logique sur un matériel nomade «ve fon peut ps faclement perdre ou se fate voer. Et est qu'apparat une nouvel fos la question du compromis 1 Este quo vais chiror la partion /ome et utliser LUKS ot LYM? 1 Ou estice que je vais me contener de citier mon épertoewtlsatew ? Le premier cas sera pus adcurie, male na sera pas nécassarementle plus pratique je vais dovor taper deux clés de lng earactéres minum chacune 8 chaque cémarrage (i faut nécessalramentchiter également la partion de swap, dod les deux pation). Si je ne veux pases taper, Je poural les lenregiser sur une c¥é USB que jinsérerai au démarrage. Question : je suis en déplacement, fe sul fatigue, at oublé mes ces klomeénques (I ut une ferour run caracre, ce qui est vite atve je pare cFexpéience...). eat perdu ma dé USB ; comment est-ce que ais pour ravaller? Le dousiéme cas sera moins sécursé, mais simplement avec mon login et mon ‘mot de passe je pourra séclencher le décifrement du répertare. Vopération sera donc tout a fait ransparente pour moi ete r’aurai pas la hantse de me retrower conc loin de mes pénates avec un ordinstourparfatement Irutisabe. La sécurité des données est quelque chose dimportant, mais ne doit pas ven. slourd note vie de tus les jours. a done choi la deuxéme configuration, Cotte expéronce mia appelé une dscussion que favs eue avec une biblthé- care qui, dans le car de son tava, devi se connecter au ste poars-addict. com mais qui ad émete une demande spéciale de connexion au ste, clic ‘ant bloga (eh oui, yale mot «acct» - soi « aro» ou «toxleomane » = dans FURL!) Deux mois plus tard ele a pu accéder au site et poursure son traval ta magle des whitest West val que pour le responsable deta sécurts ‘est beaucoup plus simple &gérer..par conte pour ls wiisatours du réseau, stout de site beaucoup plus compliqué de travail Je me répéte souvent, mais rioubliez pas que les applications que nous développens ou les auts que nous mettns en place sot plupart du temps ddies & des ubestours et qu'il faut es adapter a leurs besoin et leurs com ptonces ! Nous forgeons leurs outset, cates, is auront moins de reques de 0 blossor avec une pote cule quavec un corséque, mais contr un dragon sera nettamant moins eficace! faut choise juste miiou Tristan Colombo SOMMATIRE ET ts GNU/LINUX MAGAZINE HORS-SERIE N° FRANCAIS 24th 1 228h — 06 ACTUS 06 Mozilla Common Voice : rendre la reconnaissance vocale ouverte et collaborative 08 Coté livres.. DOSSIER : SPECIAL DEVOPS 10. Enfouissement de données LA BOITE A OUTILS DEVELOPPEMENT dans un document LibreOffice INDISPENSABLE ! SYSTEME 22. Patroni, un cluster PostgreSQL simple et rapide 40 Du sysadmin au dev : Des commandes Shell pour les développeurs 62 Du dev au sysadmin : Apprenez a concevoir et distribuer vos applications sur plusieurs plateformes avec CMake Du sysadmin au dev : Git, le gestionnaire Se ere ae de versions pour tous les développeurs répétlves d'accds A un Du dev au sysadmin : Automatisez les site Web tests et évitez les régressions 116 Web crawler / pilote web Selenium : comment AIcHTUIS MOZILLA COMMON VOICE: RENDRE LA RECONNAISSANCE VOCALE OUVERTE ET COLLABORATIVE FIGURE 2 Mozilla 2 récemment lanes un projet pour collecter et vai- Francals der des échantilons de vox © 248h . permettant d'améliorer les systémes de reconnaissance et de synthase vocale (STT - ‘Speech To Text - et TTS - Text To Speech). En effet, pour que la reconnaissance soit la plus flable et la synthese la plus raliste possible, il faut néces- sairement disposer d'un grand Nomtre dheures denrepisvement pour angais nombre 6'échantilons vocaux. Or, la bale plupart des données employées par ucts les grandes entreprises ne sont pas libres. Mozilla propose donc via son projet Commen Voiee de partciper 8 Télaboration dune base de données lore, créée de maniére communautaire. 12k . Comme Iilustrent les figures 1, 2 et 3 ily a nécessairement des langues pour lesquelles la collecte et la valida- tion de données sont plus simples que dautres, Nombre dheures enreisrement pour le ren. /olce.mozilla.orgffr vous propose enregistrer (https:livoice.mozilla.orgifrispeak) ou de valider (https:/iveice.mozilla.orgifrlisten) des échantillons vocaux. Pour renregistrement d'échantillons vocaux, la page va vous demander de lire § phrases (figure 4). Pour la validation d'échantilons vocaux, la page va vous proposer d'écouter 5 phrases lues par Bos FIGURE 4 La possibilité, pour une fois, de vraiment y arriver. Interface onregiromeont des intermautes et de les valider (04 dindiquer quelles ont mal 6t6 prononcées (figure 5) ‘Si vous souhaitez contribuer & autres langues que le fan- cals, vous pouvez vous rendre sur la page https:!Ivoice. mezilla.orgifllanguages, afin de sélectionner une des lan- ues proposées, untar topane nee core Chettikudiyiruppu est construit avec un toit recouvert de feuilles et des murs en briques. om > nom FIGURE 5 Interface de vaksation Enfin, comme la base de données résuitante sera bro, vous avez la possibile Ge tléchargerles jeux de données sur httpsivotce. ‘mozila.orgt/datasets ‘i vous travailez avec du STT ou du TTS, vous devriez vis terce site qui ne manguera pas de vous intresser! __, BLOCK CHAINS EN SO QUESTIONS, LES BLOCKCHAINS EN 50 QUESTIONS ‘COMPRENDRE LE FONCTIONNEMENT ET LES ENJEUX DE CETTE TECHNOLOGIE INNOVANTE Si vous vous intéessez au domaine de fauthen- tiation de transactions en ligne at que vous r'9tes pas encore familarisés avec lo concent do bockchain, vous pourez aborder avec ce live leur fonctionnement ainsi que les conséquences de leur usage pour leur utlisatur fe tout au travers de 50 questions qui permettont, comme rindique te sous-titre do Fouvrage, de « comprendra lo fonctionnement et les enjeux de cette technologie inovente ». | + Auteurs : Jean-Gulllaume Dumas, Pascal Lafourcade, Ariane Tichit et Sébastion Varretto + Editeur : Dunod septembre 2018 + Nombre de pages : 296 pages + Parution + Prix: 22,00€ Voici une sélection d ouvrages pour la plupart récemment sortis ou sur le point de sortr et qui ont. attré notre attention, MEMOIRES VIVES Eaton frangaise de « Permanent record », du lanceur dalerte Edward Snowden, qui a été publiée simuitané- ‘ment par 20 éditeurs diférents, de parle ‘monde. Cet ouvrage autobiographique permet de plonger dans les coulisses de la NSAet de la ClAet de comprende les rouages du renseignement américain. I permet, une éniéme fos, dalerter sur les enjeux que constituent les données ‘numériques personnelies et les usages ui peuvent en étre fits, par les entre prises ou les états. + Auteur : Edward Snowden ro) + Parution : septembre 2019 ur: Seuil + Nombre de pages : 464 pages + Prix: 19,00 € wovw.ed-dlamond.com = PYTHON® POUR LA CARTE | micro:bit PYTHON POUR LA CARTE MICRO:BIT La carte BBC micro:bit a 616 lancée en Angleterre en 2016 et permet dntior les collégiens & la program ‘mation, & moindres frais (environ 20 €), Cette carte peut étre programmeée depuis un PC en Python, mais aussi en JavaScript ou encore en MakeCode, un langage « Puzzle » de Microsoft (https:/imakecode. microbit.orgi#). Ce livre se focalise sur le langage Python (la premiere partie présente le langage de ‘maniére sommaire pour les non-développeurs) et sur Ln apprentissage progressif, permettant d'aboutir& des projets complets. Il sagit d'un livre de découverte de la programmation destiné aux lycéens... qui n'ont jamais programmé (un enfant plus joune, sintéres- santa informatique, y trouvera de lintéré) En complément, si le sujet vous intéresse, le livre «40 activités avec la carte miero:bit » de Dominique NNibart, chez le meme éciteur, vous fournira des idées de développements.. traduire en Python, puisque ce demier est orienté MakeCode. + Auteur: Julen Launay + Editeur : Eyrolies + Parution : septembre 2019 + Nombre de pa 1s: 168 pages *Prix : 19,90 € Python _ et les ontologies gr Hl PYTHON ET LES ONTOLOGIES \Vous souhaitez manipuler et construire des ontologies (modéle de données per- mettant d'effectuer des raisonnements ‘automatiques) ? Alors, ce live vous ‘apprendra a utlser le module Owlready2 (https:s/owiready2.readthedocs io!) en Python. Progressivement, en débutant par des rappels sur OWL (Web Ontology Language) et Python, vous accéderez & {es ontologies, avant de pouvoir les créer ‘et les motifer, en bénéficiant de nom- breux exemples pratiques. + Auteur : Jean-Baptiste Lamy + Editeur : ENI + Parution : aout 2019 + Nombre de pages : 310 pages + Prix :54,00€ TE[VIEILIOIPIPIEIMIEIN ENFOUISSEMENT DE DONNEES DANS UN DOCUMENT LIBREOFFICE Tristan COLOMBO Cacher des données dans un document, c’est de la stéganographie [1]. Ici ce qui va nous intéresser, ce n'est pas vraiment de dissimuler les données, mais de les lier a un document LibreOffice pour ajouter des métadonnées. Ces données n’étant utiles qu’a notre usage personnel, nous allons les enfouir pour qu’elles ne perturbent pas nos collaborateurs. ravaillr quotidionnement avec LibreOffice s'apparente un véritable calvaire, tant les styles de paragraphes et de caractéres disparaissent rmystérieusement, aprés chaque sauvegarde. Nous allons essayer dans Cot article d'ajouter des données, sans que celles-ci ne soient vsibles pour les autres utlisateurs de nos documents, mais sans pour autant ajouter un facteur dinstabilté. LLidée ici est d'ajouter un fichier INI contenant des métadonnées et dassocier ce fichier .un document ODT. Ilest bien évident que la structure suivante est a proscrre GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com cee En effet, cela reviendrait 4 manipuler un répertoire contenant deux fichiers au lieu dun seul fichier: les risques de perte du fichier .meta. ini sont impor- ‘tants et nos collaborateurs ne comprendraient pas ‘nécessairement pourquoi manipuler subitement des répertoires, au lieu de simples fichiers. Nous allons donc nous servir de la structure des fichiers ODT pour y enfouir nos données. La pre- rmiére étape est donc de comprendre le format de es fichiers. 1, STRUCTURE DES FICHIERS ODT Les fichiers ODT, ce n'est un secret pour personne, sont des archives ZIP. Prenons un fichier vide que conque doc. odt et décompressons-le dans un répertoite (les fichiers ne sont pas organisés dans un répertoire et ils pollueraient done notre réper- toire courant): erry corer eee tne coer eer) peer steers! Corererstrd eee preerares eee Fane ae estes pers aay cst \ toolpanel Peeraeast poner erat) Parrwescd fetes or rea pest rrecoe erect! Eesrte ey ercerre ey La structure du répertoire nous montre une grande {quantité de fichiers. Une premiére approche naive pourrait étre de se dire quil suit ajouter notre fichier, de recompresser et que le tour serait ous... 2. ESSAI MANQUE ‘Ajoutons un fichier .meta. ini (sans section, pour rester simple) dans unzip : titre=0h le bel article! tags=Super, Top pages=10 idee=une image en lien avec l'article : https: //www.doc_images. com/logo.png Créons notre archive, sans oublier de préciser & Zip que nous souhaitons que les fichiers cachés Solent incorporés (parametre .) : rrr any adding: .meta.ini (deflated 16%) "Nous vous recommandons de ne pas faire Confiance au conten ou document ftir newboe ot JEIVIEILIOIPIPTE (ME INIT Im: line raste plus qu’a auvrirle dacument avec LibraOfice ? Pas vraiment... Vouverture, vous obtiendrez un beau message derreur, tel que celui présenté en figure 1, page précédente. Done, LibreOtfice verifierit intégrté de ses données ? Pas de trace de checksum, donc peutétre que le ‘nombre de fichiers présents dans l'archive est restrint ? Mais cette hypothese ne tient pas la route, puisque lorsque on ajoute une image, celle-ci est intégrée a larchive dans le répertoire Pictures. Ajoutez donc une image a doc.odt et décompressez-te. Vous verrez apparaitre un fichier du style = oo en pester ree ares extracting: unzip/mimetype Sepaert yp ster eee Ysera Te ey Etsinous recherchons une référence ce fichier (puisquil ny a pas de checksum, il doit bien y avoir une liste de fichiers valides) : ieee ue Noor ner eee ert St cts entry manifest: full-path="Pictures/ meters tee eee elas Bed [Nous nous apercevons que le fichier NETA-INF/mani fest .xm1 liste les fichiers présents dans larchive, en leur associant un type MIME (ici image/jpeg"). Si nous suivons le méme principe, tout devrait se dérouler correctement pour notre fichier .meta. ini. 3. ESSAI TRANSFORME Repartons de notre fichier inal, sans image. Décompressons-e, ajoutons-y le fichier .meta. ini et cette fois, 6ditons le fichier META-INF/mani fest .xnl pour y ajouter une référence & notre fichier = ‘ | Se Cette fois-c, le fichier peut étre ouvert sans probleme, il n'est pas dégradé et sion le décampresse, on retrowve bien notre fichier ! Voyons maintenant comment exploter cela depuis un script (on ne va pas éditer & la main le fichier manifest. xml a chaque fois que Ton souhaiteinsérer des données !). 4, EXPLOITATION DE L’AJOUT DE FICHIERS La premigre chose & faire va étre de choisir un langage. Nous avons vu quil y avait pas mal de manipula- tions de fichiers, donc un script Shell semble tout indiqué. Nous partons done sur du Bash pour notre script ‘add_metadata, prenant en parametre le nom d'un fichier ODT. 4.1 Ajout du fichier .meta.ini Dans un premier temps, nous allons nous contenter d'ajouter un fichier .meta.ini vide set -eo pipefail usage () { Sec "(4)" = "help" |; then ‘echo 'Usage: add_metadata [fields] echo | Ajouite un fichier de métadonnées au fichier Libreoffice Writer’ 10: echo | (extension .odt) a echo | [fields] est un fichier optionnel indiquant 1a structuration du fichier’ a2: ‘echo " cmeta.ini a ajouter. Par défaut c'est le fichier data/add metadata/iniFile. ini" echo! qui sera utilisé.' exit 0 fi La fonction usage() permet simplement dafficher un message daide. Lafonction addMetabata( ) suivante effectue tout le traval. Je vais la commenter au fur et a mesure. addiietadata() ( local dest="${PHD) métadonnées, af [2 "9(2)" J; then struct¥ile="$ HOME} /bin/data/add_metadata/iniFile. ini" else af [ -£ "§(2)" 1 the echo ‘Struct file §(2) activated’ structFile="5(2)" eu echo "Error : struct file $(2) not found or not a regular file" 1>62 exit 2 Sill ny a pas de second paramétre (ligne 25), alors on utlse le fichier de structuration par défaut, en indiquant ‘son chemin absolu dans structFie (ligne 27). Sinon, si le fichier référencé par ${2} existe (ligne 28), alors (on place son nom dans structFie (ligne 30). ¥ création du répertoire temporaire Local tmp _dir=$(mktemp -d -t add-metadata-XXXXXXXX) On crée ensuite un répertoire temporaite dans /‘tmp dont le nom sera de la forme add-metadata-XXXXXXXX (00 00XKKK correspond & des valeurs aléatoires. On s'assure ensuite que le répertore temporaire sera bien det la fin de exécution du programme. Pour cola, on emploie la commande trap qui exécutera rm -rf ${tmp_dir} lors de événement EXIT. ¥ Decompression du unzip "§{1)" -d "$(tmp_dir)" ._file="$(tmp_diz}"/.meta.ini touch "${mata_file}” # Modification du fichier M WF/mani fest xml local line=' " ‘echo "${tmp_dir)"/MBTA-INF/mani fest xml sed ~i "\$i §(1ine)" "§(tmp_dir)"/MBTA-INF/mani fest xml # Recompression du fic! ment du fichier ODT od "${tmp dir)" sip “= "§[dest)" * fichier ODT. (#)" -1e 2]; then if [-£°"$(1)" J; then df [ "$(H#*.)" == todt! J; then addMetadata "$(1)" "$(2)" els ‘echo 'Error : You MUST use a Libre0ffice Writer file with .odt extension’ 1>42 6a. exit 1 I: a else ‘echo "Error : File ${1) not found or not a regular file” exit 1 usage ‘help’ © [6:4 Enfin, le programme principal gére l'appel ala fonction addMetadata( ) en fonction des paramétres qui lui sont transmis, ‘A Fexécution, nous obtenons bien le résultatattendu ; en décompressant le fichier ODT fourit en entrée de ta ‘commande, nous remarquons bien la présence du fichier .meta. ini etle fichier META-INF/mani fest xml. a bien été modifié Mais du coup, que se passe-ta si nous appelons une nouvelle fois la commande sur le fichier doc .odt ? A.chaque appel a add_netadata, nous ajoutons une ligne de référence au fichier .meta. ini dans le fichier manifest. xml ot nous écrasons le fichier .meta. ini ! ly a quelques lignes de correction ajouter & note script Plutot que de vériier la présence « physique » du fichier dans archive, nous allons vérifier si colui-ci est men- tionné dans le fichier META-INF /manifest. xml 19. . 20: lj répertoiz i pacts 21: existsMeta() ( 22. grep ‘manifest: full-path=".meta.ini"’ "§(1)"/META~INF/mani fest. xml > /dev/null 2>61 23: return $(?) 24: } ‘Siune occurrence de ‘manifest: full-path=".meta. ini” est découverte dans META-INF /manifest. xm alors grep renverra 0 et sinon 1, Cette valeur se retrouve dans la valeur de retour de la derniére commande '$7} que nous utiisons en ligne 23, en tant que valeur de retour dela fonction. hier de métadonnées du 43 }" -d "$(tmp_dir)" > /dev/null 2>61 local overwrit if existemeta "$(tmp dir)"; ‘echo 'File .meta-ini exists more "S(tmp dir) "/-meta.ini read -r -p TOverwrite data ? [y/N] " response response=$ (response, , } Iy)$ 11; then La variable overwrite va nous permettre de savoir dans quel état nous nous trouvons, premier ajout de métadonnées ; ‘= 1: écrasement des anciennes métadonnées ; ‘= 2 conservation des anciennes métadonnées. La valeur de cette variable est conditionnée parle test sur existsMeta() de la ligne 56, puis sur la réponse donnée par Iutlisateur la question de la ligne 59 (en ligne 60, ${response, , } permet de convertr tous les ccaractéres en minuscules), : ‘${overwrite)" -eq 0 "${overwrite}" -eq 1]; then local meta_file="§(tmp_dir}"/.meta.ini touch "${meta_file}" ‘media-type="plain/text"/> \$i $(Line}" "${tmp_dir}" /META-INF/manifest..xm1 # Recompression du fichier ODT et rene fichi "ed "$(tmp_dir)" zip “x "S{dest)" * . > /dev/null 2>61 On retrouve ensuite le traitement permettantlajout du fichier . meta. ini ainsi que la modification de META-INF /manifest .xml dans le cas ou ${overwrite} vaut 0. GNUILINUX MAGAZINE HORS-SERIE N‘105, wow: 4.3 Saisi du contenu du fichier .meta.ini Maintenant que nous avons vu que notre systéme état fonctionnel, il faut pouvoir saisir des données & sauvegarder dans le fichier .meta. ini, si nous voulons que notre petit script serve réellement & quelque chose. Rappelez-vous que nous avons décidé de rendre les données récoltées paramétrables depuis un fichier de configuration (par défaut data/add_metadata/iniFile. ini). Ce fichier sera un fichier INI, donc com- pposé sur chaque ligne d'un nom de variable, dun signe égal, puis dune valeur (ci, une chaine de carac- tres indiquant la question & affcher). Voici un exemple de fichier iniFite. ini, Pour interroger Iutlisateur, il va donc falloir parcourir ce fichier ligne a ligne, récupérerles noms de variables (a gauche du signe =) et les questions (8 droite du signe =), puis afficher les questions et récupé- ror las saisios de lutllsatour. Tout ceci sera réalisé dans une fonction createIni() exec 5< "$(2)" while read <é5 line; do local name=$(echo "${1ine}" | cut -d= -£1) local text=$(echo "${1ine}" | cut -d= -£2) local userinput="' read -p "§(text) : " userInput echo "$(name)=${userInput}" >> "${1)" done exec S<é~ ‘ci la dificult vient du fat que Von souhaite lire le fichier $2} tout en lisant les saisies de utiisateur (done avec deux appels & read imbriqués lignes 6 et 10). Pour pouvoir effectuer cette opération, il faut ulliser un descripteur de fichier spécifique pour un et garder le descripteur standard pour autre. Il la ligne § indique ue le descripteur de fichier 5 sera utilisé pour le fichier $2}, la ligne 6 demande a lire sur le descripteur de fichier 5 (<65), et la ligne 13 ferme ce descripteur de fichier. Pour le reste, les données sont découpées suivant le symbole = (option -d= de cut des lignes 7 ot 8) et on récupére la premiére parte (-f1) dans name et la seconde parte (-f2) dans text. Enfin, les données sont ajoutées dans ${1}. Lappe! de cette fonction se fat a la place de la ligne touch "'${meta_file}" de ancienne ligne 71 if [ "${overwrite) overwrite)” socal mete,etleot$ cap dis}*/ meta tat sceatetnd stewen fareye seisineoetiay DEIVIEILIOIPIPIEIMIEIN Aexécuton lest désormais possible 'jouter des métadonnées $ add_metadata doc.odt pee CST EU, TC nse Pree ronnie ent eeg ata cota et rcrzzty eo et ie 4.4 Et si l'on veut extraire des données ? PPouvoir enregistrer des données, c'est bien... nous pouvions fs lire, ce serait mieux { Nous allons done err un sort get_netadata qui prendra en paramétre un nom de fichier et afchera le contenu du fichier <0 métadonnées, si celu-c est présant. Un second script get_articLes prendra en paramétre un nombre 6 pages et cherchera récursivement depuis un répertoire cible les articles contenant au maximum le nombre de pages, passé en parame. {get_metadata va nous permetire de réexploiter les notions mises en pratique dans add_netadata, le code tant assez similaire 4£ ( "${1)" == "help" J; then echo ‘Usage: get_metadata * echo * Agéiche les métadonnées d'un fichier (extension .odt) . # aftichage des nétadonnées # 5(1) + nom du fichier INT 1 displayMetadata() ( printf "$-20s $-50s\n" "Nom" “Valeur” exec 5< "§(1)" while read <é5 line; do Local nane=§ (echo "§{1ine}" | cut -d= -£1) (echo "$(1ine)" | cut -d= ~£2) Printf "§-20s %-50s\n" "$(name}" "$(value)" : # Récupération des métadonnées 31: # $(1) : nom du fichier opr + getMetadata() { eee eee ceeees emer, trap "xm rf $(tmp_dir)" EXIT unzip "$(1)" -d "${tmp_dir}" > /dev/null 2>61 Af ( -£ "$(tmp_dir)"/.meta.ini ]; then displayMetadata "$(tmp_dir)"/.meta.ini else ‘echo "Error : No metadata file in $(1)" 1>62 exit 1 i a6 ("SCH ie T oe § todt' J; then getMetadata "$(1)" ei : echo ‘Error : You MUST use a Libre0ffice Writer file with odt extension’ 1>42 exit 1 fi else echo "Error : File $(1) not found or not a regular file" 1>42 exit 1 fi else usage ‘help’ et La lecture de ce code devrait vous permettre de verifier que vous avez bien compris les explications données. pour add_metadata. Siun point ne parait pas clair, reportez-vous au code précédent, nous sommes dans les memes cas d'utlisation. Passons maintenant & 'écriture du script get_articles. La encore, une bonne partie du code ne nécessite pas d'explications, puisque se rapprochant des codes précédents. set -eo pipefail readonly ODT_PATH="$ {HOME} /Documents” readonly TAG_NAME='pages' Nous définissons deux constantes : 0DT_PATH contiont le chemin absolu vers le répertoire qui sera scanné Ala recherche de documents ODT et TAG_NAME contient le nom de la variable qui sera recherchée dans le fichior .meta. ini. waw-gnatinuxmag.com GNUILINUX MAGAZINE HORS-SERIE N*105 06 Mf ( "$(1)" == "help" J; the: echo ‘Usage: get_articles ' echo * Affiche la liste des fichiers LibreOffice Writer’ comportant des métadonnées indiquant un nombre’ de pages estimées au maximum a .' chage des données fichier ODT de pages while read <65 line; do local name=$(echo "$(Line)" | cut -d= £1) Local value=§ (echo "${1ine)" | cut ~d= -£2) Af [ "$(name}" == "$(TAG NAME)" ]; then Af [ S{value} -le $(3) 1; then PFint£ "$-10s $-50s\n" "§{value)” "$(2)" fi EN done exec S /dev/nul1 2>61 {cj il faut penser & supprimer le fichier meta. ini dont le chemin absolu (dans le répertoire temporaire) se trouve dans ${1}, de maniére & ne pas utliser le fchier .meta.ini dun document précédent, si le fichier ODT courant ne dispose pas de métadonnées. ¥ Récupération du nombre de pages de $(1) # S{1} : nom du fichier 43: # $(2) : nom du répertoire ter ¥ 5/3) : nombre de pages getbata() ( # Decompression du fichie unzip -o "${1}" -d "$(2)" > /dev/null 2>61 if [ -£°"$(2)"/.meta.ini ]; then getPages "$(2)"/.meta.ini "$(1)" "$(3)" 'Notez ici utilisation de foption -0 avec unzip, de maniére a rendre automatique l'écrasement de fichiers tants (puisque fon décompresse tous les fichiers ODT dans le méme répertoire temporaire). 35: # Récupérat niers Libreoffice 56: # $(1) : nombre de pages getarticles() ( # Création du répertoire temporaire local tmp_dir=§(mktemp -d -t get-articles-xx000ax) GNUILINUX MAGAZINE HORS-SERIE N‘105, # Programmation de 1a destruction du répertoire temporaire # en sortie du seript trap "em -rf §{tmp_dir)" EXIT cd $(0D7_PATH) while read -r filename do getdata "$(filenane)" "$(tmp dir)" "$(1)" done < <(find . name **.0dt") La boucle des ligne 66 & 69 va itrer sur le résultat de la commande find . -name "*.odt™. filename va Contenir le nom des fichiers ODT trouvés. ee seoe aT esc ey eee Prrererry ey eee ieee tee te ieret ts Cees CONCLUSION ‘Vous vous demandez peut-étre pourquoi ne pas avoir réalisé toutes ces opération 6 le choix de ce langage aurat pu étrejudicieux pour le traitement des données, m: sn Python ? En effet, ‘également pour dun ef s'assurer d'une compatiillé multiplate-forme. Mais d'un autre cdté, nous multiplions ici les appels a des com- ‘mandes Shell et c'est dans ces concitions que les scripts Shell montrent toute leur puissance. J'ai donc fat le choix du Shell, mais rien ne vous empéche de reprendre le code pour le retranscrire en Python (ou un autre langage) et 'améliorer! | REFERENCE [1] T. COLOMBO, « L'art du camouriage informatique », GNU/Linux Magazine n°182, mai 2015 : https:l/connect.ed-diamond,com/GNU-Linux-MagazinelGLMF-182/L-art-du-camouflage-informatique PATRONI, UN CLUSTER POSTGRESQL SIMPLE ET RAPIDE David BLASKOW COPE Cus CORR eras el a Cora at Ce Ce SST et er ee ee Ue) Bier ene et ed Con eee ais Patroni[f], __Patroni est un fork développé par I peut ailleurs re intégré & quest ce que —_Zalando [2] de Governor, qui votre Kubernetes, en s‘appuyant cest ?Eh lui aussi étaitun outilpermettant sur son ETCD. bien, cest cde mettre en place des clusters toys allons créer un cluster un outilen PostgreSaL arakas sreanes Gatos Python qui va vous permettfe our maintenir état du cluster ——_‘7.4, Comme nous avons évo- de personnaliser des déploie- PostgreSQL, out repose sur ‘qué, Patroni est écrit en Python, ‘ments, pour mettre en place tne base de données clés! du coup, nous utiliserons la ver- vos serveurs de base de don- valeurs, au choix: ETCD, sion 3.4 disponible dans le dépot rnées en haute disponibilité Consul ou Zookeeper. officiel de Centos. CChaque machine composera un nooud de notre cluster. Nous allons exécuter la version 8.6 de PostgreSQL, avec ETCD comme base de données clés/valeurs, Et voici oe que ga va donner Si vous avez Ihabitude dinstaller PostgreSQL, cette partie ne va pas bouleverser vos habitudes ; cependant, Cotte étape est essentiole. "Nous n’allons pas nous occuper de la configuration de PostgreSQL, mais juste de son installation : est PPalroni qui se chargera de la configuration, Jai choisi dutliser PostgreSQL 9.5 qui n'est pas dans les dépdts standards de CentOS, mais qu’ cela ne tionne, nous utlserons les dépéts de PostgreSQL. Etclest on ne peut plus simple : nous allons configurer le dépot via le RPM fourni sur chacun des trois noouds Et maintenant, installons notre serveur SQL toujours sur les trois nceuds (étape que vous pouvez automatiser avec un outil de gestion de configuration, tol que Ansible) Le service est stoppé ot désactivé, nous pouvons donc passer a a sulte, Notre premiére étape va étre de mettre en place un simple cluster ETCD. ‘Le but 6tantici de vous montrerla mise en ceuvre d'un cluster PostgreSQL via Patroni je nventreral pas trés en avant dans la configuration du cluster ETCD, mais vous pouvez aller jeter un cela la documentation officielle (3) Pour la démonstration,jutliserai un serveur ETCD non sécurisé. Bien évidemment, c'est une pratique & ban- rir, d8s le moment ol on n'est plus en mode exploratoire | I sufit pour cela de mettre en place quelques certi- ficats lest aussi tout a fat possible dutliser un cluster ETCD existant, si vous en avez un, ‘Sur chaque serveur, nous pouvons done lancer stallation Voila qui est fait! Il est temps de se lancer dans la configuration. Commengons par éditer le fichier sur chacun des nosuds, Pour le premior ncoud [Nous pouvons maintenant démarrer notre cluster ETCD, en langant le service ETCD sur chaque naoud (pensez aussi activer, parla méme occasion) Verifons maintenant état du cluster Le cluster est en bonne santé et prét a étre le réceplacie de l'état de notre cluster Patroni Patroni nécessite Python. Par défaut, CentOS est installé avec une version 2.7, ce qui ne nous convient pas. Nous allons done installer . et (disponible sur les dépots oficiels Centos) GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com ‘wwgnulinuxmag.com Une fois installs, je vous conseille de mettre jour pip et ‘Tout est maintenant prét pour installer Patroni. Nous allons installer avec Pip ‘Comme pour le cluster ETCD, les commandes seront & passer sur chaque noeud du cluster, cest encore une fois bien mieux si vous 'automatisez avec un outi de configuration, afin d’éviter les erreurs, de gagner du temps et surtout, de ne pas avoir refaire plusieurs fois la méme chose ! (Que diable, on ne travalle pas dans IT pour faire des choses manuellement !) Pour commencer, nous allons créer le fichier de configuration de Patron’; celui-i peut étre mis rrimporte (0, mais je vous conseille de le mettre dans. Ce chemin n'existant pas, il faut tout 'abord le créer, ot y motte le fichier YAML GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com ‘Si nous analysons rapidement le fichier YAML ci-dessus, nous avons fen premier lieu, la configuration lée a etted : le namespace, le nom du cluster, ensuite, nous avons la partie Nous permettant de gérer le cluster Patroni via API ensuite, la partie ‘contenant ia partie ‘ ej et enfin, la partie ui elle contient la configuration du serveur PostgreSQL. lutméme, avec la dofinition de 'tlisateur pour la réplicaton (ainsi que de son mot de passe) ot le superadmin. waw-gnatinuxmag.com GNUILINUX MAGAZINE HORS-SERIE N‘105. La partie tags, quanta alle, donne des informations de configuration pour Patroni "Nous y sommes presque, il ne nous manque plus qu’a créer 'arborescence ol se situera notre serveur PostgreSQL. SSi vous avez bien remarqué, nous avons indiqué dans le fichier de configuration Patroni : cest ce ui va déterminer ol placer les fichiers du serveur Postgres, et donc ici Enfin, pour démarrer notre cluster, il va falloire faire & la main (encore, ou & la manivelle, au choix) sures tuois noouds, via la commande Mais ce n'est pas trés pratique, et catastrophique au niveau opérationnel : que se passer redémarre ? sile nooud Pour faire les choses bien, nous allons fae en sorte que notre Patroni soit géré par Systemd et on aura beau dire, mais Systemd nous rend la vie bien plus simple pour la création d'un service. “Tout ce dont nous avons besoin est d'un simple fichier positionné dans explication de la création dunt Systemd sort quelque peu du cadre de cet article, mais deux choses ici sont importantes il est préférable que Patroni démarre apres ETCD fet que le service Patroni soit démarré avec utlisatour GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com Rapide reload systemd pour que cette nouvelle unit soit prise en compte Et maintenant, nous pouvons démarrer proprement notre cluster en tant que service Le cluster a bien démarré, nous pouvons voir ii que la machine sur laquelle nous nous trouvons est un nooud secondaire, et que celui suite leader. JJetons un ceil notre noeud primaire Tout semble bien : notre cluster est up and running \ol il ne nous reste plus qu'a placer notre cluster PostgreSQL. derrre un foad balancer, Une des choses intéressantes de Patroni, c'est son API. Cette API va nous permettre, par exemple, de déterminer quel est le noeud primaire, ou encore d'etfectuer un failover, de sort un nosud du cluster (pour une quelconque maintenance, typiquement la mise a jour du SE), ote Pour interagir avec API, nous avons deux méthodes Curl (out! devenu indispensable & quiconque interagit avec une API) ; Patronict (le CLI développé pour Patroni) Via Cur, nous allons pouvoir déterminer le noeud primaire ts simplement, carle naeud primaire répond par lun code HTTP/200, alors que les nceuds secondaires répondent par un HTTP/S03, Et maintenant, sur le nooud primaire Ce simple test est le health-check de base pour mettre notre cluster derriére un load balancer. Il est aussi tout fait possible de changer la configuration de Patroni via curl grace a ‘Commengons paar regarder notre configuration Essayons d'augmenter notre nombre maximum de connexions Et voila! Rien de plus simple, comme vous pouvez le voir. Patronict!estutitaire qui, comme son nom Iindique, va nous permettre de contréler notre cluster Patron Pour utiliser iva nous fallor installer un binaire python supplémentaire via Pip Uslisons pour verifier 'état de notre cluster, par exemple Essayons maintenant de basculer le Leader sur le second nceud La bascule est instantanée ! Et comme précédemment avec curl, il est possible ’éiter la configuration a la volée Par sa simplicité, sa facilité de mise en couvre et de maintenance, Patroni est pour moi un choix adapté pour la ‘mise en place d'un cluster PostgreSQL en hauite disponibilit, De nos jours, API est un atout sans pareil et dune précision étonnante, et elle vous permettra une fois votre Cluster en place de le gérer sans aucun accroc. Cet article n'est bien évidemment qu'une mise en bouche, mais ‘espére quil va vous donner envie d'appro- fondir ce magnifique produit, et de Iuliser dans vos différents projets! Documentation Patroni https:lipatroni.readthedocs.olenilatest Gitkiub Patroni par Zalando https:/igithub.com/zalandoipatroni Documentation officielle CoreOS ETCD hitps:llcoreos.comletedidocsilatest! GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com N°106 Nov. / DEC. 2019 DELA ‘CYBERSECURITE LE MAGAZINE Y (ve ET DEFENSIVE OFFENS! r Preto ch ez votre marchand de journaux et sur www.ed-diamond.com 4 ’ il ee fevOps :« (..) un mouvement en ingéniere informatique et tune pratique technique visant a unification du développe- ‘ment logiciel (Dev) et de ‘administration des infrastructures informatiques (Ops), notamment Fadministration systéme. », apres Wikipédia, Dans le dossier de ce numéro hore-séria, nous nous sommes consacrés aux buts utiles aux développeurs (‘ou ailleurs le tire de « Botte & outils»). Les artcies présentés sinscrivent dans la mouvance DevOps sans pour autant resterfocalisés sur les outls phares que sont Docker, Torraform, Prometheus ou encore Ansible, Nous nous trouverons un peu plus du cBté Dev que du cbté Ops... une sorte de DEVops (d'un point de vue marketing, il est toujours bien vu dintroduire de nouveaux termes ! Attention toutefois la casse...). Nous aborderons ainsi plusieurs thématiques = «= Le Shell peutil venir en aide aux développeurs ? Il existe pléthore de ‘commandes en Shell et, parmi elles, certaines peuvent s'avérer particullé- rement utiles pour le développement. Nous passerons quelques-unes de calles-cien revue. «= La compilation de code avec Cmake. Comment utiiser correctement cet ‘= Un point crucial du développement : la gestion des versions concurrentes 04 versionning. Nous aborderons le cas du gestionnaire de révisions dis- tribué le plus connu, Git, sous un angle original en nous mettant tour 3 tour dans la peau d'un développeur amateur, dun développeur meter pus dun développeur chevronné. «= Lautomatisation des tests grce integration continue (Cl). Nous pré- senterons deux outils permettant de mettre en place une Cl : CireleCl et ‘Au programme donc deux thémes plus Dev et deux themes DevOps, nous ‘sommes bien sGr du DEVops et sur quatre thémes incontournables ! En dehnors du petit jeu de majuscules sur le terme DevOps, force est de consta- ter que nous aurions tout aussi bien pu aborder ce hors-série sous le seul titre de « Botte & outls du développeur » sans plonger avec allégrosse sur emploi d'un buzzword qui est de plus en plus souvent éloigné de sa definition originale. Regardez les ofres d'emploi: lorsque les entreprises recherchent un DevOps, elles recherchent un profil « bouche-trou », & qui on pourra demander de faire un peu n‘importe quoi. Originelement, le terme DevOps visait a définir le rapprochement des Dev et des Ops dans le cadre «un travail en équipe pour atteindre un objectf commun, réalisé & grands coups ¢'automatisation... ce qui est fialement le but de toute personne tra- vallant sur des ordinateurs | Ce dossier est done pour vous les Dev, les Ops... en fait les informaticiens ! Bonne lecture ! Larédaction | 010101100101100111103 ef “ oe, <> DU SYSADMIN AU DEV: = DES COMMANDES - _ SHELL POUR LES =>" DEVELOPPEURS Tristan COLOMEO «@ Shell rest pas réservé aux administrateurs systéme. Bon nombre de commandes sont tras utiles dans le cadre d'un développement : des commandes peu connues, mais également des Ccommandes trés basiques que tout informalicien, quel que soit son domaine expertise, devralt connattre. Dans cet article, nous commencerons par un rappel de ces commandes élémentaires, avant d'aborder des commandes moins connues. 1. LA BASE DE TOUT La toute premigre commande, celle sans laquelle on ne peut absolument rien faire, est bien entendu man ! 1.1 La commande man Pour obtenir la documentation sur une commande, il faudra employer man (pour manual suivi du nom de la ‘commande. Et pour comprendre comment fonctionne la commande man, iln'y @ qu'a appeter man Une page de manuel se compose des sections suivantes = NAME : Contient le nom de la commande, suivi d'une courte description de son utiité. Par exemple Nom peer oe ee eee eee ees '= SYNOPSIS : Indique comment utliser la commande. Une convention s'applique pour représenter les infor- ‘mations dans ce champ. La page de man de man nous dit : ere eee eer erty eee teC ME ETL SUC etre arts ss oot] esol ee ce eerste -al-b eee eeae ce eC ee ear tary Pisseer eeapre steer ae ped Pe eae 2d cc toute l'expression située a l'intérieur de [ } Poa Voici un exemple de synopsis pour: Bnased man [-C file] [-d] [-D] [--warnings[=warnings}] [-R encoding] Cee OMe t eo eC SMe omen orc mates feeb eC ee eee) [-u] [--no-subpages] [-P pager] [-r prompt] [-7] [-E encoding] [--no- erst encceetrisestrtst Me stc Mes mec cece sme corr soB fete rsep) = DESCRIPTION : Contiont la description longue de ce que fait la commande. C'est généralement la section la plus longue de la page de man et on y trouve le détail des différentes options autorisées Dad Parfois, les options sont regroupées dans une section spéciale OPTIONS. C’est par exemple le as pour la page de man de man, méme si en général les options sont listées dans DESCRIPTION. ‘= EXEMPLES : Cette parte n'est pas toujours présente, mais elle est bien utile, car elle présente des cas application de la commande. Prenons lexemple du man de la commande t evan Con Baro a ee see esc east fee ees renee tare Tes ‘= CODE DE RETOUR : Comme son nom Iindique, vous trouverez dans cette partie la liste des codes de retour ullisés par la commande. Trés ulle pour trater les erreurs depuis un script! Eeeeeern eee etd Pia Ons ee CUM esc re ee eee ecorst etsy Peeea tree artes Cet eee esc rete oe ecco see) 16 Au moins une des pages ou un des fichiers ou un des mots: Seer rea Dray La présentation des pages de man peut étre un peu austére. Si vous souhaitez obtenir des pages colorées, définissez comme commande de lecture most dans le fichier de configuration een Cee te a ee ees waw-gnatinuxmag.com GNUILINUX MAGAZINE HORS-SERIE N*105 ‘Meme sila plupart du temps, on utlse man sans option, i faut savoir que pour chaque page de man, il existe des sections Serer eee err er neers ee eee ear rs ies eters ere ee ee Cee eee Ee Cee ere eed foot) Peter eco e oe eer) Eee ssecc te eerste eet ee COR Sten orton Peg) Ce Ctr Care 5 Formats des fichiers et conventions. Par exemple /etc/passwd A Co eC CeCe enc ECU S2A0) ORC Cee eC COM eC eo Preeteseereretrs) ee eee el) Toutes ces sections ne sont pas nécessairement remplies et lors de fappel de man sans option, a commande va rechercher et aficher la premiére page, en fonction de Fordre prédéfini dans le fichier /etc/ c Par défaut, cat ordre est défini comme suit 111: SECTION 1 n 1 8 3 2 3posix 3pm 3perl 3am 5.4967 Ans, sila page de manuel 1 contient des informations, les autres pages seront ignorées, Prenons exemple dela commande feces SLEEP (1) Cre SUEEP(1) ort SO ee rece ee tere ean er eae Tere etry Perased Ses aT PSPeR csr Cette commande est équivalente & man sLeep..1, puisque nous afficnons la section 1. Par contre, sinous ssouhaitons des informations sur la fonction sLeep() pour coder en C, nous ne pourrons pas y accéder en tapant simploment man sleep. Il faut préciser que nous souhaitons accéder a la section 3 ery SLEEP (3) eC et ae Te) NAME PS Ce eas Ore eae rrr 2c eee eed SYNOPSIS Pree eres SIRE UCC cc Senet ec ee arr icrt sy} MOSSOER ‘Done, suivant que vous souhaitiez développer un script Shell ou programmer en C, il faudra préciser la section 1 oul section 3 Con eC Cu enna Peers rst time (7) See eco eee ans romereeetete time (2) Bee ePaeL Oo) cere eran eae n est done trés utile si fon connat le nom de la commande, dans le cas contraire, il faudra passer d'abord par apro} 1.2 La commande apropos La commande apropos va rechercher dans le nom et la description des pages de man laccurrence d'un param@tre transmis par utlisateur ees sleep (1) Endormir un processus pour une durée déterm: clock_nanosleep (2) - high-resolution sleep with specifiable clock nanosieep (2) high-resolution sleep rtowake (8) enter a system sleep state until specified Saree sleep (3) Ste eee ere sec ete eae eed sleep.conf.d (5) Eee iner in rreeenter ieentsD ee tStnwr sary Une fois la commande trouvée, i n'y a plus qu'a invoquer man sur la bonne section (elle est indiquée entre parenthases aprés le nom de la commande, dans la sorte d'apropos). Taig Cette commande peut étre utilisée pour afficher toutes les sections disponibles pour une page Pe So en LG crac) eee ecco eee ee eS ears eneerentetery time (2) Seeger eee cy time (3am) Bxoeeseererie ears waw-gnatinuxmag.com Pour rechercher des fichiers dans 'arborescence, on ullisetradtionnelle- ‘ment la commande find avec la syntaxe find -name “". Par exemple, pour retrouver tous les fichiers LibreOffice Writer dont le nom commence par doc_ et qui se trouvent dans le répertoire /hone/Login/Work : (On retrouve bien sdr toutes les options permettant de cibler les fichiers par ‘apport a leur talle (-size), leurs droits d'accés (-perm), le laps de temps relatif au dernier acces au fichier (-amin, ete LLoption -exec permet ensuite d'exécuter une commande sur les fichiers renvoyés, Par exemple, pour effacer tous les fichiers compressés en zip pré= ‘sents dans l'arborescence, depuis lerépertoire courant. ‘ind est donc trés complet et comme il est aussi trés connu, je ne m'éten- ral pas plus longtemps dessus, un man find vous apportera toutes les. Informations manquantes concernant les différentes options offertes, pour ible es fichiers. Une autre commande de recherche de fichiers est bien pratique : Locate. ‘Son fonctionnement est ditférent de find, puisqu'elle recherche les occur ‘ences des fichiers dans une base de données... uil faut done mettre a jour réquliérement | ‘Locate niest pas présente par défaut et i faut donc installer. Surles sys- temes basés sur Debian, ce sera Vous disposerez alors bien entendu de la commande Locate, mais égale- ‘ment de la commande updatedb permettant de mettre a jour la base. Lors du premier appel d'updatedb, la commande est nécessairement longue, puisquielle dot indexer ensemble des fichiers Mais une fois que celle-ci a terminé son travail, es résultats sont immédiats. Reprenons lexemple précédent avec la recherche des fichiers LibreOtfice Writer, dont le nom commence par doc_ Ets vous voulez vous restreindre & un répertore de départcible comme /hone/Login/Work, il vous suffra de le spécifier dans la chaine de recherche GNUILINUX MAGAZINE HORS-SERIE N‘105. MOSSOER ee Notez que le résultat sera le meme qu'en uti a oan | ee Etjustement, puisque nous parions de grep, voll une troisiéme commande de recherche de fichiers parti- culiérement utle pour le développeur, puisqu'elle permet de rechercher du contenu a rintérieur des fichiers 1 Pour ma par, jutlse toujours la syntaxe suivante: grep =r --color -n -i -F "crecherche>" *.Les options ullisées effectuent le travail suivant: ss +1: recherche récursive ; ‘color: affichage en couleur (les mots de recherche trouvés sont affchés en rouge, les noms de fichiers fen violet, les numéros de ligne en ver, etc). ‘= =i: afchage des numéros de ligne ; 1= +4: ignore la casse (ne fait pas de distinction entre caracléres majuscules et minuscules) ; ‘= +F :interpréte la chaine comme une chaine de caractéres normale et non une expression régulire. Ceci permet de rechercher les caractéres employés traditionnellement dans les expressions réqu: ligres comme *, $, etc. Par exemple, la commande grep sans option -F va nous permettre de faire une recherche du terme import en début de ligne : ee ee Presser eee La méme commande, dans le méme répertoie, avec Foption =F ne donnera pas le méme résultat (elle ne trouvera la présence du motif dans aucun fichier) : Ee 1.4 Diff LLorsque l'on développe, il peut étte interessant de comparer le contenu de deux fichiers (par exemple, deux fichiers générés par un script avant et aprés une modification). La commande diff réalise cette tache ts ‘implement. Prenons deux fichiers d'exemple. fichier_1.txt contient : Ceci est un fichier d'exemple contenant quelques données 125 ;34;65 45; Le second fichier, fichier_2.txt, contient: Ceci est un fichier d'exemple contenant des données = 125;36;65; 35;6:9; MAGAZINE | FRANCE = cs ae CREEZ VOTRE PREMIERE APPLICATION KGHAIN) << Perera POURQUO! REMPLACER PPro cdi Pr oh Lida TYPAGEEN PYTHON : MYPY ‘ =" sa ; f UARKUS ETAUSSI... ead pS Pye aad AVEC cies chez votre marchand de journau et sur www.ed-diamond.com | Can I iosque sur www.ed-diamond.com Smee eee eec ei Reet) by) » Vous l'avez raté ? Vous avez une deuxiéme chance |! ra, ie 8 ar aS CTS as A nouveau disponible chez votre marchand de journaux et sur www.ed-diamond.com Un appel « brut » a diff va nous donner le résultat suivant Prego tenet tears re) quelques données Eee 45,778 Peer peers Eat II faut maintenant déchifirer le message renvoyé. ‘Sura premiére ligne, la commande nous indique des numéros de ligne correspondant au premier fichier, une letire, et des numéros de ligne correspondant au second fichier. Les lettres peuvent éire de trois types : ‘= @ pour ajout (ada) ; ‘= © pour modification (change) : ‘= d pour suppression (delete) Ce sont les actions permettant de passer du premier fichier au second. Dans notre cas, il faut modifier (2, 4¢2,4)les lignes 2 & 4 (2,42, 4) du premier fichier pour qu'elles correspondent aux lignes 2 & 4 (2, 4¢2,4) ddu second fichier. Les lignes précédées du signe < sont les lignes du premier fichier impactées par les modif- cations et les lignes précédées du signe > sont calles du second fichier, ‘Si nous copions txt dans fi {et que nous ajoutons une nouvelle ligne dans ¢ nous indiquera un ajout dans le second fichier race nee eae > 22;3:4 Et effectivement, aprés la ligne 4 (4a5) du premier fich pour que les fichiers soientidentiques. il faut ajouter (4a5) la ligne 5 (4a5) du second fichier {faut reconnaitre que c'est pratique, mais pas foroément ts lisible... Pour les pets fichiers, vous pouvez uti liser Foption -€ pour vor les diférences directement sur les fichiers Perec reese aed Pesce eocs ote CMR Mey sentry Portree Pte eC ER EEC EE ICEL IeCr IT) poeaeer ener Cee eect isc ot acrid peer eearecnrees peered rere fc) sons Senco otic Pee eee = waw-gnatinuxmag.com GNUILINUX MAGAZINE HORS-SERIE N*105 MOSSOER Les caractéres en début de ligne peuvent étre de trois types ‘= {ligne nécessitant une modification ; ‘= = :ligne du premier fichier supprimée dans le second ‘= + ligne absente du premier fichier et ajoutée dans le second. Enfin, option -u va permetire diobtenir un résultat« unifié », un format compréhensible par la commande ! At'appe! du diff, i suft alors de rediriger la sortie dans un fichier, pour pouvoir utiliser parla suite pour modifier un fichier cible : “Maintenant, nous pouvons appliquer le patch fichi ichier_2.txt pourle transformer en eee an posttest est ttt mss eG eS aC Ce et aC Dad SE Re Ce TCC Ck ee doe Ce Reet ee ee a oe eee ted Seecroe cons Po ‘sachez quil existe une commande dif f3 pour comparer trois fichiers, une commande pour aficher le contenu de deux fichiers sur deux colonnes et bai, pour travailer sur de gros fichiers 1.5 L'archivage et la compression Pour partager son code ou le sauvegarder, lorsque r'on ruts pas un syst8me de gestion de versions concurrentes, on passera par larchivage et la compression. On retrouve ici classiquement la commande tar, il faut seulement se souvenir des options les plus fréquentes ‘= Pour créer une archive mon_projet. tar d'un projet se situant dans le répertoire ee eR ead $ tar -czf mon_projet.tar.gz projet GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com Pour extraire une archive depuis mon_projet.tar : Pour extraire une archive compressée depuis mon_projet.tar.gz Dans toutes les commandes précédentes, option -v déclenche le mode verbeux, pour obtenir un maximum informations et -f est Foption permettant d'indiquer le nom de fichier en entrée (done, a toujours indiquer en derier dans le groupe d options) Pour s'assurer rapidement de absence de lignes dupliquées au sein dun fichier, on peut utliser la commande unig. Prenons le fichier d'exemple fichier_dup. txt Ceci est un fichier d'exemple Ceci est un fichier d'exemple 125 ;34;65 45;7:8 Un appel a unig supprimera les lignes en doublon. Si en plus on y ajoute option ~c, on pourra également affcher le nombre d'ocourrences de chaque ligne, avant fitrage par unig : MOSSOER 1.7 Sed La commande sed est une commande extrémement puissante de manipulation et c'édiion de données & la volée. Elle permet de travaller rapidement a la modification de fichiers (éventuellement de code) depuis la ligne de commande. La syntaxe sera : sed -e . Par exemple, pour supprimer ensemble des lignes de commentaire dun fichier mon_script.py. on pourra [as ad Pour en apprendre plus sur cette commande, vous pourrez vous reporter a l'article de Romain Pelisse publié dans un précédent hors-série (1) 2. LES COMMANDES UTILES DANS LES SCRIPTS Certaines commandes du Shell sont particuligrement utiles pour réaliser des tiches a lntérieur de scripts ‘Shell. Dans cette partie, nous allons voir certaines dfentre elles. 2.1 Sort La commande sort permet de tier rapidement des données présentes dans un fichier. Prenons l'exemple du fichier names. txt = 1 gules César 5 Hannibal Barca 3 Alexandre le Grand 9 Gengis Khan 8 Napoleon Bonaparte lest possible de ter les données suivant ’importe laquelle des colonnes (index, prénom ou nom). Pour un ti ‘numérique, il faudra spéciier option =n estes eras) Peeoerrees ey Pour indiquer sur quelle colonne doit porter le tri, on utiisera Toption - -key= suivie du numéro de colonne (la ‘premiére colonne étant numérotée 1): on Peon Peecrssi ty paeee Peso ery Dad eect a 2.2 Cut La commande cut est un grand classique des outils du Shell qui sont d'une grande ullité dans des scripts LLoption =d permet de specifier le ou les caractéres qui délmitent les colonnes et option =f sélectionne les ‘champs & affcher. Si nous prenons le fichier / ‘et que nous souhaitons afficher le login (premiere colonne) et le nom complet des ullisateurs (cinquiéme colonne), i faudra exécuter re eee sees preeeere veer regs tT poeeeetintiee pene ecs teeny 2.3 Pv 1 9 Pie Veer, es une conrande cu ene! osu lpn une ache 3 avers in pe (pour la copie d'un fichier, cela sera fait directement par la commande pv qui remplacera cp). pv n'est pas ins- tallé par défaut : Vein expan ord cop ceri. fite rar dae coy bi Spepreet err a rat 1,09Gio 0:00:02 [ 195MiB/s} [- Cece) Et voici un exemple utilisant un pipe pour la création d'une archive compressée re ee peered cer ORE LSC ears U YEE i 2.4 Dialog La commande permet de créer trés simplement une interface en mode CLI pour interroger Iutlsateur Cette commande n'est pas disponible par défaut et dot étre instalée (On peut par exemple demander & utlisateur de choisir une date en effectuant sa sélection dans un calendrier. ‘Nous écrirons un petit script quill faudra penser a rendre exécutable (chmod u+x) ¥i/bin/bash userDate=$ (dialog --stdout --title "Calendrier" choisir une date" 0 0 1 1 1970) 9(7) in calendar "Veuillez 0) echo "L'utilisateur a choisi : $(userDate)." 1) echo "L'utilisateur a cliqué sur ANNULER" 255) echo "L'utilisateur a refermé 1a fenétre' esac Ce script exécute dialog pour afficher une fenétre contenant un calendrier (-~calendar) sur lequel la date ft fxée au ter janvier 1970 (1 1 1970) pour étre sur la méme logique que la commande time. La sélection de Fullisatour est stockée dans la variable userDate et le code derreur de la commande (${?}) permet de determiner siutlisateur a cliqué sur Annuler (code 2) ou s'il a refermé la fenétre (code 255). La taille de la fenétre est colle définie par le widget (0 0). Au lancement, on obtientaffichage de la figure 1. Veuittez choisir une date Mots Année janvier 1970 ce a) dum Lun mar mer Jeu ven sam 1 B23 Ad 9 9 ait 5% 3 2 3 14 a5 6 a7 4 5 18 19 20 21 22 23 24 3 26 27 20 39 30 it Ja SERIE De nombreux autres widgets sont aisponibles, allez done voir man dialog ! 2.5Zenity Une alternative graphique & dialog est la commande zenity, qu dot elle aussi re intaiée : ‘De maniére & comparer avec dialog, nous allons réalisé un script simiaire, nommé select_days_zenity.sh cote fois-ci: userDate=$(zenity --title "Calendrier" --calendar --text "Veuillez choisir une date" --day=1 =-year=1970) case ${?) in 0) echo "L'utilisateur a choisi : ${userDate}.";; 1) faut modifier les paramétres d'appel par rapport a dialog: la date est spéciée a aide des paraméttes --day, --month et --year. De plus, les codes dere ne sont pas les rmémes : on ne peut pas distnguer la fermeture de la fenétre dun cic sur le bouton Annuler (meme code 1). Aulancement, on obtent la fenétre graphique présentée en figure 2. Ici encore, de nombreux autres widgets sont disponibles et leur liste est accessible par ‘man zenity, et un article un peu plus detaillé avait été publié dans Linux Pratique, ily a quelques années [2] | pout étre intéressant de proposer & ses utlisatours un affchage sous forme de tableau de bord... mais comme nous sommes ici dans le cadre d'outils destinés & des ‘développeurs, autant que ce tableau de bord pulsse dire affiché dans un terminal WOPR [3] est un outil NodeJS qui répond justement a cette exigence. Ii peut étre ut- cho "L'utilisateur a cliqué sur ANNULER ou a refermé 1a fenétre";; «janvier > 5 10 lisé en ligne en transmettant un modéle de rapport au format XML, mais peut également étre employé en local, ‘ce que nous allons faire dans cet article. MOSSOER eee fn ‘Comme tout outil NodeJS, il faut installer WOPR via nm Les rapports sont des documents XML ayant le format suivant CChaque page (done ) est composée dune grille de 12x12 cases indexées de 0 a 11 sures lignes et les colonnes. Les widgots sont ensuite disposés surla page a Vaide de la balise ot de ses attbuts ‘= coL : pour donner index de la colonne ot positionner le widget; ‘= Fow : pour donner Findex de fa ligne ; = colSpan (facultatif): pour agrandir le widget en fusionnant des colonnes ; ‘= rowSpan (facultati : pour agrandir le widget en fusionnant des lignes. WOPR accepte des balises pour un texte au format Markdown qui sera rendu en utlisant des couleurs pour représenter las styles (talique, etc) Un défaut de ce projet estla documentation tres lmitée. Pour comprendre quels sont les widgets disponibles (sachant qu'l est également possible d’en créer, mais que cela sortirat du cadre de cet article), i faut analyser le code de démonstration four dans le répertoire examples des sources. Je vous propose ici mon exemple de rapport (dashboard. xml), adapté des exemples proposés et commentés | | i Simplement pour montrer que l'on peut ajouter plusieurs pages dans un rapport.4#10;Chaque page sera accessible en appuyant sur **RETURNS* La douxidme page ne présente aucune nouveaut6, elle est seulement présente pour montrer quil est possible avoir plusieurs pages au sein d'un méme rapport. Pour afficher le rappor, i faut lancer ee Le résultat de cette commande est présenté en figure 3. GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com Ifaut reconnaitre que WOPR est quelque peu limits, par rapport a un tableau de bord avec interface web. ‘mais justement, c'est parce quil tourne dans un terminal et c'est quand méme bien pratique. Il faudra done choisir sila présentation dinformations sans interactivité sufft ou sl vous faut vous lancer dans un développe- ‘ment plus complexe, pour présenter vos données. llexste telement de commandes et de petits outs qui peuvent tre utiles aux développeurs quil est impos- sible de tous les recenser, au sein d'un méme article. Nous avons @ailurs pu voir également que certains utils « non Shell » pouvaient étre trés intéressants pour s‘interfacer avec des scripts. A vous maintenant de les tester ot de orer votre bote& outs. R. PELISSE, « Marie des expressions réguliéres avec Sed », GNU/Linux Magazine 0°102, ‘mai 2019 :https:f/connect.ed-diamond.com/GNU-Linux-MagazinelGLMFHS-102/Maitrise-des- expressions-regulieres-avec-Sed T. COLOMBO, « Interfacez vos scripts shell avec Zenity », Linux Pratique n°075, janvier 2013 https://connect.ed-diamond.com/Linux-Pratique/LP-07Siinterfacez-vos-scripts-shell-avec-Zenity Dépét GitHub de WOPR : https://github.comlyaronn/wopr ‘wwgnulinuxmag.com GNUILINUX MAGAZINE HORS-SERIE N‘105. r\ MAGAZINE / FRANCE CREEZ VOTRE PREMIERE APPLICATION BLOCKCHAIN Tote 0) GE oO i 5 Sa Peelers eis NUMEROS STANDARDS. NUMEROS HORS SERIE A découvrir sur : connect.ed-diamond.com OYA Mabe Pour vous abonner : www.ed-diamond.com Pour un devis personnalisé ou pour en savoir plus : Tél. : +33 (0)3 67 10 00 20 * E-mail : cial@ed-diamond.com HOSSIER ET DISTRIBUER VOS APPLICATIONS @7/%" SUR PLUSIEURS == PLATEFORMES AVEC ff Du dev au sysadmin : Apprenez & concevoir et distribuer vos applications sur plusieurs plateformes avec CMake | arrive trés souvent qu’a la fin du développement d'une application, on désire créer un exécutable ‘ou un package que 'on pourra distribuer & des collagues. Par exemple, on souhaiterait pouvoir faire onctionner notre application sur un systéme d'exploitation 32 bits et sur un systéme d'exploitation 64 bits. C'est un probléme trés fréquent dans le monde du développement de logiciel, et c'est & ce point précis quiintervient CMake. Dans la suite de cet article, nous présenterons outl CMake, puis nous en. ferons une prise en main au travers d'un exemple, au cours duquel on installera et on le configurera pour un projet —e ne 1. PRESENTATION DE CMAKE 1.1 Introduction (CMake [1] est un outil open source de construction d applications sur plusiours systémes dexploitation. I assure organisation du projet, le test at le déploiement du logiciel sur différentes plateformes. CMake a été iniié par 'entreprise americaine Kitware et développé par Andy Cedinik, Bill Hoffman, Brad King, Ken Martin ‘et Alexander Neundort, Sa premire version date de 2000 et aujourd'hui, nous en sommes a la version 3.15.0. PPrincjpalement coneu pour résoudre le probléme de compilation muiiplate-forme, CMake est aujourd'hui un systéme tr8sutlisé dans ce domaine et dans d'autres encore, car ila vantage d'étre open source et fable et de ce fata, beaucoup de logiciels oélébres ont été concus A partir de lui, par exemple KDE, MySQL, Opencv, Geant, ReactOS, etc. (2) (CMake, malgré sa grande communauté, a tout de méme des concurrents coriaces, on peut citer entre autres ‘Scrons, make, Autotools (que vous rotrouverez dans un article du présent hors-série) et Premake. FORCES ET FAIBLESSES DE CMAKE Ce eee ee Cet ed connaissances. De plus, il offre énormément d’options que vous pouvez découvrir dans la documentation [1]. lest également possible avec CMake de générer des projets Eclipse et CodeBlock. Le principal Ue eee te eae ee ee ees Toutefois, CMake a un inconvénient, il utilise différents modules pour fonctionner, en d'autres termes, Dee ee eee ee er 1.2 Principe de fonctionnement (CMake est un utlitaire qui & partir d'un ensemble dinstructions génére un fichier MakeFiLe qui, une fois exé- - cuté avec des parametres précis en entrée, effectue une tache automatiquement. CMake est un systéme pos- ssédant 3 principaux outis : 'outil CMake lui-méme, CTest et CPack [1] TY 2 out cto peti génsrton dn RakeFite parr de insets écrtes dan un angage EF )) te tangage de cia). Une fis lo MakeFte générb, on poutullisr pour effecuer un ensemble do ‘aches déja préconstruit par CMake. ‘www-gnulinuxmag.com GNUILINUX MAGAZINE HORS-SERIE N‘105. i as MOSSE : See ‘= LoutllCtest, quant 2 lui, aide dans la génération, exécution et la gestion des tests de notre application. ‘= Enfin, foutil CPack de son odté est axé sur la génération des packages dinstallation redistribuables. En effet, CPack intervientlorsquion voudrait construire un fichier qui va se charger de déployer notre projet dans une machine queleonque. LANGAGE DE CMAKE Le langage de CMake est un langage par lequel le programmeur donne des instructions a CMake. Le développeur écrit donc dans ce langage une suite d'instructions destinée a CMake. Comme la plupart des langages, il existe un type de fichior dans lequel on peut écriro ce code, Il s‘agit des fichiers .cmake ou encore, un fichier spécial appelé CMakeLists.txt. La syntaxe de ce langage est, simple, on y trouve d'ailleurs des fonctions ou commandes, des variables et méme des structures Pores (CMake, bien que possédant une version graphique simplifiée, fonctionne essentiellement en ligne de com- ‘manda. Le principe est le suivant: le développeur code un ensemble dinstructions dans un fichier nommé (CHakeLists. txt la racine de son projet et ensuite, fait appel & CMake en ligne de commande pour géné- rerle MakeF ile & partir de ces instructions. (CMake s'adapte au langage de programmation utlisé dans le projet; il peut méme s'utliser sur des projets fails avec plusieurs langages de programmation. Dans la section suivante, nous allons entrer en profondeur de (CMake a aide dun exemple :allons coder ;-) lt 2. PRISE EN MAIN DE CMAKE 2.1 Téléchargement et installation (CMake est donc un out bre et téléchargeable en ligne gratuitement [1]. Lorsque vous voulez installer (CMake, vous avez le choix : «= Soit vous instalez CMake directement en ligne de commande, sans le télécharger sur a plateforme, avec les commandes suivantes ees a eee « Soit vous téléchargez le fichier extension . tar.gz correspondant a votre systéme dexploitation, & adresse https:/iemake.orgidownload! eta la section Binary Distribution de la page web. Si vous avez choisi de télécharger le fichier . tar.gz, alors procédez comme sult 1. Décompressez le fichier .tar.gz quelque part dans votre machine (par exemple, dans le dossier home de "utlisateur en cours) : 2. Ouvtez votre dossier home et ouvrez le fichier caché bashre ; 3, Ajoutez les lignes suivantes @ la fin du fichier, en remplagant /path/to/cmake par le chemin vers le dos- sior de CMake précédemment décompressé GNUILINUX MAGAZINE HORS-SERIE N‘105, ww. Ta Sea Ta ‘export CMAKE_HOME=/path/to/cmake | export _PATH=§ (CMAKE_HOME) /bin:§(PATH) ee 2.2 Création du projet Pour la suit de cete prise en main, nous allons défi un projet que Ton varéalser ide de CMake et avec te langage C. Ce projet est en fait la réalisation dune i va faire fadition, la soustracton, la multipl- cation et la division de deux nombres. On va appeler ce projet Calculator. 2.2.1 Implémentation du projet Pour commencer, créons un dossier portant le nom cal.culatrice et dans ce dossier, créons 3 sous-réper- toires, build, sre et include : ‘= build contiendra les fichiers générés par CMake (ce dossier interviendra plus tard) ; ‘= sre contiendra les fichiers sources de notre projet ; ‘= include contiendra les fichiers d'en-téte du projet (les headers). Les commandes correspondantes a ces opérations sont Perr eerste eeetrnrsresy poereg erst were sec rs (On va créer un dossier Lib dans le dossier src, ce nouveau dossier contiendra les implémentations des fonc- tions définies dans les headers | EE Comme notre projet est simple, il ne nécessite que 3 fi s= Un fichier main. contenu dans le dossier sre ; «= Un fichier caleuLator.¢ contenu dans le dossier sre/Lib ; 1 Un fichier cal.culator.h contenu dans le dossier include. re teen ecru er er ere ras (On va maintenant passer a la phase du codage de notre calculatice. La description du projet fit ressortir 4 {onctions que Von va utlser. Une fonction d'addition, une fonction de soustraction, une fonction de mutiplica- ‘ton et une fonction de division Ainsi le contenu du fichier catculator.h sera ‘double _add(double a, double b); double “sub(double a, double b) ; double Tmul (double a, double b) ; double “div(double a, doub! B): MOSSOER Etdans le fichier calculator finclude "./../,./include/eaiculator.h” double _add (double a, double b) { return atb; ) double _sub(double a, double b) ( return a-b; ) double _mul (double a, double b) ( double b) { Etenfin dans le fichier main. c, on va implémenter le code principal de notre calculatrice = Yinclude finclude finclude finclude "./../include/calculator-h" int main(int age, char *argv(]) ( if (arge == 4) ‘ char* op = argv[i]: char* a= argv[2]; char* b = argv[3]; double r = 0; Af (steomp(op, add") == 0) ( r= add(atof (a), atof(b)); printe("41£" 2); Velse if(steemp(op, "sub") == 0) ( jub (atof (a), atof (b)) + printe("41£",r); } else if(stromp(op, “mul") == 0) ( = mul (atof (a), atof (b)) ; printe("41f",r); } else if(stromp(op, "div") == 0) ( r= _div(atof (a), ato£ (b)); printe("41£",r); } else { printé ("Erreur de paramétre: , 1 else Print€("Erreur de paramatres") ; return 0; ) (On a fini avec le code C, maintenant on passe a lintégration de CMake, GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com ST TIE ey CERES TES 2.2.2 Configuration du projet (On va ajouter CMake dans notre projet pour la compilation et ls tests. Dans le fichier CMakeLists. txt, on va commencer par définir la version minimum de CMake qui exécutera nos instructions. Nous choi- sissons la version 2.8. En effet, est préférable de choisir la version la ‘moins basse, la plus stable et la plus populare possible, afin déviter & toute personne qui souhaiterait compiler notre projet avoir & réinstal- ler une version de CMake. Ainsi la version 2.8 est trés populaire et la plus adaptée, car beaucoup de distribution Linux ont des CMake deja installés qui oscillent entre les versions 2.8 et 3.10. De plus, nombre [anguagel, Language2.....]). Ici, est le nom du projet et Language, Language2... sont des paramétres facultatis, {qui permettent de définir les langages qui seront ulsés dans le projet (par defaut, les langages sont le C et le C++) (3). Dans notre cas, notre projet s'appelle calculator et sera codé en C, done on va ajouter le code suivant project (calculator C) ‘Comme note projet posséde deux dossiers, sre et include (build rest pas compte ii car souvene2-vous qui contiendrales fichiers de CMake), ‘alors on va devoirles ajouter grace la fonction add_subdirectory() défirie comme suit: add_subdirectory ), i - estle nom (ou le chemin relat pari du dossier contenant fchier CHakeL ists. txt) du dossier que fon souhaite ajouter [B].Ainsi on va ajouterles deuxinstructions suivantes: add_subdirectory (include) add_subdirectory (ere) Une chose trés importante retenir est que tout dossier défini dans (CMake doit avoir son propre fichier CMakeLists..txt, Ainsi, on va ajouter dans les dossiers sre et include un fichier nommé égale- ‘ment CHakeLists. txt, qui contiendra les instructions spécifiques ppour ces régions (sr¢ et include) du projet. ‘De méme, on doit rajouter le dossier srr¢/Lib dans notre projet. Pour ce faire, on se sert du fichier sr¢/CMakeLists. txt en y ajou- tant cect: Et ensuite, il faut ajouter un fichier CMakeLists. txt dans le dossier sre/lib. La structure des fichiers de notre projet jusquici est présentée en figure 1 "Nous continuons la configuration par la definition d'une librairie. En effet, dans notre projet nous avons créé une liraire, qui est constituée d'un seul fichier calculator-.c. Ce fichier doit done étre compli, afin que notre fichier exécutabe final puisse appeler les fonctions qui se trouvent dans. cate libra. Pour compiler cette libratie, commencons dabord par ouvir le fichier sre/ ‘Lib/CHakeLists txt. On va créer une variable (en CMake) quicontien--——_~)fecuve ves Fehrs cuore dra tous les fichiers du répertoire sr¢/Lib & Taide de la fonction file() Cette fonction est définie comme suit: file(GLOB variable [RELATIVE path] [globbing expressions]...) od = GLOB permet dindiquer a la fonction fiile() quill s'agit de la génération d'une liste de fichiers a travers une expression réguliére ; = variable est le nom de la variable qui sera créée et contiendra ces fichiers ; = RELATIVE path est le chemin du dossier od se trouve ces fichiers = globbing expression est expression qui permetira de defini tous les fichiers que 'on souhaite sélectionner [3]. Dans notre cas, on aura fie cies Ue. +3) | En effet, LIB est le nom de notre variable, . indique quil s‘agit du dossier courant, et *. indique quil s'aait de tous les fichiers dont le nom se termine par ‘Avant de continuer, i faut que Ion démystie la notion de variables sur CMake. En fait en CMake, les variables ‘sont comme des conteneurs que l'on peut créer & tout moment et sans restrictions, afin quis contiennent une valeur que fon pourra utiliser plus tard. Pour défnir une nouvelle variable avec CMake, on utlis la fonction ‘set() qui prend en paramere le nom de la variable et sa valeur [1]. Par exemple, nous allons définir une variable nommeée NAME et qui va contenir bob, voici le code ‘orrespondant » [eeeomm bob) ] Etplus tard, sion souhaite appeler cette variable quelque part, on dott utliser comme coci ${NAME}. Pour définir a librairie & partir de notre variable LIB, on va utiliser la fonction add_Library(), qui prend en pparamétre le nom de la libraiie qui sera créée et la liste des fichiers & partir desquels la libra sera créée (notre variable LIB fera Vaffair). Ainsi, on va ajouter dans le fichier sre/Lib/CHakeLists. txt le code suivant ‘add_library(1ib §(L1B)) GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com ‘Du dev au sysadmin : Apprenez & concevoir et distribuer vos applications sur plusieurs plateformes avec CMal Maintenant que la librarie est définie dans CMake, on va la lier & notre fichier exécutable. Pour cela, revenons. dans notre fichier sr¢/CHakeLists. txt. Dans ce fichier on va demander & CMake de nous générer un exé- ‘cutable pour notre projet & partir du fichier main. Cela se fait & aide de la fonction add_executable(), ui prend en paramétre le nom du fichier a générer et le nom du fichier source & compiler, ainsi on aura | [add_executable (calculator main.c) (On a demandé CMake de générer un exécutable nommé calculator a partir du fichier main.c. On va pour finir demander & CMake de lier notre exécutable a la librairie précédemment créée, afin que cet exécu- table puisse appeler les fonctions de lalibrairie (_add,_sub, iv) ; cote liaison se fat grace a la fonc- tion target_Link_Libraries() comme suit | [target_1ink_1ibraries (calculator 1b) Avant de terminer, on dott faire une deriére chose, c'est inclusion des fichiers headers au projet. En effet, tous comme le librairies, le fichier exécutable a besoin d'avoir les fichiers d'en-tate a sa disposition, ainsi (CMake met a notre disposition deux fonctions pour cela, la fonction include) et la fonction include_ directories() ‘= La fonction inctude() ne permet dinclure que les fichiers et prend en parametre le nom du fichier que l'on souhaite inclu. «= La fonction include_directories() quant a elle prend en parametre une liste de nom de répertoires contenant les fichiers que fon souhaite incure. Pour notre cas, on va donc utliser la fonction include_directories() dans le fichier CMakeLists.txt de la racine du projet, comme suit | [inelude directories (include) Ainsi le contenu final du fichier CMakeLists. txt est ‘cmake_minimum_ required (VERSION 2.8) project (calculator C) add_subdirectory (include) add_subdirectory (sre) | | incTude_directories (include) Le fichier include/CHakeLists. txt est toujours vide jusqu’a présent. Le fichier src/CHakeLists. txt contient le code suivant : | | add_eubdirectory (1ib) add_executable(calculator main.c) target_link libraries (calculator 1ib) Etentin, le fichier src/Lib/CMakeLists. txt contient le code suivant file (GLOB LIB . *.c) add_library(1ib $(LIB)) Jusqu'a présent, nous n'avons pas encore ullisé CMake, on a juste préparé les instructions. C’est enfin le ‘moment de le faire, vous verrez, tout va se passer automatiquement. waw-gnatinuxmag.com GNUILINUX MAGAZINE HORS-SERIE N*105 Premiérement, on va ouvir le terminal at se placer dans le dossier de commande, on va exécuter Une fois dans ce dossier en ligne a Pe eects Cee ee wera eons cement renee] Sty Check for working C compiler: /usr/bin/ce -- works Detecting C compiler ABI info postr gen ster et eo eereenr gp stew arr Persie seer Configuring done nresreneac ees Build files have been written to: /home/bob/My_Work_Space_Tampon/ Se ee ee as aces ete tryst) Cette commande va permetire a CMake de parcourir tout le code qu'on a écrit jusquici (dans les differents fichiers CHakeLists..txt) et de compiler ce code, afin de générer le fichier MakeFile et un ensemble autres fichiers. Une fois ta commande exécutée, on peut lancer la commande dossier build) e comme suit (toujours en étant dans le $ make PCr Oe Rem abey eer sm erie SC earrepet (<1 a rel ty per ete cnet ae) fet mshcter est eetscto wert set ey eke ase Poerrerge rs cress as ere ees ERC nos ei eo eC e crate. TC ocr Seater meena sears ees etry pebeses te are etd Cette commande ordonne & CMake la compilation de notre projet et la génération d'un exécutable. Cet exé- cutable est généré dans le dossier build/sr et a pournom calculator. Vous pouver alors le tester vous- méme en ligne de commande [eee (On a fini notre projet, on peut passer a installation et aux tests du projet. 2.3 Installation et tests 2.3.1 Installation Vous avez déja eu a installer des applications, n’est-ce pas ? Dans cette section, on va plani ‘ment de Finstallation de notre application. 1 le comporte- ‘Commengons par expliquer ce qui se passe lorsqu’on exécute la commande Lorsque cette commande est exécutée, CMake compile tout notre projet et fait tout ce que l'on adit, mais déverse tout cela dans le dos- sier build, Or, ce dossier r’est pas vraiment celui que l'on pourra partager avec nos amis, car il contient un ‘ensemble de fichiers propres & CMake et qui n'ont rin a faire dans notre projet. GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com ‘Du dev au sysadmin : Apprenez a concevoir et distribuer vos applications sur plusieurs plateformes avec CMal installation permet alors de définir la position qu‘occupera chacun des fichiers du projet, quand notre application sera installée chez un collegue ou un client. Tout d'abord, on va définr la fonction ins talU()) de CMake. Elle sutiise comme suit: instaUl( [FILES| TARGETS |DTRECTORY |SCRIPT | CODE| EXPORT] [...]) ou [FILES| TARGETS | DIRECTORY | SCRIPT | CODE| EXPORT] permet de définirla nature de et ainsi de définirle comportement de ins tall (). Dans notre cas, on va uiliser pour installer 'exécutable généré dans un dossier bin, la librainie créée dans tn dossier Lib et enfin, les headers dans un dossier include, Commencons par les headers. Pour cela, ‘ouvrons le fichier include/CnakeLists. txt ; comme on veut juste copier le contenu de ce dossier dans un dossier include lors de installation, on va d'abord garder en variable la liste des fichiers de notre actuel dos- sier include grace notre fameuse fonction file() file(GLOB headers . *-h) (On a gardé cette liste dans la variable headers. Pour installer maintenant nos fichiers d’en-téte dans le futur dossier include, on procéde comme suit: install (FILES ${headers) DESTINATION include) Ce code demande & CMake de copier les fichiers contenus dans la variable headers vers un dossier include. (Ona fini avec les fichiers d’en-téte, Passons a la lbraire: on ouvre le fichier Src/Lib/CMakeLists.txt et (on y ajoute simplemente code suivant | [install (TARGETS 1ib DESTINATION 14b) Cotte instruction demande & CMake installer a libraire Lib qu'on a précédemment créée dans un dossier Lib lors de instalation Ine reste plus que lexécutable qui sera logé dans le dossier bin. Ouvrons le fichier sr¢/CMakeLists. txt, Puis ajoutons le code suivant inetall (TARGETS calculator DESTINATION bin) Cette instruction demande @ son tour dinstaller notre exécutable dans un dossier nommé bin. La phase dinstallation est maintenant terminée, on va recompiler notre projet. Mais avant de recompile, on va nettoyer les anciens fichiers grce a la commande suivante (dans le dossier build) La commande make clean a pour objectif de supprimer les fichiers issus de la compilation des fichiers ‘sources ; dans notre cas il s‘agit de exécutable et de la librarfe. Une fois que c'est fall, on va exécuter de nouveau la commande cnake, mais cette fois, et seulement parce quil s'agit des tests, on va modifier une Variable de configuration de CMake, il sagit de la variable CHAKE_INSTALL_PREFIX. (On va commencer par de un petit mot sur les variables de configuration. Il s'agit des variables déja exis- tantes et ayant des valeurs par défaut que CMake met & notre disposition, afin que Fon puisse configurer notre environnement. La iste de ces variables ainsi que leur description se trouve sur le site officiel de (CMake [1]. La variable qui nous intéresse est la variable CHAKE_INSTALL_PREFIX : c'est cotte variable qui permet de defini le répertoire dans lequel notre projet va sinstaller dans ordinateur. Par défaut et sur Linux, sa valeur est /usr/Local et en général, on ne la change pas, mais comme nous ne voulons pas installer propre~ ‘ment dit notre projet, on va fae en sorte que notre dossier d'nstallation soit un dossier nommé dist a la racine de notre dossier de projet. Pour cela, on va exécuter la commande suivante (en étant dans le dossier build) (On peut également modifier cette variable (et méme d'autres variables) en ullisant ccmake comme suit Vous obtiondrez alors la sortie présentée en figure 2. UID IR ee eee eee eee Une application va alors s‘ouvrr dans le terminal, avec son manuel en bas de la fenétre, Pour modifier las variables de configuration, vous devez appuyer sur , sélectionnez votre variable (avec les fiéches de direc- tion vertcale), puis appuyez sur pour entrer dans espace d'éition,éditez la valeur de la variable, puis appuyez de nouveau sur . Une fois que c'est fail, appuyez sur pour sauvegarder les configurations, puis sur pour générer le MakeFite. ‘Vous pouvez également uliser interface graphique (figure 3) de Cmake en ullisant cmake-gui comme sult : C—O Sur interface graphique qui apparalira, vous pourrez plus facilement modifier ces variables et d'autres détails sur le projet. Ainsi au niveau du champ CMAKE_INSTALL_PREFIX, vous pourrez mettre la valeur «/../dist. Gece Interface graphique do CMake, parla commande emake. Une fois la variable CHAKE_INSTALL_PREFIX modifiée, on pout exécuter de nouveau : _ Oreo cot east abet) ecm trier ass arrester ett pec test acer’ fer mshrtre or ccsewerscrowsrt set ey eer ers eenteree ete aster [ 758] Building eres Sete tenia Te. tay ena meu tras aenrtess SCL ees ‘Apres fexécution de cette commande, on va passer a la génération du dossier d'installation, en exécutant la commande suivante : Perret eee erasers ocr yy ets ste ee crn cs ceerer sags eer os eeeereeeerrcy MOSSOER == Installing: /home/bob/My_Work_Space_Tampon/Projet_Personnel/cmake_ ery petra erny Peete rie Recher UC 0/0 Moe ees Coe test/calculatrice/dist/bin/calculator peep Mette Soe eee Ce SC oe Gerster seLyeetaeteey Vous verrez alors un dossier dist dans le projet comportant 3 sous-dossiers : bin, U NALS Si vous souhaitez que I'installation se fasse dans les dossiers prévus par le systéme dlexploitation, vous devez romettre la valour par défaut de CMAKE_INSTALL_PREFTX, puis aC ete installation étant torminée, on va passer aux tests. 2.3.2 Les Tests sur CMake Les tests sur CMake sont faciles a implémenter. Pour commencer, i faut les activer grace a la fonction Ce Done, on va ouvir le fichier CMakeLists. txt a la racine du projet, puis ajouter la ligne suivante nable_testing() Cette commande prépare CMake & fare les tests. Ensuite, on va ajouternos tests grace & la fonction add_test() defnie comme suit: add_test e 0 testname est le nom du test, ‘nom ou le chemin vers Fexécutable et arg], arg2, eto. sont les arguments que 'on suhaite passer. Dans notre cas, on va faire 4 tests. On va tester Tadition, la soustraction, a multiplication et la division grace au code suivant add_test(t1 src/calculator add 2 3) add_test(t2 src/calculator sub 3 -2) add_test(t3 src/calculator mul 5 5) add_test(t4 src/calculator div 1 5) Une fois que ce code est ajouté, on va générer de nouveau le HakeFile avec la commande : uis, on exécute la commande suivante pour lancer les tests $ make test eres Sema oe See oeed eaten beeen or ert pores ra test Pee a CS ‘Du dev au sysadmin : Apprenez & concevoir et distribuer vos applications sur plusieurs plateformes avec CMal BZ as eras Eee : : ce er ed peer 4/4 Test #4 Passed 0.00 sec eet ee erecta Total Test time (real) = 0.12 sec Le test est alors exécuté et les résultats du test se trouvent dans le fichier build/Testing/Temporary/ LastTest.log, 2.4 Génération du package |i ‘agit pour nous dans cette section de générer un package, ou un fichier qu’on peut partager avec des amis. LLoutl de CMake qui permet de générer les packages redistribuables est CPack. Pour fonctionner, tout comme (CMake, ila besoin d'un ensemble diinstructions, et ses instructions sont placées dans un fichier nommé cPackConfiig. cmake. Ans, grace a Cpack, on va powoir générer les fichiers tar.gz, «sh, etc. de notre projet (4 ‘Commengons par créer le fichier CPackConfiig. cmake & la racine du projet. Dans notre cas, on va générer 3 fichiers pour faire simple : . tar.gz, .tar.Zet .sh. Voici le code qui correspond ‘Set (CPACK_CMAKE GENERATOR “Unix Makefiles") ‘SET (CPACK GENERATOR "STGZ;7G2 ;12") ‘SET (CPACKINSTALL_CMAKE PROJECTS "/home/bob/My_Work_Space_Tampon/Projet_ Personnel/cnake_test/caiculatrice/build;calculator/ALL;/") ‘SET (CPACK NSIS DISPLAY NAME "calculator 1.0") __ | SET (CPACK_PACKAGE_DESCRIPTION FILE "/home/bob/My_Work_Space_Tampon/ Projet_PeFsonnel/énake_test/dascription. txt") _ | SET (CPACK_PACKAGE DESCRIPTION SUMMARY "AZERTY") __ | SET (CPACKPACKAGE_FILE NAME "Galculator-1.0.0-Linux-x86_64") ‘Set (CPACK_PACKAGE_INSTALL, DIRECTORY "calculator 1.0") SET (CPACK_PACKAGE_INSTALLREGISTRY KEY "calculator 1.0.0") ‘SET (CPACK_PACKAGE_NAME "calculator™) ‘SET (CPACK_PACKAGE_VENDOR "bob") ‘SET (CPACK_PACKAGE_VERSION "1.0.0" | | SET (CPACKRESOURCE_FILE LICENSE "/nome/bob/My_Work_Space_Tampon/Projet_ Personnel /enake_test/description. txt") ‘SET (CPACK_RESOURCE_FILE_README "/home/bob/My Work _Space_Tampon/Projet_ Personnel /omake teat /deacription.txt") MOSSOER sunnnnn ‘SET (CPACK_RESOURCE_FILE WELCOME "/home/bob/My_Work_Space_Tampon/Projet_ Personnel/cmake_test/description. txt") ‘SET (CPACK_TOPLEVEL_TAG "Linux-x86_64") ‘SET (CPACK_SYSTEM NAME "Linux-x86_¢ Pas de panique, nous allons vous expliquer les variables les plus importantes ‘= CPACK_CHAKE_GENERATOR : indique le générateur de cmake utiisé, dans mon cas il s'agit de Unix Makefites. Vous pouvez voirla lste des générateurs de CMake avec la commande : a ‘= CPACK_GENERATOR : indique les générateurs de CPack qui vont intervenir ; en dautres termes, on indique ici les fichiers que 'on souhsaite générer, Vous pouvez également voir a liste de générateurs de CPack avec la commande : aE ‘= CPACK_INSTALL_CHAKE_PROJECTS : ici, on indique le dossier emplacement des fichiers générés par CMake (c'est-é-dire, le dossier build), le nom du projet, les composants du projet et le sous-dossier dins- tallation, Tous ces paramétres sont concaténés et séparés par un point-vrgule. Changez cette valeur selon votre contexte ; ‘= CPACK_NSIS_DISPLAY_NAME : le nom at la version du projet; = CPACK_PACKAGE_DESCRIPTION_ FILE : un fichier texte, dont le contenu décrit le fichier a générer ou le pro- jet luiméme. Changez cette valeur selon votre contexte ; ‘= CPACK_PACKAGE_DESCRIPTION_SUMMARY : une description bréve du package ‘= CPACK_PACKAGE_FILE_NANE : le nom que portera le fichier généré ; ‘= CPACK_RESOURCE_FILE_LICENSE i s'agit un fichier texte qui contient la licence du projet ‘= CPACK_RESOURCE_FILE_READHE : il sagit d'un fichier texte qui content le « readme » du projet; ‘= CPACK_RESOURCE_FILE_WELCOME : devinez quoi? :-) il s'agit dun fichier texte qui contient le message de bienvenue du projet; ‘= CPACK_TOPLEVEL_TAG : cestle nom du dossier qui contiendra vos fichiers, il se trouvera dans le dossier build/_CPack_Packages lorsqu’on aura lancé cpack ; ‘= CPACK_SYSTEM_NAME : le nom du systéme d'explitation. Vous pouvez également lire article de Jamie Smith (4], qui explique la création des packages avec cpack. Une fois que vous avez adapté toutes ces valeurs en fonction de votre context, il faut exécuter la commande suivante (en étant toujours dans le dossier build) Seo o tetas Ce om sec] poaetemocorney eee cerreth inet ee eee neces Becht sre rome emetesy Coot GNUILINUX MAGAZINE HORS-SERIE N‘105, wovw.ed-dlamond.com Toe Poe scorn Ree Se ees Eat ese testy recy 0.0-Linux-x86_64.sh Cee oe mune Fareetemseereicy eee terest iete arenes Spent meer ramet emeterd etry ee eee ener estssticsteys Semen a eaters eee rr] peretemocoriaad See tures eee nets eerste ore coast ne ts Create package Se ae Se rap ostiert rec Crete See R nets) percent Et laissez la magie s'opérer. A la fin de l'exécution, vous verrez dans le dossier build tous vos fichiers. ‘A,ous maintenant do dstibuer oes ihios a vos callégues). CONCLUSION Durant cet article, nous avons parcouru en détail l'outil CMake qui est d'ailleurs, nous le rappelons, un sys- téme de constuction de logiciels mutipate forme. état queston pour nous dle présente et de moniter pas a pas son principe de fonctionnement. Aprés cette étude, difficile de nier que CMake est un outil non négligeable lors de la réalisation de nos projets logiciels, car on a démontré que CMake résout nombre de nos: probiémes, notamment e pobléme dela stuctuation des fichiors, de installation du projet ou encore, dela cistbution de celui sur plusieurs platforms. REFERENCES [1] Le site officiel de CMake : https://icmake.org (2) Lanticle CMake de Wikipédia : https:/if.wikipedia.orgiwiki/CMake [3] L. GOUARIN, « Introduction @ Cmake » = https://calcul.math.cnrs.friattachments/spip/Documents/Ecoles/LEM2UMod2itp_cmake.paf [4] Jamie Smith, « Packaging avec Cpack de Fentreprise Kitware https://gtlab.kitware.com/emake/communitylwikisidoclepack/Packaging-With-CPack [5] Quora, « Avantage de CMake » https://www.quora.comils-t-worth-replacing-autotoots-with-cmake - aul DU — fl DEV: NU GIT, LE GESTIONNAIRE mn DE VERSIONS "@ POUR TOUS LES DEVELOPPEURS aF | € gestionnaire de versions est sans doute un des outils les plus utiles & la disposition du déve- loppeur ; méme si malheureusement, tous ne s'en rendent pas compte. Dans cet article, nous lions donc ilustrar ce postulat, en passant en revue plusieurs catégories de développeur. Pour ‘chacun de ces développeurs, du plus dilettante au plus chevronné, nous ilustrerons, & aide de Git, comment un tel outi peut lui simplifer la vie. Cette structure va aussi permettre au lecteur qui ne connait pas Git de le prendre en main. Elle va aussi permetre aux lecteurs plus chevronnés ou déja habi- {ués & utiliser Git a sauter les sections de article qui ne le concement pas. En effet, la description du déve- loppeur au début de chaque section lui permettra de voir de suite ses fonctionnalités 6voquées dans la partie assaciée lintéressent, Ce tour a'horizon ne se limite pas qu'aux fonctionnalités de Git, Nous allons aussi évoquer son utilisation Conjointe avec la plateforme en ligne GitHub Git est un outil d'une trés grande souplesse et autonome. On utilise souvent, en local, comme client dun d6p6t Git distant, mais, dans les fits, oul peut sutliser sans ce dernier. Il est donc tout fait possible duti- liser Git, méme si le reste de votre équipe ne utilise pas. C'est ce premier cas que nous allons aborder, en décrivant le personage dun développeur travallant sur un petit proet logiciel développé par une association, Amaud. ‘Amaud n'est pas un programmeur de formation. Passionné dinformatique, il arejoint une association cari- tative qui organise de petites formations pour des demandeurs d'emploi en diffcuté. association lui a domandé de mettre en piace un petit site web. Amaud est a 'aise avec le langage PHP, ila donc développé lun petit site qui permet aux demandeurs d'emploi d'accéder au catalogue des formations proposées et de sinscrire. D'autres membres de l'association modifient parfois les fichiers du projet, pour en changer le contenu statique — par exemple, corriger une faute d'orthographe ou ajouter une phrase explicative Le code source est accessible par FTP depuis le serveur qui héberge application ot la méthode de travail de "équipe consiste donc a rapatrier tous les fichiers via FTP, puis de les modifier avant de les déployer directe- ‘ment sur le serveur de production. Il est évident que ce n'est pas approche la plus recommandée dans lin- dustre, mais il existe encore de nombreux projets qui opérent ainsi, surtout dans de pelites structures, comme association de Arnaud, Dans ce contexte, il n'y a done aucun dépét de sources de référence, autre que le répertoire du serveur de production. Aucun outilage de gestion de versions n'a été mis en place. En premidre analyse, ine semble as possible ou méme pertinent d'utliser un out de gestion de versions. En effet, les autres membres de équipe sont encore moins qualiés en informatique que Arnaud, eur apprendre Iutlisation d'un tel out risque d'étre trés chronophage, au bout de compte, et d'avoir peu de valeur ajoutée, Néanmoins, Amaud est curieux et @ dé utilisé une solution de gestion de versions parle passé, en Toccur- rence Subversion (SVN). De prime abord, i voulat utiliser & nouveau cette solution, mais il n'a que peu dexpérience en administration de systame. Installer et maintenir un serveur SVN, juste pour ses propres besoins, lui semble une tache bien trop codteuse. Heureusement pour Amaud, ila décidé dacheter ce hors-série et de lire cot article, qui va donc lui permet de réaliser que Git est la parfaite solution & son probleme. GNUILINUX MAGAZINE HORS-SERIE N‘105. MOSSOER 1.1 Qu’est-ce que I’historique des révisions d'un projet logiciel ? Pour bien assecir le vocabulaire utilisé par la suite dans cet article, il est important de bien comprendre la notion dhistorique d un projet logiciel. Uhistorique est, dans ce contexte, la succession de changements ceffectués sur le code source du projet. Aprés la création du dépot des révisions, on va litialiser en lui ajou- tant la toute premiére version de chaque fichier du projet. Ceci fait, dés que un de ces fichiers sera modifié, faudra ajouter cette révision & Thistorique. Ainsi, on disposera d'un moyen de tracer et de suivre chaque chan- gement dans le code du projet. Ajouter une révision au dépét est une opération désignée sous le terme de commit. Cette opération consiste & indiquer ensemble des changements effectués sur les sources du code, & ajouter historique. On lui asso- ie souvent un peu diinformation sur la nature des changements, sous la forme d'un commentaire de commit. (On notera que chaque révision au sein de historique est généralement associée a un identifiant unique. LLarborescence qui contient les fichiers sources manipulés par Futlisateur est désignée sous le terme des pace de travail (ou workspace en anglais). Son contenu est généralement identique a celui dune révision, & "exception des modifications que Iutiisateur est en train dy apporter. Demier élément de vocabulaire, i est possible de créer des branches au sein de Ihistorique pour développer des fonctionnalits & part ou maintenir une version diférente de historique, la plupart du temps afin de main- tonir une version dfférente (ot souvent antérieure) du logiciel 1.2 Installation de Git La plupar des distributions Linux dispose d'un paquet logiciel pour installer Git. I sufft done d'utliser le ges- tionnaire de paquet logiciel de la distribution, pour installer le paquet qui lui est associé. Sous la distribution Fedora, le gestionnaire se nomme DNF et le paquet associé & Git se nomme, sans surprise, git. Il suf done

You might also like