Où comment faire défiler une série de fond d'écran pour les environnements de bureau tels que GNOME, MATE, ou Cinnamon.
samedi 18 août 2018
Envie d'un diaporama comme fond d'écran ?
Par Olivier Duchateau le samedi 18 août 2018, 14h24
Groupe d'utilisateurs de logiciels libres du Grand Avignon
samedi 18 août 2018
Par Olivier Duchateau le samedi 18 août 2018, 14h24
vendredi 14 octobre 2016
Par Olivier Duchateau le vendredi 14 octobre 2016, 16h30
urllib3 est un module python extrêmement puissant, qui enrichit les différents modules relatifs aux réseaux présents dans la bibliothèque standard.
Il existe différentes manières pour effectuer une requête (il suffit de voir la documentation). Jusqu'ici je ne m'étais pas penché sur le cas du protocole HTTPS.
Par défaut on obtient ce message :
/usr/local/lib/python2.7/site-packages/urllib3/connectionpool.py:841: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/l...
InsecureRequestWarning)
Même si l'on utilise la classe urllib3.connectionpool.HTTPSConnectionPool, le warning est toujours présent.
Il faut faire appel à un autre module, certifi, donc l'instance de HTTPSConnectionPool s'écrit alors :
[...] conn = urllib3.connectionpool.HTTPSConnectionPool(host, cert_reqs='CERT_REQUIRED', ca_certs=certifi.where()) res = conn.request('GET', '/') [...]
En annexe, vous trouverez un exemple complet.
On le lance de cette manière :
python npmjs.py HTTPHeaderDict({'Content-Length': '3143', 'Via': '1.1 varnish', 'X-Cache': 'MISS', 'Accept-Ranges': 'bytes', 'X-Timer': 'S1476454061.911429,VS0,VE292', 'Vary': 'Accept-Encoding', 'X-Served-By': 'cache-fra1231-FRA', 'server': 'CouchDB/1.5.0 (Erlang OTP/R16B03)', 'Connection': 'keep-alive', 'etag': '"ETFO48QX32KIQMANPF4IXAOMS"', 'X-Cache-Hits': '0', 'Cache-Control': 'max-age=300', 'Date': 'Fri, 14 Oct 2016 14:07:42 GMT', 'Content-Type': 'application/json', 'Age': '0'})
jeudi 14 juillet 2016
Par Olivier Duchateau le jeudi 14 juillet 2016, 19h15
Ces derniers temps, j'explore les capacités du site arte.tv afin de (re)voir certaines vidéos.
Je peux désormais récupérer la véritable URL d'une vidéo à partir de leur playlist (j'y reviendrais dans un futur billet). Mais cette fois-ci je me suis intéressé au cas, où l'on connaît déjà le lien.
j'ai donc écrit un script avec le langage Vala. Pour utiliser le programme il vous faut installer les bibliothèques suivantes [1] :
Il faut ensuite le compiler :
valac --pkg=glib-2.0 --pkg=libsoup-2.4 --pkg=json-glib-1.0 artetv.vala
Si tout se passe bien, on peut le lancer de la manière suivante [2] :
./artetv http://www.arte.tv/guide/fr/057398-000-A/quand-l-amerique-sera-latine http://arte.gl-systemhaus.de/am/tvguide/EUR_DE_FR/057398-000-A_EQ_2_VOF-STF_02421848_MP4-1500_AMM-Tvguide.mp4
Le script par défaut recherche les vidéos dont le conteneur est MP4 (il est tout a fait possible de voir les vidéos en streaming, grâce au protocole RTMP).
Je n'ai pas prévu de fonctionnalité pour télécharger le fichier (ce n'était pas le but premier, je voulais surtout m'intéresser aux données au format JSON). Cependant on peut utiliser un utilitaire prévu pour ça (par exemple avec wget
) :
wget `./artetv http://www.arte.tv/guide/fr/057398-000-A/quand-l-amerique-sera-latine`
Ou tout simplement, visualiser directement la vidéo avec la bibliothèque GStreamer.
gst-launch-1.0 playbin uri=`./artetv http://www.arte.tv/guide/fr/048078-000-A/papouasie-expedition-au-coeur-d-un-monde-perdu`
(Cliquez sur l'image pour la voir au format original)
jeudi 14 mai 2015
Par Olivier Duchateau le jeudi 14 mai 2015, 20h59
En ce moment, je travaille sur le portage de l'environnement de bureau Pantheon [1] pour FreeBSD. C'est long, fastidieux, car il faut sans cesse lire le code (voir plusieurs fois) pour vérifier qu'il n'y a pas de « linuxisme », et trouver des parades pour les résoudre (si il y en a).
Récemment je suis tombé sur une portion de code, qui m'a laissé perplexe. Pour simplifier, elle consiste à calculer la taille du disque dur [2].
En isolant cette partie (Cf. annexe, fichier hdd.vala
), je fus surpris du résultat (au départ j'ai cru, que sous Linux le résultat serait différent, mais en fait non).
valac --pkg=glib-2.0 --pkg=gio-2.0 hdd.vala ./hdd 33.2 GB
Le résultat sera sans doute différent chez vous, en fait, le calcul se fait uniquement pour la racine (/
). Il crée un File object juste pour /
, grâce à la méthode GLib.File.new_for_path.
Mais dans mon cas, mon disque dur est partitionné, je dois pouvoir retrouver la (quasi) totalité du disque, en faisant la somme de toutes mes partitions.
Ce bout de code s'inspire en fait, de ce que fait GNOME (via le paquet gnome-control-center). En parcourant le fichier panels/info/cc-info-panel.c
, on constate, que c'est la fonction g_unix_mount_points_get qui est utilisée [3].
Avec le langage Vala, il faut utiliser la classe UnixMountEntry, et faire une boucle sur l'ensemble des points de montage.
Dans mon exemple (Cf. annexe), je stocke la taille de chacune des partitions dans une liste, et ensuite je fais la somme de toutes les tailles.
valac --pkg=glib-2.0 --pkg=gio-2.0 --pkg=gio-unix-2.0 hdd-02.vala ./hdd-02 266.5 GB
C'est déjà plus cohérent.
Il ne reste plus qu'à envoyer un patch aux développeurs.
[1] Issue du projet elementary OS.
[2] À partir de la ligne 234 du fichier src/Plug.vala
(Switchboard-about-plug).
[3] Elle lit le fichier /etc/fstab
ou /etc/mtab
.
samedi 31 janvier 2015
Par Olivier Duchateau le samedi 31 janvier 2015, 11h31
En ce moment, je découvre la bibliothèque garcon [1] du projet Xfce.
Comme je débute, le premier programme est relativement simple. Il affiche les applications présentes dans le menu. Il va analyser le fichier xfce-applications.menu
présent dans $XDG_MENU_PREFIX
pour rechercher les fichiers .desktop
. Le résultat peut être différent en fonction des logiciels installés sur votre système.
Pour pouvoir l'utiliser il vous faut les fichiers d'en-tête pour GLib et bien évidemment garcon.
La ligne de commande que j'utilise sous FreeBSD (j'utilise encore gcc comme compilateur).
$ gcc -Wall xfce-menu.c -o xfce-menu `pkgconf --cflags --libs glib-2.0 garcon-1` -lc $ ./xfce-menu * xfce4-run.desktop ---- * exo-terminal-emulator.desktop * exo-file-manager.desktop * exo-mail-reader.desktop * exo-web-browser.desktop ---- Settings * xfce-settings-manager.desktop ---- * xfce4-accessibility-settings.desktop [...] System * Thunar-bulk-rename.desktop * xfce4-taskmanager.desktop * Thunar.desktop * xterm.desktop * xfce4-terminal.desktop ---- * xfce4-about.desktop * xfce4-session-logout.desktop
Si l'on souhaite utiliser la fonction xfce_menu_items2 ()
la sortie est différente, les fichiers .desktop
sont suivis des catégories.
$ ./xfce-menu xfce4-run.desktop X-Xfce-Toplevel;X-XFCE;Utility; exo-terminal-emulator.desktop X-Xfce-Toplevel;X-XFCE;Utility; exo-file-manager.desktop X-Xfce-Toplevel;X-XFCE;Utility; exo-mail-reader.desktop X-Xfce-Toplevel;X-XFCE;Network; exo-web-browser.desktop X-Xfce-Toplevel;X-XFCE;Network; xfce-settings-manager.desktop DesktopSettings;Settings;X-XFCE; xfce4-accessibility-settings.desktop X-XFCE-SystemSettings;X-XFCE-SettingsDialog;DesktopSettings;Settings;GTK;XFCE; xfce-ui-settings.desktop X-XFCE-PersonalSettings;X-XFCE-SettingsDialog;DesktopSettings;Settings;GTK;XFCE; [...] Thunar.desktop FileManager;FileTools;GTK;Core;Utility;System; xterm.desktop TerminalEmulator;System; xfce4-terminal.desktop TerminalEmulator;System;GTK; xfce4-about.desktop X-Xfce-Toplevel;X-XFCE;Utility; xfce4-session-logout.desktop X-Xfce-Toplevel;X-XFCE;System;
Maintenant, il nous reste plus qu'à utiliser un GtkTreeView widget pour afficher le tout dans une fenêtre.
[1] C'est un portage des spécifications définit par le consortium Freedesktop.org pour définir l'agencement d'un menu.
samedi 7 juin 2014
Par Olivier Duchateau le samedi 7 juin 2014, 19h13
Dans ce billet, nous allons voir comment afficher certaines informations obtenues avec la fonction sysctlbyname(3).
/sbin/sysctl vfs.usermount vfs.usermount: 1
En C, on peut écrire un programme relativement simple (sysctl-01.c
), qui va afficher uniquement le résultat.
gcc sysct-01.c -o sysctl-01 -Wall -W -lc ./sysctl-01 1
Si l'on souhaite afficher une chaîne de caractères.
/sbin/sysctl kern.ostype kern.ostype: FreeBSD
Avec le programme sysctl-02.c
, on procède de la manière suivante :
gcc sysct-02.c -o sysctl-02 -Wall -W -lc ./sysctl-02 FreeBSD
Maintenant, si plusieurs valeurs doivent être affichées.
/sbin/sysctl hw.acpi.supported_sleep_state hw.acpi.supported_sleep_state: S3 S4 S5
Le programme sysctl-03.c
affiche ces informations de cette manière :
gcc sysct-03.c -o sysctl-03 -Wall -W -lc ./sysctl-03 S3 S4 S5
Au lieu d'avoir une chaîne de caractères, on a une série d'entiers.
/sbin/sysctl kern.cp_times kern.cp_times: 889624 1836 116735 3507 4424229
Le programme sysctl-04.c
affiche tout ceci, de cette façon :
gcc sysct-04.c -o sysctl-04 -Wall -W -lc ./sysctl-04 Values: 889624 1836 116735 3507 4424229 Max: 4424229
Voilà, on peut désormais s'inspirer de ces exemples, pour apporter des patches aux programmes trop orientés Linux.
mardi 27 mai 2014
Par Olivier Duchateau le mardi 27 mai 2014, 22h46
J'écris ce billet ici, au lieu du wiki, pour qu'il ait plus de visibiliter.
Parfois dans certains projets écris en Vala on trouve ce bout de code :
[...] [CCode (cheader_filename = "sys/prctl.h", cname = "prctl")] extern int prctl (int option, string arg2, ulong arg3, ulong arg4, ulong arg5); [...]
On dénomme ce fragement par C code attribut (ou CCode attribut). Il s'agit d'une particularité de ce langage, pour utiliser directement des fonctions « externes ».
Sous Linux la fonction prctl ()
permet de nommer un processus (on peut le voir avec top
).
Sous les BSD (DragonFly, FreeBSD, NetBSD et OpenBSD) cette fonction n'existe pas. En fait elle s'appelle autrement, setproctitle ()
.
Or elle n'est pas présente au même endroit dans chacun des BSD.
Sous DragonFly et FreeBSD, on la retrouve dans unistd.h.
[...] [CCode (cheader_filename = "unistd.h", cname = "setproctitle")] extern static void setproctitle (string fmt, ...); [...]
Sous NetBSD et OpenBSD, on la retrouve dans stdlib.h.
[...] [CCode (cheader_filename = "stdlib.h", cname = "setproctitle")] extern static void setproctitle (string fmt, ...); [...]
Voilà, désormais on peut écrire du code « portable ».
vendredi 9 mai 2014
Par Olivier Duchateau le vendredi 9 mai 2014, 23h37
Je viens de publier sur le wiki, un snippet, afin de déterminer l'origine d'une adresse IP écrit en Vala.
En testant ce programme avec différentes versions de ce langage, j'ai dû mettre en place des tests, qui sont évalués par le compilateur valac
. On parle souvent de préprocesseur dans certains langages.
Si on dispose d'une version de Vala >= 0.22, il faut activer la directive VALA_0_22.
Si on dispose d'une version de libsoup >= 2.42, il faut activer la directive LIBSOUP_2_42.
C'est très simple, on utilise l'exécutable pkg-config
[1].
pkg-config --modversion libsoup-2.4 2.42.3.1
En fait pkg-config
interroge les fichiers .pc
, qui se trouve dans le dossier pkgconfig/
. Pour savoir où il se trouve dans l'arborescence :
find /usr -type d -name 'pkgconfig' -print
Par exemple, sous Fedora, on le trouve dans les dossier /usr/share
et /usr/lib
. Sous FreeBSD, il est situé dans /usr/local/libdata
.
Pour Vala :
valac --version Vala 0.20.1
Maintenant nous avons toutes les informations, on peut compiler notre programme.
Si Vala < 0.22.x
valac --target-glib=2.32 --pkg=glib-2.0 --pkg=libsoup-2.4 --pkg=json-glib-1.0 geoip.vala
Si Vala >= 0.22.x et libsoup >= 2.42.x
valac --define=VALA_0_22 --define=LIBSOUP_2_42 --pkg=glib-2.0 --pkg=libsoup-2.4 --pkg=json-glib-1.0 geoip.vala
Sous FreeBSD, on peut changer de compilateur, en utilisant par exemple clang.
valac --cc=clang --define=VALA_0_22 --pkg=glib-2.0 --pkg=libsoup-2.4 --pkg=json-glib-1.0 geoip.vala
Dans tout les cas, on obtient le même résultat :
./geoip fr
[1] Sous FreeBSD, on utilisera plutôt pkgconfig
.
mercredi 16 avril 2014
Par Olivier Duchateau le mercredi 16 avril 2014, 23h12
Quant on est sous GNU/Linux, il existe udev, très largement utilisé sur ce système d'exploitation (SE), mais lorsque l'on utilise un système BSD, et en particulier FreeBSD il nous est impossible d'utiliser cette bibliothèque. Cependant les développeurs de FreeBSD ont développé un outil similaire devd(8).
Il est accessible via un socket unix.
J'ai voulu voir comment l'utiliser grâce aux systèmes de notifications du noyau kqueue(2)/kevent(2), avec le langage Python.
Je détaille un peu le script, tout d'abord nous allons initialiser un socket (le programme va fonctionner comme un client).
[...] s_file = os.path.join("/var", "run", "devd.pipe") # Create new socket object s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) s.connect(s_file) # Return the socket's file descriptor fd = s.fileno() [...]
fd
(file descriptor) est nécessaire pour kevent
.
Les fonctions utilisées par kqueue/kevent sous Python sont accessible via le module select. Nous allons uniquement lire les données qui transitent par /var/run/devd.pipe
.
Ci-dessous l'initialisation du mécanisme de notification.
[...] # Kernel queue object kq = select.kqueue() # Event to monitor (only attach) event = [select.kevent(fd, filter=select.KQ_FILTER_READ, flags=select.KQ_EV_ADD),] # Initialize kevent structure (like EV_SET macro in sys/event.h) ev_set = kq.control(event, 0, 0) [...]
Nous pouvons « boucler » pour afficher les résultats quand un périphérique est branché. Un truc magique avec kqueue/kevent
on a directement accès à la taille du tampon à lire.
[...] for event in events: # Display data from socket (event.data is size to read) print s.recv(event.data) [...]
Voici le résultat lorsqu'une clé USB est branchée.
!system=DEVFS subsystem=CDEV type=CREATE cdev=usb/2.2.0 !system=DEVFS subsystem=CDEV type=CREATE cdev=ugen2.2 !system=DEVFS subsystem=CDEV type=CREATE cdev=usb/2.2.1 !system=DEVFS subsystem=CDEV type=CREATE cdev=usb/2.2.2 !system=USB subsystem=DEVICE type=ATTACH ugen=ugen2.2 cdev=ugen2.2 vendor=0x0930 product=0x653d devclass=0x00 devsubclass=0x00 sernum="0B4085607142DAD4" release =0x0100 mode=host port=6 parent=ugen2.1 !system=USB subsystem=INTERFACE type=ATTACH ugen=ugen2.2 cdev=ugen2.2 vendor=0x0 930 product=0x653d devclass=0x00 devsubclass=0x00 sernum="0B4085607142DAD4" rele ase=0x0100 mode=host interface=0 endpoints=2 intclass=0x08 intsubclass=0x06 intp rotocol=0x50 +umass0 at bus=1 hubaddr=6 port=2 devaddr=2 interface=0 vendor=0x0930 product=0x 653d devclass=0x00 devsubclass=0x00 sernum="0B4085607142DAD4" release=0x0100 mod e=host intclass=0x08 intsubclass=0x06 intprotocol=0x50 on uhub2 !system=DEVFS subsystem=CDEV type=CREATE cdev=pass2 !system=DEVFS subsystem=CDEV type=CREATE cdev=da0 !system=DEVFS subsystem=CDEV type=CREATE cdev=da0s1
La dernière ligne est intéressante, car c'est le nom de la partition que l'on pourra « monter » sur le système.
vendredi 3 janvier 2014
Par Olivier Duchateau le vendredi 3 janvier 2014, 17h08
En ce moment je travaille sur le portage d'une application pour FreeBSD. Comme elle fait appel à des fonctions qui ne sont pas disponibles sous ce système, je passe par l'analyse des fichiers iso-codes [1] mis à notre disposition par Debian.
Il s'agit de mon premier programme en C, donc soyez indulgent.
J'utilise les bibliothèques suivantes :
Pour le compiler, il faut définir une variable (par exemple ISO_CODES_PREFIX
), qui va nous servir de macro [2].
ISO_CODES_PREFIX=`pkgconf --variable=prefix iso-codes` gcc -Wall -DISO_CODES_PREFIX=\"$ISO_CODES_PREFIX\" `pkgconf --cflags --libs glib-2.0 gio-2.0 libxml-2.0` locales.c -o locales
Note : Si pkgconf n'est pas disponible, essayez pkg-config.
Après compilation, on obtient une liste avec la locale suivi du nom du pays. Cela me sert pour renforcer les tests pour mon patch.
[...] eu_ES.ISO8859-1 Spain eu_ES.ISO8859-15 Spain eu_ES.UTF-8 Spain fi_FI.ISO8859-1 Finland fi_FI.ISO8859-15 Finland fi_FI.UTF-8 Finland fr_BE.ISO8859-1 Belgium fr_BE.ISO8859-15 Belgium fr_BE.UTF-8 Belgium fr_CA.ISO8859-1 Canada fr_CA.ISO8859-15 Canada fr_CA.UTF-8 Canada fr_CH.ISO8859-1 Switzerland fr_CH.ISO8859-15 Switzerland fr_CH.UTF-8 Switzerland fr_FR.ISO8859-1 France fr_FR.ISO8859-15 France fr_FR.UTF-8 France he_IL.UTF-8 Israel hi_IN.ISCII-DEV India [...]
« billets précédents - page 1 de 2