samedi 5 août 2017

wxPython pour réaliser des interfaces graphique sous Python

Il n'y a pas si longtemps, je suis tombé sur cet article qui à retenu toute mon attention


Pour en revenir à l'article, il propose de réaliser:
  1. Une interface graphique à l'aide de wxFormBuilder
  2. Exporter l'interface dans un fichier python (directement depuis wxFormBuilder)
  3. Créer le code (vraiment très rudimentaire) pour coder l'exemple en python
Exemple wxFormBuilder et Python

Je me suis donc lancé dans l'expérimentation en installant wxFormBuilder sur mon Linux Mint (Ubuntu).

Petite surprise
En suivant les instructions mentionnées dans l'article pour l'installation de wxFormBuilder, j'ai vite remarqué que le code Python généré par wxFormBuilder (compilé depuis GitHub) n'était pas compatible avec wxPython  (installé depuis les packages pythons avec "pip install -U wxPython").

Ce n'est pas grand chose... juste un appel de fonction à modifier dans le fichier Python généré par wxFormBuilder.
Ce n'est quand même pas très "propre", sans savoir ce que cela cache comme autre surprise.

Cause et solution
Je me doutais que la version de wxPython (des dépots Python) n'était pas en concordance avec la version wxFormBuilder disponible sur GitHub.
La solution:
  • re-compiler wxPython 
  • compiler wxFormBuilder
Recette pour recompiler wxPython et wxFormBuilder
Recompiler wxPython ne fut pas de tout repos et il n'aura fallut pas loin d'une journée pour y arriver.
Voici donc la recette magique:

# === Installer les essentiels ===
# essentiels de compilation
sudo apt-get install build-essential g++

# Installer GTK 2.0
sudo apt-get install gtk2.0

# === Install wxPython ===
# comme mentionné sur https://www.wxpython.org/pages/downloads/
# l intruction suivante ne compatible pas bien:
#
# pip install -U wxPython

# Comme indiqué dans l'article, l'instruction suivante 
# ne fournit pas une compatibilité optimale entre le code 
# Python généré par wxFormBuilder et le package Python 
#
# sudo apt-get install python-wxgtk3.0

# === Compilation de wxPython ===
# Installer GStreamer requis pour compiler wxPython
sudo apt-get install libgstreamer0.10
sudo apt-get install libgstreamer0.10-dev
sudo apt-get install libgstreamer-plugins-base0.10
sudo apt-get install libgstreamer-plugins-base0.10-dev
sudo apt-get install gir1.2-gst-plugins-base-0.10
sudo apt-get install gir1.2-gstreamer-0.10

# Installer WebKit requis pour compiler wxPython 
# NB: identifier les module WebKit avec "sudo apt-cache search libwebkit"
# NB: pas suffisant "sudo apt-get install libwebkit2gtk-3.0-dev"
sudo apt-get install libwebkitgtk-3.0-0 libwebkitgtk-dev 

# Installer python3-dev, requis pour avoir python3-config.
# python3-config utilisé par la compilation de wxPython
sudo apt-get install python3-dev

# Installer wxPython 4.0 pour python3
# La compilation peut prendre plus d'une heure
sudo pip3 install -U \
    -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-16.04 \
    wxPython

# === Compilation de wxFormBuilder ===
# Conformément au projet GitHub
# https://github.com/wxFormBuilder/wxFormBuilder

sudo apt-get install libwxgtk3.0-dev libwxgtk-media3.0-dev libboost-dev

cd /tmp
git clone --recursive --depth=1 https://github.com/wxFormBuilder/wxFormBuilder
cd wxFormBuilder
./create_build_files4.sh
cd build/3.0/gmake
make config=release

=== Exécuter la version compilée ===
cd ../../../output/bin/
./wxformbuilder

== Installer wxFormBuilder (Ubuntu/Mint) ==
# copy software to /usr/bin/
sudo mkdir /usr/share/wxformbuilder

# COPIER TOUS les fichiers de 
#   /tmp/wxFormBuilder/output/
# vers
#   /usr/share/wxformbuilder

# Reconstruire le lien symbolique de share/wxformbuilder 
# vers le répertoire "share" de notre installatin
sudo rm /usr/share/wxformbuilder/share/wxformbuilder
cd /usr/share/wxformbuilder/share
sudo ln -s /usr/share/wxformbuilder wxformbuilder

# Créer un lien symbolique dans /usr/bin
# pour pouvoir appeler wxformbuilder depuis la ligne 
# de commande
cd /usr/bin
ln -s /usr/share/wxformbuilder/bin/wxformbuilder wxformbuilder

Ressources

mercredi 7 juin 2017

Comment désactive IPV6 sur Linux Mint

Connaissant différents ralentissement sur certaines connexions internet, j'en suis venu à me demander si switching IPV6 et IPV4 ne posait pas quelques problème de résolution.

Je me suis donc demandé comment désactiver proprement IPV6 sur mon Linux Mint.

sudo nano /etc/sysctl.conf

Ajouter les lignes suivantes à la fin du fichier de configuration


# IPv6 disabled
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Puis redémarrer sysctl

sudo sysctl -p

Et HOP, plus d'IP V6. Vous pouvez facilement vérifier en consultant le résultat de la commande ifconfig :-)

mercredi 2 novembre 2016

Histoire de Flash player, HTML5 et YouTube Player Api

Je lis actuellement l'excellent article "Flash d'Adobe à l'agonie" sur LinuxFR.
En plus de revenir sur l'historique de flash (et sa déchéance qui n'en fini pas), l'article fait également une part belle à la relève (HTML5, le format SVG, les outils)

En article connexe, j'ai trouvé la présentation "YouTube Player API Reference" très intéressante. Car oui, Google est passé au support HTML5 dès 2010-2011.

Bonne lecture :-)

mardi 18 octobre 2016

Gandi: config SPK et DKIM / dig - l'outil linux pour intérroger les serveurs DNS.

Il n'y a pas longtemps, j'ai modifié les enregistrements DNS de notre société pour autoriser la société mailjet à devenir notre point relay (pour l'envoi d'émail).

Chez Gandi, cela se fait en mode expert en ajoutant la ligne suivante:

@ 10800 IN TXT "v=spf1 include:spf.mailjet.com ?all"



Et vous pouvez également ajouter une clé DKIM... (format de l'enregistrement conseillé par gandi, clé fournit par MailJet)

mailjet._domainkey 10800 IN TXT "k=rsa; p=MI........QAB"

Après la propagation DNS (environ 3H), vient le moment où il serait intéressant de savoir si l'enregistrement TXT est correctement publié sur le DNS.
Note: l'interface d'administration de MailJet pense obstinément que ce n'est pas en ordre

Prenez une machine Linux et saisissez la commande:

dig TXT mondomaine.be +short

Et l'on obtient la réponse suivante:

; <<>> DiG 9.9.5-3ubuntu0.9-Ubuntu <<>> TXT mondomaine.be
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28806
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;mondomaine.be.   IN TXT

;; ANSWER SECTION:
mondomaine.be.  10800 IN TXT "v=spf1 include:spf.mailjet.com ?all"

;; Query time: 48 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Tue Oct 18 13:48:03 CEST 2016
;; MSG SIZE  rcvd: 89

Ou nous pouvons contacter que l'enregistrement TXT pour spf1 est bien présent.

Chouette alors ;-) 

vendredi 16 septembre 2016

Python: Découverte des possibilités vidéo de GStreamer et FFmpeg grâce à FWomaj

En consultant les news de Linuxfr.org, je tombe sur l'article "Fwomaj 0.3 : Vidéos à la coupe au rayon frais".
Bien que je ne m'intéresse pas spécialement à la vidéo, le fait de Fwomaj utilise Python 3 m'incite à faire une petite lecture... fructueuse puisque je découvre de nouveaux outils pour mon environnement favoris.
Si l'article décrit le travail de l'auteur dans son projet, il énumère surtout certaines dépendances et donne des liens vraiment utiles.
Couteaux Suisse de la vidéo, je découvre donc les possibilités de GStreamer et FFmpeg qu'il est possible commander depuis Python et d'inclure dans une application GTK.

FFmpeg - codage/décodage/transcodage
FFmpeg est un Framework Multimedia très populaire capable de décoder, encoder, transcoder mixer (mux), démixer (demux), streamer, filtrer et jouer (play) presque tout ce que l'homme et la machine ont créés. Il support la plupart des anciens formats obscur jusqu'au tout dernier standard hi-tech.
Très portable, FFmpeg compile, s'exécute et passe avec succès l'infrastructure de test FATE sous Linux, Mac OS X, Microsoft Windows, les BSDs, Solaris, etc. Sous une large variété d'environnement de compilation, architecture logiciel et configuration.
GStreamer - rendu vidéo
Source: Fwomaj 0.3 : Vidéos à la coupe au rayon frais

Pour reprendre la note de l'article d'origine:
On peut faire plein de choses avec GStreamer. C'est un langage de pipes vidéo assez fascinant, qu'on prototype à l'aide de l'utilitaire gst-launch, pour construire des "tuyaux" d'images qui bougent:

gst-launch-1.0 videotestsrc pattern=1 ! video/x-raw,format=AYUV,framerate=\(fraction\)10/1,width=100,height=100 ! videobox border-alpha=0 top=-70 bottom=-70 right=-220 ! videomixer name=mix sink_0::alpha=0.7 sink_1::alpha=0.5 ! videoconvert ! xvimagesink videotestsrc ! video/x-raw,format=AYUV,framerate=\(fraction\)5/1,width=320,height=240 ! mix.

Comme rien ne vaut un beau dessin pour comprendre rapidement

Source: GStreamer Cheat Sheet

Source: GStreamer Cheat Sheet

Ressources:
  • GStreamer Cheat Sheet
    Une excellente ressource à propos de GStreamer incluant de nombreux exemples (capture webcam, network stream, generator, etc)

vendredi 12 août 2016

Python Logging & Logger - CE QU'IL NE FAUT PAS RATER

Petit détour sur les méthodes de logging Python et une erreur assez répandue (je pense).

Dans le blog victorlin, j'ai trouvé l'exemple suivant à propos du logging, exemple qui recèle une erreur dans la façon d'utiliser le logger :

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info('Start reading database')
# read database here

records = {'john': 55, 'tom': 66}
logger.debug('Records: %s', records)
logger.info('Updating records ...')
# update records here

logger.info('Finish updating records')

Il y a comme un bug!
Si ce code est parfaitement fonctionnel, il y a quelque-chose qui me choque.
  1. Il faut créer un "logger" pour pouvoir logger
  2. Ou passer le logger d'objet en objet si on ne veut pas en créer à tour de bras.
Si vous avez une grosse application, vous allez vous retrouver avec des logger dans tous les coins (classe, fichier, etc) pour enregistrer des messages... alors que tout ce qui vous intéresse c'est faire du logging d'information (info ou degug) pour les utiliser quand cela sera utile.

Découpler logging et logger
Le plus approprié, il me semble, est de faire du logging agnostique, sans se préoccuper de la question "si cela intéresse un logger ou non"! En gros, découpler le logger et les opérations de logging dans le code.
Cela se fait très simplement en écrivant les traces directement sur "logging".

import logging

logging.debug(' %r _fire_select(): %r ' % (self, selection) ) 
logging.debug('%r _fire_cancel()' % self )

Utiliser un logger pour garder une trace
Ensuite, au besoin, il suffit de créer un logger pour garder une trace des messages qui passent comme ceci:

logger = logging.getLogger()
handler = logging.StreamHandler() # Logging vers console
formatter = logging.Formatter(
    '%(asctime)s [%(levelname)s] -> %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO) # ou DEBUG 

Et toutes les opérations loggin.info, logging.debug, etc tomberons dans logger :-)
Cela va singulièrement simplifier la codage des opérations de logging dans vis classes :-)

PythonMegaWidget (Pmw) - Ressources utiles

Voici une liste de ressources collectées durant mes recherches et apprentissage sur TkInter et PythonMegaWidget.
Cette liste est destinée à être régulièrement agrémentée.
  • Comment construire des Pmw MegaWidget (pmw.sourceforge.net, anglais)
    Détaille et commente la création d'un MegaWidget. Incontournable dès que l'on veut spécialiser un composant.
  • Origine de la MultiListBox, une sorte de TableView (mypythonadventure.com, anglais)
  • SimpleTable (stackoverflow.com, anglais)
    Créer une table avec des libellés et un Grid geometry manager. Une approche simple qui peut se révéler utile.
  • Calculating the pixel size of a string with Python (stackoverflow.com, anglais)
    Ressource très intéressante pour estimer la hauteur d'un texte dans un Widget
  • Listbox.Autowidth (http://stackoverflow.com, anglais)
    Permet d'évaluer la largeur en Pixel des entrées d'une Listbox et d'ajuster la largeur du composant en conséquence. Font et taille de texte. Excellente ressource!
  • x
  • DataQ/DataTools.py (github.com/pythonadventurer, anglais)
    Un ensemble d'outils pour ouvrir et manipuler les données d'un fichier csv
  • x
  • Creating a simple Dialog (effbot.org, anglais)
    Quelques lignes de code... mais également l'utilité de destroy() et root.wait_window().
    Simple et très pertinent.
  • Tk Named Color (wiki.tcl.tk)
    Toutes les couleurs dispo dans Tk (et TkInter). Un Must!.
  • xxx