PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Influence PC : Montage Plug-and-Play des clés USB sous Debian sans interface graphique

mercredi 22 mars 2017 à 22:00

À la suite de l’article précédent, vous avez peut être choisi d’installer Debian en mode serveur sans interface graphique et de lancer Kodi au démarrage de la machine (encore une fois, un tutoriel sortira bientôt à ce sujet).

Néanmoins vous aurez besoin d’accéder au contenu d’une clé USB dès son branchement à un port USB. Et vous allez être très déçu d’apprendre que nativement sous Linux, les clés USB ne sont pas Plug-and-Play, le montage d’une partition est exclusivement manuel, via /etc/fstab ou via la commande mount.

La raison est toute simple : Linux laisse l’utilisateur libre de choisir les options de montage. Le Plug-and-Play est intégré à plus haut niveau, par les environnements tels que Unity, KDE ou Gnome.

Quand on n’a pas d’environnement de bureau, on doit recourir à un script écoutant les évènements de connexion des périphériques USB et réalisant le montage automatiquement. J’en ai justement trouvé un sur serverfault proposé par Mike Blackwell.

On va créer un fichier /usr/local/bin/usb-mount.sh et lui mettre les droits d’exécution :

#!/bin/bash

# This script is called from our systemd unit file to mount or unmount
# a USB drive.

usage()
{
    echo "Usage: $0 {add|remove} device_name (e.g. sdb1)"
    exit 1
}

if [[ $# -ne 2 ]]; then
    usage
fi

ACTION=$1
DEVBASE=$2
DEVICE="/dev/${DEVBASE}"

# See if this drive is already mounted, and if so where
MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')

do_mount()
{
    if [[ -n ${MOUNT_POINT} ]]; then
        echo "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}"
        exit 1
    fi

    # Get info for this drive: $ID_FS_LABEL, $ID_FS_UUID, and $ID_FS_TYPE
    eval $(/sbin/blkid -o udev ${DEVICE})

    # Figure out a mount point to use
    LABEL=${ID_FS_LABEL}
    if /bin/grep -q " /media/${LABEL} " /etc/mtab; then
        # Already in use, make a unique one
        LABEL+="-${DEVBASE}"
    fi
    MOUNT_POINT="/media/${LABEL}"

    echo "Mount point: ${MOUNT_POINT}"

    /bin/mkdir -p ${MOUNT_POINT}

    # Global mount options
    OPTS="rw,relatime"

    # File system type specific mount options
    if [[ ${ID_FS_TYPE} == "vfat" ]]; then
        OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
    fi

    if ! /bin/mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then
        echo "Error mounting ${DEVICE} (status = $?)"
        /bin/rmdir ${MOUNT_POINT}
        exit 1
    fi

    echo "**** Mounted ${DEVICE} at ${MOUNT_POINT} ****"
}

do_unmount()
{
    if [[ -z ${MOUNT_POINT} ]]; then
        echo "Warning: ${DEVICE} is not mounted"
    else
        /bin/umount -l ${DEVICE}
        echo "**** Unmounted ${DEVICE}"
    fi

    # Delete all empty dirs in /media that aren't being used as mount
    # points. This is kind of overkill, but if the drive was unmounted
    # prior to removal we no longer know its mount point, and we don't
    # want to leave it orphaned...
    for f in /media/* ; do
        if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then
            if ! /bin/grep -q " $f " /etc/mtab; then
                echo "**** Removing mount point $f"
                /bin/rmdir "$f"
            fi
        fi
    done
}

case "${ACTION}" in
    add)
        do_mount
        ;;
    remove)
        do_unmount
        ;;
    *)
        usage
        ;;
esac

Puis on créé un fichier /etc/systemd/system/usb-mount@.service pour le service systemd :

[Unit]
Description=Mount USB Drive on %i
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/usb-mount.sh add %i
ExecStop=/usr/local/bin/usb-mount.sh remove %i

On fini en ajoutant des règles au fichier /etc/udev/rules.d/99-local.rules surveillant les évènements de connexion/déconnexion de clés :

KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service"
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"

Ce script n’est pas parfait, son comportement devient même assez étrange si la partition d’une clé USB n’a pas de nom et qu’on en branche une seconde : les dossiers se mélangent. Arrangez vous pour toujours nommer vos clés, ou proposez moi une correction du script ci-dessus 🙂

Gravatar de Influence PC
Original post of Influence PC.Votez pour ce billet sur Planet Libre.

Full Circle Magazine FR : Et voici le numéro 118

mercredi 22 mars 2017 à 18:17

Bonjour !

L'équipe du FCMfr est, comme toujours, heureuse de vous présenter le dernier numéro, celui de février 2017, en français. Vous le trouverez sur notre page NUMÉROS ou en cliquant directement sur la photo ci-dessus :

Issue118.png

Ce mois-ci, outre les rubriques et tutoriels habituels, une série au sujet de la programmation pour Ubuntu Touch débute. En fait, il s'agit d'un cours participatif - une sorte de séminaire - créé suite à la pénurie d'applis pour Ubuntu Touch. L'auteur pense que l'échec relatif du téléphone Ubuntu, par exemple, peut être dû à ce manque. Par conséquent, il voudrait que tout le monde se mette à créer des programmes pour Ubuntu Touch et donne, dans cette première partie de la série, une introduction à son cours. Tout est gratuit, y compris le PDF qui est téléchargeable, et tout peut évoluer selon la contribution de chacun (questions, suggestions, etc.). Une excellente initiative...

Vous y trouverez aussi, notamment :

Nous vous en souhaitons bonne lecture.

Toute l'équipe du FCMfr, dont :

Gravatar de Full Circle Magazine FR
Original post of Full Circle Magazine FR.Votez pour ce billet sur Planet Libre.

Articles similaires

Framablog : Framaslides : reprenez en main votre Power, Point !

mercredi 22 mars 2017 à 14:05

Pour le meilleur ou pour le pire, les diaporamas, slides et autres présentations font partie de notre quotidien. Quitte à devoir en faire et en voir, seul·e ou en groupe, autant disposer d’un outil en ligne pratique et respectueux de nos vies numériques, non ?

Ceci n’est pas un Powerpoint®

Commençons par un point vocabulaire : demander un diaporama en prononçant les mots « Tu me fais un Powerpoint ? » c’est un peu comme si on disait « Tu me fais un Subway ? » lorsqu’on veut un sandwich. Non seulement on fait de la pub gratos à une marque (si encore Microsoft vous payait…) ; mais en plus on court le risque de se polluer les cerveaux en apprenant à nos subconscients que sandwich = Subway.

Et puis il faut être francs, le format de documents .ppt ou .pptx (utilisé par Microsoft pour enchaîner vos diaporamas à leur logiciel Powerpoint), ben c’est une plaie. Un format fermé, difficilement compatible avec d’autres logiciels, et dépassé. Et cher, en plus, si vous voulez l’utiliser en ligne avec la suite « Office 365″…

10 € par mois pour avoir le droit de vous filer mes données ?
C’est payant et je suis quand même le produit ?
Microsoft, vous êtes des génies.

 

Car aujourd’hui, les langages qui permettent de faire des sites web (le HTML, bien sûr, mais aussi ses copaings CSS et Javascript), permettent de produire et de lire hyper facilement des présentations (même complexes), sans toucher à une seule ligne de code, sans installer de logiciel ni d’application, juste à l’intérieur de nos navigateurs web.

C’est justement, ce que permet le logiciel libre Strut. C’est donc à ce logiciel que nous avons contribué afin qu’il ait toutes les fonctionnalités dont nous rêvions pour mieux vous proposer Framaslides !

Framaslide présenté en une framaslide !

Nous pourrions énumérer les fonctionnalités qu’offre Strut : formatage de texte et choix de couleurs, intégration d’images, vidéos, sites web et formes, transitions, etc. Mais le plus simple, c’est encore de vous les montrer, non ?

Cliquez sur le cadre ci dessous et naviguez grâce aux flèches droite et gauche (ou haut et bas) de votre clavier ;).

Cliquez, puis faites défiler les slides avec ↑ ↓ → ←

Déjà, vous allez nous dire, c’est beau (et on vous remercie de nous le dire). Oui. Le seul souci c’est que Struts a été conçu comme un logiciel « perso ». On l’installe sur son ordinateur ou sur un coin de serveur (une brique inter.net, par exemple), on l’utilise, et il enregistre notre ou nos présentation(s) dans le cache de notre navigateur web. Mais si on change d’ordinateur, de navigateur, ou si on nettoie l’historique et le cache de son navigateur web, pfuiiit ! Tout est perdu !

Tout ceci est normal : Strut a été conçu comme cela, et il faut rendre grâce à Matt Crinklaw-Vogt, son développeur, pour le travail fourni. En revanche, si vous voulons que ce logiciel ait de nouvelles fonctionnalités permettant d’autres utilisations, on fait comme tout·e libriste qui se respecte : on se relève les manches et on contribue au code ;) !

Framaslides, un service collaboratif

Nous avons donc demandé à Thomas (que nous avons embauché suite à son stage où il a mené à bien Framagenda) de relever le défi ! Un peu comme une liste au père Noël, qui s’allonge au fur et à mesure que la date approche…

Thomas, face à ces demandes…

Dis, Thomas, ce serait pas génial si on pouvait…

Et le plus beau, c’est que le résultat est là. Autour de l’outil d’édition de présentations qu’offre Strut, Thomas a conçu un outil permettant de créer, présenter et collaborer sur ses présentations, en gérant aisément son compte, ses images, ses groupes, et bien entendu ses Framaslides !

Et un aperçu du résultat de son travail, un !

Pour les plus techos d’entre nous, Thomas a même pris le temps de faire un code propre, facile d’accès, documenté et de le déposer sur un Git aux petits oignons avec les tags et issues kivonbien… bref : un code qui est un appel aux contributions et collaborations ! Du coup, si vous maîtrisez du ImpressJS, du BackboneJS et du Handlebars (qui font tourner Strut) ; ou si vous êtes virtuose du Symphony3 (qui se trouve derrière la surcouche « Framaslides » de Thomas), vos contributions seront grandement appréciées ;) !

Manuel change le monde avec Framaslide

Manuel Dupuis-Morizeau veut changer le monde. Il se dit que la première étape, c’est de convaincre d’autres personne de le rejoindre dans son envie… Et pour cela, rien de tel qu’une présentation de derrière les fagots ! Ne voulant pas que ses idées soient confiées aux mains de Google Slides ou Microsoft Powerpoint 365, Manuel décide de se lancer sur Framaslide.

Pour cela, il lui faut un compte Framaslides. C’est facile : dès la page d’accueil, il clique sur le bouton « Se créer un compte », remplit le formulaire assez classique, puis attend l’email de confirmation (en vérifiant de temps en temps dans son dossier courriers indésirables, sait-on jamais)

On lui dit, à Manuel, que 8 caractères dans un mot de passe c’est bien trop peu ?

Une fois son compte validé, Manuel est impatient de s’y mettre, il clique donc directement sur « Créer une présentation ». Là, il découvre l’interface d’édition des diaporama de Struts.

Il décide donc de créer ses premières diapositives, ou slides, comme on dit !

Alors c’est bien gentil tout cela, mais il ne voit toujours pas comment faire les transitions… C’est là qu’il active le mode Panorama. Cela demande une petite gymnastique mentale, mais il voit vite comment ça peut marcher !

En fait, il faut s’imaginer qu’on déplace ses slides dans l’espace !

Bon, après avoir regardé un aperçu, ce début semble prometteur à Manuel, alors faut-il il le sauvegarde en utilisant le menu en haut à gauche.

Le menu, un grand classique indémodable.

Puis clique sur « retourner aux présentations », dans ce même menu.

Manuel se retrouve alors devant l’interface de gestion de ses Framaslides. L’outil à l’air assez explicite, en fait…

Au centre, il retrouve ses présentations, ses modèles et ses collaborations, chacun sous leur onglet

Et en haut à droite une barre de recherche et d’outils qui lui permet de :

Tout cela rend Manuel assez curieux, il va donc aller voir son gestionnaire d’images, mais comme il n’en a téléchargé qu’une, cela ne lui sert pas encore beaucoup. Il est quand même rassuré de savoir qu’il peut en effacer à tout moment et garder la maîtrise de ses fichiers.

Par contre, Manuel a une idée brillante… se faire aider pour commencer à changer le monde. Il décide d’aller directement créer un nouveau groupe afin d’y inviter toute la famille Dupuis Morizeau !

Non, sérieusement Manuel : le mot de passe, plus il est long, plus il est bon…

Bon, l’histoire ne dit pas si Manuel réussira à changer le monde, mais on peut croire qu’il réussira facilement à créer sa présentation avec d’autres membres de la famille et à la partager le plus largement possible ;)

Pour aller plus loin :

Gravatar de Framablog
Original post of Framablog.Votez pour ce billet sur Planet Libre.

Thuban : Quelles activités dans le libre depuis la semaine dernière...

mercredi 22 mars 2017 à 13:12

Tiens, j'ai envie de m'essayer à l'exercice de faire un bilan régulier sur mes "contributions" libres.

La semaine dernière, j'annonçais le passage sous git des sources du guide sur l'auto-hébergement. Deux contributeurs on fait des propositions et permis de pousser la réflexion plus loin. Merci les gars !



De mon côté, je continue ma relecture et simplification autant que possible. Il reste du boulot ^^

En parallèle, j'ai contribué, malheureusement trop peu, à la progression des cahiers du débutants sous debian stretch. Ma tâche a constitué à vérifier les liens morts principalement :s

J'ai ouvert une issue sur le projet blogotext à propos d'un bug pour le lecteur de flux RSS qui est désormais corrigé :) Trop hâte de voir la nouvelle version sortir.

J'ai aidé une collègue à recupérer ses données sur son ordinateur donc le windows ne voulait plus démarrer. Hop, une DFLinux en live et roule ! Par contre, windows ne démonte pas correctement les disques, j'ai dû les monter en read-only pour pouvoir récupérer ses précieuses données. 130€ d'économisés pour elle avec une DFLinux installée :)

J'ai aussi tenté de me plonger dans le code de txt2tags, qui malgré de nombreuses nouvelles fonctionnalité n'est pas mis à jour depuis plusieurs années. C'est désolant. Il faudrait terminer de passer tous les tests pour la publication d'une nouvelle release. Pour l'instant je fais choux blanc, mais j'encourage toutes personnes plus versées que moi dans le python pour contribuer à ce projet. txt2tags a une syntaxe parfaite et devrait à mon avis remplacer markdown utilisé tant bien que mal dans certains projets.

Enfin, les listes d'IP à blacklister augmentent petit à petit en volume, et je note quelques téléchargements :) Il y a 427 dans les bruteforces et 7 dans les spammeurs.

Voilà voilà, c'est tout pour cette semaine. :)
Et vous ? :)

Gravatar de Thuban
Original post of Thuban.Votez pour ce billet sur Planet Libre.

Benoît Boudaud : Python: Les booléens

mercredi 22 mars 2017 à 10:15

Pour une lecture plus agréable (page plus large), je vous invite à cliquer sur ce lien et à lire ce chapitre dans la rubrique consacrée au langage Python.

Aujourd’hui, je vais vous parler des booléens. Les booléens sont des êtres farouches qui vivent au fin fond des forêts binaires recouvrant la terre sacrée du Grand Python Digital. Très difficiles à observer dans leur milieu naturel bla, bla, bla…

Bon en fait, il s’agit d’une notion informatique quelque peu tordue que j’avais du mal à conceptualiser au début de mon apprentissage du Python.

boole
Très rare cliché d’un booléen pris dans son environnement naturel

Un peu d’histoire avec George Boole

Figurez-vous que celui qui a inventé l’algèbre booléenne s’appelle George Boole. Ce sujet anglais est né en 1815 et vous ne serez pas étonné d’apprendre qu’il est mort. C’est une pneumonie qui l’a emporté à l’âge de 49 ans, après que son épouse l’eût aspergé d’eau pour le soigner! (source: Wikipédia). C’est beau l’Amour!

Il est donc le père de l’algèbre de Boole que je suis bien incapable de vous expliquer. Durant ma scolarité,  je n’ai pas eu l’heur de me plonger plus avant dans cette mathématique mystérieuse (J’ai fait un bac A2). C’est la raison pour laquelle je vous renvoie à la page Wikipédia. Débrouillez-vous!

Cela dit, je peux quand-même vous parler des booléens dans mon langage de programmation préféré.

Définition

En Python, un booléen est un type de variables qui possède deux états :

False == 0 et True == 1. Comment le prouver? C’est très simple. Nous allons créer deux variables (faux et vrai) et leur affecter respectivement les valeurs False et True. Ensuite, nous allons créer une liste de deux éléments indicés 0 et 1. Nous allons nous servir des deux variables comme indice pour retourner chacune des deux valeurs dans un print(). C’est parti:

faux = False
vrai = True
liste = ["Corée du Nord", "États-Unis"]
print ("1er pays:", liste[faux])
print("2ème pays:", liste[vrai])

1er pays: Corée du Nord
2ème pays: États-Unis

Je rappelle que l’indice d’une liste ne peut être qu’un nombre entier. Le fait que j’aie réussi à retourner les deux éléments de la liste en utilisant comme indice les variables faux et vrai prouvent que ces dernières stockent des valeurs qui sont respectivement égales aux nombres entiers 0 et 1.

Amusons-nous avec un exemple un peu tordu

J’ai dit que faux était égal à 0, c’est-à dire faux == 0. Attention! J’ai bien écrit faux == 0 et non pas faux = 0. En effet, La variable faux ne stocke pas le nombre entier 0 mais bien le booléen False qui est égal à la valeur 0. En Python, je rappelle que le signe = est un signe d’affectation tandis que le signe == est le signe d’égalité.

Je vais donc évaluer l’expression (faux == 0)  pour savoir si elle est vraie ou fausse et  je vais stocker la valeur retournée dans cette même variable faux.

faux = False
faux = (faux == 0) # Évaluation d'une expression (vraie ou fausse?)
print(faux)

True

L’expression faux == 0 est bien vraie (True). J’ai stocké le résultat dans la variable faux et maintenant faux = True!

Évaluation d’une expression

Bon, il s’agissait d’un exemple qui n’était pas du tout pédagogique. Je voulais simplement vous expliquer de manière ludique que Python évalue des expressions pour savoir si elles sont fausses ou vraies. Prenons un autre exemple plus parlant:

nombre_1 = 5
nombre_2 = 8
result = (nombre_1 < nombre_2)
print(result)

True

La variable result évalue si l’expression (nombre_1 < nombre_2) est vraie ou fausse. Il se trouve qu’elle est vraie puisque 5 est inférieur à 8. Donc le résultat est True.

Le type bool()

Les variables faux et vrai sont de types bool() car elles stockent les valeurs False et True.

faux = False
vrai = True
print (type(faux))
print(type(vrai))



 Si on déclare une variable de cette manière : var = bool(), alors var stockera la valeur False.

var = bool()
print(var)

False

Les conditions sont sous l’emprise des booléens

Lorsque Python évalue une condition, soit le résultat est False (== 0), soit il est True (== 1). C’est comme cela qu’un ordinateur pense… uniquement avec des zéros et des uns!

a = 5
if a < 9:
    print(a, "est inférieur à 9")
else:
    print(a, "est supérieur à 9")

Résultat: 5 est inférieur à 9

Qu’est ce qui s’est passé dans la tête de l’ordinateur? Il a évalué la condition. Est-ce que la variable a est inférieure à 9? Oui, c’est vrai. Donc la condition vaut 1 car elle est True). Remplacez 5 par 12 par exemple et vous verrez que la condition vaudra 0. Elle sera False. Par conséquent, c’est le deuxième message qui s’affichera :

Résultat: 12 est inférieur à 9

Pour vous en convaincre, je vais de nouveau utiliser une expression conditionnelle avec la même variable:

a = 5
result = (a < 9)
print(result)

True

L’expression conditionnelle est vraie.

À l’instar d’autres langages de programmation tels que le « C » par exemple, Python considère que toute valeur autre que 0 est vraie (True). Seule la valeur 0 est fausse (False).

chain_car = ""
if chain_car:
    print("vrai")
else:
    print("faux")

chain_car2 = "Boole"
if chain_car2:
    print("vrai")
else:
    print("faux")

faux

vrai

liste = []
if liste:
    print("vrai")
else:
    print("faux")

liste2 = ["Boole", "George"]
if liste2:
    print("vrai")
else:
    print("faux")

faux

vrai

Comme Python considère que toute valeur autre que 0 est True, je n’ai même pas besoin d’écrire par exemple « if a == 5: »

a = 5
if a == 5:
    print("C'est vrai")
else:
    print("C'est faux")

Je peux me contenter d’écrire « if a: »

a = 5
if a:
    print("C'est vrai")
else:
    print("C'est faux")

La fonction print() affichera « C’est vrai » car elle a évalué que la condition était True.

L’instruction else

Dans une condition, le code indenté qui suit l’instruction else s’exécute lorsque l’évaluation est False (ou les évaluations précédentes sont toutes False). L’instruction else exécute un code qui est False.

L’instruction elif 

Le code indenté qui suit l’instruction elif s’exécute lorsque les tests précédents if et elif sont déclarés False. Mais contrairement à else, l’instruction elif exécute un code qui est True.

a = 5
if a == 6: # False
    print("C'est vrai")
elif a == 7: # False
    print("C'est vrai")
elif a == 5: # True
    print("C'est vrai")
else: # False
    print("C'est faux") 

L’instruction not

En Python, l’instruction not transforme False(0) en True(1) et True(1) en False(0).

not

a = 5
a = not a
print(a)

False

L’instruction and

L’expression a and b est vraie si a et b sont vrais tous les deux. Elle est fausse si a ou b est faux ou si a et b sont faux tous les deux. Voici un tableau qui résume ce que je viens d’écrire:

and

a, b = 5, 13
if a == 5 and b == 13:
    print("C'est vrai.")
else:
    print("C'est faux.")

C’est vrai.

L’instruction or

L’expression a or b est vraie si au moins l’une des deux variables est vraie. Elle est fausse si les deux variables sont fausses. Voici un tableau qui résume ce que je viens d’écrire:

or

a, b = 5, 13
if a == 5 or b == 18:
    print("C'est vrai.")
else:
    print("C'est faux.")

C’est vrai.

Les boucles while et for

On retrouve les booléens dans les boucles while et for qui exécutent un programme tant que la condition est vraie (True). À partir du moment où elle devient fausse (False), la boucle s’interrompt. Il est donc aisé (mais pas très malin!) de créer une boucle infinie si on fait en sorte que la condition soit vraie pour l’éternité (ou au moins pour les capacités de la mémoire RAM!).

a = 5
while a:
    print("Au secours! Je viens de créer une boucle infinie.")

À partir de là, seul un Ctrl + C est à même d’interrompre l’irrémédiable processus.

Au secours! Je viens de créer une boucle infinie.
Au secours! Je viens de créer une boucle infinie.
Au secours! Je viens de créer une boucle infinie.

line 1344, in write
return self.shell.write(s, self.tags)
KeyboardInterrupt

Conclusion

Les booléens sont au coeur de la conscience-machine. Un ordinateur ne comprend que le langage binaire. C’est la raison pour laquelle il évalue la fausseté ou la véracité d’une expression uniquement en utilisant le 0 et le 1.


Gravatar de Benoît Boudaud
Original post of Benoît Boudaud.Votez pour ce billet sur Planet Libre.