fix a shitload of crap

This commit is contained in:
Guy Godfroy 2020-05-05 23:23:26 +02:00
parent 613b353479
commit 3f7e0eda8c
26 changed files with 643 additions and 326 deletions

View File

@ -14,11 +14,15 @@ Du point de vue des histoires de fond, l'action se situe souvent dans des mondes
_[Within A Deep Forest](http://nifflas.ni2.se/?page=Within+a+Deep+Forest)_ est sans conteste l'un de ses jeux les plus novateurs en termes de _gameplay_. Vous y incarnez une petite balle dont vous devez maîtriser les rebonds en leur donnant plus ou moins de force et en changeant le matériau constituant la balle. Les matériaux sont progressivement gagnés en accomplissant des quêtes proposées par les différents PNJs et se déroulant dans des univers propres. Le design est très simpliste, tout en pixels apparents et et 2D vue de profil.
\[caption id="attachment\_69" align="alignnone" width="598"\][![Capture de WADF](http://hashtagueule.fr/wp-content/uploads/2015/08/wadf.png)](http://hashtagueule.fr/wp-content/uploads/2015/08/wadf.png) WADF : Dans la nature, obstacles à franchir. Très esthétique.\[/caption\]
![Capture de WADF](http://hashtagueule.fr/wp-content/uploads/2015/08/wadf.png)
WADF : Dans la nature, obstacles à franchir. Très esthétique.
L'un de mes jeux préférés de Nifflas est [_Knytt_](http://nifflas.ni2.se/?page=Knytt), toujours en 2D et aux pixels grossiers. Le principe est simple, vous incarnez une petite créature perdue sur un terrain inconnu, et vous devez explorer une carte pour retrouver des pièces de votre vaisseau spatial pour pouvoir retourner chez vous.
\[caption id="attachment\_67" align="alignnone" width="598"\][![Capture d'écran de Knytt](http://hashtagueule.fr/wp-content/uploads/2015/08/knytt.png)](http://hashtagueule.fr/wp-content/uploads/2015/08/knytt.png) Knytt : Design simple, carte simple, ambiance simple. Tout est dans la simplicité.\[/caption\]
![Capture d'écran de Knytt](http://hashtagueule.fr/wp-content/uploads/2015/08/knytt.png)
Knytt : Design simple, carte simple, ambiance simple. Tout est dans la simplicité.
Vos seules interactions sont vos déplacement. En dehors du gauche/droite vous pouvez littéralement grimper aux murs (tous les murs) et sauter.

View File

@ -12,11 +12,15 @@ Je souhaite vous présenter un système d'exploitation à la fois ergonomique, f
Aujourd'hui, nous partons donc à la découverte d'un OS qui nous est proposé par nos amis nord-coréens, un OS conçu pour la sécurité et le bonheur de la population : il s'agit de Red Star OS.
\[caption id="attachment\_1011" align="alignnone" width="949"\]![Kim Jong-un](%assets_url%/2016/03/A8274E464023940BBC74E1BD9A802758.jpeg) Kim Jong-un qui se rend sur Hashtagueule depuis son ordinateur sous Red Star OS.\[/caption\]
![Kim Jong-un](%assets_url%/2016/03/A8274E464023940BBC74E1BD9A802758.jpeg)
Kim Jong-un qui se rend sur Hashtagueule depuis son ordinateur sous Red Star OS.
Parlons tout d'abord de l'intelligence esthétique. Admirons le charme de ce fond d'écran, symbole de l'unité du Pays des Matins Calmes, de sa prospérité, de son ouverture diplomatique et de sa paisible atmosphère.
\[caption id="attachment\_1017" align="aligncenter" width="1024"\]![Les canons de beautés de Corée du Nord](%assets_url%/2016/04/VirtualBox_etoilerouge_29_03_2016_19_51_59.png) Les canons de beautés de Corée du Nord\[/caption\]
![Les canons de beautés de Corée du Nord](%assets_url%/2016/04/VirtualBox_etoilerouge_29_03_2016_19_51_59.png)
Les canons de beautés de Corée du Nord
Notez également cette touche d'élégance que représente le drapeau animé du pays, dans lequel souffle le vent du progès et du patriotisme. ![star](%assets_url%/2016/04/star.gif) J'en ai un pincement au cœur et la larme à l'œil.
@ -24,11 +28,15 @@ Constatons qu'il s'agit d'un système Linux basé sur la branche Red Hat, comme
L'interface de la mouture 3.0 de Red Star OS est en QT et reprend copie les codes esthétiques d'OS X. La version 2 s'orientait plutôt sur l'interface de Windows. Mais à l'évidence, ces OS n'arrivent même pas à la plante des pieds de Red Star OS.
\[caption id="attachment\_1018" align="alignnone" width="1024"\]![Tout pareil.](%assets_url%/2016/04/VirtualBox_etoilerouge_29_03_2016_19_54_15.png) Tout pareil.\[/caption\]
![Tout pareil.](%assets_url%/2016/04/VirtualBox_etoilerouge_29_03_2016_19_54_15.png)
Tout pareil.
J'ai réussi à passer l'interface en anglais avec quelques difficultés, sachant que je ne parle ni lis absolument pas le coréen, et que de toute façon il n'existe aucun réglage en interface graphique permettant de changer la langue. Quelle sage décision de la part des concepteurs ! Il s'agit en effet d'une option superflue, et il est inutile de surcharger l'utilisateur d'options superflues.
\[caption id="attachment\_1019" align="alignnone" width="1024"\]![On peut uniquement changer le clavier.](%assets_url%/2016/04/VirtualBox_etoilerouge_29_03_2016_20_54_09.png) On peut uniquement changer le clavier.\[/caption\]
![On peut uniquement changer le clavier.](%assets_url%/2016/04/VirtualBox_etoilerouge_29_03_2016_20_54_09.png)
On peut uniquement changer le clavier.
Il m'a été impossible de configurer correctement la connexion de l'OS, car Red Star OS étant le fruit de nombreuses années de recherche des studios de Corée du Nord, la sécurité est primordiale, donc la connexion doit obligatoirement passer par une passerelle coréenne, et uniquement accessible depuis ce pays, et cette passerelle est hard-codée (enfin, c'est ce que j'ai supposé). Du coup, il me sera impossible de vous parler des performances du navigateur Naenara ("Mon Pays" en coréen), basé une version presque aussi récente de Firefox que celle utilisée pour Iceweasel sur Debian. C'est dire !

View File

@ -22,19 +22,27 @@ Ni une, ni deux, je me dis qu'il faut envoyer cela aux utilisateurs d'AVG, puisq
- l'accès à slashdot ne pose pas de problème, on tombe sur une page ressemblant à ça après avoir accepté les cookies :
\[caption id="attachment\_611" align="alignnone" width="300"\][![00slashdot](%assets_url%/2015/10/00slashdot-300x195.png)](%assets_url%/2015/10/00slashdot.png) page d'accueil slashdot.org\[/caption\]
![00slashdot](%assets_url%/2015/10/00slashdot-300x195.png)
page d'accueil slashdot.org
- Lorsqu'on fait une recherche du mot-clef AVG ça ressemble à ça :
\[caption id="attachment\_612" align="alignnone" width="300"\][![01slashdot_search](%assets_url%/2015/10/01slashdot_search-300x199.png)](%assets_url%/2015/10/01slashdot_search.png) recherche du mot-clef AVG sur slashdot.org\[/caption\]
![01slashdot_search](%assets_url%/2015/10/01slashdot_search-300x199.png)
recherche du mot-clef AVG sur slashdot.org
- Et lorsqu'on clique sur l'article en question, voilà ce qu'il ce passe :
\[caption id="attachment\_613" align="alignnone" width="300"\][![02slashdot_article](%assets_url%/2015/10/02slashdot_article-300x174.png)](%assets_url%/2015/10/02slashdot_article.png) AVG annonce un virus sur slashdot.org\[/caption\]
![02slashdot_article](%assets_url%/2015/10/02slashdot_article-300x174.png)
AVG annonce un virus sur slashdot.org
Avant de conclure qu'il s'agit là d'une action d'AVG dont le but est d'influencer l'utilisateur, comparons ce qui est comparable, alors voici la dernière capture d'écran :
\[caption id="attachment\_614" align="alignnone" width="300"\][![03slashdot_yro](%assets_url%/2015/10/03slashdot_yro-300x176.png)](%assets_url%/2015/10/03slashdot_yro.png) News sur slashdot.org à propos d'AVG\[/caption\]
![03slashdot_yro](%assets_url%/2015/10/03slashdot_yro-300x176.png)
News sur slashdot.org à propos d'AVG
Comme vous le voyez, cette news est aussi prises sur yro.slashdot.org, le même sous-domaine, et contient aussi une news à propos d'AVG, par contre AVG ne se plaint pas ici... En conclusion, AVG est capable de faire du FUD (Fear (peur, je vous mâche le boulot ^^), Uncertainty (incertitude), Doubt (doute)) sur une seule page, non pas seulement un sous-domaine. On ne peut pas raisonnablement penser que cette action de la part d'AVG n'est pas grave. Un antivirus est un logiciel ayant beaucoup de droits, et les boîtes vendant ce type de logiciel se font une réputation sur la qualité de leur produit. Il serait malhonnête de prétendre que cette fenêtre d'AVG ne va pas influencer le lecteur à ne pas lire l'article (pour la plupart), voire ne plus retrourner sur le site, après tout, c'est un site anglais, ils sont très dangereux, et mangent peut-être les petits enfants.

View File

@ -60,7 +60,9 @@ J'ai donc initialement acheté 3 disques de 3 To chacun (des Western Digital Red
Par ailleurs, pour faire de la place dans la baie de disques, j'ai du déménager le disque de démarrage dans la baie frontale, celle destinée à accueillir les périphériques comme le lecteur optique.
\[caption id="attachment\_1353" align="alignnone" width="1000"\][![](%assets_url%/2017/08/baie_labeled.png)](%assets_url%/2017/08/baie_labeled.png) Le 4ème disque du RAID, on en parlera plus tard. Je l'ai acheté bien après.\[/caption\]
![](%assets_url%/2017/08/baie_labeled.png)
Le 4ème disque du RAID, on en parlera plus tard. Je l'ai acheté bien après.
Pour ça j'ai utilisé un [adaptateur 3,5 pouces vers 5,25 pouces](https://www.startech.com/HDD/Brackets/Bracket-for-35-Inch-Floppy-with-Bezel~BRACKETFDBK) bien pratique, qui m'a permis de fixer bien solidement le disque dur au lieu de le laisser se balader dans la tour.
@ -72,7 +74,9 @@ Du côté software, je me retrouve avec un disque `sda` de démarrage, et `sdb`,
C'est tout bête, ça tient en une seule ligne de commande :
```
mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
```
Dans cette commande, j'indique que le nom du volume abstrait sera `/dev/md0`, que ce sera un RAID 5, qu'il comporte 3 disques et je lui précise les partitions que je veux utiliser.
@ -80,22 +84,30 @@ Pour suivre l'évolution de la création de l'assemblage, jetez un coup d'oeil a
Puis j'ajoute l'assemblage à la configuration de mdadm pour que celui-ci me l'assemble au démarrage :
```
mdadm --detail --scan >> /etc/mdadm.conf
```
Puis il ne vous reste plus qu'à mettre votre système de fichier préféré sur le volume créé !
```
mkfs.ext4 /dev/md0
```
Pour que votre assemblage soit monté au démarrage, j'ajoute à mon `/etc/fstab` :
```
/dev/md0 /mnt/data ext4 defaults 0 0
```
Il ne faut pas confondre assemblage et montage, il s'agit de deux étapes lors de la connexion d'un RAID. On doit assembler un RAID afin qu'il soit reconnu comme un volume propre, puis on doit monter notre volume pour pouvoir lire et écrire dessus.
Enfin on monte le volume :
```
mkdir /mnt/data
mount /mnt/data
```
Ayé vous avez un RAID 5 qui fonctionne !
@ -114,8 +126,10 @@ Cependant, faites quand même gaffe lorsque vous allez ajoutez votre nouveau dis
Tout ce que j'ai eu à faire, en définitive, a été de partitionner-formater mon nouveau disque ainsi que l'ont été ses aînés, puis j'ai lancé les deux commandes suivantes :
```
mdadm --add /dev/md0 /dev/sdb1
mdadm --grow --raid-devices=4 --backup-file=/root/grow\_md0.bak /dev/md0
```
La première va juste indiquer à mdadm qu'on lui ajoute un disque, mais sans plus. C'est la deuxième commande qui va lancer l'opération de reconstruction (rééquilibrage de l'assemblage). Opération qui dure plusieurs heures, donc suivez son déroulement dans `/proc/mdstat`.
@ -123,7 +137,9 @@ Une fois que c'est terminé, il faut maintenant procéder à l'extension du syst
Il le supporte même tellement bien que vous pouvez le faire directement à chaud, sans démonter votre volume. Pour ça, premièrement, si vous utilisez une connexion SSH, ouvrez une session tmux. Il serait bête qu'un incident réseau de rien du tout vienne corrombre tout votre système de fichire tout de même. Puis il vous faudra exécuter :
```
resize2fs -p /dev/md0
```
Il va vous mettre en garde et ronchonner un tantinet que votre disque est toujours monté, mais écoutez, il s'en remettra, dans la vie on fait pas toujours ce qu'on veut. Les minutes passent, vous vous rongez les ongles, vous prenez un café, vous videz un pot de glace, et normalement, si tout se passe bien, le système de fichier aura été étendu à tout l'espace disponible sur l'assemblage. Félicitations !

View File

@ -10,11 +10,15 @@ Aujourd'hui un nouveau coup de cœur sur un de ces artistes qui utilisent le lib
[David Revoy](http://www.davidrevoy.com/) est un artiste et informaticien français. Il a à son actif plusieurs projets déjà bien connus, comme la direction artistique du court-métrage [Sintel](https://durian.blender.org/), un des splendides projets [Blender](https://www.blender.org/). Il a également travaillé sur des jeux vidéos, et il a notamment eu l'occasion de travailler pour [Valve](http://www.valvesoftware.com/).
\[caption id="attachment\_1106" align="alignnone" width="474"\][![Capture du court métrage Sintel](%assets_url%/2016/05/3.2d-1024x436.png)](%assets_url%/2016/05/3.2d.png) Sintel, sorti en 2010\[/caption\]
![Capture du court métrage Sintel](%assets_url%/2016/05/3.2d-1024x436.png)
Sintel, sorti en 2010
La raison qui me pousse à parler de lui, outre le fait toujours appréciable qu'il publie toutes les œuvres dont il a la propriété morale en licence Creative Common, c'est le projet dans lequel il se concentre le plus en ce moment, c'est à dire son webcomic [Pepper & Carrot](http://www.peppercarrot.com/), prenant place dans un univers fantasy remarquable, et racontant les aventure rafraîchissantes de la jeune et gentille sorcière Pepper et de son chat Carrot.
\[caption id="attachment\_1109" align="alignnone" width="2278"\][![Extrait d'une planche de Pepper & Carrot.](%assets_url%/2016/05/gfx_Pepper-and-Carrot_by-David-Revoy_E11P03.jpg)](%assets_url%/2016/05/gfx_Pepper-and-Carrot_by-David-Revoy_E11P03.jpg) Extrait d'une planche de Pepper & Carrot.\[/caption\]
![Extrait d'une planche de Pepper & Carrot.](%assets_url%/2016/05/gfx_Pepper-and-Carrot_by-David-Revoy_E11P03.jpg)
Extrait d'une planche de Pepper & Carrot.
L'univers dispose d'un magnétisme rarement atteint à mon sens. On sent l'influence manga dans le style, ce qui en fait assurément une œuvre fort intéressante. L'héroïne est tout-à-fait attachante, même si je ne suis peut être pas objectif, j'ai toujours eu un coup de cœur [pour](http://wiki.lspace.org/mediawiki/Magrat_Garlick) [les](http://www.encyclopedie-hp.org/wizards/hermione.php) [petites](http://bd-girls.mon-oueb.com/belles/melusine/index.phtml) [sorcières](http://myanimelist.net/anime/14349/Little_Witch_Academia).

View File

@ -22,7 +22,9 @@ L'intérêt du pair à pair, c'est que les utilisateurs du service ne sont plus
Rappelons que **ces protocoles pair à pair ne sont pas illégaux**, ce sont certains usages qui en sont fait qui le sont. On ne va pas interdire la gravité parce que la chute inattendue d'un rhinocéros du haut d'un immeuble sur la tête est potentiellement néfaste pour la santé du propriétaire de ladite tête (et pour le rhinocéros par la même occasion).
\[caption id="" align="aligncenter" width="1356"\][![Un rhinocéros](https://upload.wikimedia.org/wikipedia/commons/3/38/Rhinoc%C3%A9ros_blanc_JHE.jpg)](https://upload.wikimedia.org/wikipedia/commons/3/38/Rhinoc%C3%A9ros_blanc_JHE.jpg) Principal responsable de l'interdiction totale de la gravité (décret de 2035).\[/caption\]
![Un rhinocéros](https://upload.wikimedia.org/wikipedia/commons/3/38/Rhinoc%C3%A9ros_blanc_JHE.jpg)
Principal responsable de l'interdiction totale de la gravité (décret de 2035).
Tout cela vous le saviez. En tout cas vous devriez le savoir. Bon de toute façon, maintenant vous le savez.

View File

@ -12,7 +12,7 @@ Aujourd'hui on va parler boulot, mais n'ayez pas peur, on parle du mien. Petite
Ce que j'aime le plus avec mon stage courant, c'est les défis. J'ai 6 semaines pour réaliser un prototype et sa documentation, et je peux vous dire que c'est serré. À près de trois quarts du projet, faisons un point sur son avancement, ce qu'il reste à faire, les technos, etc.
# I --- Le cahier des charges
# Le cahier des charges
Le monitoring réseau c'est tout sauf un sujet original. Hyper intéressant, sa mise en pratique évolue au fur et à mesure que les outils, les pratiques, et les protocoles évoluent.
@ -39,25 +39,29 @@ Une fois qu'on a déterminé si une saturation est gênante, on veut savoir qui
- Par exemple, lorsqu'un site est saturé, cela gêne-t-il 1 ou 50 personnes ? Dans le premier cas, la personne est peut-être trop gourmande en ressources, dans le second, le lien est peut-être mal dimensionné.
- Certains processus peuvent être automatisés la nuit, certaines pratiques changées : backup du travail pendant la pause de midi et la nuit, passer de FTP à rsync pour les backup, ou au moins un système incrémental plutôt que full
# II --- Implémentation
# Implémentation
Comme je sens que vous êtes des warriors,
\[caption id="attachment\_1181" align="alignnone" width="300"\][![cyclops_warrior_concept_by_masterfulmind-d4vi7mx](%assets_url%/2016/08/cyclops_warrior_concept_by_masterfulmind-d4vi7mx-300x218.jpg)](%assets_url%/2016/08/cyclops_warrior_concept_by_masterfulmind-d4vi7mx.jpg) Un warrior, probablement.\[/caption\]
![cyclops_warrior_concept_by_masterfulmind-d4vi7mx](%assets_url%/2016/08/cyclops_warrior_concept_by_masterfulmind-d4vi7mx-300x218.jpg)
Un warrior, probablement.
je vous propose de rentrer dans le vif du sujet avec les détails techniques.
##### 1\. Unzip
## Unzip
Je pars avec une archive zip, gentiment déposée par mon FAI, dans laquelle il y a des logs au format nfcapd, défini par Cisco.
##### 2\. Nfdump
## Nfdump
Nfcapd est un fichier binaire, pas très comestible pour l'œil humain. J'ai donc trouvé [nfdump](http://nfdump.sourceforge.net/), un programme qui permet de transformer les logs binaires en texte ASCII. ça ressemble à peu près à ça :
```
2016-09-21 21:47:42.360     0.000 TCP         192.168.5.3:445   ->    192.168.5.249:56011        1       52     1
```
##### 3\. csvify
## csvify
C'est mieux, mais c'est toujours pas optimal. Il y a notamment trois problèmes :
@ -73,7 +77,7 @@ J'ai donc créé [un préparser](https://git.hashtagueule.fr/citnop/YaPLog/src/m
En moyenne, mon préparser sort un fichier au format CSV qui fait 70% de la taille du fichier d'entrée, et est beaucoup plus normalisé. Il ne supprime cependant pas beaucoup d'informations (la flèche seulement).
##### 4\. Parse/Somme et plus si affinités
## Parse/Somme et plus si affinités
Maintenant qu'on s'est facilité la tâche, il ne reste plus qu'à analyser le tout.
@ -87,7 +91,9 @@ Enfin, en théorie. Parce qu'on se retrouve devant quelques petits problèmes :
- Même si le C/C++ est rapide, la partie lecture du fichier sur disque est très rapide, la partie traitement est lente, la partie écriture des résultats sur disque est rapide.
- On adopte donc l'architecture suivante pour le programme C++ :
\[caption id="attachment\_1182" align="alignnone" width="474"\][![C++ n-multithread](%assets_url%/2016/08/tbbq-1024x544.png)](%assets_url%/2016/08/tbbq.png) Architecture du programme C++\[/caption\]
![C++ n-multithread](%assets_url%/2016/08/tbbq-1024x544.png)
Architecture du programme C++
Le thread lecteur en haut lit depuis le disque à gauche, range les éléments dans la `std::queue fileQ` protégée par un mutex (`fileQmutex`, je suis d'une originalité à toute épreuve), tandis que les n threads workers vont travailler à générer la donnée, puis vont passer leur résultat à la liste de résultats `resQD`. Finalement le thread écrivain va réunir la liste de résultats, et l'écrire sur disque (à droite).
@ -98,11 +104,11 @@ Comme vous le voyez, beaucoup de choses ont été faites, beaucoup de choix, et
- un How-to pour installer/améliorer le bidule ;
- utiliser la classe `Traffic()` du programme C++ pour effectivement ranger les paquets dans des types de `Traffic` (par port pour le protocole, par IP source pour les utilisateurs les plus gourmands, par IP destination pour les serveurs les plus consultés/les plus consommateurs de ressource, et pour déterminer combien d'utilisateurs sont effectivement gênés lors d'une saturation).
##### 5\. Des graphs. For free.
## Des graphs. For free.
Une fois que l'on a écrit le CSV, il ne reste qu'à faire le graph. le programme [gnuplot](http://gnuplot.info/) peut faire [ça très bien](https://git.hashtagueule.fr/citnop/YaPLog/src/master/gnuplot/plotgnu.sh).
##### 6\. Un chef d'orchestre
## Un chef d'orchestre
Tout cela est opéré depuis un [script bash](https://git.hashtagueule.fr/citnop/YaPLog/src/master/chef/chef_d_orchestre.sh).

View File

@ -18,7 +18,10 @@ En ce qui me concerne, quelques évènements auxquels j'ai participé ces dernie
- Du 1er au 2 avril, j'étais présent aux [JDLL](https://www.jdll.org/) à Lyon, pour défendre les couleurs d'un [hackerspace local](https://labolyon.fr/) que je fréquente, mais également pour découvrir des associations et rencontrer des gens très sympatiques.
\[caption id="attachment\_1327" align="aligncenter" width="500"\][![](%assets_url%/2017/06/IMG_20170401_144449.jpg)](%assets_url%/2017/06/IMG_20170401_144449.jpg) Membres présents de l'association [LILA](https://libreart.info/en/index-p2.html) lors des JDLL\[/caption\]
![](%assets_url%/2017/06/IMG_20170401_144449.jpg)
Membres présents de l'association [LILA](https://libreart.info/en/index-p2.html) lors des JDLL
- Le 21 mai, je me suis rendu à Toulouse pour rencontrer David Revoy, le créateur du webcomic [Pepper & Carrot](/posts/david-revoy/) dont on vous a déjà parlé, lors d'une [séance de dédicace](https://pod.hashtagueule.fr/posts/85108) dans une petite librairie.
Je ne pourrai malheureusement pas me rendre aux prochaines [RMLL](https://2017.rmll.info/) à Saint-Étienne En fait si, je me suis juste emmêlé les pinceaux au moment de regarder dans mon calendrier, j'y serai donc les 1er et 2 juillet prochains. D'autre part, je vais tout faire pour me rendre aux prochain [Capitole du Libre](https://2017.capitoledulibre.org/) à Toulouse les 18 et 19 novembre prochains (ça semble encore loin certes).
@ -27,6 +30,8 @@ D'autre part, je suis en train de monter avec des amis une émission de radio lo
C'est la fin de cette série d'infos inutiles. Avant de vous quitter, je tiens à vous faire connaître [Erma](https://tapas.io/series/Erma), un webcomic que j'ai découvert récemment, et qui est mon coup de cœur artistique du moment. Vous connaissez peut-être le film d'horreur [_The Ring_](https://en.wikipedia.org/wiki/The_Ring_(2002_film)) sorti en 2002, dans lequel figure Samara, un spectre féminin aux longs cheveux noirs masquant le visage, qui a notamment le pouvoir de sortir de l'écran du téléviseur (sans pour autant vous parler de yaourts vous, remarquez) à des moments contrariants et de marcher à quatre pattes au plafond. Dans ce webcomic, Samara s'est calmée, a arrêté de faire peur aux gens, s'est intégrée paisiblement parmi les humains et a même un mari, dont l'union a donné Erma, une petite fille qui tient beaucoup de sa mère, tant sur l'apparence que sur les pouvoirs surnaturels. Le décalage entre horreur et _slice of life_ est assez comique mais mène souvent à des situations attendrissantes. Ce webcomic est tout bonnement adorable.
\[caption id="attachment\_1328" align="aligncenter" width="1611"\][![](%assets_url%/2017/06/erma__sleep_floating_by_bjsinc-dag6a0c.png)](%assets_url%/2017/06/erma__sleep_floating_by_bjsinc-dag6a0c.png) Erma © Copyright 2016 Brandon Santiago\[/caption\]
![](%assets_url%/2017/06/erma__sleep_floating_by_bjsinc-dag6a0c.png)
Erma © Copyright 2016 Brandon Santiago
Voilà, bon vote si ce n'est déjà fait, hydratez-vous bien, et soyez gentils.

View File

@ -12,33 +12,37 @@ Depuis quelques semaines, je m'intègre au sein de l'activité de ces ateliers c
Avant que vous ne continuiez la lecture de cet article, un avertissement. Une petite partie de ce texte reflétera ma prise de position et mon expérience personnelle. Je préfère personnellement les hackerspaces, mais si vous êtes partisan de l'autre école, s'il vous plaît, n'en soyez pas vexé. Comme toujours, si vous estimez que j'ai tort, vous pouvez toujours commenter ou venir nous en parler autour d'une bière virtuelle sur IRC.
\[caption id="attachment\_1127" align="aligncenter" width="474"\][![Le Fablab, un espace rangé, discipliné.](%assets_url%/2016/05/18393927202_69724bd85d_b-1024x576.jpg)](%assets_url%/2016/05/18393927202_69724bd85d_b.jpg) Le Fablab, un espace rangé, discipliné.\[/caption\]
![Le Fablab, un espace rangé, discipliné.](%assets_url%/2016/05/18393927202_69724bd85d_b-1024x576.jpg)
##### Fablabs : la pointe du matériel au service de l'individu
Le Fablab, un espace rangé, discipliné.
# Fablabs : la pointe du matériel au service de l'individu
C'est probablement le type d'atelier communautaire le plus médiatisé. Probablement parce qu'il promeut un modèle industriel original.
###### On y fait quoi ?
## On y fait quoi ?
Avant tout, un Fablab est un atelier. Sa vocation est de permettre à n'importe quel bricoleur de réaliser son projet matériel. En gros vous arrivez avec votre idée, et vous ressortez avec sous le bras.
Un Fablab est parfois amené à effectuer des prestations pour des entreprises, contre espèces sonnantes et trébuchantes. Il arrive même que le Fablab ait des horaires d'ouverture dédiés aux entreprises, et donc fermé à tous les autres utilisateurs.
###### Quel statut ?
## Quel statut ?
Un Fablab, pour être considéré comme tel, doit se plier à la charte commune des fablabs du monde entier, charte mise au point par un éminent professeur du [MIT](http://web.mit.edu/). En contrepartie, le Fablab bénéficie de la reconnaissance des autres Fablabs et dispose de la base de conaissance du grand réseau commun mondial des Fablabs.
###### Quelles conditions ?
## Quelles conditions ?
Le Fablab dispose en général de matériel relativement neuf et de bonne qualité, ce qui implique généralement des frais à l'utilisation pour l'utilisateur ; selon moi, ces utilisateurs sont des clients plus que des contributeurs du Fablab.
\[caption id="attachment\_1132" align="aligncenter" width="474"\][![Le Hackerspace : un fouilli sans nom, un nid humain.](%assets_url%/2016/05/NYCResistor-Hackerspace-397bridge-1024x768.jpg)](%assets_url%/2016/05/NYCResistor-Hackerspace-397bridge.jpg) Le Hackerspace : un fouilli sans nom, un nid humain.\[/caption\]
![Le Hackerspace : un fouilli sans nom, un nid humain.](%assets_url%/2016/05/NYCResistor-Hackerspace-397bridge-1024x768.jpg)
##### Hackerspaces : bienvenue à bord, matelot.
Le Hackerspace : un fouilli sans nom, un nid humain.
# Hackerspaces : bienvenue à bord, matelot.
Les Hackerspaces ont une définition volontairement plus floue et plus libre.
###### On y fait quoi ?
## On y fait quoi ?
Au Hackerspace, on peut y faire absolument toute activité constructive, dans une multitude de domaines : informatique et électronique bien sûr, mais également mécanique, menuiserie, art, musique, parfois même jardinage, cuisine... Certains Hackerspaces sont un peu spécialisés dans certains domaines. L'idée étant que si vous savez faire un truc, vous êtes cordialement invité à mener un atelier ponctuel ou récurrent, afin d'initier des nouvelles personnes.
@ -46,17 +50,19 @@ On y aide également des personnes extérieures et d'autres associations, notamm
L'activité d'un Hackerspace est aussi militante : outre la tendance des membres d'un hackerspace à favoriser et inciter à l'usage du libre (ce qui est une très bonne habitude), il peut aussi avoir une conviction politique en son sein. Comprenez-moi bien, un Hackerspace accueille les gens de tout bord politique avec le même intérêt. Il arrive que la question de la politisation de l'association se pose, en particulier pour son fonctionnement interne.
###### Quel statut ?
## Quel statut ?
Un Hackerspace est avant tout une association, et les personnes qui le fréquentent en sont des membres, qui ont donc un pouvoir de décision au sein de la communauté. Il existe des rassemblement de Hackerspaces, sans empêcher chaque Hackerspace d'être autonome.
###### Quelles conditions ?
## Quelles conditions ?
Dans un Hackerspace, si la bière peut couler à flot, ce n'est pas le cas de l'argent. Ici, toutes les actions sont bénévoles, l'intégralité du budget vient des (très maigres) cotisations des membres et des éventuels dons, financiers ou matériels. En général, les ustensiles utilisés sont vieux, récupérés et recyclés. La mentalité du Hackerspace est donc de faire du neuf avec du vieux plutôt que d'avoir des outils derniers cris pour être plus efficace.
\[caption id="attachment\_1137" align="alignnone" width="474"\][![Exemple de récup : un réflecteur de lampe bricolé à partir du capot d'un vieux PC](%assets_url%/2016/05/IMG_20160423_164125-1024x768.jpg)](%assets_url%/2016/05/IMG_20160423_164125.jpg) Exemple de récup : un réflecteur de lampe bricolé à partir du capot d'un vieux PC\[/caption\]
![Exemple de récup : un réflecteur de lampe bricolé à partir du capot d'un vieux PC](%assets_url%/2016/05/IMG_20160423_164125-1024x768.jpg)
##### Alors, dois-je aller au Fablab ou au Hackerspace ?
Exemple de récup : un réflecteur de lampe bricolé à partir du capot d'un vieux PC
# Alors, dois-je aller au Fablab ou au Hackerspace ?
Si vous cherchez un endroit ou bricoler, si vous avez dans votre ville accès "uniquement" à l'un ou l'autre, alors allez-y sans vous poser de question, car vous êtes chanceux ! Il existe encore de nombreux endroits, notamment en campagne, ou il n'y a ni l'un ni l'autre. Si vous avez le choix entre un Fablab ou un Hackerspace à l'endroit ou vous êtes, cela dépend de votre besoin. Voici un récapitulatif des orientations des uns et des autres si on devait résumer grossièrement leurs motivations :

View File

@ -16,4 +16,4 @@ Peut-être est-il malvenu de faire la remarque tout de suite, mais celà n'annon
Allez, courage tout le monde, et plus que jamais, restez gentils.
P.S: Aujourd'hui c'était la journée de la gentillesse. Une journée qui defait aller dans le sens d'Hashtagueule. Triste cynisme.
P.S: Aujourd'hui c'était la journée de la gentillesse. Une journée qui fait aller dans le sens d'Hashtagueule. Triste cynisme.

View File

@ -8,6 +8,6 @@ tags: caméra,Détente,gif,NSA,pixar,Lien,surveillance,USA
Très bien pensé, rien à rajouter.
\[video width="460" height="286" mp4="%assets_url%/2015/09/IMG\_1385.mp4"\]\[/video\]
[Lien](%assets_url%/2015/09/IMG\_1385.mp4)
Via [9gag](http://9gag.com/gag/aq2RzW7)

View File

@ -62,7 +62,9 @@ En gros les juridictions peuvent faire les décrets pour faire appliquer des loi
Dans les années 90, le chiffrement était encore classé comme arme de guerre aux États-Unis, avec les avantages et les inconvénients que ça comporte (le droit de porter une arme, par exemple) :
\[caption id="attachment\_986" align="alignnone" width="740"\][![legal_hacks](%assets_url%/2016/03/legal_hacks.png)](%assets_url%/2016/03/legal_hacks.png) Legal Hacks @xkcd.com/504\[/caption\]
![legal_hacks](%assets_url%/2016/03/legal_hacks.png)
Legal Hacks @xkcd.com/504
Les inconvénients étant que l'export d'armes depuis les États-Unis était limité --- interdit aux civils.

View File

@ -25,10 +25,9 @@ Internet est en fait un réseau de réseaux : chaque opérateur internet ([FAI](
Cela dit, dans tout cet article, une représentation schématique à peu près équivalente d'internet sera utilisée (_vous pouvez cliquer pour afficher les images taille réelle dans un nouvel onglet_) :
\[caption id="attachment\_454" align="alignnone" width="250"\][![schema_internet](%assets_url%/2015/09/schema_internet-212x300.png)](%assets_url%/2015/09/schema_internet.png) Représentation d'un réseau physique  de machines. Schéma simplifié d'internet. _CC-BY-SA. Cliquer pour agrandir.
_\[/caption\]
![schema_internet](%assets_url%/2015/09/schema_internet-212x300.png)
 
Représentation d'un réseau physique de machines. Schéma simplifié d'internet. _CC-BY-SA_
**Web** : réseau virtuel de machines. Ce réseau utilise l'infrastructure qu'est l'internet. Il est constitué de deux types d'objets :
@ -76,13 +75,15 @@ Le fil de cet article sera le suivant :
(_En fait l'idée de nouvelles possibilités à l'aide des mathématiques n'est pas nouvelle :  le principe du VPN ou du chiffrement permet de s'abstraire du risque d'un réseau non sécurisé en soi..._)
# I - Du réseau d'anonymisation
# Du réseau d'anonymisation
Un petit schéma aidera à mettre les idées au clair, mais pas si vite ! Rien ne vaut un petit parallèle avec ce que vous connaissez déjà...
Lorsque vous chargez une page web en HTTP (flux non-chiffré, non-signé) il se passe ça :
\[caption id="attachment\_458" align="alignnone" width="212"\][![http](%assets_url%/2015/09/http-212x300.png)](%assets_url%/2015/09/http.png) Trafic HTTP (Web). Requête, réponse. CC-BY-SA. Cliquer pour agrandir.\[/caption\]
![http](%assets_url%/2015/09/http-212x300.png)
Trafic HTTP (Web). Requête, réponse. CC-BY-SA.
La suite dévénement est :
@ -95,7 +96,9 @@ La suite dévénement est :
De même, demander une page web en HTTPS, ça se représente comme ça :
\[caption id="attachment\_460" align="alignnone" width="212"\][![https](%assets_url%/2015/09/https-212x300.png)](%assets_url%/2015/09/https.png) Trafic HTTPS (Web). Requête, réponse. CC-BY-SA. Cliquer pour agrandir.\[/caption\]
![https](%assets_url%/2015/09/https-212x300.png)
Trafic HTTPS (Web). Requête, réponse. CC-BY-SA.
La suite dévénement est presque identique :
@ -113,7 +116,9 @@ Deux différence entre HTTP et HTTPS, avec HTTPS :
Eh bien utiliser tor, ça ressemble à ça (décrit [ici](https://www.torproject.org/about/overview.html.en) par le projet tor) :
\[caption id="attachment\_461" align="alignnone" width="221"\][![tor0](%assets_url%/2015/09/tor0-221x300.png)](%assets_url%/2015/09/tor0.png) Trafic tor. CC-BY-SA. Cliquer pour agrandir.\[/caption\]
![tor0](%assets_url%/2015/09/tor0-221x300.png)
Trafic tor. CC-BY-SA.
C'est-à-dire que tor fonctionne comme s'il y avait au minimum (parce qu'il peut y avoir plusieurs nœuds milieu en théorie) trois proxy (ou intermédiaires) entre nous et le serveur que l'on interroge.
@ -125,11 +130,15 @@ Tor est ainsi un réseau virtuel de machines serveur appelées "nœud". Il y a t
Le trafic ressemble donc à ceci :
\[caption id="attachment\_468" align="alignnone" width="221"\][![tor01](%assets_url%/2015/09/tor01-221x300.png)](%assets_url%/2015/09/tor01.png) Apparence du trafic avec tor. CC-BY-SA. Cliquer pour agrandir.\[/caption\]
![tor01](%assets_url%/2015/09/tor01-221x300.png)
Apparence du trafic avec tor. CC-BY-SA.
Une représentation complète de l'internet avec du trafic tor serait :
\[caption id="attachment\_462" align="alignnone" width="212"\][![tor](%assets_url%/2015/09/tor-212x300.png)](%assets_url%/2015/09/tor.png) Trafic tor sur internet. CC-BY-SA. Cliquer pour agrandir.\[/caption\]
![tor](%assets_url%/2015/09/tor-212x300.png)](%assets_url%/2015/09/tor.png)
Trafic tor sur internet. CC-BY-SA.
Utiliser le réseau tor permet donc un anonymat de **très** grande qualité, en effet :
@ -145,7 +154,7 @@ Ainsi l'utilisation de tor, par le grand anonymat qu'il permet, empêche de reli
L'utilisation de tor fait donc disparaître les informations liées à une connection : les **métadonnées**.
# II - Une communication irrémédiablement chiffrée
# Une communication irrémédiablement chiffrée
Une communication chiffrée, une clef de chiffrement. Une idée gargantuesque consiste à enregistrer, au niveau d'un État, tout le trafic chiffré qui passe, et de l'analyser après, avec plusieurs idées derrière la tête :
@ -192,7 +201,7 @@ Cette fonctionnalité s'appelle [PFS](https://fr.wikipedia.org/wiki/Confidential
Ici, ce sont les **données** de la conversation qui disparaissent.
# III - Information, existes-tu ?
# Information, existes-tu ?
Un autre recours de l'enquête est la perquisition : physiquement aller voir l'information. Dernière déception pour les tenants du contrôle, ça n'est plus possible. Un mécanisme appelé "[déni-plausible](https://fr.wikipedia.org/wiki/D%C3%A9ni_plausible_%28cryptologie%29)" consiste à pouvoir cacher si bien une donnée qu'il devient impossible de faire la preuve de son existence. Plongée dans les profondeurs du mystère...

View File

@ -14,7 +14,9 @@ J'aimerais vous parler plus en détail de [py3status](https://github.com/ultrabu
Parmi tous les modules proposés, il y en a tant d'utiles que je n'avais pas la place au début dans ma barre. Heureusement que j'ai ensuite découvert qu'on avait droit à plusieurs barres dans la configuration i3. De plus, j'ai noté qu'il existe un pull request sur le dépôt de py3status qui permettrait de multiplier les configurations pour une seule barre, donc la possibilité de changer de modules à chaud.
\[caption id="attachment\_1251" align="aligncenter" width="474"\][![](%assets_url%/2016/12/i3-1024x576.png)](%assets_url%/2016/12/i3.png) Ma configuration i3 actuelle\[/caption\]
![](%assets_url%/2016/12/i3-1024x576.png)
Ma configuration i3 actuelle
Une petite description des modules affichés, de gauche à droite :
@ -54,7 +56,9 @@ L'écriture d'un module est vraiment simple, pour peu qu'on ait des bases de Pyt
Je souhaite également parler des symboles que vous pouvez voir dans mes barres d'information. Ceux qui font du frontend web reconnaîtront les glyphes du projet Font Awesome (pour le coup, rien à voir avec le gestionnaire de fenêtres Awesome). Il s'agit d'une police de caractère qui utilise une plage spéciale de la table unicode afin de mettre à disposition des symboles qu'il est pratique d'utiliser principalement pour des pages web, mais également, comme vous pouvez le voir, sur des interfaces un peu plus personnelles. Lorsque i3 tombe sur un caractère unicode que la police qu'il utilise ne peut pas afficher, il va alors utiliser la police Font Awesome en tant que police de substitution. Afin mettre ce procédé en œuvre, il est nécessaire d'installer la fonte (le paquet AUR `otf-font-awesome` sous Arch Linux) et de vérifier que le fichier de configuration d'i3 contienne la ligne suivante :
```
font pango:monospace 8
```
Vous pouvez remplacer monospace par la fonte que vous préférez. Vous serez ensuite libres de choisir une icône Awesome en le précisant dans la configuration des modules py3status (le plus souvent, il faut se tourner vers la variable `format`).
@ -64,9 +68,11 @@ J'avais oublié d'expliquer dans mon précédent article, lorsque j'ai parlé de
Pour utiliser ces touches, comme pour les touches volume et luminosité, il vous faudra spécifier dans votre configuration i3 que vous souhaitez mapper ces touches médias à un appel de commande. Simplement, le problème est que par défaut, il n'existe pas de commande simple pour contrôler un lecteur MPRIS. Nous avons donc besoin d'installer playerctl, un petit programme en ligne de commande qui va se charger de fournir des commandes lisibles et succinctes. Ensuite, il nous faudra ajouter dans le fichier de configuration i3 les lignes suivantes :
```
bindsym XF86AudioPlay exec playerctl play-pause
bindsym XF86AudioPrev exec playerctl previous
bindsym XF86AudioNext exec playerctl next
```
Notez que si le lecteur que vous utilisez n'est pas compatible MPRIS, il vous faudra trouver une autre astuce. Notamment si vous utilisez cmus en version release et non en version git, vous aurez besoin de faire appel à la commande `cmus-remote`.

View File

@ -30,7 +30,9 @@ Sachez aussi que, de la même manière qu'il existe des conflits entre les utili
Bon, ça fait 5 minutes que je vous parle de bureau élégant, mais toujours pas une seule image. Le mieux c'est que je vous montre maintenant.
\[caption id="attachment\_1220" align="aligncenter" width="474"\][![Mon bureau sous i3, avec vim à gauche et htop à droite](%assets_url%/2016/11/2016-11-08-223006_3840x2160_scrot-1024x576.png)](%assets_url%/2016/11/2016-11-08-223006_3840x2160_scrot.png) Mon bureau sous i3 sur écran HiDPI, avec vim à gauche et htop à droite\[/caption\]
![Mon bureau sous i3, avec vim à gauche et htop à droite](%assets_url%/2016/11/2016-11-08-223006_3840x2160_scrot-1024x576.png)
Mon bureau sous i3 sur écran HiDPI, avec vim à gauche et htop à droite
Sur cette exemple, je n'ai que deux fenêtres ouvertes, mais sachez que je peux en ouvrir bien plus, et je peux également scinder les espaces verticalement et horizontalement à la fois. Pour ceux qui s'affolent en voyant que je n'ai que des terminaux ouverts et qui voudraient continuer à utiliser leurs programmes GTK, sachez que rien ne les en empêche, c'est juste que je fais en ce moment une petite indigestion des programme à interface graphique, et je les évite le plus possible, ma tension s'en porte mieux et mes proches en souffrent moins.
@ -54,6 +56,7 @@ Une fenêtre de terminal se lance par la combinaison `$mod+enter`. i3 est assez
De même qu'i3, urxvt a besoin de sa configuration si vous voulez le modifier un tantinet (et vous allez sûrement le faire, car urxvt a une interface atroce par défaut). Ça se passe dans `~/.Xresources`. Il s'agit d'un fichier utilisé par le serveur X, donc prudence, il est possible que vous y trouviez la configuration d'autres programmes. Je vous joins mes propres réglages, à vous de les modifier à votre convenance.
```
! Fonts {{{
Xft.antialias: true
Xft.hinting: true
@ -127,18 +130,23 @@ urxvt\*color12: #5B5BC7
! bright-cyan + bright-white
!urxvt\*color14: #7D7DFB
!urxvt\*color15: #ffffff
```
## Des volumes qui se montent tout seul
J'aime bien pouvoir brancher ma clef USB et qu'elle se mone toute seule dans mon système avec les droits qui vont bien, et ne pas avoir à taper ce genre de commande :
J'aime bien pouvoir brancher ma clef USB et qu'elle se monte toute seule dans mon système avec les droits qui vont bien, et ne pas avoir à taper ce genre de commande :
```
sudo mount /dev/sdX /home/raspbeguy/mnt
```
Et en plus, avec cette commande, vous n'avez même pas le droit d'écriture sur votre clef en simple utilisateur, c'était vraiment casse-pied, pour rester poli.
Heureusement, vous pouver installer udisk qui va le faire pour vous, puis udiskie, un wrapper qui va utiliser udisk  plus simplement. Pour lancer udiskie automatiquement au démarrage d'i3, écrivez juste dans la configuration d'i3 :
```
exec udiskie -ans &
```
et le tour est joué. Vous aurez vos volumes tout beaux qui se monteront comme des grands, des notifications à chaque branchement/débranchement de volume, et un menu dans la barre du bas permettant de démonter les volumes.
@ -152,7 +160,8 @@ Pour la gestion du volume sur votre machine, je vous conseille d'utiliser pulsea
Sinon, beaucoup de claviers ont des touches média, avec contrôle du volume et d'intensité lumineuse. Il est possible d'utiliser ces touches avec i3 moyennant les bonnes lignes de configuration i3. Je vous donne cet extrait de configuration :
\# media keys
```
# media keys
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume 1 +5%
bindsym XF86AudioLowerVolume exec pactl set-sink-volume 1 -5%
bindsym XF86AudioMute exec pactl set-sink-mute 1 toggle
@ -160,6 +169,7 @@ bindsym XF86AudioMute exec pactl set-sink-mute 1 toggle
# backlight
bindsym XF86MonBrightnessUp exec xbacklight -inc 5
bindsym XF86MonBrightnessDown exec xbacklight -dec 5
```
Notez que vous aurez peut-être à changer le "1" en "0" sur les lignes de volume, cela dépendra de votre configuration matérielle.
@ -167,7 +177,9 @@ Notez que vous aurez peut-être à changer le "1" en "0" sur les lignes de volum
Certains diront que c'est un réglage pas très important, mais j'estime que c'est quand même bien agréable. Personnellement, j'utilise le fond d'écran que j'ai configuré dans lightdm, ce qui m'évite de recourir à un autre utilitaire ou configuration. Si vous voulez utilisez un fond d'écran différent, vous pouvez utiliser nitrogen, qui dispose d'une interface GTK (yeurk...) pour choisir votre fond d'écran. Si vous optez pour cette solution, vous devrez ajouter cette ligne à votre configuration i3.
```
exec nitrogen --restore
```
* * *

View File

@ -27,7 +27,9 @@ Pour ce faire, les outils permettaient de trouver plein d'info à propos du navi
Avec la version 2, l'EFF va d'abord tester si votre navigateur web bloque les publicités qui vous épient. Ça ressemble à ça :
\[caption id="attachment\_844" align="alignnone" width="710"\][![eff_test_pano](%assets_url%/2015/12/eff_test_pano.png)](%assets_url%/2015/12/eff_test_pano.png) Test de mon firefox en navigation privée. Chromium en incognito donne à peu près le même résultat.\[/caption\]
![eff_test_pano](%assets_url%/2015/12/eff_test_pano.png)
Test de mon firefox en navigation privée. Chromium en incognito donne à peu près le même résultat.
Donc là mes navigateurs bloquent les publicités intrusives, mais ils sont identifiables. Le seul navigateur non identifiable que je connaisse est le Tor Browser.

View File

@ -10,13 +10,17 @@ Salut à tous,
Voici la première partie du tutoriel en temps réel que je vous avais [présenté](/posts/gerer-plusieurs-parcs-informatiques-partie-0-presentation/). Ici, on commence à mettre les mains dans le cambouis pour corrompre fertiliser notre machine pour qu'elle puisse router les IP comme une déesse.
\[caption id="attachment\_711" align="aligncenter" width="871"\][![Schéma global de l'utilisation de notre passerelle](%assets_url%/2015/10/global.png)](%assets_url%/2015/10/global.png) Schéma global de l'utilisation de notre passerelle\[/caption\]
![Schéma global de l'utilisation de notre passerelle](%assets_url%/2015/10/global.png)
Schéma global de l'utilisation de notre passerelle
Je vous rappelle le problème. Afin que les clés SSH ne se baladent pas dans la nature, nous avons choisi d'utiliser un proxy SSH interne sur lequel se connecteront toutes les personnes qui on besoin de gérer une des machines distantes dont on a la charge. Ces machines distantes sont accessibles pour la plupart via un tunnel VPN. Et un VPN, par définition, est un moyen de créer un **réseau** (le N de VPN, pour _network_) **privé** (P pour _private_), c'est à dire inaccessible autrement sur les internets, et cela **virtuellement** (V pour _virtual_) car un "vrai" réseau se fait d'habitude physiquement, par le pouvoir et la sainte grâce du support physique brut, pur et candide (cuivre, fibre, onde électromagnétique, signaux de fumée, que sais-je encore) sans aucune intervention autre que celle d'équipements de niveau 2 dans le [modèle OSI](https://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI). Oui, le VPN ne sert pas qu'à télécharger illégalement des données de manière anonyme, chose qu'il fait d'ailleurs la plupart du temps très mal s'il n'est pas couplé avec d'autres techniques. Le tunnel VPN va alors se matérialiser sous la forme d'une interface spéciale sur la machine, de la forme _tun_ ou _tap_, selon le protocole (pour les plus curieux, _tap_ encapsule des frames Ethernet tandis que _tun_ se limite à des frames IP, mais bon, on s'en tape).
Et comme les réseaux privés ne sont pas sensés être accessible de l'extérieur, les IP de ces réseaux n'obéissent à aucune pression extérieure, tels les joyeux hippies défoncés qui ont agrémenté les années 70. Ces adresses hippies sont généralement de la forme 192.168.X.X, 172.X.X.X, ou encore 10.0.X.X, ce qui fait que ces adresses hippies, même si elles s'affranchissent des ordres extérieurs, on tendance à se ressembler quand même un peu, c'est pourquoi ces  tiennent également un peu du mouvement hipster.
\[caption id="attachment\_700" align="aligncenter" width="214"\][![Hipster :)](%assets_url%/2015/10/hipster-358479_640-214x300.jpg "hipster")](https://hashtagueule.fr/?attachment_id=700) Un exemple d'adresse IP de réseau privé.\[/caption\]
![Hipster :)](%assets_url%/2015/10/hipster-358479_640-214x300.jpg "hipster")
Un exemple d'adresse IP de réseau privé.
On peut y voir tout ce que l'on veut, en bien ou en mal, mais une chose est sure, cette "hipsteritude" conduit souvent à **des conflits** lorsqu'il s'agit de s'y retrouver dans notre routage. En effet, imaginons, je veux envoyer un paquet à une certaine machine, je me débrouille donc pour obtenir son IP (disons l'adresse 192.168.0.2) et j'adresse ce paquet à cet IP. Seulement voilà, c'est tordant de rire, mais des IP comme ça, dans le monde, y en a des millions, et parmi mes connexions, comme j'ai pas mal de clients, il y a de fortes chances que ma machine incline là tête en arrière, me pointe du doigt et me raille méchamment. Ou alors il sera envoyé sur le premier chemin correspondant dans sa table de routage, ce qui n'est évidement pas la bonne solution. C'est ce qu'on appelle **les conflits LAN to LAN**.
@ -34,14 +38,18 @@ Les opérations suivantes s'effectuent en mode super-utilisateur ou avec la comm
On souhaite cloisonner un tunnel VPN. Pour cela **on crée un NetNS** que l'on nomme `vpn0` par exemple. On va donc effectuer la commande :
```
ip netns add vpn0
```
Ça y est, le NetNS est né ! Bon je vous avoue que tout nu comme ça, il ne va pas servir à grand chose, pour la simple et bonne raison qu'il ne contient encore aucune interface vers le monde extérieur (c'est embêtant quand on gère un réseau).
On va donc **créer une interface de loopback** `lo` (mandataire pour le bon fonctionnement de certains programmes, même si on ne s'en servira pas nous-même) et une interface `main` qui communiquera avec l'espace principal qui, je le rappelle, est le seul à contenir les interfaces physiques :
```
ip netns exec vpn0 ip link set dev lo up
ip link add nseth type veth peer netns vpn0 name main
```
**Explications :**
@ -52,26 +60,34 @@ On va maintenant **assigner des adresse IP** à ces interfaces. Eh oui, on fait
Il s'agit de créer un petit réseau privé (à deux membres) avec une IP que j'ai choisie bizarre pour être sûr que personne ne l'utilise pour son adressage VPN. En théorie, un /30 suffirait, mais je vois large, et j'ai laissé un simple /24.
```
ip netns exec vpn0 ifconfig main 10.42.0.2/24
ifconfig nseth 10.42.0.1/24
```
J'avoue qu'il s'agit là de la partie que je n'aime guère, le fait de créer des réseaux pour des interfaces virtuelles ne m'enchante pas vraiment. Mais je suis sur qu'il y a pire dans la vie, d'ailleurs j'ai déjà fait pire, et je referai sûrement pire (le tutoriel ne fait que commencer)...
Voilà, maintenant **l'espace principal et le nouveau NetNS se connaissent mutuellement**. Mais c'est pas fini. Parce que le nouveau NetNS, il ne sais pas qu'il faut passer par l'espace principal pour accéder à internet.
```
ip netns exec vpn0 route add default gw 10.42.0.1
```
On ne fait qu'**ajouter une entrée  à la table de routage** du nouveau NetNS pour lui dire "Quand tu ne sais pas ou tu vas, il faut y aller passe par l'espace principal".
En l'état, toutes les requêtes sortantes provenant du nouveau NetNS arrivent à l'espace principal, mais lui n'en a cure. Il faut alors **activer la redirection IP dans l'espace principal** :
```
sysctl -w net.ipv4.ip\_forward=1
```
Et voilà vous pouvez taper sur n'importe quel serveur depuis votre nouveau NetNS !
Mais mais mais (parce qu'il y a un mais) ce n'est pas fini, et c'est ça, **la valeur ajoutée Hashtagueule**, car je n'ai trouvé aucune ressource sur le net évoquant le problème suivant : les requètes montent, pour ça, aucun problème. Mais jamais elle ne redescendrons, en tout cas pas en l'état. Vous pouvez vérifier par vous même avec la commande :
```
ip netns exec vpn0 ping 8.8.8.8
```
**Vous n'obtiendrez aucun écho ICMP**. Pourquoi donc ?
@ -85,31 +101,43 @@ En fait, `iptables` est un **parre-feu**, c'est à dire qu'il va examiner tous l
Pour faire du NATing, déjà, **il faut activer le mode _masquerade_**, c'est à dire la réécriture des ports entrants et sortants :
```
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
```
(en admettant que vous vous connectez à internat par l'interface `eth0`).
Vous pouvez définir des ensembles de règles (on les appelle des chaînes de règles), et il est recommandé de faire une chaîne spéciale pour vos NetNS, histoire de ne pas flinguer une configuration déjà existante, et dire à la chaîne principale dédiée à la redirection des paquets de prendre en considération cette nouvelle chaîne :
```
iptables -N netns
iptables -A FORWARD -j netns
```
Puis vous allez dire à votre NAT d'accepter tous les paquets impliquant l'interface virtuelle vers notre nouveau NetNS :
```
iptables -A netns -i nseth -j ACCEPT
```
Voilà, vous êtes parés ! Maintenant votre NetNS peut pleinement communiquer avec Internet. Les paquets sortants seront modifiés afin de prendre l'IP publique, et les paquets entrants seront automatiquement restitués au bon NetNS.
Maintenant, pour ouvrir un VPN sans risquer de troubler votre routage (c'était le but à la base), par exemple avec OpenVPN, et ouvrir une connexion SSH sur un serveur membre de ce VPN, vous n'avez qu'à effectuer les commandes :
```
ip netns exec vpn0 openvpn fichier\_de\_conf.ovpn
ip netns exec vpn0 ssh mon\_serveur\_distant
```
Astuce : pour ne pas être obligé de retaper `ip netns exec vpn0` à chaque commande, vous pouvez lancer un nouveau shell dans le NetNS et bénéficier ainsi de l'hérédité de l'environnement de travail :
```
ip netns exec vpn0 bash
```
\[caption id="attachment\_712" align="aligncenter" width="1177"\][![Récapitulatif du finctionnement interne](%assets_url%/2015/10/interne.png)](%assets_url%/2015/10/interne.png) Récapitulatif du fonctionnement interne\[/caption\]
![Récapitulatif du finctionnement interne](%assets_url%/2015/10/interne.png)
Récapitulatif du fonctionnement interne
Voilà, c'est pas beau tout ça ?

View File

@ -10,7 +10,7 @@ Bonjour à tous !
Êtes-vous amateurs de musique ?  Eh bien nous aussi, c'est pourquoi aujourd'hui je vous présente Lilypond (pour ceux qui ne le connaissent pas déjà). Lilypond est un logiciel permettant de créer des partitions de musique. Pour ceux qui connaissent le fonctionnement de LaTeX, le principe est le même. Pour les autres, on va le découvrir ensemble...
# **I - Aspect pratiques**
# Aspect pratiques
Vous pouvez passer à la partie II si vous n'êtes pas sûr de vouloir utiliser Lilypond, pour en voir les fonctionnalités de base.
@ -20,23 +20,27 @@ On écrit les partitions dans un fichier texte, à ouvrir avec [notepad++](https
On compile avec la commande :
`$ lilypond mon_fichier.ly`
```
lilypond mon_fichier.ly
```
Pour les petits exemples, ceci est plus rapide. Il existe néanmoins un IDE très efficace que j'utilise qui s'appelle [Frescobaldi](http://www.frescobaldi.org/), qui est multiplate-forme. L'avantage de Frescobaldi est qu'il permet de prévisualiser son travail :
[![01_Frescobaldi_empty](%assets_url%/2015/09/01_Frescobaldi_empty-300x165.png)](%assets_url%/2015/09/01_Frescobaldi_empty.png)
![01_Frescobaldi_empty](%assets_url%/2015/09/01_Frescobaldi_empty-300x165.png)
# II - Exemples
# Exemples
En fait c'est assez simple, vous écrivez les notes, et Lilypond se charge du reste. Mise en page, espacement, production du PDF/DVI, manière optimale de disposer la queue des croches...
Faisons simple avec un petit exemple. Écrire :
`{ c' e' g' c' }`
```
{ c' e' g' c' }
```
dans un fichier texte test.ly produit le résultat suivant après compilation :
dans un fichier texte `test.ly` produit le résultat suivant après compilation :
[![05test_ly](%assets_url%/2015/09/05test_ly.png)](%assets_url%/2015/09/05test_ly.png)
![05test_ly](%assets_url%/2015/09/05test_ly.png)
On ne s'en rend pas compte tout de suite, mais c'est très puissant. Lilypond a automatiquement créé un PDF à partir d'un fichier texte tout simple. En fait il a fait plus que ça. Puisque rien n'est précisé ici (mis à part les notes) Lilypond a fait beaucoup d'hypothèse, il s'agit en fait du comportement par défaut :
@ -66,23 +70,29 @@ En fait il y a deux comportements de Lilypond :
On peut donc réécrire notre fichier lilypond ainsi :
`\relative c' { c  e g c }`
```
\relative c' { c  e g c }
```
Vous découvrez là une nouvelle fonctionalité de Lilypond ! les commandes. Celles-ci sont introduites par le caractère "\\". Ici on a demandé à Lilypond de disposer toutes les notes relativement au do 293. \\relative permet de ne plus avoir besoin de mettre d'apostrophe, chaque note étant écrite en fonction de la précédente. Ainsi :
`\relative c { c' c' c' }`
```
\relative c { c' c' c' }
```
produit le résultat suivant :
[![06_test_ly](%assets_url%/2015/09/06_test_ly.png)](%assets_url%/2015/09/06_test_ly.png)
![06_test_ly](%assets_url%/2015/09/06_test_ly.png)
Vous savez désormais écrire toutes les notes, augmenter d'une l'octave, utiliser le mode relatif ou absolu. Pour diminuer d'une octave, le caractère à utiliser est la virgule :
`\relative c'' { c' c, c, }`
```
\relative c'' { c' c, c, }
```
donne :
[![07_test-ly](%assets_url%/2015/09/07_test-ly.png)](%assets_url%/2015/09/07_test-ly.png)
![07_test-ly](%assets_url%/2015/09/07_test-ly.png)
Tout cela est un peu monotone. Ajoutons du rythme. Ici c'est pareil que la hauteur. Le rythme d'une note dépend de la précédente. La première vaut une noire par défaut. Pour définir un rythme, on utilise les puissance de 2. En effet une ronde vaut deux blanches qui valent deux noires, qui valent deux croches, qui valent deux doubles-croches etc...
@ -98,11 +108,13 @@ Pour Lilypond, la ronde est représentée par le chiffre 1. On a donc :
On peut donc écrire :
`\relative c' { c1 | c2 c | c4 c c c | c8 }`
```
\relative c' { c1 | c2 c | c4 c c c | c8 }
```
qui donne :
[![08_test_ly](%assets_url%/2015/09/08_test_ly-300x89.png)](%assets_url%/2015/09/08_test_ly.png)
![08_test_ly](%assets_url%/2015/09/08_test_ly-300x89.png)
Vous remarquez :
@ -116,11 +128,13 @@ Deux autres concepts fondamentaux :
Une chose à retenir : on n'écrit jamais de bécarre. Lilypond les écrira pour vous :
`\relative c' { \key c \minor c d e f | c d ees f | e ees e ees }`
```
\relative c' { \key c \minor c d e f | c d ees f | e ees e ees }
```
donne :
[![09test_ly](%assets_url%/2015/09/09test_ly-300x97.png)](%assets_url%/2015/09/09test_ly.png)
![09test_ly](%assets_url%/2015/09/09test_ly-300x97.png)
Quelques explications :
@ -136,13 +150,13 @@ Quelques explications :
NB : il ne faudra pas confondre `\key` qui permet de définir la tonalité du morceau et `\clef` qui indique la clef de la mesure (qui admet treble (clef de sol), bass (clef de fa)... comme paramètre) :
`\relative c' { \clef treble`
c \\clef bass c \\clef treble c \\clef bass c | }
```
\relative c' { \clef treble c \clef bass c \clef treble c \clef bass c | }
```
donne :
[![10_test_ly](%assets_url%/2015/09/10_test_ly.png)](%assets_url%/2015/09/10_test_ly.png)
![10_test_ly](%assets_url%/2015/09/10_test_ly.png)
J'espère que vous êtes convaincus que le résultat est ce qu'on attend. En effet il s'agit quatre fois de la **même** note.
@ -154,21 +168,25 @@ Finissons-en avec les problèmes de durée de note :
- c'4. (l'apostrophe (ou la virgule) _doit_ être collée à la lettre, en effet la note est c' puisque c est une note différente, une octave en dessous)
- On peut sinon utiliser les parenthèses pour indiquer une ligature de note tenue. Cela se fait ainsi :
`\relative c' { c1(  |  c4 )  c }`
```
\relative c' { c1(  |  c4 )  c }
```
qui donne :
[![11_test_ly](%assets_url%/2015/09/11_test_ly.png)](%assets_url%/2015/09/11_test_ly.png)
![11_test_ly](%assets_url%/2015/09/11_test_ly.png)
La parenthèse est **collée après** la note sur laquelle le début de la ligature commence.
Voyons maintenant les accords. On les obtient ainsi :
`\relative c' { <c c'> <cis e cis'>8. <cisis  cisis'>16 }`
```
\relative c' { <c c'> <cis e cis'>8. <cisis  cisis'>16 }
```
qui donne :
[![12_test_ly](%assets_url%/2015/09/12_test_ly.png)](%assets_url%/2015/09/12_test_ly.png)
![12_test_ly](%assets_url%/2015/09/12_test_ly.png)
Vous remarquez que Lilypond a fait automatiquement le lien entre la croche pointée et la double croche. Vous savez aussi comment organiser :
@ -179,25 +197,29 @@ Vous remarquez que Lilypond a fait automatiquement le lien entre la croche point
Pour changer la manière dont Lilypond lie les croches/doubles-croches/etc... il faut utiliser "\[" et "\]" exactement comme on a utilisé les parenthèses :
`\relative c' { c8  c c c c c c c | c[ c] c c c c c c }`
```
\relative c' { c8  c c c c c c c | c[ c] c c c c c c }
```
qui donne :
[![13_test_ly](%assets_url%/2015/09/13_test_ly-300x79.png)](%assets_url%/2015/09/13_test_ly.png)
![13_test_ly](%assets_url%/2015/09/13_test_ly-300x79.png)
Je ne sais pas vous, mais je trouve que Lilypond a bon goût dans la manière qu'il a de lier les croches.
Changeons de mesure ! 4/4 ça devient ennuyeux ;-) . Eh bien pour cela, on va utiliser la commande `\time` suivie d'un argument. `\time 3/8` donne une mesure qui dure 3 croches :
`\relative c' { \time 7/8 c8  c c c c c c  | \time 3/8 c[ c] c c c c c c }`
```
\relative c' { \time 7/8 c8  c c c c c c  | \time 3/8 c[ c] c c c c c c }
```
donne :
[![14_test_ly](%assets_url%/2015/09/14_test_ly-300x67.png)](%assets_url%/2015/09/14_test_ly.png)
![14_test_ly](%assets_url%/2015/09/14_test_ly-300x67.png)
Je vais finir cette première esquisse par quelques points :
- Lilypond grogne à chaque fois qu'on compile sans le numéro de version. il suffit de rajouter l'entête `\version "2.18.2".` Il s'agit là d'un header, on en verra d'autres par la suite.
- Lilypond grogne à chaque fois qu'on compile sans le numéro de version. il suffit de rajouter l'entête `\version "2.18.2"`. Il s'agit là d'un header, on en verra d'autres par la suite.
- Les partitions peuvent être très complexes :
- plusieurs voix ;
- plusieurs portées ;

View File

@ -48,182 +48,214 @@ Au programme :
On va s'y prendre de la même manière que la première fois, rien ne vaut un petit exemple simple pour comprendre.
##### Plusieurs portées
## Plusieurs portées
On pourrait essayer de faire ça pour obtenir deux portées :
\\version "2.18.2"
upper = \\relative c'
```
\version "2.18.2"
upper = \relative c'
{
c e g
}
lower = \\relative c
lower = \relative c
{
c e g
}
```
Mais ici on ne dit pas à Lilypond comment il doit gérer les deux groupes de notequ'on a créé. La seule chose ici qu'on a fait, c'est dédoubler le premier groupe de musique et on leur a donné des noms. On a de plus pas généré de PDF ! C'est un bon début, mais ce n'est pas suffisant. Il faut donc préciser dans un header -- qu'on va placer à la fin, je suppose que ça en fait un footer -- comment les ajouter. Voici le code, attention les yeux :
\\version "2.18.2"
upper = \\relative c'
```
\version "2.18.2"
upper = \relative c'
{
c e g
}
lower = \\relative c
lower = \relative c
{
c e g
}
\\score
\score
{
\\new GrandStaff \\with { instrumentName = "Piano" }
<< \\new Staff = upper { \\new Voice = "singer" \\upper } \\new Staff = lower { \\lower } >>
\new GrandStaff \with { instrumentName = "Piano" }
<< \new Staff = upper { \new Voice = "singer" \upper } \new Staff = lower { \lower } >>
}
```
Voilà, c'est un peu moche, mais on ne touchera plus à ce footer dans cette deuxième partie de tutoriel. Il est cependant très utile, puisqu'il permet en théorie l'ajout de paroles et la création automatique du fichier midi de votre partition. Voici le résultat tand attendu :
\[caption id="attachment\_639" align="alignnone" width="300"\][![2portees](%assets_url%/2015/10/2portees-300x215.png)](%assets_url%/2015/10/2portees.png) Deux portées au piano. Le début de la gloire !\[/caption\]
![2portees](%assets_url%/2015/10/2portees-300x215.png)
Deux portées au piano. Le début de la gloire !
Bon maintenant tout ça donne un PDF un peu moche, alors rendons-le plus joli. Vous savez faire, il suffit de changer la clef à l'armure (je ne mets plus les headers ni les footers) :
\\version "2.18.2"
upper = \\relative c'
```
\version "2.18.2"
upper = \relative c'
{
c e g
}
lower = \\relative c
lower = \relative c
{
\\clef bass
\clef bass
c e g
}
```
qui donne :
\[caption id="attachment\_640" align="alignnone" width="300"\][![2portees_2clefs](%assets_url%/2015/10/2portees_2clefs-300x177.png)](%assets_url%/2015/10/2portees_2clefs.png) Partition à deux portées avec Lilypond\[/caption\]
![2portees_2clefs](%assets_url%/2015/10/2portees_2clefs-300x177.png)
##### Commentaires
Partition à deux portées avec Lilypond
## Commentaires
Pour insérer un commentaires en lilypond, il suffit d'utiliser le caractère `%`.
Tout ce qui suit le `%` est ignoré par le compilateur. Voilà. Simple et efficace.
##### Plusieurs Voix
## Plusieurs Voix
On se représente les voix facilement lorsqu'il y a plusieurs instruments, donc sur plusieurs portées, mais une portée peut représenter plusieurs voix. Le code peut ressembler à ceci :
\\version "2.18.2" % ---- header ---- %
upper = \\relative c'' {
  \\clef treble
  <<     \\voiceOne{c4 c c c  c} \\\\     \\voiceTwo{b4 b2  b4 b}   >>
```
\version "2.18.2" % ---- header ---- %
upper = \relative c'' {
  \clef treble
  <<     \voiceOne{c4 c c c  c} \\     \voiceTwo{b4 b2  b4 b}   >>
}
% ---- footer ---- %
\\score {
  \\new GrandStaff <<     \\new Staff = upper { \\new Voice = "singer" \\upper }   >>
  \\layout {
    \\context {
      \\GrandStaff
      \\accepts "Lyrics"
\score {
  \new GrandStaff <<     \new Staff = upper { \new Voice = "singer" \upper }   >>
  \layout {
    \context {
      \GrandStaff
      \accepts "Lyrics"
    }
    \\context {
      \\Lyrics
      \\consists "Bar\_engraver"
    \context {
      \Lyrics
      \consists "Bar_engraver"
    }
  }
}
```
dont le rendu est :
\[caption id="attachment\_641" align="alignnone" width="300"\][![1portee_2voix](%assets_url%/2015/10/1portee_2voix-300x97.png)](%assets_url%/2015/10/1portee_2voix.png) Gérer deux voix sur une portée avec Lilypond\[/caption\]
![1portee_2voix](%assets_url%/2015/10/1portee_2voix-300x97.png)
Gérer deux voix sur une portée avec Lilypond
Pas très original, mais pratique pour faire apprécier l'idée : ici le chant en haut est constitué de _do_ 4, et la basse de _si_ 4 et 2.
J'ai encore un peu modifié le footer pour que les deux voix soient prises en compte.
##### Ornements
## Ornements
Vous connaissez ces jolies petites notes qui ne compte (souvent) pas dans le calcul de la longueur de la mesure ? Il y en a plein et nous allons les découvrir.
upper = \\relative c'' {
  \\clef treble
```
upper = \relative c'' {
  \clef treble
   \\appoggiatura{a8} c2 \\appoggiatura{a16}c2 | \\appoggiatura{a32}c2 \\appoggiatura{a16 b}c2 | r1 \\bar "" \\break
   \\acciaccatura{a8} c2 \\acciaccatura{a16} c2 \\acciaccatura{a32} c2 \\acciaccatura{a16 b} c2   r1 \\bar "" \\break
   \\grace{a8} c2 \\grace{a16} c2 | \\grace{a32} c2 \\grace{a16 b} c2 \\bar ""
   \appoggiatura{a8} c2 \appoggiatura{a16}c2 | \appoggiatura{a32}c2 \appoggiatura{a16 b}c2 | r1 \bar "" \break
   \acciaccatura{a8} c2 \acciaccatura{a16} c2 \acciaccatura{a32} c2 \acciaccatura{a16 b} c2   r1 \bar "" \break
   \grace{a8} c2 \grace{a16} c2 | \grace{a32} c2 \grace{a16 b} c2 \bar ""
}
```
Il s'agit la de trois ornements que j'ai mis en parallèle pour que vous puissiez voir la différence facilement :
\[caption id="attachment\_642" align="alignnone" width="300"\][![grace_notes](%assets_url%/2015/10/grace_notes-300x93.png)](%assets_url%/2015/10/grace_notes.png) Ornements avec Lilypond\[/caption\]
![grace_notes](%assets_url%/2015/10/grace_notes-300x93.png)
Ornements avec Lilypond
Les notes sont espacées exprès à l'aide de la commande `\break`. Ce n'est pas utile pour l'instant, il s'agit d'une commande avancée mais je l'ai utilisé pour que les notes soient très écartées, pour plus de lisibilité.
##### Trilles --- mordants
## Trilles - mordants
On n'oublie surtout pas les mordants et autres trilles qui vont de pair avec les ornements :
upper = \\relative c'' {
  \\clef treble
```
upper = \relative c'' {
  \clef treble
  c4\\trill r2 r4 | c\\prall r2 r4 | c\\mordent r2 r4 | c\\turn r2  
  c4\trill r2 r4 | c\prall r2 r4 | c\mordent r2 r4 | c\turn r2  
}
```
dont le rendu est :
\[caption id="attachment\_645" align="alignnone" width="300"\][![trilles](%assets_url%/2015/10/trilles-300x64.png)](%assets_url%/2015/10/trilles.png) Trilles et mordants avec GNU Lilypond\[/caption\]
![trilles](%assets_url%/2015/10/trilles-300x64.png)
##### Écriture du rythme
Trilles et mordants avec GNU Lilypond
## Écriture du rythme
Si vous avez fait un peu de mathématiques ou d'informatique, vous savez qu'on peut représenter n'importe quel nombre à l'aide des puissances de 2. Les musiciens devaient savoir ça et permettent de rallonger les notes ainsi :
upper = \\relative c'' {
  \\clef treble
```
upper = \relative c'' {
  \clef treble
   a4 r2 r4 |
a. r8 r2 |
a4.. r16 r2 |
}
```
ce qui donne :
\[caption id="attachment\_647" align="alignnone" width="300"\][![pointees](%assets_url%/2015/10/pointees-300x50.png)](%assets_url%/2015/10/pointees.png) Notes pointées avec Lilypond\[/caption\]
![pointees](%assets_url%/2015/10/pointees-300x50.png)
Notes pointées avec Lilypond
J'ai fait exprès ici de mettre les silences complémentaires pour terminer la mesure afin qu'on se rende compte de l'effet du `.` sur la note.
##### Accentuations
## Accentuations
Voici comment expliquer la façon dont une note est jouée :
upper = \\relative c'' {
  \\clef treble
```
upper = \relative c'' {
  \clef treble
  a4 a^. a^- a^> |
a^1 a^^ a^+ a-\_ |
}
```
ce qui donne sans grande surprise :
\[caption id="attachment\_649" align="alignnone" width="300"\][![accentuation](%assets_url%/2015/10/accentuation-300x80.png)](%assets_url%/2015/10/accentuation.png) Notes accentuées avec Lilypond\[/caption\]
![accentuation](%assets_url%/2015/10/accentuation-300x80.png)
Notes accentuées avec Lilypond
Ici le `^` sert à introduire le signe qui sera utilisé sur la note.
##### Pour quelques sesterces de plus...
## Pour quelques sesterces de plus...
On en a fini (je crois) avec les principales règles de Lilypond. Bien sûr il y en a encore plein d'autre qui existent et elles sont plus ou moins importantes en fontcion des partitions que vous jouez. Alors pour finir, on va faire disparaître la mesure, et c'est là que vous vous rendrez compte que les commandes de Lilypond sont très puissantes.
```
global = {
  \\cadenzaOn %supprimer les mesures
  \\override Staff.TimeSignature.transparent = ##t
  \cadenzaOn %supprimer les mesures
  \override Staff.TimeSignature.transparent = ##t
}
upper = \\relative c'' {
  \\clef treble
upper = \relative c'' {
  \clef treble
  a4 a a a
  a a a a
  a a a a
}
```
donne
[![magie_rythme](%assets_url%/2015/10/magie_rythme-300x58.png)](%assets_url%/2015/10/magie_rythme.png)
![magie_rythme](%assets_url%/2015/10/magie_rythme-300x58.png)
J'ai donc utilisé un header supplémentaire, le header global, auquel j'ai donné une instruction : `\cadenzaOn`, et une commande `\override Staff.TimeSignature.transparent = ##t`.

View File

@ -18,9 +18,11 @@ On va tout d'abord commencer en parlant de la structure d'une partition, je sera
Vous vous rappelez surement le début où l'on faisait des fichiers ly aussi petits que ça :
```
{
a c e
}
```
eh bien c'était non seulement grâce aux très nombreuses valeurs par défaut de Lilypond, mais aussi parce que Lilypond voit une unique chaîne de musique et sait "dans quel ordre" la traiter, et "où" la placer. En effet si vous voulez écrire une partita à 6 mouvements et deux portées, il n'est plus possible de savoir quoi mettre où. Donc il va falloir l'expliquer à Lilypond. Et pour ça, il y a plusieurs solutions.
@ -30,16 +32,17 @@ eh bien c'était non seulement grâce aux très nombreuses valeurs par défaut d
Prenons un exemple créé avec Frescobaldi :
\\version "2.18.2" % header version
```
\version "2.18.2" % header version
\\header {
\header {
dedication = "ma dédicace"
title = "le Titre"
subtitle = "ss titre"
subsubtitle = "le ssss titre"
instrument = "linstrument"
instrument = "l'instrument"
composer = "le compositeur"
arranger = "larrangeur"
arranger = "l'arrangeur"
poet = "le parolier"
meter = "Symphonia"
piece = "Andantino"
@ -49,120 +52,134 @@ Prenons un exemple créé avec Frescobaldi :
} % header global
global = {
\\key f \\minor
\\time 2/2
\\partial 8.
\\tempo "Andante"
\key f \minor
\time 2/2
\partial 8.
\tempo "Andante"
} % header pour les trois portées
right = \\relative c'' {
\\global
right = \relative c'' {
\global
% En avant la musique !
} % portée supérieure piano
left = \\relative c' {
\\global
left = \relative c' {
\global
% En avant la musique !
} % portée inférieure piano
sopranoVoice = \\relative c'' {
\\global
\\dynamicUp
sopranoVoice = \relative c'' {
\global
\dynamicUp
% En avant la musique !
} % voix de soprane
verse = \\lyricmode {
verse = \lyricmode {
% Ajouter ici des paroles.
} % paroles pour la soprane
pianoPart = \\new PianoStaff \\with {
pianoPart = \new PianoStaff \with {
instrumentName = "Piano"
} << \\new Staff = "right" \\with { midiInstrument = "acoustic grand" } \\right \\new Staff = "left" \\with { midiInstrument = "acoustic grand" } { \\clef bass \\left } >>
% utilisation des variables \\right et \\left pour créer la ligne piano
} << \new Staff = "right" \with { midiInstrument = "acoustic grand" } \right \new Staff = "left" \with { midiInstrument = "acoustic grand" } { \clef bass \left } >>
% utilisation des variables \right et \left pour créer la ligne piano
sopranoVoicePart = \\new Staff \\with {
sopranoVoicePart = \new Staff \with {
instrumentName = "Soprano"
midiInstrument = "choir aahs"
} { \\sopranoVoice }
\\addlyrics { \\verse }
% utilisation des variables \\sopranoVoice et \\verse pour créer la ligne de la soprane
} { \sopranoVoice }
\addlyrics { \verse }
% utilisation des variables \sopranoVoice et \verse pour créer la ligne de la soprane
\\score {
<< \\pianoPart \\sopranoVoicePart >> % assemblage dans la partition score
\\layout { }
\\midi {
\\context {
\\Score
\score {
<< \pianoPart \sopranoVoicePart >> % assemblage dans la partition score
\layout { }
\midi {
\context {
\Score
tempoWholesPerMinute = #(ly:make-moment 81 2)
}
}
}
```
En rajoutant des notes et des paroles on obtient :
\[caption id="attachment\_877" align="alignnone" width="650"\][![partition](%assets_url%/2016/01/partition.png)](%assets_url%/2016/01/partition.png) Partition exemple. Piano et voix de Soprane.\[/caption\]
![partition](%assets_url%/2016/01/partition.png)
Partition exemple. Piano et voix de Soprane.
# Problèmes rencontrés et leurs solutions
#### Forcer le retour à la ligne
## Forcer le retour à la ligne
Il suffit d'utiliser la commande \\break au niveau d'une barre de mesure.
Il suffit d'utiliser la commande `\break` au niveau d'une barre de mesure.
Je vous recommande d'écrire les barre de mesures de manière explicite (elles existent de manière implicite) car ça permet de corriger beaucoup d'erreur --- grâce au "barcheck", et permet de relire son code plus facilement.
#### Hampe (Stem)
## Hampe (Stem)
La hampe est généralement liée à la voix s'il y en a plusieurs, voiceOne et voiceThree sont par défaut vers le haut (mais pas toujours) et voice To et voiceFour vers le bas. S'il n'y a qu'une seule voix, Lilypond choisit en fonction de la hauteur de la note.
Parfois la hampe de la note (Stem en anglais) est dirigée vers le haut et vous la voudriez vers le bas ou vice versa. Il y a pour cela une comande très simple : \\stemUp pour forcer les hampes vers le haut, \\stemDown pour les forcer vers le bas, \\stemNeutral pour laisser de nouveau le choix à Lilypond.
Parfois la hampe de la note (Stem en anglais) est dirigée vers le haut et vous la voudriez vers le bas ou vice versa. Il y a pour cela une comande très simple : `\stemUp` pour forcer les hampes vers le haut, `\stemDown` pour les forcer vers le bas, `\stemNeutral` pour laisser de nouveau le choix à Lilypond.
On peut aussi rendre la hampe transparent à l'aide de : \\once \\override Stem.transparent = ##t.
On peut aussi rendre la hampe transparent à l'aide de :
\[caption id="attachment\_884" align="alignnone" width="300"\][![hampe transparente](%assets_url%/2016/02/002-300x170.png)](%assets_url%/2016/02/002.png) noire avec une hampe transparente.\[/caption\]
```
\once \override Stem.transparent = ##t.
```
#### Silence transparent
![hampe transparente](%assets_url%/2016/02/002-300x170.png)
Il peut vous arriver de vouloir effacer les silences, on le fait avec la commande : \\override Staff.Rest.transparent = ##t, et pour n'en effacer qu'un : \\once \\override Staff.Rest.transparent = ##t.
noire avec une hampe transparente.
#### Décaler une ligature
## Silence transparent
Si vous voulez déplacer une ligature logique (Tie, indiquée par le symbole ~ après la note) on peut le faire à l'aide de la commande : \\once \\override Tie.extra-offset = #'(0.1 . -0.1) par exemple :
Il peut vous arriver de vouloir effacer les silences, on le fait avec la commande : `\override Staff.Rest.transparent = ##t`, et pour n'en effacer qu'un : `\once \override Staff.Rest.transparent = ##t`.
\[caption id="attachment\_885" align="alignnone" width="300"\][![ligature normale](%assets_url%/2016/02/003-300x127.png)](%assets_url%/2016/02/003.png) ligature normale\[/caption\]
## Décaler une ligature
Si vous voulez déplacer une ligature logique (Tie, indiquée par le symbole ~ après la note) on peut le faire à l'aide de la commande : `\once \override Tie.extra-offset = #'(0.1 . -0.1)` par exemple :
![ligature normale](%assets_url%/2016/02/003-300x127.png)
ligature normale
devient :
\[caption id="attachment\_886" align="alignnone" width="300"\][![ligature décalée](%assets_url%/2016/02/004-300x110.png)](%assets_url%/2016/02/004.png) ligature décalée en hauteur et en largeur\[/caption\]
![ligature décalée](%assets_url%/2016/02/004-300x110.png)
ligature décalée en hauteur et en largeur
(ici ce n'était pas très utile, je l'admets...)
De la même façon que la hampe, on peut forcer une ligature vers le haut ou vers le bas avec \\tieUp \\tieDown, et remettre le défaut avec \\tieNeutral.
#### Décaler une note horizontalement
## Décaler une note horizontalement
Par défaut, les voix 3 et 4 (voiceThree et voiceFour) sont décalées par rapport aux voix une et deux. C'est sympa la majorité du temps, mais parfois (lorsqu'on fait des accord, par exemple, afin d'avoir les notes alignées). On peut le faire à l'aide de la commande suivante : \\once \\override NoteColumn.force-hshift = 0.
Par défaut, les voix 3 et 4 (voiceThree et voiceFour) sont décalées par rapport aux voix une et deux. C'est sympa la majorité du temps, mais parfois (lorsqu'on fait des accord, par exemple, afin d'avoir les notes alignées). On peut le faire à l'aide de la commande suivante : `\once \override NoteColumn.force-hshift = 0`.
#### Trille prolongé
## Trille prolongé
On peut spécifier un trille avec \\trill après la note sur lequel le trille s'applique.
On peut spécifier un trille avec `\trill` après la note sur lequel le trille s'applique.
Pour faire un trille prolongé, on indique le début avec \\startTrillSpan et on le termine avec \\stopTrillSpan.
Pour faire un trille prolongé, on indique le début avec `\startTrillSpan` et on le termine avec `\stopTrillSpan`.
Pour spécifier une altération sur le trille, on utilise \\pitchedTrill
Pour spécifier une altération sur le trille, on utilise `\pitchedTrill`.
#### Texte sur la partition
## Texte sur la partition
On peut utiliser \\markup{} pour afficher du texte. Par exemple : c4^\\markup{\\italic{mezzo forte}} affiche mezzo forte en italic au dessus de la note, et c4\_\\markup{\\italic{mezzo forte}} l'affiche en dessous.
On peut utiliser `\markup{}` pour afficher du texte. Par exemple : `c4^\markup{\italic{mezzo forte}}` affiche mezzo forte en italic au dessus de la note, et `c4_\markup{\italic{mezzo forte}}` l'affiche en dessous.
\[caption id="attachment\_890" align="alignnone" width="292"\][![markup](%assets_url%/2016/02/005.png)](%assets_url%/2016/02/005.png) markup mezzo forte en italic en haut, piano en italic en bas\[/caption\]
![markup](%assets_url%/2016/02/005.png)
markup mezzo forte en italic en haut, piano en italic en bas
#### Accords en arpèges
## Accords en arpèges
Pour afficher un arpège, on utilise \\arpegio. Pour préciser explicitement si l'accord est de haut en bas, on utilise \\arpeggioArrowUp, qu'on termine avec \\arpeggioNormal. Pour aller de haut en bas, on utilise \\arpeggioArrowDown.
Pour afficher un arpège, on utilise `\arpegio`. Pour préciser explicitement si l'accord est de haut en bas, on utilise `\arpeggioArrowUp`, qu'on termine avec `\arpeggioNormal`. Pour aller de haut en bas, on utilise `\arpeggioArrowDown`.
Voilà, c'est tout pour ce troisième petit tour dans Lilypond, je suppose qu'il va falloir attendre que j'écrive des partitions vraiment complexes pour en écrire un troisième ;). Bonne journée à tous !

View File

@ -37,11 +37,15 @@ Une fois votre ROM flashée, installez l'application [F-Droid](https://f-droid.o
À ce niveau, l'important est de comprendre que vous téléchargerez les applications qui vous intéressent sur votre ordinateur **en le faisant passer pour un appareil Android auprès de Google**. Il y a plusieurs solutions pour y arriver. Personnellement, j'utilise l'extension Firefox [APK Downloader](https://addons.mozilla.org/fr/firefox/addon/apk-downloader/) dont le rôle est d'ajouter un bouton sur chaque page web du Google Play Store. Vous aurez besoin de configurer l'application en renseignant votre adresse de compte Google, votre mot de passe, et l'identifiant Android que vous avez noté plus tôt.
\[caption id="attachment\_1041" align="alignnone" width="742"\][![Notez le bouton "Download APK" permettant de télécharger directement l'application sur votre PC.](%assets_url%/2016/04/2016-04-07-171238_742x230_scrot.png)](%assets_url%/2016/04/2016-04-07-171238_742x230_scrot.png) Notez le bouton "Download APK" permettant de télécharger directement l'application sur votre PC.\[/caption\]
![Notez le bouton "Download APK" permettant de télécharger directement l'application sur votre PC.](%assets_url%/2016/04/2016-04-07-171238_742x230_scrot.png)
Notez le bouton "Download APK" permettant de télécharger directement l'application sur votre PC.
À partir de là, vous pouvez si vous le souhaitez installer directement l'application sur votre appareil à l'aide de la commande de débug d'Android :
```
adb install /chemin/vers/l/application/téléchargée.apk
```
Mais ce serait passer à côté de fonctionnalités intéressantes :
@ -58,104 +62,112 @@ Il est alors intéressant d'avoir un serveur sur lequel vous allez constituer vo
Sur votre serveur, créez le dossier du dépôt, chez moi il s'agit du dossier `/var/apk`. Placez-vous dans ce répertoire et effectuez la commande suivante :
```
fdroid init
```
Cette commande va créer un certain nombre d'éléments, dont le dossier `repo` et le fichier `config.py`.
Intéressons-nous au fichier de configuration. Normalement les commentaires sont assez explicites. Voici à quoi peut ressembler votre fichier de configuration :
```
#!/usr/bin/env python2
mvn3 = "mvn"
gradle = "gradle"
repo\_maxage = 0
repo_maxage = 0
repo\_url = "http://bidule.machin.truc"
repo\_name = "Repo perso de Raspbeguy"
repo\_icon = "fdroid-icon.png"
repo\_description = """
repo_url = "http://bidule.machin.truc"
repo_name = "Repo perso de Raspbeguy"
repo_icon = "fdroid-icon.png"
repo_description = """
Comme j'utilise Dirty Unicorn tout nu sans les services Google play,
ben je suis dans l'obligation de magouiller...
"""
archive\_older = 3
archive\_url = "https://f-droid.org/archive"
archive\_name = "My First FDroid Archive Demo"
archive\_icon = "fdroid-icon.png"
archive\_description = """
archive_older = 3
archive_url = "https://f-droid.org/archive"
archive_name = "My First FDroid Archive Demo"
archive_icon = "fdroid-icon.png"
archive_description = """
The repository of older versions of applications from the main demo repository.
"""
keydname = "CN=bidule.machin.truc, OU=F-Droid"
keyaliases\['com.example.another.plugin'\] = '@com.example.another'
keyaliases['com.example.another.plugin'] = '@com.example.another'
# Wiki details
wiki\_protocol = "http"
wiki\_server = "server"
wiki\_path = "/wiki/"
wiki\_user = "login"
wiki\_password = "1234"
wiki_protocol = "http"
wiki_server = "server"
wiki_path = "/wiki/"
wiki_user = "login"
wiki_password = "1234"
update\_stats = False
update_stats = False
stats\_to\_carbon = False
carbon\_host = '0.0.0.0'
carbon\_port = 2003
stats_to_carbon = False
carbon_host = '0.0.0.0'
carbon_port = 2003
build\_server\_always = False
build_server_always = False
char\_limits = {
char_limits = {
'Summary': 50,
'Description': 1500
}
```
Les lignes 9 à 15 de cet exemple sont les plus importantes. En fait, normalement, vous n'aurez pas à modifier les autres lignes pour que le dépôt fonctionne bien.
Il vous faut ensuite copier vos APK directement dans le dossier `repo`. Ensuite, à partir du dossier du dépôt (dans notre cas `/var/apk`), effectuez la commande suivante, que vous devrez refaire après chaque ajout d'application au dépôt :
```
fdroid update --create-metadata
```
Il faut maintenant mettre en place le serveur web afin que le dépôt soit accessible depuis votre appareil par le réseau. Créez donc un _server block_ pour Nginx ressemblant à cela, dans le cas de l'utilisation de SSL/TLS, ce que je ne peux que vous recommander :
```
server{
listen 80;
listen \[::\]:80;
server\_name bidule.machin.truc;
listen [::]:80;
server_name bidule.machin.truc;
location ~ ^/.well-known/acme-challenge(/.\*)?$ {
root /etc/letsencrypt/webrootauth;
default\_type text/plain;
default_type text/plain;
}
return 301 https://$server\_name$request\_uri;
return 301 https://$server_name$request_uri;
}
server {
listen 443;
listen \[::\]:443;
server\_name bidule.machin.truc;
access\_log /var/log/nginx/fdroid.access.log;
error\_log /var/log/nginx/fdroid.error.log;
listen [::]:443;
server_name bidule.machin.truc;
access_log /var/log/nginx/fdroid.access.log;
error_log /var/log/nginx/fdroid.error.log;
ssl on;
ssl\_certificate /etc/letsencrypt/live/machin.truc/fullchain.pem;
ssl\_certificate\_key /etc/letsencrypt/live/machin.truc/privkey.pem;
ssl_certificate /etc/letsencrypt/live/machin.truc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/machin.truc/privkey.pem;
server\_name\_in\_redirect off;
server_name_in_redirect off;
root /var/apk;
location ~ ^/.well-known/acme-challenge(/.\*)?$ {
root /etc/letsencrypt/webrootauth;
default\_type text/plain;
default_type text/plain;
}
location / {
try\_files $uri $uri/ =404;
try_files $uri $uri/ =404;
}
}
```
Les lignes 1 à 9 concernent la redirection de HTTP vers HTTPS. Vous reconnaîtrez certainement aux lignes 6 à 9 et 29 à 32 les instructions qu'on a introduites pour l'automatisation des renouvellements de certificats Let's Encrypt. Si ça ne vous dit rien, vous pouvez faire une cure de rappel [par ici](/posts/securiser-ses-sites-web-avec-lets-encrypt/), c'est gratuit et ça vous met plein de belles choses dans la tête.
@ -163,9 +175,13 @@ Rechargez Nginx, puis il faut maintenant tester sur votre appareil. Dans F-Droid
Laissez mouliner quelques secondes, et paf, normalement vous avez un dépôt fonctionnel.
\[caption id="attachment\_1049" align="alignnone" width="474"\][![Screenshot_20160408-005739](%assets_url%/2016/04/Screenshot_20160408-005739-576x1024.png)](%assets_url%/2016/04/Screenshot_20160408-005739.png) Le dépôt a bien été ajouté.\[/caption\]
![Screenshot_20160408-005739](%assets_url%/2016/04/Screenshot_20160408-005739-576x1024.png)
\[caption id="attachment\_1050" align="alignnone" width="474"\][![Exemple d'app ajoutée dans mon dépôt.](%assets_url%/2016/04/Screenshot_20160408-005819-576x1024.png)](%assets_url%/2016/04/Screenshot_20160408-005819.png) Exemple d'app ajoutée dans mon dépôt.\[/caption\]
Le dépôt a bien été ajouté.
![Exemple d'app ajoutée dans mon dépôt.](%assets_url%/2016/04/Screenshot_20160408-005819-576x1024.png)
Exemple d'app ajoutée dans mon dépôt.
Une fois cette victoire confirmée, rappelez-vous le but initial de la manœuvre : avoir des applications qui se mettent à jour toutes seules comme des grandes.
@ -177,30 +193,38 @@ Pour disposer de cet outil, clonez le dépôt quelque part sur votre serveur (on
Installez le programme par la commande :
```
python setup.py install
```
Notez que vous aurez peut-être à installer au préalable l'outil de déploiement `python-setuptools` :
```
apt install python-setuptools # si vous utilisez python2
apt install python3-setuptools # si vous utilisez python3
```
Attention, si vous utilisez Python 3 (c'est toujours recommandé de l'utiliser si possible et pas trop enquiquinant), vous devez installer manuellement une dépendance par la commande :
```
pip install https://pypi.python.org/packages/source/p/protobuf/protobuf-3.0.0a3.tar.gz#md5=6674fa7452ebf066b767075db96a7ee0
```
Ensuite, copiez et renommez le fichier `config_example.py` dans un endroit adéquat (par exemple `/etc/googleplayupdater/config.py`) et modifiez-le afin qu'il ressemble à ceci :
from \_\_future\_\_ import unicode\_literals
```
from __future__ import unicode_literals
LANG = "en\_US" # can be en\_US, fr\_FR, ...
ANDROID\_ID = "votre\_identifiant\_android"
GOOGLE\_LOGIN = 'adresse@machin.truc'
GOOGLE\_PASSWORD = 'mdp\_compte\_google'
AUTH\_TOKEN = None
LANG = "en_US" # can be en_US, fr_FR, ...
ANDROID_ID = "votre_identifiant_android"
GOOGLE_LOGIN = 'adresse@machin.truc'
GOOGLE_PASSWORD = 'mdp_compte_google'
AUTH_TOKEN = None
# force the user to edit this file
if ANDROID\_ID == None or all(\[each == None for each in \[GOOGLE\_LOGIN, GOOGLE\_PASSWORD\]\]):
if ANDROID_ID == None or all([each == None for each in [GOOGLE_LOGIN, GOOGLE_PASSWORD]]):
raise Exception("config.py not updated")
```
Bien sûr, adaptez les variables `ANDROID_ID`, `GOOGLE_LOGIN` et `GOOGLE_PASSWORD` avec ce que vous avez mis dans la configuration de votre extension Firefox...
@ -210,23 +234,25 @@ Vous pouvez tester la configuration avec la commande suivante :
Si vous constatez que tout se passe bien, vous pouvez alors finaliser en créant un script cron `update_apk` que vous placerez dans `/etc/cron.daily/` contenant ce code :
```
#!/bin/bash
GPUPD=/usr/local/bin/googleplayupdater
CONFIG=/etc/googleplayupdater/config.py
REPO=/var/apk
LOG\_GPU=/var/log/gpupd.log
LOG\_FDROID=/var/log/fdroid.log
LOG_GPU=/var/log/gpupd.log
LOG_FDROID=/var/log/fdroid.log
echo -e "\\n\*\*\*\*\*\*\*\*\*\* $(date)\\n" >> $LOG\_GPU
echo -e "\n\*\*\*\*\*\*\*\*\*\* $(date)\n" >> $LOG_GPU
$GPUPD -c $CONFIG -v $REPO/repo >> $LOG\_GPU 2>&1
$GPUPD -c $CONFIG -v $REPO/repo >> $LOG_GPU 2>&1
cd $REPO
echo -e "\\n\*\*\*\*\*\*\*\*\*\* $(date)\\n" >> $LOG\_FDROID
echo -e "\n\*\*\*\*\*\*\*\*\*\* $(date)\n" >> $LOG_FDROID
fdroid update --create-metadata >> $LOG\_FDROID 2>&1
fdroid update --create-metadata >> $LOG_FDROID 2>&1
```
Ainsi, votre dépôt se mettra à jour tous les jours. Et votre appareil vous notifiera dès qu'une mise à jour sera disponible. Et vous n'avez rien de Google sur votre téléphone, c'est magnifique.

View File

@ -34,7 +34,9 @@ Les deux premières étapes sont instantanées ; cependant, la dernière étape
Let's Encrypt prends en charge ces 3 étapes (il faut reconnaitre que c'est très facile d'automatiser les 2 premières) en passant par un utilitaire chargé de communiquer avec le serveur de son autorité de certification.
\[caption id="attachment\_856" align="aligncenter" width="1771"\]![Schéma](%assets_url%/2016/01/letsencrypt.png) Processus de vérification d'identité\[/caption\]
![Schéma](%assets_url%/2016/01/letsencrypt.png)
Processus de vérification d'identité
1. Une fois la clef et la demande de certificat générées, l'exécutable local communique au serveur http un code de vérification à rendre accessible par le serveur de certification.
2. L'utilitaire demande à l'autorité de certification de procéder à une vérification d'identité en envoyant la demande de certificat et lui communique le code servi par le serveur http à tester.
@ -52,18 +54,24 @@ Tout d'abord, il faut définir le dossier qui sera mis à disposition par le ser
Vous devez ensuite modifier la configuration de chaque domaine que vous souhaitez faire certifier. Vous avez le droit à 100 domaines couverts par votre certificat, vous avez donc de la marge, et vous auriez tort de vous priver. Sous Nginx, vous devez ajouter au sein de chaque _server block_ :
location ~ ^/.well-known/acme-challenge(/.\*)?$ {
```
location ~ ^/.well-known/acme-challenge(/.*)?$ {
root /var/www/webrootauth;
default\_type text/plain;
default_type text/plain;
}
```
Sans oublier de recharger Nginx :
```
service nginx restart
```
ou bien, selon votre distribution Linux :
```
systemctl restart nginx
```
Pour information, cela demande à Nginx de servir le contenu de `/var/www/webrootauth` à l'adresse `http://example.com/.well-known/acme-challenge/`, adresse qui sela utilisée par l'autorité de certification.
@ -75,11 +83,15 @@ Il faut maintenant télécharger l'exécutable mis à disposition par Let's Encr
Devenez super-utilisateur :
```
sudo su -
```
Puis clonez le dépôt du projet :
```
git clone https://github.com/letsencrypt/letsencrypt /root/letsencrypt
```
# Configurer Let's Encrypt
@ -87,6 +99,7 @@ Il est possible d'exécuter Let's Encrypt à la sauvage sans fichier de configur
Un fichier de configuration Lets Encrypt ressemble à ceci :
```
rsa-key-size = 4096
server = https://acme-v01.api.letsencrypt.org/directory
email = votreadresse@domaine.truc
@ -96,6 +109,7 @@ text = True
renew-by-default = True
agree-tos = True
domains = hashtagueule.fr,mail.hashtagueule.fr,wiki.hashtagueule.fr,mysql.hashtagueule.fr,znc.hashtagueule.fr,ttrss.hashtagueule.fr
```
Petite explication :
@ -115,7 +129,9 @@ Vous placerez ce fichier quelque part d'accessible. Par exemple, vous pouvez le
Tout est en place pour la génération de votre premier certificat, la tension monte, je vous sens tout excité. Allez, lancez-vous, en voiture Simone. Pour générer votre certificat, en tant que super-utilisateur, exécutez la commande suivante :
```
/root/letsencrypt/letsencrypt-auto certonly --config /root/le-config/cli.ini
```
Laissez mijoter quelques instants. La première fois, des dépendances nécessaires vont s'installer, il va configurer deux trois trucs, et finalement faire le boulot.
@ -123,11 +139,13 @@ Normalement, à la fin, vous allez avoir un message vous félicitant du succès
Vous pourrez ensuite configurer votre serveur web pour utiliser ce certificat. Sous Nginx, vous préciserez dans vos _server blocks_ :
```
listen 443;
listen \[::\]:443;
listen [::]:443;
ssl on;
ssl\_certificate /etc/letsencrypt/live/hashtagueule.fr/fullchain.pem;
ssl\_certificate\_key /etc/letsencrypt/live/hashtagueule.fr/privkey.pem;
ssl_certificate /etc/letsencrypt/live/hashtagueule.fr/fullchain.pem;
ssl_certificate\_key /etc/letsencrypt/live/hashtagueule.fr/privkey.pem;
```
Bien sûr, vous remplacerez _hashtagueule.fr_ par le nom de votre domaine principal. Vérifiez en regardant le nom du dossier à cet emplacement.
@ -139,9 +157,10 @@ Les certificats générés par Let's Encrypt ont une validité de 90 jours. C'es
Cron est un service sur votre machine qui va se charger d'exécuter des tâches à intervalle régulier. Tous ce que vous avez à faire, c'est d'écrire un script à fournir à cron. Ce script ressemblera à ça :
```
#!/bin/bash
la\_cert\_dir=/etc/letsencrypt/live/hashtagueule.fr
la_cert_dir=/etc/letsencrypt/live/hashtagueule.fr
/root/letsencrypt/letsencrypt-auto certonly --config /root/le-config/cli.ini 1> /dev/null
@ -157,7 +176,7 @@ Bonjour,
Le certificat des services Hashtagueule a été renouvelé et couvre actuellement les domaines suivants :
$(openssl x509 -in /etc/letsencrypt/live/hashtagueule.fr/cert.pem -noout -text | grep DNS | sed 's/, /\\n/g' | cut -d: -f2)
$(openssl x509 -in /etc/letsencrypt/live/hashtagueule.fr/cert.pem -noout -text | grep DNS | sed 's/, /\n/g' | cut -d: -f2)
Dates de validité :
@ -168,6 +187,7 @@ Il est à noter également que l'autorité Let's Encrypt ne délivre qu'un maxim
Bonne journée.
EOF
```
Ce script va renouveler le certificat et vous envoyer un mail de notification comportant les nouvelles dates de validité et les domaines concernés. Classe, non ?

View File

@ -22,11 +22,15 @@ C'est ce qu'on va faire dans la suite.
Eh bien il y a un super logiciel libre (en GPLv2 pour la majorité des sources) qui fait tout ça très bien : il s'agit de [Wireshark](http://wireshark.org). Si vous êtes sous Debian/Ubuntu, vous pouvez l'installer à l'aide de la commande :
```
sudo apt install wireshark tcpdump
```
ou
```
sudo apt-get install wireshark tcpdump
```
si votre Debian/Ubuntu n'est pas récente. Sur une distribution type CentOS/Fedora/Red Hat il faut utiliser `yum`. Vous pouvez aussi récupérer les sources et les recompiler.
@ -34,7 +38,9 @@ Je vous ai aussi fait installer tcpdump. Il aurait été installé quand même p
Lorsque vous le lancez, il ressemble à peu près à ça :
\[caption id="attachment\_798" align="alignnone" width="474"\][![wireshark_dark](%assets_url%/2015/11/wireshark_d-1024x711.png)](%assets_url%/2015/11/wireshark_d.png) Wireshark thème dark sous Debian GNU/Linux 8, machine de test\[/caption\]
![wireshark_dark](%assets_url%/2015/11/wireshark_d-1024x711.png)
Wireshark thème dark sous Debian GNU/Linux 8, machine de test
Notez que les utilisateurs de Microsoft© Windows® peuvent aussi utiliser Wireshark, mais une partie de ce qui suit est pour les linuxiens.
@ -48,7 +54,9 @@ Là on va aller à la limite de ma connaissance du noyau linux (aussi appelé ke
Normalement vous avez installé les commandes `getcap` et `setcap` que `root` peut utiliser. Elles se trouvent dans le paquet `libpcap2-bin`, comme en témoigne la commande :
```
dpkg -S getcap
```
qui permet de chercher dans quel paquet se trouve la commande `getcap`.
@ -58,20 +66,24 @@ Donc les commandes `getcap` et `setcap` permettent respectivement de voir et mod
Je suppose que vous êtes devenu `root`, soit avec la commande `su`, si vous connaissez la phrase de passe `root`, soit avec `sudo su` et votre phrase de passe, si vous êtes un sudoer. Voilà les fameuses commandes tant attendues :
```
getcap /usr/sbin/tcpdump
```
permet de voir les capacités du binaire `tcpdump` qui est dans `/usr/sbin/`.
Le binaire tcpdump a besoin des capacités suivantes pour fonctionner en utilisateur simple :
setcap cap\_net\_admin,cap\_net\_raw+eip /usr/sbin/tcpdump
```
setcap cap_net_admin,cap_net_raw+eip /usr/sbin/tcpdump
```
Voilà, le binaire a les bonnes capacités.
Pour deux types de capacités :
- cap\_net\_admin
- cap\_net\_raw
- cap_net_admin
- cap_net_raw
on a donné les attributs suivants :
@ -89,21 +101,29 @@ Le binaire `tcpdump` est dans `/usr/sbin` et c'est normal, puisqu'il ne devrait
Pour pouvoir lancer le binaire, il faut pouvoir l'exécuter. `tcpdump` appartient à `root:root`, et a les droits UNIX suivants : `-rwxr-xr-x` ce qui veut dire que n'importe qui peut faire de la capture réseau ! Eh oui, il est exécutable par `o=other`. Changeons ça immédiatement à l'aide de la commande :
```
chmod 754 /usr/sbin/tcpdump
```
Donc `root` peut lire-écrire-exécuter le binaire, les personnes dans le groupe `root` peuvent lire-exécuter le binaire, et les autres peuvent seulement le lire.
Personnellement, je n'aime pas mettre des gens dans le groupe `root`, donc on va en créer un autre, qu'on va appeler `wireshark` :
```
addgroup wireshark
```
Supposons que l'utilisateur qui va utiliser Wireshark/`tcpdump` ait le login UNIX `toto`. La commande
```
usermod -aG wireshark toto
```
permet de mettre `toto` dans le groupe `wireshark` et
```
chown root:wireshark /usr/sbin/tcpdump
```
pour mettre `tcpdump` dans le groupe `wireshark`.
@ -113,54 +133,65 @@ Maintenant seul les membres du groupe `wireshark` (dont `toto`), et `root` peuve
Le problème c'est que l'exécutable `tcpdump` est dans `/usr/sbin`, qui n'est pas dans le PATH de l'utilisateur `toto`. Il y a donc deux options, une mauvase et une bonne. La mauvaise, c'est de rajouter `/usr/sbin` au PATH de `toto`. La bonne, c'est de faire un lien symbolique de l'exécutable tcpdump vers `/usr/local/bin` à l'aide de la commande :
```
ln -s /usr/sbin/tcpdump /usr/local/bin/
```
Ça n'est pas un problème en terme de sécurité puisqu'on s'est assurés que seuls les membres du groupe `wireshark` pouvaient exécuter `tcpdump`. Ça y est. `toto` peut utiliser `tcpdump`. À partir de maintenant, les commmandes ne sont plus exécutées en tant que `root`. Vous pouvez soit faire une capture simple que vous lisez avec un éditeur de texte (pas un traitement de texte !), l'avantage, c'est de pouvoir travailler sur des fichiers distants, l'inconvénient, c'est que vous ne pourrez pas utiliser Wireshark pour les visualiser. Utiliser la commande :
```
tcpdump -i wlan0
```
si wlan0 est l'interface sur laquelle vous voulez capturer des paquets. Il s'agit chez moi de mon interface Wi-Fi. L'interface ethernet s'appelle souvent eth0. Utiliser **Contrôle-C** pour arrêter la capture. vous pouvez rediriger ça vers un ficher ainsi :
tcpdump -i lo > ./mes\_paquets\_captures
```
tcpdump -i lo > ./mes_paquets_captures
```
(interface loopback, ici). Sinon utilisez la commande :
tcpdump -i eth0 -w ./mes\_paquets\_capturés
```
tcpdump -i eth0 -w ./mes_paquets_capturés
```
pour capturer les paquets dans un format lisible pour Wireshark. Lancer **Contrôle-C** pour arrêter la capture.
Vos captures devraient ressembler à ceci :
\[caption id="attachment\_799" align="alignnone" width="1016"\][![tcpdump](%assets_url%/2015/11/tcpdump.png)](%assets_url%/2015/11/tcpdump.png) Capture réseau avec tcpdump, machine de test.\[/caption\]
![tcpdump](%assets_url%/2015/11/tcpdump.png)
Capture réseau avec tcpdump, machine de test.
Puis il vous suffit de lancer Wireshark, et d'ouvrir le fichier de capture (raccourci Contrôle-O).
Enfin les paquets vus avec Wireshark ressemblent à ça :
\[caption id="attachment\_800" align="alignnone" width="474"\][![wireshark](%assets_url%/2015/11/wireshark-1024x742.png)](%assets_url%/2015/11/wireshark.png) Paquets capturés avec tcpdump, puis chargés sous Wireshark. machine de test.\[/caption\]
![wireshark](%assets_url%/2015/11/wireshark-1024x742.png)
Paquets capturés avec tcpdump, puis chargés sous Wireshark. machine de test.
# Le script !
Alors. Puisque vous avez été sages, je veux bien. Mais c'est vraiment pas grand chose. Je le mets là parce que j'ai ça dans mon `/root/` pour rapidement permettre la capture puis la retirer :
Le script pour permettre la capture :
`enable_tcpdump.sh`
Le script pour permettre la capture : `enable_tcpdump.sh`
```
#!/bin/bash
/sbin/setcap cap\_net\_admin,cap\_net\_raw+eip /usr/sbin/tcpdump
/sbin/setcap cap_net_admin,cap_net_raw+eip /usr/sbin/tcpdump
```
Le script pour l'empêcher :
`disable_tcpdump.sh`
Le script pour l'empêcher : `disable_tcpdump.sh`
```
#!/bin/bash
/sbin/setcap -r /usr/sbin/tcpdump
```
Le script qui paramètre tout pour vous (à ne lancer qu'une fois, en tant que `root`) :
`setup_tcpdump.sh`
Le script qui paramètre tout pour vous (à ne lancer qu'une fois, en tant que `root`) : `setup_tcpdump.sh`
```
#!/bin/bash
/usr/sbin/adduser toto
/usr/sbin/addgroup wireshark
@ -168,12 +199,15 @@ Le script qui paramètre tout pour vous (à ne lancer qu'une fois, en tant que `
/bin/chmod 754 /usr/sbin/tcpdump
/bin/ln -s /usr/sbin/tcpdump /usr/local/bin/
/bin/chown root:wireshark /usr/sbin/tcpdump
```
Voilà. L'utilisateur `toto` (ou autre, si vous avez changé le script) peut facilement intercepter le trafic sur le réseau, à l'aide des deux scripts `setup_tcpdump.sh` et `enable_tcpdump.sh`.
Je ferai peut-être une suite où l'on étudiera plus avant les fonctionnalités de Wireshark plutôt que la seule mise en place de l'écoute réseau, en attendant bonne écoute !
\[caption id="attachment\_802" align="alignnone" width="594"\][![NSA_PR](%assets_url%/2015/11/NSA_PR.png)](%assets_url%/2015/11/NSA_PR.png) Touitte de NSA\_PR, 22 juillet 2014 ;)\[/caption\]
![NSA_PR](%assets_url%/2015/11/NSA_PR.png)
Touitte de NSA_PR, 22 juillet 2014 ;)
Sur ce petit troll de la NSA, je vous quitte !

View File

@ -10,9 +10,11 @@ Vous le saviez, vous qui êtes en grande partie fans de la saga _Star Wars_, que
En effet, Disney a annoncé ce week-end lors du salon D23 en Californie la création d'une zone entièrement dédiée à _Star Wars_, non pas dans un de ses parcs d'attraction, mais dans deux de ses parcs, en Californie et en Floride.
[![Aperçu de la zone Star Wars](http://hashtagueule.fr/wp-content/uploads/2015/08/star-wars-parc.jpg)](http://hashtagueule.fr/wp-content/uploads/2015/08/star-wars-parc.jpg)
![Aperçu de la zone Star Wars](http://hashtagueule.fr/wp-content/uploads/2015/08/star-wars-parc.jpg)
\[caption id="attachment\_188" align="alignnone" width="1140"\][![Aperçu de la zone Star Wars](http://hashtagueule.fr/wp-content/uploads/2015/08/star-wars-parc-3.jpg)](http://hashtagueule.fr/wp-content/uploads/2015/08/star-wars-parc-3.jpg) Crédits : Disney Parks\[/caption\]
![Aperçu de la zone Star Wars](http://hashtagueule.fr/wp-content/uploads/2015/08/star-wars-parc-3.jpg)
Crédits : Disney Parks
Personnellement, je n'ai pas beaucoup approuvé le rachat de _Star Wars_ par Disney, mais d'un autre côté je ne pourrai pas m'empêcher d'aller voir le film, quitte à sortir en hurlant de rage. Ah ils sont forts chez Disney, les gredins. C'est plus fort que moi, _Star Wars_ représente tellement pour moi, et comme avec toutes les choses qui nous sont très chères, si on a pu goûter aux merveilles de cet univers, il faut savoir également endurer les moment les plus pénibles, car il s'agit d'un moment affreux pour _Star Wars_ à n'en point douter.

View File

@ -26,13 +26,17 @@ Comme je l'ai dit, Tor-messenger est un nouveau client XMPP (entre autres, il pe
Voici une capture d'écran de mon utilisation de Tor-messenger (XMPP + IRC) :
\[caption id="attachment\_746" align="alignnone" width="474"\][![tor-messenger](%assets_url%/2015/11/tor-messenger-745x1024.png)](%assets_url%/2015/11/tor-messenger.png) Tor-messenger : ajout de compte, fenêtre de contacts, fenêtre de clavardage, cliquez pour agrandir.\[/caption\]
![tor-messenger](%assets_url%/2015/11/tor-messenger-745x1024.png)
Tor-messenger : ajout de compte, fenêtre de contacts, fenêtre de clavardage, cliquez pour agrandir.
Le gros avantage, c'est que sous GNU/Linux, il n'est pas nécessaire d'installer Tor-messenger, il suffit de décompresser la tarball avec :
$ tar xvfJ tor-messenger-linux\*\_en-US.tar.xz
```
tar xvfJ tor-messenger-linux\*\_en-US.tar.xz
```
et exécuter le script start-tor-messenger ou start-tor-messenger.desktop (pas exécuté dans un terminal, le second) dans le répertoire Messenger.
et exécuter le script `start-tor-messenger` ou `start-tor-messenger.desktop` (pas exécuté dans un terminal, le second) dans le répertoire Messenger.
# Ce qui change
@ -41,11 +45,11 @@ En en parlant autour de moi, j'ai eu des réactions comme :
- Ça change tout !
- Mais qu'est-ce que ça change ?
##### Pour tout le monde, sur les grandes plateformes du web
## Pour tout le monde, sur les grandes plateformes du web
Eh bien voyons cela. A priori ça ne change pas grand chose, puisque lorsque vous parlez à votre réseau de connaissances sur Facebook ou Google, fondamentalement, vous êtes toujours connecté à votre compte, et il y a toujours les logs. Ce qui change, c'est que passer par Tor empêche à la plateforme que vous utilisez sache où vous vous trouvez.
##### Ce qui pourrait changer à long terme
## Ce qui pourrait changer à long terme
Ce que je vais écrire est complètement spéculatif, et un petit peu optimiste, mais bon, allons-y. Il est possible que la nouvelle génération vive avec deux types d'identités :
@ -60,7 +64,7 @@ Lorsqu'une personne s'inscrit sur Facebook, elle va presque automatiquement fair
Prendre l'habitude de toujours utiliser une multitude de pseudos sur internet amenuise le ciblage publicitaire, le tracking, le profilage, etc.
##### Ce qui change beaucoup, maintenant
## Ce qui change beaucoup, maintenant
Pour ceux qui utilisent régulièrement leur propre serveur XMPP décentralisé, ça permet en plus d'anonymiser leurs connexions.

View File

@ -20,11 +20,15 @@ Ce tutoriel va référencer des tags du dépôt git [à cette adresse](https://g
Je vous conseille donc de cloner le dépôt ci-dessus :
```
git clone https://git.hashtagueule.fr/motius/django-tutorial.git
```
et de suivre les tags que j'ai indiqués au fur et à mesure de l'avancement du tutoriel grâce à la commande :
```
git checkout <tagname>
```
Je préfixe les noms de tous les tags git de ce tutoriel par un `"_"`, afin que ceux-ci ne polluent pas le projet si vous en réutilisez le dépôt git par la suite (`git tag` admet l'option `-d` pour ceux qui veulent vraiment se débarasser de mes tags).
@ -38,48 +42,56 @@ Commençons en douceur avec Flask.
Je vais me faire battre, je vais parler de Flask alors que je l'ai utilisé en tout et pour tout 7 minutes 24 secondes dans ma courte vie.
##### Installation
## Installation
Prenons l'exemple le plus basique avec Flask. La documentation du projet [se trouve ici](http://flask.pocoo.org/).
Elle indique qu'il suffit de taper la commande suivante pour installer Flask :
```
pip3 install --user Flask
```
##### Le projet fil d'ariane
Si vous avez suivi l'étape précédente, vous savez qu'il faut revenir à la version du tag `"_v0_flask"` comme ceci :
git checkout \_v0\_flask
```
git checkout _v0_flask
```
pour cette partie du tutoriel. Vous pouvez alors faire tourner le serveur de test à l'aide de la commande :
```
make
```
Je vais faire une utilisation intensive des Makefiles, que j'affectionne, mais je vous encourage à les parcourir pour voir ce qu'ils exécutent.
Ici, la commande est simplement :
python3 ma\_flasque.py
```
python3 ma_flasque.py
```
Vous pouvez alors vous rendre à l'url suivante :
Vous pouvez alors vous rendre à l'url suivante : `http://localhost:5000` dans mon cas.
`http://localhost:5000`
dans mon cas.
##### Le pourquoi du comment
## Le pourquoi du comment
La partie intéressante que je voulais mettre en avant avec cet exemple concerne la structure du code Flask : j'ai divisé le source en trois parties, les imports, les routes Flask, et le code pour faire tourner l'application. La deuxième partie concernant les routes et le code métier est celle qui nous intéresse.
Les routes sont indiquées par un :
@app.route('/', methods=\["GET"\])
```
@app.route('/', methods=["GET"])
```
tandis que le code à exécuter dans le cas où l'utilisateur demande (`'GET'`) la page par défaut de l'application (`'/'`) se situe dans le code de la fonction Python `index`, qui dans notre cas retourne la chaîne de caractères `"Hello World!"` (tradition oblige) :
```
def index():
return "Hello World!"
```
Ainsi, Flask pose les bases de la programmation avec [le motif MVC](https://fr.wikipedia.org/wiki/Mod%C3%A8le-vue-contr%C3%B4leur), que Django utilise : on décrit de manière séparée le code de routage des URL et le code permettant d'obtenir le résultat demandé.
@ -89,36 +101,44 @@ Il va falloir un peu de travail pour arriver au même résultat avec Django, mai
Django va un peu plus loin car il permet de s'interfacer très facilement avec une base de données et en propose une abstraction très propre, il possède un moteur de template pour prémâcher du HTML, permet d'installer des modules, mais tout ça viendra plus tard, je vous mets l'eau à la bouche...
\[caption id="attachment\_1368" align="alignnone" width="768"\][![gâteau au chocolat](%assets_url%/2017/09/Gâteau-au-chocolat.jpg)](%assets_url%/2017/09/Gâteau-au-chocolat.jpg) Un gâteau au chocolat pour vous mettre l'eau à la bouche si ma description des fonctionnalités de Django n'a pas suffi.\[/caption\]
![gâteau au chocolat](%assets_url%/2017/09/Gâteau-au-chocolat.jpg)
Un gâteau au chocolat pour vous mettre l'eau à la bouche si ma description des fonctionnalités de Django n'a pas suffi.
# Même résultat avec Django
##### Installation
## Installation
La [page de téléchargement de Django](https://www.djangoproject.com/download/) indique, à l'heure actuelle, qu'il suffit de taper la commande suivante pour installer la dernière version de Django :
```
pip3 install Django==1.11.5
```
Si vous utilisez Django de manière professionnelle ou amateure, il faut consulter la page de téléchargement pour mettre à jour la version de Django utilisée.
Vous pouvez aussi installer la version de votre distribution, par exemple à l'aide de
```
su -c 'apt-get install python3-django'
```
si vous utilisez une debian ou dérivée (Ubuntu, Mint...)
On utilisera Django dans un `virtualenv` Python pour ce projet.
##### Virtualenv
## Virtualenv
Python est un langage de programmation modulaire dont le cœur des fonctionnalités est assez réduit, mais qui reste très puissant grâce au grand écosystème disponible de bibliothèques logicielles, officielles ou tierces.
Celles-ci peuvent être importées dans un script par une primitive import du type :
```
import os, sys
import re
import numpy as np
from django.http import HttpResponse
```
etc.
@ -128,13 +148,17 @@ On utilisera donc les virtualenv pour des questions de facilité, et parce qu'il
Vous pouvez installer virtualenv à l'aide de la commande :
```
sudo apt-get install python3-virtualenv
```
ou en tapant :
```
pip3 install --user virtualenv
```
##### Premier projet Django dans un Virtualenv
## Premier projet Django dans un Virtualenv
La version `"_v1_django"` permet d'installer Django dans un virtualenv Python. Si vous avez installé Django et Virtualenv comme indiqué précédemment, l'installation devrait se faire sans retélécharger des bibliothèques Python depuis internet.
@ -142,7 +166,9 @@ Elle suppose que vous installez toutes les bibliothèques avec `pip`, si ce n'é
Pour installer le virtualenv, Django, créer un projet et une application, tapez simplement la commande :
```
make
```
Pour l'**arrêter**, tapez la combinaison de touches `CTRL-C`.
@ -157,11 +183,11 @@ Détaillons les étapes du Makefile :
Vous remarquerez que chacune des étapes ne modifie que le répertoire d'installation situé à l'intérieur du répertoire git, jamais des bibliothèques système.
##### Utilisation de Django
## Utilisation de Django
Jusqu'ici, on n'a toujours pas écrit de code correspondant à notre application, seulement décrit une manière générale d'obtenir un projet Django d'équerre pour commencer. Il reste quelques étapes à connaître pour avancer dans le développement d'applications web avec Django sans que celui-ci se mette en travers de notre chemin.
##### Migrations
## Migrations
Lors de la création d'un projet Django, certaines applications sont installées pour nous, par exemple l'interface d'administration. Celle-ci n'est pas migrée, opération qu'il faut réaliser pour pouvoir l'utiliser.
@ -173,7 +199,9 @@ Obtenez le code de la version `_v2_migration` du projet git pour pouvoir migrer
La commande :
```
make
```
permet d'effectuer toutes les étapes décrites jusqu'ici :
@ -183,26 +211,25 @@ permet d'effectuer toutes les étapes décrites jusqu'ici :
- migrations du projet et de l'application ;
- lancement du serveur de développement.
Rendez-vous  à l'URL suivante pour la page par défaut de Django :
Rendez-vous  à l'URL suivante pour la page par défaut de Django : `http://localhost:8000`
`http://localhost:8000`
##### Organisation du dépôt
## Organisation du dépôt
Le dépôt est organisé de la manière suivante :
```
.
+-- doc
│   \\-- README.md
│   \-- README.md
+-- exec\_django.sh
+-- LICENSE
+-- Makefile
+-- mon\_django
│   +-- Makefile
│   +-- mon\_app
│   \\-- mon\_django
│   \-- mon\_django
+-- README.md
\\-- sandbox
\-- sandbox
+-- bin
+-- db.sqlite3
+-- include
@ -213,7 +240,8 @@ Le dépôt est organisé de la manière suivante :
+-- mon\_django -> ../mon\_django/mon\_django
+-- pip-selfcheck.json
+-- static
\\-- templates -> ../mon\_django/templates
\-- templates -> ../mon\_django/templates
```
- les sources sont dans le répertoire mon\_django (nom du projet) ;
- la production est dans le répertoire sandbox ;
@ -236,7 +264,7 @@ Cette organisation a pour but de **simplifier** le développement :
Ça y est, on a enfin tout un environnement prêt pour le développement. Vous allez me dire "était-ce bien la peine de faire tout ça pour en arriver au même point ?" Je crois que oui.
##### Avantages de Django
## Avantages de Django
Pour plusieurs raisons :
@ -248,7 +276,7 @@ Pour plusieurs raisons :
Je ne détaille pas les inconvénients de Django, il y en a un principal selon moi, la relative difficulté de le mettre en place, ce qui est fait par le système de construction logicielle avec Makefile.
##### Comprendre le code de Django en comparaison avec celui de Flask
## Comprendre le code de Django en comparaison avec celui de Flask
Django fonctionne fondamentalement de la même manière que Flask pour le routage, mais il sépare les vues et le contrôleur :
@ -263,23 +291,29 @@ Django fonctionne fondamentalement de la même manière que Flask pour le routag
Maintenant que vous avez vu l'installation de Django en virtualenv Python, ainsi que la théorie sur la manière dont il faut organiser le code Python, allons voir quelques exemples simples.
##### Hello World!
## Hello World!
Obtenez la version `_v3_application` du dépôt. Elle contient un simple "Hello World!" si le client demande la page `http://localhost:8000/`, et une simple indication "Not found" pour toutes les autres pages. Comme pour chanque étape de ce tutoriel, la commande :
```
make
```
permet de faire le café (enfin presque). Par rapport à l'étape précédente, on dispose désormais d'une application Django dont le code Python est importé.
\[caption id="attachment\_1386" align="alignnone" width="1335"\][![café au lait](%assets_url%/2017/09/cafe.jpg)](%assets_url%/2017/09/cafe.jpg) Le café au lait que mon ordinateur ne sait toujours pas faire... Ça viendra.\[/caption\]
![café au lait](%assets_url%/2017/09/cafe.jpg)
Le café au lait que mon ordinateur ne sait toujours pas faire... Ça viendra.
En lisant le code,on s'aperçoit que son organisation est similaire à celle de Flask : d'un côté on route les urls, on utilise un ou plusieurs fichiers `urls.py` pour ce faire, et dans les vues du fichier `views.py` de chaque application du projet, on peut écrire le code à exécuter pour chaque requête.
urlpatterns = \[
```
urlpatterns = [
url('^$', views.index),
url(r'^admin/', admin.site.urls),
url('^.\*', appviews.p404),
\]
url('^.*', appviews.p404),
]
```
Le routage des URL du projet (et de chacune des applications) est défini à l'aide de [regex](https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re) [Python](https://docs.python.org/fr/3.5/howto/regex.html). Je fait correspondre les URL suivantes :
@ -288,8 +322,10 @@ Le routage des URL du projet (et de chacune des applications) est défini à l'a
au code ci-dessous :
```
def index(request):
return HttpResponse("Hello World!")
```
à l'aide de la première règle de routage.
@ -297,20 +333,22 @@ La [page suivante](https://docs.djangoproject.com/fr/stable/topics/http/urls/#na
Je ne vous ai pas promis la lune mais presque, allons plus loin dans les fonctionnalités qui sont un des grands avantages de Django.
##### Mon premier gabarit
## Mon premier gabarit
La version `_v4_template` permet d'utiliser les templates de Django. Je n'en fait qu'un usage très limité, je me limite à indiquer à Django où il doit aller chercher les fichiers de template correspondant au code HTML/CSS/JavaScript, servis par le serveur de développement, mais ce moteur de gabarits possède de nombreuses fonctionnalités, comme les variables, les tags, des boucles, des conditions...
La page accessible à l'URL par défaut `http://localhost:8000/` affiche le code du template `index.html` :
```
def index(request):
return render(request, "index.html", {})
```
J'ai rajouté de manière explicite un paramètre optionnel : le dictionnaire vide `{}`. Il sert à préciser des variables Python à transmettre au moteur de gabarits.
Toutes les autres requêtes redirigent vers la page 404.
##### Un accès à la base de données
## Un accès à la base de données
Une grande quantité d'applications web nécessite une base de données. Django propose un moyen simple pour s'interfacer avec une base de données sans nécessairement en connaître les subtilités, fournit des garanties qui permettent éventuellement de changer de moteur de base de données, et permet au développeur de manipuler les objets en base facilement.
@ -328,11 +366,11 @@ La version `_v5_bdd` présente un exemple simple d'utilisation d'une base de don
Si vous vous demandez pourquoi l'exemple marche bien que tous les objets aient le même nom et la même valeur de booléen, c'est parce qu'ils se voient attribuer un identifiant entier automatique croissant si on ne définit pas d'attribut ayant une clef primaire, cf. la [documentation](https://docs.djangoproject.com/fr/stable/topics/db/models/#automatic-primary-key-fields).
##### Découpage en modules
## Découpage en modules
Vous remarquerez l'utilisation de la primitive Django `include` dans le code, par rapport à la version `_v4_template`, qui permet de découper le routage vers les URL d'une application.
##### Utilisation d'un constructeur personnalisé
## Utilisation d'un constructeur personnalisé
Django utilise la fonction `__init__` qui sert à construire des objets Python. La [documentation](https://docs.djangoproject.com/fr/stable/ref/models/instances/#creating-objects) explique comment attacher un constructeur aux objets sérialisés en base de données, plutôt que de recourir à une méthode `build` comme je m'y suis pris dans l'exemple `_v5_bdd`. L'exemple se trouve dans le code de la version  `_v6_constructeur`.
@ -342,7 +380,7 @@ Je ferai peut-être une suite à ce tutoriel Django. Dans tous les cas, sachez q
> "(notre métier est le développement denvironnements Web, pas de serveurs Web)."
##### Mise en production
## Mise en production
D'**autres éléments sont à considérer** durant et après la phase de développement :
@ -352,13 +390,13 @@ D'**autres éléments sont à considérer** durant et après la phase de dévelo
Il s'agit d'un travail d'administration système indispensable. À ce travail s'ajoute éventuellement celui de développer une interface web ou autres, si besoin est.
##### Modules
## Modules
Je n'ai pas parlé des modules de Django. Dans la version `_v4_bdd`, on utilise la fonction Django `render`, qui permet de retourner une chaîne de caractères en temps que réponse HTTP. Cela diffère de Flask, qui permet de simplement retourner une chaîne de caractères. L'explication tient au fait que Django utilise l'objet request pour le passer aux modules Django, dans la fonction render.
Si vous êtes intéressés par le sujet, je vous conseille [cette page](https://docs.djangoproject.com/en/stable/topics/http/middleware/), qui décrit les interactions possibles sur une requête, ainsi que la base de leur fonctionnement.
##### Réutilisation
## Réutilisation
Voilà un bon début de projet Django. Pour le réutiliser, n'oubliez pas :
@ -367,15 +405,21 @@ Voilà un bon début de projet Django. Pour le réutiliser, n'oubliez pas :
Vous pouvez également créer un répertoire `git` de zéro à partir d'un des tags du dépôt exemple. Pour cela, obtenez les sources du dépôt au tag que vous souhaitez :
```
git checkout <tagname>
```
Puis supprimez le dépôt git sans toucher au fichiers existant en enlevant l'arborescence sous le répertoire .git :
```
rm -rf ./.git
```
Enfin, créez un nouveau dépôt :
```
git init
```
Vous pouvez aussi garder le dépôt `git` en l'état, le script `del_tags.sh` permet de supprimer les tags commençant par `"_"`.
@ -408,6 +452,4 @@ Bonne journée et bon développement Python/Django !
_Motius_
 
PS : après avoir commencé cet article, je suis tombé sur [celui-ci](http://stackabuse.com/flask-vs-django/), en anglais. Je tiens à le mentionner car la majorité des articles Flask vs Django sont théoriques (souvent des descriptions fonctionnelles, assez intéressantes pour se familiariser rapidement avec les deux projets), mais je n'avais pas vu (ni vraiment cherché) d'article les comparant en mettant la main dans le code.