Affichage des articles dont le libellé est Développement. Afficher tous les articles
Affichage des articles dont le libellé est Développement. Afficher tous les articles

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

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

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)

samedi 20 février 2016

Python : Lecture de carte eID Belge avec Python

Bien que cet article concerne la lecture de eID Belge sur Raspberry-Pi, la bibliothèque et le code doivent pouvoir être utilisé avec d'autres systèmes.
Bonne lecture
Dominique
 
En Belgique, les carte d'identités sont équipées de puce Smart Card. Cela permet d'emporter:
  • Un certificat CitizenBE utilisé pour la signature et authentification numérique du citoyen (protégé par une mot de passe).
  • D'autres informations librement accessible comme le nom, prénom, ....
Toutes ces informations étant décrites dans des spécifications ouvertes publiées sur le Net par l'eGouvernement Belge il y a une décennie.

Des spécifications ouvertes... c'est génial, du coup, nous avons une connaissance qui s'est lancé dans le projet fou de faire lire des cartes d'identités beid (carte d'identité Belge) par un Raspberry-Pi sous Jessie et en Python 3 s'il vous plaît! C'est trop de la balle.

from beid.beid import scan_readers, read_infos, triggered_decorator
from pprint import pprint
from time import sleep

# retrieve a list of available readers
r = scan_readers()[0]

# declare a function that will be executed automatically when a card is removed/insterted
# funcion arguments should be :
# - action : which will be "inserted" or "removed" when the function will be called
# - card : which will be the card if inserted
# - reader : which will hold  the name of the reader to use 

@triggered_decorator
def basic_read(action, card, reader=r.name):
    if action=="inserted":
        i = read_infos(card)
        pprint(i)

sleep(5)

infos = read_infos(r, read_photo=True)
with open("photo.jpg", "wb") as f:
    f.write(infos['photo'])

Vous trouverez pythonbeid sur le GitHub de Lapin Blanc.

Un grand merci pour ce partage avec la communauté.
Dominique

mercredi 18 mars 2015

Python: Les Imports, créer un setup.py, mettre sa bibliothèque en ligne sur Pyp

Sam & Max, encore une fois ;-) ...
Un article qui vient à point dans mes travaux autour de ZPL (GitHub) organiser une bibliothèque et la mettre en ligne.
Ce n'est pas tout d'offrir une bibliothèque, il faudrait qu'elle soit aussi suffisamment sympa pour faire des import facilement et "user-friendly".

Merci les gars de bloguer et partager librement.

jeudi 19 février 2015

Python: Librairies Tierces de références

Sam & Max, malgré leur style un peu "cru" écrivent des articles de qualités.
Ce n'est pas la première fois que j'arrive sur le site et le fait d'y venir et revenir est quand même significatif de la qualité du contenu.
Je reprends ici deux articles très utiles pour les plus curieux d'entre-nous... il s'agit d'outils pour l'aide au développement en Python (pas besoin de réinventer la roue, ni dépenser un temps considérable en recherche si d'autres nous proposent déjà ce qu'ils ont trouvé et testé)
Merci les gars.

dimanche 8 février 2015

Imprimante Zebra USB, ZPL et CUPS - Damned CUPS!!!

Voici un petit bout d'histoire autour d'un imprimante Zebra USB branchée sur une machine Linux (Linux Mint Mate 17) et d'un acharné qui voulait envoyer du ZPL sur sa Zebra.

L'imprimante à étiquette Zebra, ZPL et Linux
Chez MCHobby (shop.mchobby.be) nous utilisons Linux Mint pour toutes nos tâches et développements.
Ainsi, pour améliorer et accélérer notre étiquetage à partir des infos de notre PrestaShop, nous avons branché une Zebra LP 2824 USB sur notre ordinateur.

Comme nous développons nos propres petits outils PrestaShop en Python (cfr Lcd Order Track et PrestaConsole), nous pourrions facilement créer nos étiquettes à la demande. 

Revenons à nos moutons...

Ensuite, nous avons essayer d'envoyer des commandes ZPL vers l'imprimante. Les commandes ZPL permettent de contrôler directement l'imprimante et le contenu à imprimer.

Fichier de démo et agaceries CUPS
Comme suggéré dans la documentation technique de Zebra, nous avons créé un petit petit fichier de démonstration demo.zpl

^XA
^FO100,50^ADN,36,20^FDxxx^FS
^XZ
 
Ce fichier fût créé à l'aide de Geany (un excellent éditeur de code), avec LF (LineFeed) comme séparateur de ligne et un encodage de fichier en UTF-8.

Ensuite, j'ai essayé d'envoyer le fichier directement vers l'imprimante à l'aide de:

  cat demo.zpl > /dev/usb/lp0

pour continuellement recevoir le message d'erreur

  /dev/usb/lp0: Permission denied

Cette erreur étant provoquée par le système de gestion des impressions (CUPS).

Je ne pouvais pas adresser directement le périphérique à cause de CUPS... mais je ne pouvais pas retirer CUPS car nous l'utilisons pour d'autres impressions (par exemple notre imprimante réseau HP3015).

Sacré nom de Dieu de CUPS!
Cette simple tâche d'envoyer un fichier brute (RAW comme disent les anglais) sur notre Zebra fût l'une des tâches les plus complexes à réaliser.
CUPS n'était pas vraiment en cause... c'est plutôt mon manque de connaissance de la gestion des imprimantes CUPS qui est en cause.

Ce que nous devons faire, c'est installer la Zebra comme une imprimante RAW  et non comme une Zebra! 

Installer la Zebra en RAW dans CUPS
Pour commencer,
Branchez votre Zebra USB puis ouvrez le gestionnaire d'imprimante.
Sur Linux Mint, il ressemble à ceci...

Cliquez sur le bouton "+" pour ajouter une imprimante.

A ce stade, vous pouvez sélectionner votre Zebra USB et passer à l'étape suivant.
Attention, c'est à partir ICI qu'il faudra faire le bon choix!!
Pour commencer, sélectionnez l'imprimante Generique (même si Zebra et la bonne imprimante existe dans la liste, c'est une imprimante générique qu'il faut installer)

Ensuite, vous sélectionnez le pilote "Raw Queue" (file d'impression Raw/brute):


De la sorte, tous les fichiers envoyés cette queue d'impression Zebra sera redirigé directement vers l'imprimante sans aucun traitement intermédiaire!

Point final très important... il faut nommer la file d'impression de façon intelligible!
Nous avons remplacé le nom proposé par "zebra-raw". Ce sera bien plus pratique par la suite. Nous vous conseillons vivement de simplifier le nom court.
 
Voila, quand c'est fini, vous vous trouvez vers avec une nouvelle imprimante (Printer queue / File d'impression) nommée zebra-raw et n'utilisant pas de pilote d'imprimante interprétant les données que vous voulez envoyer vers la Zebra


Chouette, c'est enfin prêt!
 
Envoyer le fichier demo.zpl vers la Zebra
Comme vous l'avez vu ci-dessus, nous avons crée une queue de traitement "zebra-raw" pour notre Zebra LP 2824 Plus.

A la suite de cela, il a été possible d'envoyer des données brutes (RAW) contenant des commandes ZPL directement sur l'imprimante à l'aide de l'utilitaire lp:

lp -d zebra-raw demo.zpl


Et voila, maintenant, cela fonctionne parfaitement!

Il nous reste plus qu'a attaquer la file d'impression/printer queue en Python et mon bonheur sera complet...

mardi 27 janvier 2015

Python, imprimer en PCL directement sur une HP 3015 en réseau

Introduction
Nous avons plusieurs imprimantes HP dans notre société, dont une HP 3015 en réseau.
Le bonheur avec une HP3015, c'est qu'il est possible d'ouvrir un socket sur le port 9100 et commencer à envoyer un flux texte à imprimer.
Il est également possible d'inclure des séquence d'échappement pour modifier la font, la taille, ect. C'est ce que qu'offre PCL, qui utilise des séquences de "caractères" particulier pour opérer ces changement.

L'avantage de cette approche est d'être totalement indépendante de la plateforme, du langage de programmation et de l'OS. Si vous le vouliez, vous pourriez imprimer depuis un Arduino + Ethernet, Raspberry, etc! Si cela à l'avantage de ne pas surcharger l'OS avec des composants logiciel (pilotes et soft annexés qui font parfois 100Mb+), votre code sera plus long et plus complexe (il devra injecter les séquence d'échappement dans le texte à imprimer, faire gaffe à ne pas déborder de la page, etc).

Pour ceux qui doute du bien fondé de cette approche un peu extrême, je leur propose de prendre un bon vieux soft Clipper en production (20 ans d'ages) et de le recompiler sous Win32.
C'est là que l'on apprécie les bonne vielles casseroles et le gain de temps en R&D.  Une bonne vielle poule au pot... humm que c'est bon!

HP 3015 + PCL + Python
Voulant introduire du graphique dans le documents imprimés (hé oui, PCL le supporte), je me suis dit "pourquoi ne pas faire un prototype en Python".
Simple et facile à mettre en oeuvre, c'est un langage idéal pour faire quelques tests.

Seulement voila, j'ai chié des boulons (Metric 60 les gars!). Pas a cause du l'imprimante IP, pas à cause du socket, par a cause de Python mais à cause de l'encoding!
Entre explosion pour erreur d'encodage, affichage de mes accentués à la va te faire f...., j'en ai vu de toutes les couleurs.

En suivant les recommandations sur l'article "L’encoding en Python, une bonne fois pour toute" de Sam & Max, j'ai fait très attention à mon encoding (UTF8 pour les sources), utilisé des chaines de caractère Unicode (Python 2.7) et réencoder vers le bon code page pour l'envoi des chaines de caractères vers l'imprimante (cp850, il a aussi fallut le trouver celui-là).

Par contre, il m'a fallut un temps considérable pour remarquer que les séquences d'échappement devaient être envoyéez en UTF-8 (sinon "encoding error") et le texte avec accentués en cp850!!!
J'en ai mangé mon clavier (j'en ai encore la barre d'espacement en travers de la gorge!).

Un bout de code qui marche
Voici finalement un petit bout de code simplissime en état de fonctionnement. Les séquences d'échappement modifies seulement la taille du texte. Le but étant d'avoir un résultat cohérent sur l'imprimante sans explosion Python!

#!/usr/bin/env python
# -*- coding: utf8 -*-

import socket
import sys
import encodings

PRINTER_IP = '192.168.1.206'
PRINTER_PORT = 9100
PRINTER_ENCODING = 'cp850'

s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
s.connect( (PRINTER_IP, PRINTER_PORT) )
  
s.sendall( bytes( (u"Chère Mère à la peau tanée.\r\n").encode( PRINTER_ENCODING )) )
s.sendall( bytes( (u""+chr(27)+"(s5H").encode( 'UTF-8' ) ))
s.sendall( bytes( (u"Cet énorme titre\r\n").encode( PRINTER_ENCODING ) ))
s.sendall( bytes( (u""+chr(27)+"(s11H").encode( 'UTF-8' ) ))
s.sendall( bytes( (u"a t'il attiré ton regard\r\n").encode( PRINTER_ENCODING ) ))
s.sendall( bytes( (u""+chr(27)+"(s17H").encode( 'UTF-8' ) ))
s.sendall( bytes( (u"à moins que cela ne soit impossible?").encode( PRINTER_ENCODING ) ))

s.close()


Il y a certainement moyen de rendre ce code plus lisible (le blinder ou faire en sorte qu'il soit "safe" sous Python 3) mais au moins, il fonctionne!

Quel encoding sur mon imprimante
Dans l'exemple précédent, j'utilise 'cp850' comme encoding sur l'imprimante HP.
J'ai eu beaucoup de mal a trouver le bon encodage car malheureusement, Google et le Net ne sont pas très bavard à ce propos!

Encore un fois, c'est un petit script Python qui à testé TOUTES les possibilités en imprimant une phrase contenant un 'é' et le codepage utilisé pour cette impression.
Il ne reste plus qu'a relever les lignes ou le "é" est imprimé correctement.

#!/usr/bin/env python
# -*- coding: utf8 -*-

import socket
import sys
import encodings

PRINTER_IP = '192.168.1.206'
PRINTER_PORT = 9100

s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
s.connect( (PRINTER_IP, PRINTER_PORT) )

for e in encodings.aliases.aliases.values():
  try:
    s.sendall( bytes( (u"Encode ecute é with %s\r\n" % e).encode( e ) ) )
  except:
    s.sendall( bytes( (u"Fails ecute encoding with %s\r\n" % e).encode( "UTF-8" ) ) )
    
s.sendall( bytes( (u"TIME 600\r\n").encode( "UTF-8")) )     # Pas d'accent -> pas de problème
s.sendall( bytes( (u""+chr(27)+"(s5H"+"Big Title").encode( "UTF-8" ) )) # Pas d'accent -> pas de problème

s.close()

Plusieurs options  valides
"é" est un caractère assez répandu dans les alphabets. Il y a donc plusieurs codes pages pouvant convenir.
J'ai finalement choisi 'cp850' car en Belgique, c'est le codepage 850 qui est également utilisé "sous DOS". Les imprimantes vendue dans le même pays sont forcement configuré avec un codepage similaire à celui utilisé par les OS locaux.
Python peut encore une fois vous aider à déterminer le code page de votre système d'exploitation (la console).
C:\temp\python-hp>python
Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print( sys.stdout.encoding )
cp850
>>>

Le mot de la fin
Je ne voudrais pas jouer mon stroumpf grognon mais...
"J'aime pas l'encoding!"

Bonne amusement

jeudi 22 janvier 2015

PostgresSql et Python avec psyco2

Nous avons une belle DB PostgreSql utilisé par notre programme de production (Clipper compilé avec Harbour Project, Mediator utiliser pour l'accès DB).

Voulant afficher les stats d'expéditions journalière le moniteur d'un portable de récup, je me suis demandé s'il était possible d'attaquer notre DB à partir d'un script Python.
Après quelques recherches sur le Net, je suis rapidement venu et revenu vers PsycoPg2.

Bibliothèque PsycoPG2 - Accéder à vos DB PostgresSql en Python.
Il vaut avouer qu'avec cette bibliothèque, cela devient un vrai jeu d'enfant.
Non seulement il est possible d'accéder facilement à une DB PostgreSql mais en plus, les données sont accessible dans le plus pure esprit Pythonien!
Il est possible:
  • D'exécuter des requêtes SQL
  • Lire un seul enregistrement (FetchOne)
  • Lire  tous les enregistrement (FetchAll)
  • Ou d'utiliser un curseur sur le serveur de base de donnée (pour ne pas charger massivement vos milliers de records en une fois).
  • Supporte les transactions (commit après plusieurs insertions).
  • etc.
Après avoir fait quelques tests (Linux Mint 17.1), je peux vous affirmer que c'est de la balle!

Installation
Sur Linux Mint (Ubuntu), l'installation se résume à:

sudo apt-get install python-Psycopg2

Il semblerait qu'il soit parfois compliqué de trouver les paquets pour certaines distribution. Sachez que la documentation officielle (crf liens ci-dessous) reprend quelques notes concernant la compilation de la bibliothèque.

Des tutoriels
Connaître une bonne bibliothèque c'est bien mais avec de la doc c'est mieux.
Voici donc quelques ressources incontournables.

dimanche 11 janvier 2015

Basic Authentication avec Python - authentification dans l'entête HTML

J'avais justement besoin de m'authentifier pour faire des requête d'API sur Spark Cloud dans le cadre du projet PyCall.

J'ai trouvé une ressource très intéressante:
Un grand merci à Michael Foord.

Quelques ressources complémentaires:

samedi 8 novembre 2014

GoJS - Du code javascript pour réaliser et manipuler des diagrammes en ligne

Je prenais quelques renseignements sur le Canvas HTML quand je suis tombé un peu par hasard sur GoJS.net.


GoJS permet de réaliser des diagrammes interactif pour le WEB. J'ai pris le temps de naviguer dans les exemples... et c'est franchement impressionnant (même exceptionnel!).
Un des nombreux exemples de GoJS
Ce que je trouve particulièrement intéressant de GoJS est la structure de donnée bien pensée permettant d'élaborer un tel graphique en ligne!!!
Structure descriptive des graphiques interactif GoJS
Les exemples
Prenez donc le temps d'aller jeter un oeil sur les exemples proposés par GoJS.
Prenez aussi une chaise, vous allez certainement en avoir besoin :-)


Un référence à retenir:
  • GoJs.net - Interactive Diagrams for the Web


mardi 3 juin 2014

Clipper: Envoi d'email via SMTP - L'entête/header email

En tant que développeur des années 2010-2015, vous avez probablement accès à des bibliothèques, outils ou API vous permettant d'envoyer facilement des email. Ce genre d'outils qui prend en charge tout le travail... mais aussi qui vous éloigne du savoir de base.
Ces outils, c'est magnifique tant que cela fonctionne... mais Quid si vous n'avez qu'une bibliothèque rudimentaire capable de faire un envoi STMP?
Encore une fois, ce seront les connaissances les plus anciennes (et les plus basique) qui seront les plus utiles... à savoir la constitution d'un header/entête d'émail. Vous trouverez d'ailleurs une excellente référence de documentation en fin d'article ;-)

C'est dans les vieilles casseroles que l'on fait les meilleurs soupes
Je trafficote toujours avec Harbour Project (Compilateur Clipper Open-Source).... et je me demandais s'il était possible d'envoyer directement des e-mails depuis notre logiciel de gestion.
Limiter le nombre de couches logiciels et ne pas devoir s'appuyer sur un programme externe est plutôt intéressant dans notre cas... inutile de perdre de longues heures à essayer de comprendre ce qui ne fonctionne pas... il suffit de gratter dans le programme.
SMTP est toujours d'actualité et nous offre les services dont nous avons besoin... pourquoi se compliquer la vie avec MAPI qui n'arrête pas de demander des autorisations à l'utilisateur pour l'email.

Harbour Project - TIPTest
Dans les contributions du compilateur Harbour, vous trouverez le répertoire hbtip pour "HarBour Tools IP".
HBTIP contient par ailleurs un objet TIpClientSmtp() permettant d'envoyer des e-mais directement via un serveur ou un relay SMTP
C'est génial, il est possible d'envoyer un e-mail directement sur le Net depuis un programme écrit en Clipper :-)

Pour résumer les éléments clés de l'envoi d'émail dans TipTest.prg.
J'ai encodé en dur la valeur de cURL dans le programme, juste avant la ligne tURL():New( cURL ), parce que nous avons un petit problème de conversion DOS <-> Windows.

   && Domeu test - TipTest.PRG
   &&   override cUrl because of translation issue between Windows and
   &&   dos around the & character

   &&  smtp://Adresse_Email_Emetteur@serveur_smtp/Adresse_Email_destinataire
   &&  A noter: l'adresse_Email_Emetteur DOIT UTILISER &at; à la place du @!!!
   cUrl := 'smtp://stock&at;mydomain.be@relay.our_provider.be/dominique@customer_domain.be'
   && cFile est le fichier contenant l'mail à envoyer... 

   &&    attention, ce fichier doit contenir le header du mail!
   && C'est là que le site de DAN intervient
   cFile := "+c:\tipmail.txt"
   oUrl := tURL():New( cUrl )


Plus loin dans le code, l'on retrouve l'envoi du contenu du mail

IF oClient:nAccessMode == TIP_WO .OR. ( oClient:nAccessMode == TIP_RW .AND. bWrite )
         oClient:exGauge := { | done, size| ShowGauge( done, size ) }

         IF oClient:WriteFromFile( cFile )
            @7, 5 SAY "Data sucessfully sent"
         ELSE
            @7, 5 SAY "ERROR: Data not sent " + oClient:lastErrorMessage()
         ENDIF
      ELSE

      ...

Le corps du mail
Comme précisé, le corps du mail est un fichier qui doit impérativement contenir le header du mail.
Qui sait encore comment constituer un tel header (il n'aura fallu quelques recherches pour y arriver)

Voici un exemple de corps d'émail avec son header

Return-Path: <noreply@our_domain.be>
From: Stock Program <noreply@our_domainbe>
To: Dominique MachinChose <dominique@customer_domain.be>
Subject: Notification de Changement de Prix - OUR_DOMAIN SPRL
MIME-Version: 1.0
Content-Type: text/plain;
    charset="iso-8859-1"
Cher client,

*** LE CONTENU DE CET EMAIL EST GENERE AUTOMATIQUEMENT ***
*** NE PAS REPONDRE A CE MESSAGE ***

Nous avons le plaisir de vous informer des modifications de prix suivantes:

xxx
xxx
xxx

Cordialement
L'équipe de OUR_DOMAIN SPRL.

En cas de problème, veuillez contacter celui_la@our_domain.be


Comme vous pouvez le constater, il y a un header relativement sommaire... ce dernier était pourtant nécessaire pour le bon acheminement du mail.
Chaque fournisseur de service à ses propres exigences concernant le contenu minimum du header

Résultat du test
Réceptions des messages sur un client mail
Contenu du message
Comment constituer le Header/Entete d'un Mail?
Vous n'imaginez pas combien il est difficile de trouver un bon site de documentation (abordable) à propos des Header de mail. Il y aura forcement les spécifications de notoriété publique mais si ces dernières sont complètes, elles sont souvent impossible à utiliser comme premier document d'apprentissage :-/

Je vous recommande chaudement le site de Dan, une perle dans le domaine

mercredi 7 mai 2014

Application console en Python sous Windows

Introduction
C'est un peu par hasard que je suis tombé sur le dépôt Console-2010... une bibliothèque Python qui vise à faciliter les développements de type console sous Windows.

Comme déjà précisé, si Python est un langage extrêmement puissant, réaliser des interfaces n'est pas son point fort.
Vous réaliserez vite que réaliser un programme console avec une ligne d'invitation (pour l'encodage de données) ne coule pas forcément de source :-/

J’accueille donc un tel projet les bras grand ouverts


Informations produite par l'auteur
==================
The console module
==================

This kit contains a simple console interface for Windows 9X/NT/2K/XP.
It provides a cursor-addressable text display, plus support for
keyboard and mouse input.

The console interface also comes with a command editing and history
implementation (readline) for Windows platforms.

Enjoy /F

fredrik@pythonware.com
http://www.pythonware.com
....
----------------------------------------
_wincon.c   the low-level driver for Win32

Console.py   high-level interface

readline.py   (experimental) command history and editing for Windows.
    to enable this module, just put it on the Python path.

setup.py   build/installation script

*.html            documentation

demo*.py   various demo and test scripts (the latter are in varying
tests/*.py        shape)


Plus d'information

Introduction à TkInter - Interface graphique en Python

Si Python est extrêmement puissant pour les tâches d'automatisation, force est de reconnaître qu'il lui manque quelque-chose si l'on veut développer des interfaces graphiques.

A vrai dire, Python est resté ouvert... sans volonté de s'attacher à une interface. En gros, c'est a vous de choisir et à la mettre en oeuvre.
Il existe de nombreuses solutions disponible mais je viens justement de tomber sur une chouette documentation d'introduction à TkInter (un interface graphique pour Pyhton).


Lecture a conseiller donc:
Mais à voir aussi

vendredi 2 mai 2014

Sublime Text: Un éditeur de code sympa pour code Python

Vous codez assez régulièrement en Python (ou autre langage) et vous cherchez un éditeur de texte open-source?

Vous pouvez vous pencher sur Geany déjà abordé dans un précédent article.
Si ce dernier ne remplit pas vos attentes, vous pouvez aussi vous pencher sur Sublime Text qui est vraiment pas mal.

Sublime Text - Simple et efficace... avec de nombreuses fonctionnalités
Disponible pour Mac, Windows et Linux.
Pour plus d'information, voir le site officiel de Sublime Text

Merci à Xavier D. pour cette information intéressante.

lundi 5 août 2013

Decouvrir Node.js en Français

Juste un petit billet pour référencer une série d'article (un tutoriel) à propos de Node.js

Comme Mathieu le dit si bien:
Node.js, c'est un peu l'outil dont les développeurs web entendent parler tout le temps en ce moment. Il y a ceux qui connaissent (et qui ont l'air de s'éclater en l'utilisant) et il y a ceux qui se disent "Bon, ça serait bien que j'y jette un oeil, mais je ne sais pas par où commencer".
Vous êtes de ceux-là ? Ca tombe bien, je l'ai été moi aussi ! ;)

Ses premières pages représentent vraiment une très bonne synthèse très agréable à lire, la suite doit certainement être tout aussi captivante.

Article à lire donc: "Des applications ultra-rapides avec Node.js" par Mathieu Nebra sur le siteduzero.com.

Voir aussi Node.js sur Wikipedia.

samedi 22 juin 2013

Environnements de développement sous Android

24/06/2013: Suite au commentaire de Joseph, j'ai ajouté PhoneGap qui semble être une alternative vraiment très intéressante.

Il existe bien entendu l'environnement de développement recommandé qui est le SDK Android qui s'appuie sur Java et Eclipse... mais aussi d'autres environnements comme SimpleApplication, AndroidScripting, AIR for Android qui peuvent se montrer intéressant a différents niveaux.

Voici quelques références de choix pour en faire rapidement un petit tour:

Android SDK
C'est l'environnement qui fait le plus, le mieux, le plus sérieux, le plus recommandé.... mais aussi le plus "complexe" à prendre en main.
Le temps et l'énergie à investir est forcement plus importante... mais au final, vous serez aussi mieux récompensé de vos efforts. 
 
PhoneGap
PhoneGap présente une approche qui peut déstabiliser mais pourtant vraiment puissante dans sont ensemble.
PhoneGap propose d'utiliser vos connaissances Html 5, CSS et JavaScript pour faire du développement sur Android, iOS, Bada, etc.
JavaScript est facile d'apprentissage et Html 5/CSS largement documenter sur le Net. Par le passé, JBoss à déjà prouvé qu'il était possible de construire des applications robustes en javascript.

Phone Gap supporte de nombreux Frameworks JavaScript 
 Et depuis la version 2, PhoneGap supporte également les PlugIns . Grâce à eux, il existe maintenant des API pour accéder au différents senseurs de la plateforme d'exécution (voir API Référence).

Organisation structurelle de PhoneGap

Ce n'est pas tout, Phone Gap dispose d'un environnement de programmation "DW" est capable d'accéder a un service de stockage de données (dit Data API).


PhoneGap est probablement l'une des alternatives les plus intéressantes à Android SDK.
Merci à Joseph pour son commentaire décidément très pertinent!!!

Plus d'informations:
 
Programming Made Simple
Un environnement de programmation qui convient visiblement aussi pour android. Il s'agit d'un langage type BASIC simple à apprendre et à utiliser.

Android Scripting Environnement
Certainement mon préféré car il permet d'obtenir des résultats rapidement sans devoir investir un temps colossal.
Permet de faire fonctionner vos scripts en service ou démarré via l'interface  locale.
Cet environnement permet d'exécuter des scripts Python, Lua et BeanShell.

Air pour Android
Environnement poids lourds de Adobe (donc payant) qui permet d'écrire des applications pour iPhone et iOs.

Son avantage: Adobe AIR est quand même très répandu et il doit être assez facile de trouver de la littérature pour ce produit.
Paraît-il que la courbe d'apprentissage est plus rapide que celle du SDK...
Titanium Mobile Application

Environnement de développement très étendu qui permet de créer des applications pour de nombreux environnement (Windows, Android, BlackBerry, iOs, ...) supportant déjà de nombreux services.

Je ne sais qu'en penser car l'investissement en temps est visiblement aussi important qu'avec le SDK Android officiel mais celui-ci serait orienté JavaScript et HTML5 (cela n'empêche pourtant pas l'appel des API).

Par contre, il semblerait avoir été utilisé pour créer 50.000 Apps donc celle de LegoLand! Voir ici les autres "App showcase".

Plus d'info:

mardi 7 mai 2013

Qt-Creator - PyQt4 - Eric

C'est en lisant un article relatif a Arduino, a savoir "Building a remote controlled Arduino robot based on the Turtle-2WD mobile platform" que j'ai découvert Qt-Creator, PyQt et ERIC par le plus grand des hasard.

Qu'est-ce que Qt-Creator?
Selon cet article de Wikipedia, c'est en environnement de développement Qt intégrant un Designer.
Source: Wikipedia

Qt Creator est un environnement de développement intégré multiplate-forme faisant partie du framework Qt. Il est donc orienté pour la programmation en C++.
Il intègre directement dans l'interface un débogueur, un outil de création d'interfaces graphiques, des outils pour la publication de code sur Git et Mercurial ainsi que la documentation Qt. L'éditeur de texte intégré permet l'autocomplétion ainsi que la coloration syntaxique. Qt Creator utilise sous Linux le compilateur gcc; il peut utiliser MinGW ou le compilateur de Visual Studio sous Windows.


Qt-Creator est en autre utilisé pour créer l'interface de l'article "Building a remote controlled Arduino robot based on the Turtle-2WD mobile platform"
Source: Building a remote controlled Arduino robot based on the Turtle-2WD mobile platform

Vous trouverez des liens intéressant sur:
 
Qu'est ce que PyQt?
Lorsque l'on apprend que Qt est bien plus qu'un simple framework graphique (voir la description des modules sur la page de RiverBankComputing), il est facile de l'envisager comme alternative pour remplacer notre logiciel vieillissant compilé sous Clipper.
Etant très orienté Python, je me suis demandé s'il existait un équivalent de Qt-Creator pour Python... et quelques recherches sur le net font vite resurgir le projet PyQt... visiblement stable.

Selon le site de PyQt:
PyQt is a set of Python v2 and v3 bindings for Digia's Qt application framework and runs on all platforms supported by Qt including Windows, MacOS/X and Linux. PyQt4 supports Qt v4 and will build against Qt v5. PyQt5 supports Qt v5. The bindings are implemented as a set of Python modules and contain over 300 classes and over 6,000 functions and methods.

Lien intéressant:
Qu'est-ce que ERIC?
Eric is a full featured Python and Ruby editor and IDE, written in python. It is based on the cross platform Qt gui toolkit, integrating the highly flexible Scintilla editor control. It is designed to be usable as everdays' quick and dirty editor as well as being usable as a professional project management tool integrating many advanced features Python offers the professional coder. eric4 includes a plugin system, which allows easy extension of the IDE functionality with plugins downloadable from the net.

Plus d'information sur la page du projet.

vendredi 1 mars 2013

Choisir un "Messaging Protocol" pour ses applications

L'une des tâches les plus importantes de l'architecte logiciel est de sélectionner les fondations de son application.
Les applications orientées Cloud et distribuées étant de plus en plus courantes, car elles permettent de répartir les charges, le choix d'un "protocole de messagerie applicatif" est un point critique/sensible de  l'architecture.

Qui peut dire qu'il en connais les subtilité?
Parmi les solutions propriétaires, il existe aussi quelques solutions open-source utilisées dans des projets de très grande envergure.

L'article suivant présente:
  • AMQP - Advanced Message Queuing Protocol
  • MQTT - Message Queue Telemetry Transport
  • STOMP - Simple/Streaming Text Oriented Messaging Protocol ... l'un des seula être "text based"
  • RabbitMQ - Un message broker multi-protocol
L'article source vous présente une introduction a toutes ces technologies.
Une source intéressante pour démystifier ces plateformes

jeudi 1 novembre 2012

Introduction à GIT

Git est devenu un système de versionning de fichier très populaire.
Comme je m'intéresse à GitHub pour la publication de librairies, je passe forcement par l'étape de GIT, ce que c'est et comment cela fonctionne.

Voici donc une excellent référence qui explique ce qu'il faut savoir sur GIT