Programmation

Fil des billets

samedi 18 août 2018

Envie d'un diaporama comme fond d'écran ?

Où comment faire défiler une série de fond d'écran pour les environnements de bureau tels que GNOME, MATE, ou Cinnamon.

Lire la suite...

vendredi 14 octobre 2016

Comment forcer urllib3 à vérifier les requêtes HTTPS

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

Voir et revoir les vidéos disponibles sur le site Arte.tv

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] :

  • glib
  • libsoup
  • json-glib

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)

gst-launch-1.0.png

Notes

[1] Ainsi que les paquets de développement, généralement.

[2] Par exemple avec cette URL, http://www.arte.tv/guide/fr/057398-000-A/quand-l-amerique-sera-latine

jeudi 14 mai 2015

Est-ce volontaire ou non ?

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).

Pour l'éxecuter

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.

Mais comment fait-on ?

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.

Notes

[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

Jouons un peu avec la bibliothèque garcon (Xfce)

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.

Note

[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

Exemples d'utilisation de la fonction sysctlbyname ()

Dans ce billet, nous allons voir comment afficher certaines informations obtenues avec la fonction sysctlbyname(3).

Exemple n°1

/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

Exemple n°2

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

Exemple n°3

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

Exemple n°4

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

Quel est l'équivalent de prctl () pour les BSD avec le langage Vala ?

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

Déterminer l'origine d'une IP

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.

Comment déterminer la version d'une bibliothèque ?

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.

Compiler

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

Note

[1] Sous FreeBSD, on utilisera plutôt pkgconfig.

mercredi 16 avril 2014

Monitorer un média amovible sous FreeBSD ou DragonFlyBSD

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

Déterminer le nom du pays à partir de la locale du système

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
[...]

Notes

[1] Certains logiciels du projet GNOME utilisent le même procédé.

[2] Reportez-vous à cette page du wiki pour plus de détail.

- page 1 de 2