cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

Il est possible de rĂ©cupĂ©rer vos photos provenant de votre appareil photo reflex numĂ©rique en utilisant un cĂąble USB, mais ce n’est probablement pas la solution la plus rapide.

L’interface USB de votre appareil photo reflex numĂ©rique peut vous sembler assez inutile, en rĂ©alitĂ© cette interface Ă  intĂ©rĂȘt pour auditer ou configurer ce pĂ©riphĂ©rique.

Sous Linux, gPhotoÂČ prend en charge la synchronisation de l’horloge interne de l’appareil photo avec celle de l’ordinateur pour de nombreux modĂšles. La liste complĂšte des modĂšles supportĂ©s est disponible sur le site de gPhotoÂČ.

J’ai bien galĂ©rĂ© pour ce billet, que j’ai commencĂ© Ă  Ă©crire courant 2019, car il y a 3 problĂšmes distincts Ă  rĂ©soudre.

  • Les appareils photos que j’ai testĂ© ne gĂšrent pas les changements d’heures entre l’étĂ© et l’hiver, hors c’est mon problĂšme principal. J’ai mis du temps Ă  comprendre qu’une gestion des fuseaux horaire sans prendre en compte l’heure d’hivers/Ă©tĂ© Ă©tait au final complexifiait le problĂšme,
  • Il y a un bug entre gphotoÂČ et les appareils de type CANON EOF : la conversion entre l’heure courante de l’ordinateur et l’heure UTC de l’appareil est Ă©trange (Ce bug identifiĂ© n’a pas avancĂ© depuis 2019),
  • Les forums recopie la mĂȘme erreur. Les forums français, en particulier, appliquent une rĂšgle dĂ©finie pour des pays qui n’ont pas de changement d’heure dans l’annĂ©e ayant comme consĂ©quence que cela ne fonctionne qu’en hivers
 Je ne comprends pas vraiment, car je n’ai trouvĂ© aucun appareil photo qui rĂ©solvais correctement ce point.

gphotoÂČ

La commande gphotoÂČ vous aidera pour cette tĂąche qui s’installe comme suit :

sudo apt update && sudo apt install -y gphoto2

Pour utiliser gphotoÂČ, il faut bien-sur que le cĂąble USB soit connectĂ©, que l’appareil photo soit allumĂ© (faite attention Ă  son extinction automatique), et que le systĂšme de fichier de l’appareil photo ne soit pas montĂ© (cela est gĂ©nĂ©ralement fait automatiquement).

Plus de dĂ©tail dans le billet sur l’installation de gPhotoÂČ

En général, vous devrez penser à démonter le « disque » qui sera monté par votre systÚme.

Pour obtenir la liste des commandes disponible avec votre appareil photo, vous pouvez utiliser :

gphoto2 --list-config

Cela validera que gphotoÂČ est capable de communiquer avec votre appareil photo.


ඏ

Les appareils supportés

Actuellement, plus de 2400 modĂšles d’appareils photos sont supportĂ©s, correspondant Ă  231 marques, je ne vais donc pas faire la liste ici.

gphoto2 --list-cameras

Notez qu’il est possible que votre appareil photo soit supportĂ© sans pour autant ĂȘtre prĂ©sent dans cette liste, pour savoir comment votre modĂšle est dĂ©tecte vous pouvez utiliser :

gphoto2 --auto-detect
gphoto2 --summary
  • Ex: gphoto2 --summary
    Camera summary:
    Manufacturer: Canon Inc.
    Model: Canon EOS 700D
      Version: 3-1.1.4
      Serial Number: 5556df3ac4089b73c8b4eba88e12c069
    Vendor Extension ID: 0xb (1.0)
    
    Capture Formats: JPEG
    Display Formats: Association/Directory, Script, DPOF, MS AVI, MS Wave, JPEG, CRW, Unknown(b103), Unknown(bf02), Defined Type, Unknown(b104), Unknown(b105)
    
    Device Capabilities:
        File Download, File Deletion, File Upload
        No Image Capture, No Open Capture, Canon EOS Capture, Canon EOS Capture 2
    
    Storage Devices Summary:
    store_00020001:
        StorageDescription: SD
        VolumeLabel: None
        Storage Type: Removable RAM (memory card)
        Filesystemtype: Digital Camera Layout (DCIM)
        Access Capability: Read-Write
        Maximum Capability: 31902400512 (30424 MB)
        Free Space (Bytes): 31902236672 (30424 MB)
        Free Space (Images): -1
    
    Device Property Summary:
    Property 0xd402:(read only) (type=0xffff) 'Canon EOS 700D'
    Property 0xd407:(read only) (type=0x6) 1
    Property 0xd406:(readwrite) (type=0xffff) 'Unknown Initiator'
    Property 0xd303:(read only) (type=0x2) 1
    Battery Level(0x5001):(read only) (type=0x2) Enumeration [100,0,75,0,50] value: 100% (100)
    

Ensuite, vous pouvez connaßtre la liste des propriétés accessibles avec votre modÚle :

gphoto2 --list-config

Et Ă©ventuellement rĂ©cupĂ©rer l’ensemble des valeurs :

gphoto2 --list-all-config

ඏ

Autre commandes

Une autre commande que vous pouvez exécuter sans risque, est de récupérer le compteur de photo.

gphoto2 --get-config /main/status/shuttercounter

Ensuite gphotoÂČ prend en charge la capture de photo, et peut Ă©galement lire et Ă©crire dans la mĂ©moire de l’appareil photo (en gĂ©nĂ©ral, la carte SD).

Ces fonctionnalitĂ©s ne sont pas inintĂ©ressantes, mais elles ne correspondent pas Ă  une utilisation traditionnelle d’un appareil photo.

N’utilisant pas ces fonctionnalitĂ©s, je ne m’étalerais pas sur cette partie.

Plus de dĂ©tail dans le billet sur l’installation de gPhotoÂČ


ඏ

Notion prĂ©alable Ă  la configuration de l’heure

  • La notion d’epoch

    L’epoch (de l’anglais « époque » ou « Úre ») reprĂ©sente la date initiale Ă  partir de laquelle est mesurĂ© le temps par les systĂšmes d’exploitation ou par certains langages.

    Notez qu’il n’y a pas de systĂšme de mesure moins arbitraire que d’autre. La date et l’heure Ă©tant par nature des conventions.

    L'epoch Posix ou l'epoch Unix (aussi appelĂ©e heure Unix, heure Posix, Unix Timestamp, etc) est une mesure du temps basĂ©e sur le nombre de secondes Ă©coulĂ©es depuis le 1er janvier 1970 00:00:00 UTC. Elle est utilisĂ©e principalement dans les systĂšmes qui respectent la norme POSIX, dont les systĂšmes de type Unix, d’oĂč son nom.

    La date avant cette l'epoch Posix sont représenté sur une forme négative.

    La plupart des langages de programmation utilisent Ă©galement cette reprĂ©sentation pour les dates. Par exemple : C/C++, Java, JavaScript, Perl, PHP, Python, Ruby


Configuration de l’heure

La configuration de l’heure est sans doute la plus utile et la plus courante.

Pour rĂ©cupĂ©rer l’heure de l’appareil photo, vous devez utiliser :

gphoto2 --get-config datetime
Label: Camera Date and Time
Readonly: 0
Type: DATE
Current: 1622796649
Printable: ven. 04 juin 2021 10:50:49
Help: Use 'now' as the current time when setting.

END

Pour mettre à jour l’heure de votre appareil photo, la solution la plus simple :

gphoto2 --set-config datetime=now
gphoto2 --set-config datetime=$( date +%s ) # epoch Posix

Constatons que pour rĂ©cupĂ©rer le nombre de seconde depuis le 1er janvier 1970, il est possible d’utiliser la commande date comme suit :

date +%s

Cependant cette commande ne fonctionne pas avec les réflexes EOS CANON. La solution est de passer par le nom complet de la propriété :

gphoto2 --set-config /main/settings/datetime=now
gphoto2 --set-config /main/settings/datetime=$( date +%s )

Cela résout cependant que partiellement le problÚme, car il faut encore tenir compte du décalage lié au fuseau horaire


Du coup, il existe une alternative, au moins, pour les appareils de type « CANON EOS » :

gphoto2 --set-config /main/actions/syncdatetime=1

Bon, en rĂ©alitĂ©, ça ne fonctionne pas non plus, car il est peu probable que vous souhaitiez avoir l’heure UTC sur votre appareil photo.

Au final, la solution passe par la propriĂ©tĂ© /main/settings/datetimeutc et on doit recalculer l’heure pour tenir compte du fuseau horaire. Je vous gagne du temps l’utilisation de /main/actions/syncdatetimeutc ne rĂ©sous rien.

📌 Configuration prĂ©alable

En fait, une partie du problĂšme vient de l’appareil, sur mon « Canon EOS 700D », il y a un rĂ©glage du fuseau horaire, mais cela ne tient pas compte du changement d’heure entre hivers et Ă©tĂ©.

Cela implique d’avoir une solution boiteuse


Je vous propose une solution qui permettra de configurer l’heure de votre de maniĂšre plus comprĂ©hensible.

Pour cela il faut définir le fuseau horaire de votre appareil photo à UTC ± 00:00, en général, cela correspond à un réglage pour la ville de Londres (« london »).

Et Ă  partir ce maintenant, on utilisera les rĂ©glages UTC pour configurer l’heure de l’appareil photo en tenant compte du dĂ©calage de l’ordinateur.

Jouons avec la date


On se rappelle, que si votre fuseau horaire est une heure en avance par rapport à l’heure UTC, il faudra soustraire 1×60×60 secondes


Pour la France mĂ©tropolitaine, en hivers (au moins pour l’instant
), il faut utiliser quelque chose comme cela :

gphoto2 --set-config /main/settings/datetimeutc=$(( $( date +%s ) + 1*60*60 ))

Et en Ă©tĂ©, en France mĂ©tropolitaine, en hivers (au moins pour l’instant
), il faut utiliser quelque chose comme cela :

gphoto2 --set-config /main/settings/datetimeutc=$(( $( date +%s ) + 2*60*60 ))

Bon, c’est pas mal, mais personnellement, je ne trouve pas cela satisfaisant, j’aimerais bien ne pas avoir Ă  m’occuper du dĂ©calage horaire, et m’appuyer sur la configuration globale de l’ordinateur.

Nous allons devoir "bricoler" la date, pour ĂȘtre Ă  mĂȘme de dĂ©terminer

voici les notions nécessaires:

date +%s        # Permet d’afficher l’heure courante sous la forme epoch Posix
date +'%F %T'   # Permet d’afficher l’heure courante sous la forme YYYY-MM-DD hh:mm:ss

Nous allons avoir besoin de convertir une date donnée en secondes (epoch Posix):

date "+%s" --date="2018-04-01 12:33:45"

Pour convertir une date donnée en son équivalent UTC, il faut utiliser:

date -u --date=@$(date "+%s" --date="2018-04-01 12:33:45")

et pour connaütre l’heure UTC courante :

date -u --date=@$(date "+%s" --date="$( date +'%F %T' )")

Et si on fait le calcul suivant, on obtient notre dĂ©calage horaire courant par rapport Ă  l’heure UTC :

echo $(( $( date -u +"%s" --date="$( date +'%F %T' )" ) - $( date -u +"%s" ) ))

📌 Solution

Et on a enfin une solution pour mettre Ă  jour l’heure de notre appareil photo qui tiens compte du fuseau horaire ainsi que d’un Ă©ventuel changement d’heure :

gphoto2 --set-config /main/settings/datetimeutc=$( date -u +"%s" --date="$( date +'%F %T' )" )
gphoto2 --get-config datetime

On rappelle que cela implique que vous avez désactivé la gestion des fuseaux horaire sur votre apparie photos et que cela peut se faire en sélectionnant quelque-chose qui parle de UTC ou de Londres.

Références

኿


Ce billet fait partie d’une sĂ©rie d’une dizaine billets : #atelier-web.

Voici un complĂ©ment pour le billet đŸ‘Ÿ Atelier-Web ⑄ : Jouons avec un peu plus de CSS

Le but de ce billet est de prĂ©ciser le formalisme CSS, sans pour autant ĂȘtre exhaustif, on cherche principalement Ă  introduire la notion de sĂ©lecteur CSS.

Forme gĂ©nĂ©rale d’une rĂšgle CSS

Une rÚgle CSS à la forme suivante :

SELECTEUR {
  PROPRIETE: VALEUR;
  PROPRIETE: VALEUR;
  ...
}

Le SELECTEUR permet de « choisir » les éléments HTML qui seront concerné par la rÚgle.

La liste (PROPRIETE, VALEUR) définissant les rÚgles proprement dites.

Le résultat sera que chacun des éléments sélectionnés se verra appliqué les valeurs des propriétés CSS définies.


ඏ

Notion de sélecteur HTML/CSS

Je vous propose une version simplifiĂ©e du code HTML et dans le quelque on utilise l’attribut id au lieu de class pour l’une des balises.

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>atelier-web-06 – CSS ComplĂ©ments</title>
    <style>

/* ICI le code CSS */

    </style>
  </head>
  <body>
    <div id="essai"><!-- Attention, ID au lieu de CLASS -->

      <div class="ligne"><span class="blanc">.</span><span class="blanc">.</span></div>
      <div class="ligne"><span class="gris" >G</span><span class="blanc">.</span></div>
      <div class="ligne"><span class="rouge">R</span><span class="blanc">.</span></div>

    </div>
  </body>
</html>

Vous noterez qu’il est possible de voir la structure du code comme un « chemin » :


body
└── div id:essai
    ├── div class:ligne
    │   ├── span:blanc
    │   └── span:blanc
    ├── div class:ligne
    │   ├── span:gris
    │   └── span:blanc
    └── div class:ligne
        ├── span:rouge
        └── span:blanc

Cette vue de la page HTML permet de décrire un « chemin » pour chaque élément du code HTML.

Un Ă©lĂ©ment HTML est Ă©galement identifiable par le nom de sa balise, par le nom de ces classes (class="class1 class2 class3") et par son identificateur (id="identificateur). Notez que dans ce dernier cas, l’identificateur Ă©tant unique (et devant l’ĂȘtre), il n’y a pas d’ambiguĂŻtĂ©.

Un Ă©lĂ©ment HTML peut ĂȘtre retrouvĂ© Ă  l’aide d’une ou plusieurs de ces caractĂ©ristiques, mais Ă©galement Ă  l’aide de tout ou partie de son chemin.

Supposons que l’on recherche toutes les cases de notre dessin, cela correspond Ă  l’élĂ©ment â‰șspan≻. Si on rĂ©cupĂšre tous les Ă©lĂ©ments â‰șspan≻ en premiĂšre approche cela est correct, mais cela interdit de rĂ©utiliser un â‰șspan≻ ailleurs dans la page.

Pour retrouver nos cases, on peut utiliser le fait que l’élĂ©ment â‰șspan≻ de notre dessin se trouve Ă  l’intĂ©rieur d’un â‰șdiv≻ de classe « ligne ».

Voir mĂȘme, ĂȘtre encore plus prĂ©cis en indiquant que tout cela se trouve dans un â‰șdiv≻ de classe « essais ».


ඏ

Construction d’un sĂ©lecteur CSS

Le nom de base d’un sĂ©lecteur est construit Ă  partir :

  • du nom de la balise balise { 
 }, lorsque l’on souhaite appliquer la rĂšgle Ă  toutes les balises de la page,
  • d’un point suivi du nom de classe, .nom_balise { 
 }, la rĂšgle sera appliquĂ©e Ă  toutes les Ă©lĂ©ments dĂ©finissant au moins cette classe.
  • d’un diĂšse suivi d’un identificateur, #identificateur { 
 }, la rĂšgle sera appliquĂ©e Ă  l’unique Ă©lĂ©ment ayant cet identificateur.

Il est possible d’avoir des sĂ©lecteurs composĂ©s :

SĂ©lecteur CSS Signification
* Sélectionne tous les éléments
E, F Sélectionne tous les éléments de type E et de type F
E F SĂ©lectionne tous les Ă©lĂ©ments F Ă  l’intĂ©rieur des Ă©lĂ©ments E
E > F Sélectionne les éléments F enfants directs des éléments E
E + F Sélectionne tout élément F placé directement aprÚs un élément E
E~F Sélectionne tout élément F placé aprÚs un élément E dans la page

Par exemple, si on considĂšre les balises â‰șp≻ et â‰șa≻, et les syntaxes :

SĂ©lecteur CSS RĂ©sultat
p a { /* 
 */ } SĂ©lectionne tous les Ă©lĂ©ments â‰șa≻ dans les Ă©lĂ©ments â‰șp≻ (comprend « dans » au sens de « à l’intĂ©rieur de »).
p > a { /* 
 */ } SĂ©lectionne que les Ă©lĂ©ments â‰șa≻ enfants directs de â‰șp≻ (un « enfant » direct Ă©tant un Ă©lĂ©ment Ă  l’intĂ©rieur de l’élĂ©ment « parent » sans Ă©lĂ©ment intermĂ©diaire.

Ceci est bien évidement généralisable pour des classes (#myclass) ou des identificateurs (#myid).


ඏ

Quelques exemples

Voici quelques exemples s’appuyant sur le code HTML donnĂ© plus haut. Je vous invite Ă  tester ces diffĂ©rentes solutions.

Tous les Ă©lĂ©ments â‰șspan≻

span {
  border-width: 1px;
  border-style: solid;
  border-color: black;
}

📌 VĂ©rifiez qu’il y a un bord noir, sur tous les Ă©lĂ©ments de type â‰șspan≻ prĂ©sent dans la page.

Tous les Ă©lĂ©ments â‰șspan≻ prĂ©sent dans les « lignes » :

On a deux solutions, qui permettent de sélectionner cela.

Voici la plus précise :

div.ligne span {
  border-width: 1px;
  border-style: solid;
  border-color: red;
}

📌 VĂ©rifiez que cela applique un bord sous forme de ligne rouge.

La seconde est cependant suffisante :

.ligne span {
  border-width: 1px;
  border-style: dotted;
  border-color: red;
}

📌 VĂ©rifiez que cela applique un bord en pointillĂ© rouge.

Tous les Ă©lĂ©ments â‰șspan≻ prĂ©sent dans les « lignes » prĂ©sentes dans « essai » :

div#essai div.ligne span {
  color: #edd400; /* Jaune */
}

📌 VĂ©rifiez la couleur du texte.

div#essai .ligne span {
  color: #53a8ca; /* Bleu */
}

📌 VĂ©rifiez la couleur du texte.

div#essai div.ligne span {
  color: #dd0b0b; /* Rouge */
}

📌 VĂ©rifiez la couleur du texte.

#essai .ligne span {
  color: #8ae234; /* Vert */
}

📌 VĂ©rifiez la couleur du texte.

Explication des solutions proposées

Le code CSS a Ă©tĂ© adaptĂ© pour le code HTML proposĂ© en dĂ©but de ce billet. Le changement est qu’au lieu d’utiliser la classe « essais », le code HTML dĂ©fini un ID « essai ».

PremiÚre version du code CSS :

#essai { font-family: monospace; }

.blanc {
  background-color: white;
  width: 20px;
  height: 20px;
  display: inline-block;
}

.gris {
  background-color: grey;
  width: 20px;
  height: 20px;
  display: inline-block;
}

.rouge {
  background-color: red;
  width: 20px;
  height: 20px;
  display: inline-block;
}

Seconde version du code CSS, plus courte et utilise la sĂ©lection des Ă©lĂ©ments sur lequel doit s’appliquer une rĂšgle basĂ©e sur le « chemin ». Ici on sĂ©lectionne tous les Ă©lĂ©ments span Ă©tant immĂ©diatement Ă  l’intĂ©rieur d’un Ă©lĂ©ment de classe ligne : cela se note '.ligne span'.

On note que l’avantage de cette solution est que la taille du carrĂ© n’est dĂ©fini qu’une seule fois, rendant, par exemple, plus simple la modification de ces valeurs.

Il s'agit simplement d'une mise en facteur.

#essai { font-family: monospace; }

.ligne span {
  width: 20px;
  height: 20px;
  display: inline-block;
}

.blanc {  background-color: white; }

.gris { background-color: grey; }

.rouge { background-color: red; }

ඏ

Références

L’atelier complet

኿

Nous allons voir comment faire pour Ă©crire un message sur votre Ă©cran, puis sur celui d’une autre machine Linux dont vous avez les droits administrateurs et l’accĂšs en ssh


En local

Pour Ă©crire un message sur votre Ă©cran, il y a la commande xmessage, mais je ne doute pas que vous trouverez des alternatives Ă  cette commande.

xmessage "Petit message Ă  moi--meme !"
xmessage "Petit message Ă  moi-meme !" -button "C'est bon !"

Écrire sur l’écran d’un tiers

Pour Ă©crire sur l’écran d’une autre machine, vous devez au prĂ©alable vous connecter sur cette machine Ă  l’aide de ssh. Cet article traite ce point, partiellement un peu plus loin.

ssh VOTRE_USER_SUR_LA_MACHINE_DISTANTE@IP_DE_LA_MACHINE_DISTANTE

Une fois sur la machine distante, vous devrez rĂ©soudre deux chose pour ouvrir une application graphique en utilisant l’écran de votre cible.

Il faut lancer l’application en tant que l’utilisateur cible, pour cela il suffit d’avoir accùs à un compte ayant les droits administrateurs de la machine, puis vous devrez positionner correctement les variables DISPLAY et DISPLAY.

su -l utilisateur_cible -c 'DISPLAY=:0.0 XAUTHORITY=${HOME}/XAUTHORITY xmessage "Bosse un peu !!!"'

Vous pouvez ajouter sudo pour Ă©viter d’avoir Ă  saisir le mot de passe utilisateur. Sur Raspberry Pi OS l’utilisateur pi Ă  le pouvoir d’utiliser sudo sur toutes les commandes et ce sans mot de passe.

sudo su -l utilisateur_cible -c 'DISPLAY=:0.0 XAUTHORITY=${HOME}/XAUTHORITY xmessage "Bosse un peu !!!"'

Si vous souhaitez reprendre la main, immĂ©diatement aprĂšs avoir envoyĂ© le message, vous pouvez dĂ©crocher le processus Ă  l’aide de &, comme suit :

sudo su -l utilisateur_cible -c 'DISPLAY=:0.0 XAUTHORITY=${HOME}/XAUTHORITY xmessage "Bosse un peu !!!"&'

Références

኿


1 / Navigation / 3 ⋙ 96

Les anciens billets sont Ă©galement disponibles dans les archives.

â„č 2006 - 2021 | 🏠 Retour Ă  l'accueil du domaine | 🏡 Retour Ă  l'accueil du blog