Yun – Expériences & découvertes

13 août 2014 in Microclub

Le champ d’application

Dans un article précédent, je montrais le besoin d’activer une DHCP pour utiliser pleinement un Arduino Yun.

Le présent article répond à quelques questions légitimes de l’utilisation et des possibilités de cette plateforme bi-processeur. Voici rapidement les caractéristiques du Yun. C’est un hardware similaire au Leonardo, équipé du CPU Atmel ATmega32U4, mais il comprend – c’est ici l’essentiel – un second CPU Atheros AR9331, qui tourne un Linux. OpenWrt est adapté pour le Yun, appelé Linino. L’OS est sur une flash de 16 Mb ; il en utilise 9 Mb. Il a des connexions Ethernet ; Wifi et USB-A supplémentaires ; un port pour mini carte SD. L’alimentation se fait en 5V, pas de régulateur. Soit par la mini USB, soit par les pins 5V et VCC. La partie Arduino communique avec le Linux via le serial1.

Les détails du système sont décrits ici (en anglais) : http://arduino.cc/en/Guide/ArduinoYun .

Chaque unité à son propre bouton de reset ; ainsi que le WiFi. Gag : il faut presser 2 x pour relancer le 32U4, donc le sketch (soit le programme) Arduino ; il se redémarre en quelques secondes pendant que la liaison USB tombe et se reconnecte.

Redémarrer le Linino prend plus de temps, env. 60 sec ; le Wifi n’est actif qu’après 1’ 15’’. Ceci rend donc long les différents essais de configuration et/ou de paramètres.

Au début, commencez par mettre à jour votre version de Linux, en en copiant l’image binaire sur une SD, à introduire dans son logement + redémarrage. Ça va vite. Les mises à jour, pas le démarrage…

Travailler avec le Wifi

M’a occasionné quelques déboires. Celui-ci n’est pas performant, dans la mesure où mes 2 PCs portables se connectent sans problème avec un débit entre 18 et 36 Mb, selon où ils sont placés sur le bureau ; tandis que le Yun ne « croche » qu’une fois sur deux ; et perd la connexion par la suite.

Si le Yun ne croche pas sur le routeur Wifi, il se met en en mode serveur, et propage un nom Wifi du genre ArduinoYun-XXXXXXXXXXXX. Seule la page de config est atteignable. Et on reconfigure… pour la n ième fois. D’où mon souhait de développer, configurer et tester avec une liaison Ethernet câble ; puis le programme terminé, le rapprocher du routeur Wifi. Ce dernier est au sous-sol, alors que le bureau est au premier étage.

Travailler avec le Linuino

Comme tout bon Linux, il offre la possibilité de se connecter en console – donc avec PuTTY http://www.putty.org/ – Mais il faut connaître l’adresse IP du Yun, of course. On se logue en ‘root’ avec le PW que l’on aura mis dans la page d’accueil initiale. Le Linuino comporte l’éditeur Nano, ce qui facilite les choses pour les modifications de fichier.

Nom du Yun propagé sur le réseau

Le Yun n’utilise pas le classique Netbios pour propager son nom réseau, même si l’EDI Arduino le trouve, le PC ne le voit pas. Il faut donc le pinguer par son adresse ; ce n’est pas pratique. Deux solutions s’offrent pour qu’il soit reconnu nommément sur PC, par exemple par la commande PING :

-        Installer le programme Apple « Bonjour », destiné aux imprimantes sur LAN
-        Modifier le fichier Linux /etc/network

root@yunmasur:~# cat /etc/config/network 

config interface 'loopback'
       option ifname 'lo'
       option proto 'static'
       option ipaddr '127.0.0.1'
       option netmask '255.0.0.0'

config interface 'lan'
       option proto 'dhcp'

config interface 'wan'
       option ifname 'eth1'
       option proto 'dhcp'
       option metric '10'
       option hostname 'yunmasur'

Note 1: si les 2 interfaces Ethernet et Wifi sont connectées, un ping selon le hostname va sur la 1ère interface qui s’est connectée, donc l’Ethernet.

Note 2 : mes explications se rapportent à un Yun qui s’appelle « yunmasur ». Bien entendu, vous l’interprétez avec le nom du Yun que vous venez de déballer et d’essayer !

Pour le stockage de données sur carte SD, on trouve comme exemple: http://arduino.cc/en/Tutorial/YunDatalogger . Et pour lire des températures et les afficher sur une page WEB, il y a bien un projet qui ressemble à ça, ici : http://arduino.cc/en/Tutorial/TemperatureWebPanel . Cependant, d’après le nombre de questions et de posts dans le forum, tout laisse croire qu’il n’est pas du tout clair. Voir incomplet, à tout le moins dans sa partie WEB.

Où et comment doivent être les fichiers ?

Rien n’est bien expliqué ; si on les voit depuis Linux ou depuis l’URL, ça change forcément. Mais comment ? La structure des fichiers sur la SD doit être selon les 2 possibilités ci après.

Servir une page WEB statique

La SD card doit contenir la page WEB et les fichiers annexes, comme les images ou les CSS, dans le répertoire ainsi: /arduino/www/index.htm et le Yun répond à l’URL yunmasur.local/sd/

1_index

Et avec l’extension « html », c’est bien ce fichier qui vient:

2_index

Visiblement, tout ce qui est dans la SD /arduino/www/ est servi, on peut y mettre des pages, des images et des scripts JS. Pour du PHP, il faudra avant l’installer sur le Linino. A ce stade, la partie Arduino sketch n’est pas sollicitée.

Utiliser une URL par le sketch

L’exemple de base est le programme Bridge.ino qui démontre comment lire une partie de l’URL au profit du sketch. Sur la carte SD, les répertoires : /arduino/www/ (et n’importe quoi, à partir de ça) suffisent.

Les deux URLs suivantes allument et éteignent la LED13, placée d’office sur le Yun. Pour voir à quelle vitesse, je les ai réunies dans un batch, qui tourne en rond. Les URL sont lancées par un programme assez génial fonctionnant en ligne de commande : cURL, qui est installé à la racine du disque C :

:start
c:\curl\curl http://Yunmasur.local/arduino/digital/13/1
c:\curl\curl http://Yunmasur.local/arduino/digital/13/0
goto start

Vous vous attendez à un clignotement rapide, imperceptible à l’œil ? Eh bien non. Temps d’une phase ~2,8 sec. (f = 0.17 Hz)

La partie de l’URL passée au sketch est celle en jaune. Après une connexion, on peut lire la partie jusqu’au ‘/’, après l’URL de base Yunmasur.local/arduino/ , ainsi :

void process(YunClient client) {
// read the command
String command = client.readStringUntil('/');

Dans ce cas : ce sera « digital ». Ensuite, c’est assez facile de lire le reste pour en déduire le n° de sortie (13) et l’état, 1 ou 0. S’il n’y a pas d’état, le sketch est prévu pour rendre l’état de la pin 13.

L’usage du C++ String

Les exemples font un usage assez abondant de manipulation avec la classe String http://arduino.cc/en/Reference/StringObject . C’est une facilité tentante… la doc de la librairie dit :

You can concatenate Strings, append to them, search for and replace substrings, and more. It takes more memory than a simple character array, but it is also more useful.

Avec un processeur doté de 2500 octets( !) est-ce bien raisonnable ? Une recherche sur le WEB l’indique : c’est non ! C’est vite la source de déboires et de comportement peu catholique. Liens en relation :

http://stackoverflow.com/questions/17972523/are-there-limits-on-string-length-in-arduino et

http://forum.arduino.cc/index.php/topic,85491.0.html

Donc String, c’est bien pour les exemples, car ça simplifie l’écriture. Sur un PC qui est doté de Gb de mémoire, OK. Mais pour la sûreté et la pérennité du fonctionnement, dans le cas de codage de programme embarqué, on évite les pratiques qui font de l’allocation de mémoire à la tout va.

Voir le Yun travailler

Pour cela, il faut se connecter avec PuTTY en console, et lancer la commande top. On voit alors que le programme Python bridge.py est le plus gros consommateur de CPU et de mémoire.

3_console

Le projet (en cours)

Il comporte 3 capteurs de température disposés pour mesurer sur ma chaudière:

-        L’eau de retour du circuit des capteurs solaires
-        L’eau solaire (200 l)
-        L’eau chaude sanitaire (200 l aussi)

Le programme doit me permettre de voir via un browser, les températures actuelles ; il doit stocker dans un fichier une ligne avec la date et l’heure, les 3 valeurs ; ceci toutes les 10 minutes. Les données seront au format tabulé de manière à être exploitable par Excel. Pour ce faire, j’ai utilisé 4 techniques :

-        La lecture de sondes one-wire
-        La lecture du temps Linux
-        Le stockage de données sur carte SD
-        Un interfaçage WEB avec le sketch.

Il fonctionne, mais n’est pas encore présentable, ce sera pour plus tard…

Yves Masur (8/2014)

Références :

cURL: http://fr.wikipedia.org/wiki/CURL
Arduino Yun: http://arduino.cc/en/Main/ArduinoBoardYun
One wire : http://playground.arduino.cc/Learning/OneWire

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email

Serveur DHCP avec Windows 7

15 juin 2014 in Microclub

Pourquoi un DHCP ?

Avec le développement sur l’Arduino Yun, me voici quelque peu ennuyé ; tout ne fonctionne pas comme dans le tuto. Les détails de cette expérience feront l’objet d’un article distinct ! Dans l’immédiat, j’ai besoin de le mettre sur le réseau câblé, avec une adresse connue.9-yun

Pour cela j’ai besoin d’un programme DHCP. Qu’est-ce que le DHCP ? Selon Wikipédia : Dynamic Host Configuration Protocol (DHCP) est un protocole réseau dont le rôle est d’assurer la configuration automatique des paramètres IP d’une station, notamment en lui affectant automatiquement une adresse IP et un masque de sous-réseau. DHCP peut aussi configurer l’adresse de la passerelle par défaut, des serveurs de noms DNS et des serveurs de noms NBNS (connus sous le nom de serveurs WINS sur les réseaux de la société Microsoft).

À ne pas confondre avec le DNS (http://fr.wikipedia.org/wiki/DNS ) le Domain Name System – qui s’occupe de faire la relation entre un nom (en fait une URL) et une adresse IP. Le DHCP attribue une adresse IP à un système, parmi une plage d’adresses, avec une durée limitée.

La configuration initiale

Voici ma config, qui est assez classique et probablement proche de la vôtre, hormis peut-être la barrette électrique:

-        Modem routeur Wi-FI NAT, adresse fixe 192.168.1.1
-        Un petit PC 14’ N145-YM, Wi-FI DHCP et une connexion LAN libre
-        Le module Arduino Yun, Wi-FI DHCP et une connexion LAN libre
-        Portable lourd, PC 17’ Vostro, Wi-FI DHCP
-        Sa connexion LAN, fixe : 10.1.0.7
-        La Barrette CBM, sur LAN, en DHCP, mais par défaut en 10.1.0.1

Ces 2 dernières sont câblées en direct ; la barrette peut donc accepter une adresse DHCP si elle est fournie. De plus, elle propage son nom « CBM11 » par NetBIOS. Le modem routeur Wi-Fi permet à la maisonnée d’aller sur l’Internet ; d’autres clients y sont connectés : PCs, PCs portables, imprimantes, NAS, seconde barrette et même mon portable Android… Bref il y a du monde.

Pourquoi une adresse fixe ?

L’attribution d’une adresse IP fixe est nécessaire pour les serveurs (on doit savoir où les trouver), sur des petits systèmes simples de disposant pas de mécanisme DHCP, ou qui ne propagent pas leur nom sur le réseau. Ou pas comme on l’aimerait. L’adresse fixe est aussi plus sûre dans certaines configurations techniques, sa présence sur le LAN lors du boot est forcément plus rapide. C’est notamment le cas des switchs managés et des routeurs : on imagine l’horreur en cas de coupure de courant si ces éléments clef commencent à se demander parmi une adresse…

Dans ma config, sont en adresse fixe : le modem routeur, les imprimantes, les NAS.

Pourquoi pas aussi une adresse pseudo-fixe ?

Si l’adresse fixe se révèle un besoin, c’est parfois pénible à mettre en œuvre et tout aussi difficile à modifier par la suite. Une possibilité intéressante est de programmer le serveur DHCP afin qu’il délivre toujours la même adresse à un système client. Ainsi, d’un coup d’œil sur la liste, on peut voir les réservations et les modifier facilement au besoin. Connexion/déconnexion, le tour est joué : le système client prend cette adresse. Les modem-routeurs récent le font d’office. Plutôt que d’attribuer le pool d’adresse dans l’ordre des démarrages des machines, selon leur MAC-adresse, il attribuera celle enregistrée auparavant ; mais ce n’est pas suffisant. Rien ne nous garantit que l’adresse soit conservée ad aeternam. Il faut pouvoir l’enregistrer dans une liste.

Ne cherchez pas ce terme de « pseudo-fixe » sur le Net ; je l’ai défini pour l’usage de nos machines dans le cadre d’appels d’offres pour mon travail. Un ennui peut toutefois découler de cette méthode : une machine tombe en panne de communication, et sa carte réseau est changée. Elle est donc réparée et retrouve le réseau, mais elle ne fonctionne toujours pas ! Son adresse MAC a changé. Et donc son adresse IP aussi !

Serveur DHCP

Une recherche montre que W7 peut servir de serveur DHCP si une carte réseau est configurée pour le partage Internet (par ICS), ici : http://answers.microsoft.com/en-us/windows/forum/windows_7-networking/make-windows-7-act-as-a-dhcp-server/8ff345f2-99b5-4670-bb6f-32d7bb63de3c

Il y a toutefois des limitations : l’adresse fixe est imposée, et les écrans abscons proposent de qualifier le sous réseau public, bureau ou privé. Cela a une incidence sur le mode dit de « découverte du réseau. »

A contrario, le programme gratuit DHCPServer (http://sourceforge.net/projects/dhcpserver/ ) permet de construire exactement ce que l’on veut. La version utilisée ci-après est la 1.61, elle occupe 1,3 Mo dans c:\OpenDHCPServer, soit la racine du disque dur. Le programme se démarre soit à la main, soit en service Windows.

Avant de le démarrer, il faut préparer la configuration, mais c’est assez simple (même pour les utilisateurs n’ayant pas des connaissances étendues en DHCP) via le fichier texte « OpenDHCPServer.ini ». Il faut également fixer l’adresse IP d’une carte du PC serveur – ce qui, dans mon cas, est déjà fait – par le Panneau de configuration -> Réseau et Internet -> Connexion réseau : choisir la carte réseau. Puis : Propriété – Gestion de réseau. Cliquer ensuite la ligne cochée Protocole Internet version 4(TCP/IPv4) et le bouton [Propriétés].

Les infos de passerelle et du DNS ne sont pas utiles pour notre utilisation.

Ensuite, on va définir une plage d’adresses à attribuer par le DHCP:

2-DHCP_range

Nouvelle configuration

Il y a 4 machines qui seront dans ce sous-réseau. Il nécessite un petit routeur à 4 ports, de ce genre :4-switch

-        Le PC Vostro, qui sera le serveur en 10.1.0.7, hors de la plage dynamique
-        Le PC N145-YM, dont on va pseudo-fixer l’adresse en 10.1.0.145
-        La Barrette, dont on va fixer l’adresse en 10.1.0.1, pour la maintenir tel quelle
-        Et l’Arduino Yun, qu’on va placer en 10.1.0.11

Seule cette dernière est importante ; le PC N145 pour le retrouver plus facilement, vu que sa RAM est si faible que j’ai désactivé un maximum de services dont les gadgets de découverte de réseau, par exemple. Pour la Barrette, c’est juste pour la maintenir ou elle était.

Voici les paramètres, selon les adresses MAC :

3-DHCP_pseudo-fixe

Un coup d’œil dans les logs montre que tout est OK :

[15-Jun-14 20:43:49] Network changed, re-detecting Static Interfaces..
[15-Jun-14 20:43:49] Lease Status URL: http://127.0.0.1:6789
[15-Jun-14 20:43:49] Listening On: 192.168.178.1
[15-Jun-14 20:43:49] Listening On: 192.168.56.1
[15-Jun-14 20:43:49] Listening On: 10.1.0.7
[15-Jun-14 20:43:49] Listening On: 192.168.216.1
[15-Jun-14 21:35:42] Host e8:11:32:7d:92:e0 (N145-YM) allotted 10.1.0.145 for 36000 seconds
[15-Jun-14 21:38:58] Host 90:a2:da:fc:0a:c0 (Host90a2dafc0ac0) allotted 10.1.0.110 for 36000 seconds
[15-Jun-14 21:41:33] Host 00:04:a3:00:00:00 (Host0004a3000000) allotted 10.1.0.1 for 36000 seconds

Comme j’ai des cartes virtuelles, dues à une config prévue pour de la virtualisation, elles sont aussi servies. Ceci laisse entrevoir les possibilités à d’intéressantes expériences en mode virtuel.

La page WEB du DHCP Server montre tout ça de manière synthétique.

9-DHCP_page

On remarque que toutes les adresse statiques (pseudo-fixes) sont prises; et que seul le nom du PC N145-YM est inscrit, les autres sont indiquées sous Host, suivi de l’adresse MAC. Pour savoir qui est qui, il suffit de déconnecter/reconnecter le LAN et d’observer l’écran (ou le log).

Configuration Arduino Yun en IP pseudo-fixe

Donc maintenant, le module Arduino est connecté aux 2 PCs par câble. On peut consulter sa page WEB, lancer une console Linux avec Putty, le programmer en connaissant de manière sûre son adresse IP. La dépendance et l’incertitude dues à un Wi-Fi instable sont éliminées. On peut avancer.

Yves Masur (6/2014)

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email

Multitâche, Système Embarqués

3 mai 2014 in Microclub

frontpage

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email

Update de HDD

30 mars 2014 in Microclub

Le disque dur du PC commence à se faire un peu petit? Plus des 3/4 de sa capacité remplie de musique, de photos, de films? Voici une technique ultra simple et… qui a fonctionné du 1er coup. Assez rare pour être mentionnée!

En fait, c’est simple pour autant qu’on aie pris quelques précautions en amont. Il faut que les données de ce type (soit des DATA, différents des programmes) aient bien été séparément enregistrées. Pour ma part, sur le disque C: qui est un SSD figurent le système, les programmes (C:\Program Files), les données de faible taille. Le profil (C:\user\Yves\Documents) est bien sûr l’objet de backup réguliers, et avec Windows 7, ça marche plutôt bien. Le backup copie les fichiers pointés par les liens – donc inutile de lancer un second backup de D: qui contient réellement les fichiers. Pour plus de détails sur l’organisation des données, voir un précédent article ici, qui précise tout ça: http://microclub.ch/2012/08/06/installer-un-disque-ssd-et-re-installer-w7-et-les-programmes/ .

Avec en tête l’idée de toujours déposer les données volumineuses sur une autre unité. On précise par des liens symboliques (commande MKLINK, en administrateur) que les images et les sons sont déposés sur la seconde unité physique. Justement, celle que l’on va remplacer, par les étapes suivantes:

  • connecter le nouveau HDD au PC
  • copier les données
  • échanger les disques
  • vérifier que les liens symboliques fonctionnent toujours…

Station d’accueil pour HDD

La connexion est faite par un dispositif que j’ai trouvé chez Conrad: http://www.conrad.ch/ce/fr/product/971937/

Ce bidule permet de connecter un disque dur 3’1/2 ou 2’1/2 via USB sur le PC. Une alimentation et un bouton permettent son enclenchement; le PC le voit comme un périphérique de stockage de masse. Ce qu’il nous faut, quoi.

Copier les données

Après l’inévitable formatage (NTFS, please), pour lequel le nouveau HDD via la station d’accueil a pris la lettre F:, il faut faire attention à tout copier du disque D: à F:, si l’on veut que les liens symboliques fonctionnent. Tout, c’est les droits, les fichiers cachés, les ACL, les liens symboliques (et non les fichiers sous-jacents).

La commande via CMD.EXE lancé en admin, est: xcopy d:*.* /S /H /O /B  f:

ça prend effectivement un peu de temps…

Échange des disques

Ensuite, démonter le PC, enlever l’ancien D: et y placer le nouveau F:. Remontage, démarrage… Windows réfléchi plus longuement que d’habitude… Mais démarre normalement. Mais voilà: le nouveau disque a conservé la lettre ‘F’! Un clic sur Ordinateur – Gérer – Stockage – Modifier la lettre de lecteur et les chemins d’accès; on corrige en D: et un petit CHKDSK. Puis on vérifie…

Tout fonctionne! C’est pas nickel, tout ça?

Yves Masur (3/2014)

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email
Avatar of Goulu

by Goulu

Les jours noirs de la crypto-monnaie – Agence Science-Presse

5 mars 2014 in Non classé

See on Scoop.itDr. Goulu

Agence Science-Presse Les jours noirs de la crypto-monnaie Agence Science-Presse (Agence Science-Presse) Crise financière dans le monde de la monnaie virtuelle: un demi-milliard$ US en monnaie virtuelle aurait été dérobée poussant l’une des plus…

See on www.sciencepresse.qc.ca

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email
Avatar of Goulu

by Goulu

IBM dévoile sa nouvelle puce en graphène

5 mars 2014 in Non classé

See on Scoop.itDr. Goulu

Le graphène pourrait un jour remplacer le silicium dans les semi-conducteurs. Mais ce composant constitué d’atomes de carbone reste difficile à produire.

See on www.rtflash.fr

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email

A vendre logiciel serveur

28 février 2014 in Microclub

Suite à une erreur de commande de ma part, je vend une licence neuve pour le logiciel :

Microsoft Windows Server 2012 Essentials OEM français

à moitié prix, soit CHF 189.-

Pour rappel ce logiciel est la version home et petites entreprises de serveurs Microsoft Windows. Elle est conçue pour être installée et gérée au moyen d’une interface intuitive et simple.

Vous trouverez la description des possibilités de ce serveur sur ce lien : http://technet.microsoft.com/fr-fr/library/jj200119.aspx

Je suis aussi prêt à donner un coup de main pour l’installation du logiciel sur un PC serveur et sur des PC clients.

Jacques Burnand

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email

Python et les objets statiques

26 janvier 2014 in Microclub

Les variables statiques

En C/C++, il est l’usage d’avoir des variables statiques, c’est-à-dire non-dynamiques, pour le comptage d’objets ou pour des flags en code embarqué, ou l’on évite comme la peste les new et delete. C’est intégré au langage, avec le mot clef ‘static’, au cas où la définition globale – hors des accolades – n’y suffit pas. Une variable statique est aussi privée au module, afin de réduire sa visibilité.

Déclarer une variable static revient à lui donner une adresse mémoire définitive. Au niveau du module, on le comprend aisément. C’est plus surprenant dans une fonction : on la retrouve inchangée depuis le dernier appel – a moins bien sûr que la fonction en question ne la modifie ! Cette persistance est valable même si elle est déclarée à l’intérieur d’un objet alloué dynamiquement. Mais en Python, comment reproduire ce comportement ?

Petite digression : dans ce texte, j’utilise souvent le mot fonction par habitude, alors que la terminologie Python est : method.

A priori, « static » va l’encontre de la programmation orientée objet… Mais parfois, on aimerait un objet unique, a dispo de manière globale, déclaré et initialisé au niveau du module. Il serait ‘objet’ pour la beauté de la pensée, donc de la programmation, plutôt qu’un fatras de variables globales ; même si elles sont utilisées au niveau du module. Cet objet serai statique parce que l’instancier ne fait que de compliquer le code, voire de prendre le risque de dédoubler l’objet par mégarde alors qu’il doit être unique.

C’est un peu tordu : si un objet n’est pas instancié… il doit être un peu instancié quand même, puisque par définition, une variable statique doit exister au moment où le programme tourne. Les exemples de codes sont entrés au niveau de la console Python ; ici en version 2.7.2, dans l’environnement (gratuit) PyCharm Community : http://www.jetbrains.com/pycharm/

Variable de classe statique

Bien. Mais comment, en Python,  reproduire ce qu’on sait si bien faire en C/C++ ?

Python permet la définition de variables statiques tout court si, hors d’une classe, définie au niveau du module; et dans un objet, si défini  hors des fonctions de la classe. On s’intéresse à cette possibilité. Dans un tel cas, elle est accédée par le nom de la classe.

1-con-Static

A priori, ça fonctionne fort bien ! En utilisant la classe de base, soit Toto – avec la majuscule qui symbolise la déclaration de classe – l’attribut ‘a’ de classe est accessible et modifiable. C’est pratique, et on peut toujours instancier la classe normalement, p. exemple dans la variable x :

1-con-Static-instance

Ha. Hem… Ça donne 4, on attendait un 6. L’attribut ‘a’ de la classe reste donc inchangé ; de plus c’est cette valeur (donc : 4) qui serait utilisée à la prochaine instanciation (par exemple : y = Toto() ). On peut donc compter des objets, par exemple. Par contre, dès qu’on touche à la variable (de même nom) d’une instance, celle-ci devient indépendante et suit la dynamique de l’instance.

En prime, (c’est Python tout craché, ça!) on peut toujours ajouter une variable au vol à la classe de base :

1-con-Static-add_var

On la retrouve dans les objets précédemment instanciés, qui se rabattent sur la classe de base pour l’afficher. Bien entendu, on peut modifier l’instance x ou y, sans que cela touche la classe de base, pour à nouveau, avoir une variable d’instance propre et indépendante.

Les fonctions et le statique (@staticmethod)

Mais pour les fonctions ? Ça ne marche pas si bien :

20-fonction

Python pas content… On beau essayer de passer la classe de base par Toto.prn(Toto), seule une version instanciée de Toto() fonctionne, comme le montre l’essai avec x. Sinon, on obtient l’erreur « unbound method prn() … »

Donc, on doit avoir une instance pour que la fonction… fonctionne. On peut toutefois forcer Python à intégrer la fonction dans la classe de base. L’astuce est de la précéder de la ligne : @classmethod. La fonction reçoit en paramètre classiquement sa propre self-référence. Et là :

2-fonction_staticmethod

On y arrive ! OK pour le statique. Avec une instance, ça se gâte :

22-fonction_staticmethod_x

On doit donner comme paramètre d’appel de fontion le nom de l’instance, alors qu’avec une classe « classique », si j’ose dire, c’est implicite. Pas terrible comme écriture de code, un peu verbeux à mon goût. Autre solution, c’est de virer l’argument, et de coder :

     def prn() :
           print Toto.a

On en revient à une méthode de module, écrite hors de la définition de classe…

Fonction de classe de base (@classmethod)

Un autre décorateur, @classmethod, permet de lier la fonction à la classe:

2-fonction_classmethod_x

Elle reçoit comme 1er paramètre non pas l’instance, mais la classe de base. Elle convient parfaitement pour compter les objets. L’écriture du code est plus claire.

Cependant, une variable instanciée ne sera pas à sa portée, et peut pousser à la faute… On ne peut pas tout avoir.

En résumé

Pour obtenir un objet statique en Python, il faut :

  • mettre les variables après la déclaration de la classe, avant les méthodes.
  • les méthodes doivent être précédées du décorateur @classmethod

Précaution : ne pas instancier cet objet dynamiquement. On peut carrément afficher un message d’erreur avec la fonction __init__(), pour en informer l’utilisateur.

Yves Masur (1/2014)

Références

http://fr.wikibooks.org/wiki/Programmation_C/Classe_de_stockage

http://stackoverflow.com/questions/68645/static-class-variables-in-python

http://stackoverflow.com/questions/735975/static-methods-in-python

http://docs.python.org/2/library/functions.html?highlight=decorator

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email
Avatar of franic

by franic

Edison, un ordinateur au format d’une carte SD

15 janvier 2014 in Non classé

C’est un ordinateur complet avec sa connectique. Son processeur, en gravure 22 nanomètres, est dans la ligne des processeurs Intel Quark conçus  pour les machines de très petites tailles, à très faible consommation. Des processeurs dont on ne sait que peu de choses, mais qu’Intel désigne comme étant de la classe Pentium.

Edison tourne sous Linux et prend en charge le Wi-Fi et le Bluetooth.

Selon Intel, Edison pourra s’inviter partout, jusque dans le berceau de bébé, pour contrôler sa respiration, son sommeil, etc.

intel-edison

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email

Récupération d’un ancien programme BASIC

27 décembre 2013 in Microclub

Quelle est la durée de vie d’un programme ?

Dans notre univers de plus en plus informatisé, la question de la mise à jour et de la pérennité d’un programme est légitime. Faire tenir des anciens programmes DOS est le lot de techniciens qui travaillent sur des machines d’un prix très élevé (pas le PC, mais bien la machine cible…) et dont il faut assurer la maintenance une vingtaine d’années, voire plus. Parfois, on peut avoir de bonnes surprises !

Le programme dont je vais discuter ici est un « codeur LPC ». Il s’agit de présenter à l’écran une main, avec 8 configurations des doigts ; un visage autour duquel 5 positions où la main devra être placée. C’est la technique que ma femme et moi avions adoptée lorsque nous avions appris la surdité de notre fils Robin. Vous trouverez plus d’explication sur ce code, sa genèse et son utilisation sur le site www.alpc.ch; ou bien sûr en lisant le livre qui traite de ce sujet à http://www.yvesmasur.ch/livre/ .

Après avoir fini des études en 1986, donc avec du temps libre à disposition je me suis mis en tête de créer un programme d’aide à l’apprentissage du LPC, et de le mettre à disposition de personnes intéressées. D’abord sur Commodore 64, qui possédait quelques atouts graphiques comme 8 sprites, ce qui convenait parfaitement pour exprimer les 8 configurations des doigts d’une main. Puis le PC est venu ; je l’ai transposé en pseudo-graphique, donc sur un écran de console en mode texte. Ce programme m’avait pris – pour la version C-64 – environ 3 mois les soirs, un investissement conséquent. Je l’ai traitée comme un projet, avec tout ce qu’il faut pour le suivi.

Récupération de l’ancien code

Afin de piloter un nouveau projet sur le même sujet – soit coder en LPC –, je me suis penché sur mes archives. J’ai retrouvé le classeur. Il comporte de la documentation, un article publié dans le journal interne du CHUV ou je travaillais à l’époque, un listing de 550 lignes en papier cranté et la disquette… au format 5’ ¼. Le listing suffirait, mais il est daté du 10/08/1987, alors que l’étiquette de disquette mentionne 1/1988.

En lançant une demande aux membres du MICROCLUB afin de relire ce média, Laurent m’annonce qu’il a toujours une machine PC 386, comportant un lecteur 5’1/4. Je vais donc à son bureau, avec la disquette dans ma serviette… Je me maudis en constatant qu’elle se ferme magnétiquement ! Quel imbécile je suis! Que va-t-il se passer ? Fort heureusement, les bits sont solidement inscrits ; ou l’effet du champ magnétique pas suffisant pour les effacer. Ouf… Le contenu est copié sur une disquette 1.44 MB (l’autre faisait 360 KB), puis je m’empresse de le poser sur le HDD de mon laptop.

Quels étaient ces fameux fichiers ? C’est écrit dans « READ-IT », en caractères DOS, bien sûr :

 Volume dans unité B est CUED-SPEECH
 Répertoire de  B:\
CUED-SCR COM    22400   5.01.88   9.46  <-- programme avec accès écran
CUED     BAS    13883  28.01.88  11.16  <-- source du programme
CUED     COM    22784  28.01.88  11.51  <-- programme avec accès BIOS
CUED     DAT      866  28.01.88  11.31  <-- datas (modifiable) chargés au départ
CUED     TRF     1528  16.07.87  10.42  <-- transformeurs, également modifiable
READ-IT             0  20.06.88  18.31  <-- CE fichier
ZB       COM    32384  10.03.87  15.30  <-- compilateur nécessaire pour modifier le programme
ZBASIC   HLP    33536  26.08.87         <-- HELP du compilateur
LPC              9344  20.06.88  18.27  <-- Mon article paru dans l'antenne du CHUV 1/88
        9 Fichier(s)
   221184 octets disponibles

Époque spartiate (à l’aune de 2014)

On peut en déduire que le PC travaillait sur deux unités de floppy ; le DOS en A : et celui de travail en B :. On remarquera la sobriété des programmes : le compilateur ZBASIC (nommé par ses auteurs « interpiler ») ne prend que 32 Kb ; le « help » à peine plus. Un souci d’économie que l’on ne retrouve certes plus dans le développement des programmes modernes, où plus de 100 Mb devient facilement la norme. Le programme compilé n’est pas bien gros non plus, avec 22 Ko. Remarquez également que c’est le format « image mémoire », soit un « COM », et non pas un « EXE ».

ZBASIC implémentait un BASIC plus élaboré que le standard BASICA (ou MS-BASIC, ce qui revient au même), avec des possibilités graphiques, non utilisées par mon programme prévu pour une console. Les références remplacent les numéros des lignes.

Qu’est devenu le producteur de ZBASIC, un compilateur (interpiler…) de 1988 ? La société proposait son compilateur pour MS-DOS, Apple II, MacIntosh, CP/M, TRS-80. Elle s’est orientée sur des solutions embarquées, en se posant comme concurrent du BASIC Stamp. Sa force mathématique reposait sur les calculs en BCD, dont la résolution – variable – peut aller jusqu’à 54 digits.

Un programme prévu pour système monotâche, 256 Kb de mémoire, 2 floppy et console va-t-il tourner sur PC Windows 7 ? C’est la bonne surprise, mais oui, ça fonctionne encore. Pour être précis, il me faut mentionner le fait que le clavier de l’interpréteur COMMAND.COM est le QWERTY. Afin d’y remédier, il faut lancer un KB16 SF, histoire de le mettre au Suisse français.

Utilisation du programme

Le programme comporte 2 versions : CUED et CUED-SCR, qui accède à la page texte via le BIOS, et non par adressage direct. Il avait donc une option de compilation permettant de faire le distinguo. L’ensemble des fichiers sont disponibles sous :  http://yvesmasur.ch/articles puis en développant l’arborescence « Cued speech ». Ou directement par :

http://www.yvesmasur.ch/articles/Cued%20speech/LPC.ZIP

L’archive contient le tout. Une fois déballé, le programme CUED.COM devrait fonctionner, pour autant que les données contenues dans CUED.DAT et CUED.TRF soient présentes dans le même répertoire.

Et je constate que le codage est correct pour la phrase entrée « Hello Microclub » ; que voici en action.

Hello_microclub

Une commande est précédée de ‘*’ pour qu’elle ne soit pas interprétée comme du texte à coder. La commande *Help nous montre ce qui est à disposition :

— Fonctions : *SHOW, *NONE, *TIME<1..9>, *TONE, *BYE —

Là ça se gâte un peu. Dès que *TIME est utilisé, au lieu de rythmer les codes, le programme fonce à la fin du texte ! Les tempos du programme, pour rythmer la présentation du codage ne sont visiblement pas basées sur un timer, mais par une boucle dépendant de la vitesse du CPU… Beurk ! Sans parler du son, qui bloque sur un ton. J’ai cependant remarqué un tel défaut avec d’autres programmes DOS tournant sous Windows. Quitter par *BYE fonctionne… Il ne faut pas oublier qu’au temps du DOS, si un programme n’avait pas de sortie correcte, le redémarrage par Ctrl – Alt – Del était la règle. Voir un bon OFF – ON, dans les cas récalcitrants.

Avec le recul, je me dis que le but du programme est atteint ; son fonctionnement est tout à fait satisfaisant pour coder une phrase entrée au clavier en LPC. Quelle en a été la diffusion ? Confidentielle… Seules quelques disquettes m’ont été demandées. Il faut dire qu’en 1987 l’ordinateur personnel (le Personnal Computer !) était peu répandu ; l’époque beaucoup moins technophile et connectée qu’aujourd’hui.

Il me reste maintenant à décortiquer les astuces de ce code pour le transposer dans un langage moderne et normalisé : le Python (enfin, on verra ce qu’il en reste dans 25 ans…) Mais ceci est une autre histoire, que je ne manquerai pas de vous rapporter.

Yves Masur (12/2013)

C'est bien ? Partagez !
  • Facebook
  • Twitter
  • Wikio FR
  • del.icio.us
  • Google Bookmarks
  • email