dimanche 19 janvier 2020

Imprimante Zebra USB en réseau avec CUPS sur Raspberry-Pi

Ce n'est pas le premier article du blog que nous écrivons sur les imprimantes Zebra utilisée en ZPL. Il y a même une bibliothèque PythonPcl publiée sur GitHub.

Avant propos
Nous avons quelques imprimantes Zebra exploitées quotidiennement pour notre étiquetage. Le hic, c'est qu'elles sont toutes branchées en USB sur un PC... du coup pas facile à utiliser en réseau :-/
Zebra ZD420

Cups et Raspberry-Pi à la rescousse
Les carte Raspberry-Pi sont devenue tellement puissantes qu'elles peuvent facilement être utilisées en serveur d'impression.
François Mocq à publié son article "Transformer une imprimante USB en imprimante WiFi" à l'aide de CUPS et d'un Raspberry-Pi.

Nous avons utilisé son tutoriel à la différence que nous avons exploité une connexion Ethernet filaire et une adresse IP fixe.

Ensuite, nous avons raccordé notre (nos) imprimante(s) Zebra USB sur le Raspberry-Pi et suivi la procédure suivante.

Rappel PythonPcl
PythonPcl utilise les imprimantes en mode RAW (voir article Imprimante Zebra USB, ZPL et CUPS - Damned CUPS!!!) afin de pouvoir envoyer directement du ZPL sur l'imprimante.

Configurer l'imprimante sur le serveur CUPS
Pour mettre l'imprimante en réseau, il faut d'abord configurer cette imprimante sur le serveur CUPS (fonctionnant sur le Raspberry-Pi).
Cela se fait par l'intermédiaire de l'interface d'administration CUPS et d'un navigateur internet.

http://adresse-ip:631/

Ajouter une imprimante

Sélectionner l'imprimante à configurer : imprimante locale ZD420 (locale puisqu'elle est branchée en USB)

Viens ensuite le moment de définir le nom de l'imprimante (celui qui sera exposé sur le réseau). Ne surtout pas oublier de partager l'imprimante!
C'est le moment d'indiquer le type de pilote... il faut sélectionner une imprimante de marque Raw (terme anglais signifiant "brute")... car notre intention est d'envoyer du ZPL brute directement sur l'imprimante... un pilote Zebra essayerait d'interpréter le contenu et imprimerait le ZPL comme si cela était du texte.
Et comme c'est une imprimante Raw, le modèle d'imprimante sera inévitablement Raw Queue (queue d'impression brute).


La dernière option permet de sélectionner les bannières d'impressions... laissés à None (rien).

Voila, notre imprimante est configurée sur le serveur CUPS et partagée sur le réseau.

Installer l'imprimante réseau sur Linux
Nous utilisons Linux Mint (dérivé d'Ubuntu, dérivé de Debian), installer l'imprimante Zebra-ticket se fait par l'intermédiaire du gestionnaire d'imprimante du système d'exploitation.

Dans le gestionnaire d'imprimante, cliquer sur le bouton "Ajouter".
Cela affiche la liste des imprimantes disponibles, on y retrouve l'imprimante Zebra (ZD420) partagée sur le serveur CUPS.
Ne reste plus qu'a sélectionner l'imprimante et presser sur le nouton "Suivant".

Tous comme sur le serveur CUPS, il nous faut une imprimante qui n'interprète pas le contenu imprimé... donc qui fait un transfert brute.
Il faut donc choisir la catégorie Generic

Puis sélectionner le pilote Raw Queue (exactement comme sur le serveur cups.
Voila, l'imprimante est ajoutée dans le gestionnaire...


il ne reste plus qu'à la renommer pour pouvoir l'utiliser plus facilement en ligne de commande (menu contextuel, option "renommer"). Le nom Zebra_Ticket sera plus simple aussi bien pour Python ou en ligne de commande.

Utiliser l'imprimante

Il suffit de suivre les instructions de l'article "Imprimante Zebra USB, ZPL et CUPS - Damned CUPS!!!" en utilisant le nom d'imprimante Zebra_Ticket permet de vérifier le bon fonctionnement de l'ensemble.

Cette configuration CUPS avec Raspberry-Pi fonctionne parfaitement. Elle est utilisée avec la bibliothèque PythonPcl.

x
x
x
x
xx

dimanche 17 juin 2018

Quels outils pour contrôler ce que fait votre ado sur son smartphone?

Bonjour,
De plus en plus d'ADO et Pré-ADO dispose d'un SmartPhone. Difficile de ne pas faire plaisir à nos enfants en accédant à leur demande d'autant que ne pas y accéder à cette technologie c'est aussi les isoler des nouveaux groupes sociaux qui se forme dans les cours d'école et après les cours.
A chacun son avis sur le sujet, protéger nos enfant ou isoler nos enfants.

A côté de cela, nous pouvons essayer de faire autant de prévention que souhaité... nos enfants sont exposés aux nombreuses tentations sur smartphone, tentations qui sont omniprésentes, les cadeaux empoisonnés des opérateurs n(en vue de fidéliser nos loulou)... sans compter que le système hédonique de notre cerveau est un véritable piège lorsqu'il est confronté aux plateformes de jeux (très avancés sur Smartphone).
Interface de contrôle parental de Xooloo
D'où l'intérêt de mettre en place un contrôle parentale... parce que la prévention ne sera pas forcement suffisante (vous le comprendrez, il s'est fait piègé... et nous aussi) sur le long terme.
A vous, en tant que parent, de fixer vis propres limites intrusives.

Saviez-vous que l'organisation Action Innocence avait fait une évaluation de logiciels de contrôle parental pour SmartPhone?
Il semblerait que les meilleurs logiciels étaient:
Ressources

dimanche 15 avril 2018

Python threads synchronization: Locks, RLocks, Semaphores, Conditions, Events and Queues

Un excellent article concernant les outils de synchronisation sous Python.

Aborde également les principes de producer/consumer... à lire !!

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