jeudi, octobre 29, 2009

Maven 2 : Lifecyle & autres

Option pour lancer une tâche sans les tests :
mvn -DskipTests=true nom_task
(ne lance pas l'exécution des tests, ni leur compilation)

Cycle de vie :
Le cycle de vie par défaut est constitué de tâches successives. En appelant une des taches de ce cycle de vie, toutes les taches précédentes sont exécutées


Le cycle de vie par défaut de maven est le suivant :
  • validate - validate the project is correct and all necessary information is available
  • compile - compile the source code of the project
  • test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
  • package - take the compiled code and package it in its distributable format, such as a JAR.
  • integration-test - process and deploy the package if necessary into an environment where integration tests can be run
  • verify - run any checks to verify the package is valid and meets quality criteria
  • install - install the package into the local repository, for use as a dependency in other projects locally
  • deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects. 

Cycle de vie en détail :

validate
validate the project is correct and all necessary information is available.
initialize
initialize build state, e.g. set properties or create directories.
generate-sources
generate any source code for inclusion in compilation.
process-sources
process the source code, for example to filter any values.
generate-resources
generate resources for inclusion in the package.
process-resources
copy and process the resources into the destination directory, ready for packaging.
compile
compile the source code of the project.
process-classes
post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
generate-test-sources
generate any test source code for inclusion in compilation.
process-test-sources
process the test source code, for example to filter any values.
generate-test-resources
create resources for testing.
process-test-resources
copy and process the resources into the test destination directory.
test-compile
compile the test source code into the test destination directory
process-test-classes
post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. For Maven 2.0.5 and above.
test
run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed.
prepare-package
perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. (Maven 2.1 and above)
package
take the compiled code and package it in its distributable format, such as a JAR.
pre-integration-test
perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
integration-test
process and deploy the package if necessary into an environment where integration tests can be run.
post-integration-test
perform actions required after integration tests have been executed. This may including cleaning up the environment.
verify
run any checks to verify the package is valid and meets quality criteria.
install
install the package into the local repository, for use as a dependency in other projects locally.
deploy
done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

lundi, octobre 12, 2009

Webservice : style et encoding

Intro:
Le style et l'encoding qui caractérise un webservice définissent la façon dont un message SOAP sera construit en fonction de la wsdl.

Style : RPC ou Document
Encoding : Literal ou Encoded
Autre : Wrapped Document Literal



Type :
RPC/Encoded :
- Le message SOAP ne contiendra pas le nom de l'opération en tant que racine à l'intérieur du <soap:body>
- Le message SOAP doit contenir des attributs xsd définissant le type de chaque élément
(exemple : xsd:int)
- No WSI-Compliant
- Validation XSD peut aisée car le schéma XSD est éclatée dans la wsdl

RPC/Literal :
- Le message SOAP contient le nom de l'opération en tant que racine à l'intérieur du <soap:body>
- Le message SOAP ne contient pas des attributs xsd définissant le type de chaque élément
(exemple : xsd:int)
- WSI-Compliant
- Validation XSD peut aisée car le schéma XSD est éclatée dans la wsdl

Document/Encoded :
N'existe pas

Document/Literal
- Le message SOAP ne contient pas le nom de l'opération en tant que racine à l'intérieur du <soap:body>
- Le message SOAP ne contient pas des attributs xsd définissant le type de l'élément
(exemple : xsd:int)
- WSI-Compliant partiellement. Dû au fait qu'une des restrictions de la norme préconise de ne faire apparaitre dans le <soap:body> qu'un seul élément racine. Alors que le Document Literal ne fait pas figurer de nom d'opération et n'a donc pas d'élément racine dans le <soap:body>
- Validation XSD aisée

Wrapped Document/Literal
- Le message SOAP contient le nom de l'opération en tant que racine à l'intérieur du <soap:body>
Il s'agit en réalité d'un contournement du type Document/Literal. L'élément racine n'est en réalité pas vraiment le nom de l'opération comme dans un type RPC/Literal, mais est un wrapper qui porte le même nom que l'opération. (Ce qui revient au meme in fine!)
- Le message SOAP ne contient pas des attributs xsd définissant le type de l'élément
(exemple : xsd:int)
- WSI-Compliant
- Validation XSD aisée


Notes :

- Historiquement, le RPC-Encoded fut le premier à apparaitre et est le plus populaire.
Il permet d'écrire des wsdl les moins complexes
- Le type RPC-Encoded présente à machines équivalentes des performances moindre qu'un type Document/Literal
- Le type Wrapped Document Literal est une amélioration du type Document/Literal en paliant à ses défauts.


Source :
http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/
http://www.ibm.com/developerworks/webservices/library/ws-soapenc/

mardi, octobre 06, 2009

JBoss esb et JBoss Remoting gateway (jbr)

Pour chaque service ESB, une ou plusieurs gateway sont définies.

Pour une gateway HTTP attachée a un provider JBR définissant un bus HTTP, il faut a chaque fois déclarer un nouveau port.

Ce qui peut etre problématique (ouvrir de multiple port HTTP, par service ESB)

La version 4.6 de Jboss ESB ne prend pas en charge un routage basé sur l'url (type JBossWS)

Ce sera peut être pris en charge dans la version 4.7
https://jira.jboss.org/jira/browse/JBESB-1557

En attendant, voici une implémentation d'un nouveau ListenerGateway, qui prend en charge un routage basé sur l'url passée, l'authentification http, etc :
http://www.jboss.org/community/wiki/HTTPGatewayListenerConfiguration

lundi, septembre 14, 2009

JBoss ESB : archives, services, messages

Archive .esb
Fichier zip contenant tout ce qu'on retrouverait dans un fichier ear avec en sus
META-INF\jboss-esb.xml
META-INF\deployment.xml
fichier.war (optionnel)
etc...


Fichier jboss-esb.xml

Fichier descriptif de l'application esb. On y retrouve
* des BUS instanciés depuis des providers (HTTP, socket, JMS, ...)
* des services

Services
Un service de JBoss ESB défini
* des listeners gateway
* des listeners ESB-aware
* une sequence d'action

Les messages et listeners

- listeners qui lisent des messages au format ESB (dit listener ESB-Aware)
- listener dit "gateway" qui sont en charge de transformer le message recu de l'extérieur de l'ESB en message de type ESB.

--> Bus GATEWAY (ou EPR End Point Reference) --> LISTENER GATEWAY --> Bus ESB-Aware --> LISTENER ESB-Aware --> Service


Structure d'un message ESB (org.jboss.soa.esb.message)
  • Header: the header information contains information such as the destination EPR, the sender EPR, and where the reply goes--general message-level functional information.
  • Context: additional information that further explains the message; for example, transaction or security data, the identity of the ultimate receiver, or HTTP-cookie-like information.
  • Body: the actual payload of the message.
  • Fault: any error information associated with the message.
  • Attachment: any attachments (additional files) associated with the message.
  • Properties: any message specific properties (for example the jbossesb.message.id property is a unique value for each message.
XSD correspondant :

<xs:complexType name="Envelope">
<
xs:attribute ref="Header" use="required"/>
<
xs:attribute ref="Context" use="required"/>
<
xs:attribute ref="Body" use="required"/>
<
xs:attribute ref="Attachment" use="optional"/>
<
xs:attribute ref="Properties" use="optional"/>
<
xs:attribute ref="Fault" use="optional"/>

Les actions de JBoss ESB

Un service définit une succession d'action.
<actions> <action name="ACTION1" class="fr.com.Action"> </action>

Voici une liste d'actions possible

WebServices
org.jboss.soa.esb.actions.soap.wise.SOAPClient
org.jboss.soa.esb.actions.soap.SOAPClient

Core Action
org.jboss.soa.esb.actions.SystemPrintln

Scripting
org.jboss.soa.esb.actions.scripting.GroovyActionProcessor

Business Process Management (jBPM)
org.jboss.soa.esb.services.jbpm.actions.BpmProcessor

Routing
org.jboss.soa.esb.actions.ContentBasedRouter
org.jboss.soa.esb.actions.StaticRouter
org.jboss.soa.esb.actions.StaticWiretap

Jboss ws + jboss esb : WS embarqué dans un esb ET autodefini en EBWS

VALABLE POUR JBOSS ESB 4.5
Pour faire cohabiter des webservices
* embarqué dans un war (par exemple utilisé dans une action de JBOSS ESB via SOAPClient) lui même embarqué dans le fichier esb
* et ceux générés automatiquement avec EBWS (un webservice endpoint sur l'ESB est défini automatiquement quand on défini les contract sur <actions> d'un service ESB)

Il faut intégrer dans le web.xml en plus des webservices qu'on aura défini ceux qui seront générés automatiquement.


<servlet>
<servlet>
<servlet-name>MonWS</servlet-name>
<servlet-class>fr.com.MonWS</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>MonWS</servlet-name>
<url-pattern>/MonWS</url-pattern>
</servlet-mapping>



<servlet>
<servlet-name>NOM-CATEGORIE_NOM-SERVICE</servlet-name>
<servlet-class>esb.ws.NOM-CATEGORIE.NOM-SERVICE.Implementation</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>NOM-CATEGORIE_NOM-SERVICE</servlet-name>
<url-pattern>/NOM-CATEGORIE/NOM-SERVICE</url-pattern>
</servlet-mapping>

</servlet>
<servlet-mapping><url-pattern></url-pattern>
</servlet-mapping>


Le problème vient du fait que la fonctionnalité EBWS génère son propre war qu'il embarque automatiquement dans le fichier ESB. On se retrouve avec deux war et deux fichiers web.xml. Celui qu'on aura défini masquant celui généré automatiquement.


Pour vérifier la publication de tous les webservices : http://localhost:8080/jbossws/services

mardi, mai 12, 2009

Rappel HTML : centrer une image

Méthode 1 :
<div style="text-align: center;">
<img src="http://www.blogger.com/xxx" sytle="width:256px:height:256px;vertical-align:middle;" alt="mon image" />
</div>

Méthode 2 :
<img src="http://www.blogger.com/xxx" style="margin: auto; display: block; vertical-align: middle;" alt="mon image" />



Le display:block transforme ton image en block, c'est a dire qu'il y aura un retour a la ligne.
Le margin:auto; c'est pour que l'image soit centrée.

samedi, mai 09, 2009

Comment faire pour activer l'ouverture de session automatique dans Windows XP


Ancien nº de publication de cet article : F315231
Cet article peut contenir des liens vers des informations en langue anglaise (pas encore traduites).
Important Cet article contient des informations sur la modification du Registre. Avant de modifier le Registre, pensez à le sauvegarder et assurez-vous que vous savez le restaurer en cas de problème. Pour plus d'informations sur la sauvegarde, la restauration et la modification du Registre, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft.
256986 (http://support.microsoft.com/kb/256986/ ) Description du Registre de Microsoft Windows
Agrandir tout | Réduire tout

INTRODUCTION
Cet article explique comment configurer Microsoft Windows XP pour qu'il automat...

Cet article explique comment configurer Microsoft Windows XP pour qu'il automatise le processus d'ouverture de session en enregistrant votre mot de passe et les autres informations pertinentes dans la base de données du Registre. Cette fonctionnalité permet aux autres utilisateurs de démarrer votre ordinateur et d'utiliser le compte que vous avez configuré afin de permettre une ouverture de session automatique.

Important Si vous activez l’ouverture de session automatique, il est plus pratique d’exécuter Windows. Toutefois, cette fonctionnalité peut présenter un risque en matière de sécurité.

Plus d'informations
Avertissement Toute utilisation incorrecte de l'Éditeur du Registre peut générer...

Avertissement Toute utilisation incorrecte de l'Éditeur du Registre peut générer des problèmes sérieux, pouvant vous obliger à réinstaller votre système d'exploitation. Microsoft ne peut pas garantir que les problèmes résultant d'une mauvaise utilisation de l'Éditeur du Registre puissent être résolus. Vous assumez l'ensemble des risques liés à l'utilisation de cet outil.
Si vous configurez un ordinateur pour l'ouverture de session automatique, toute personne capable d'accéder physiquement à l'ordinateur peut également accéder à toutes les données qui s'y trouvent, y compris aux réseaux auxquels l'ordinateur est connecté. En outre, lorsque l’ouverture de session automatique est activée, le mot de passe est enregistré dans le Registre en texte brut. La clé de Registre spécifique qui stocke cette valeur est lisible à distance par le groupe Utilisateurs authentifiés. Par conséquent, n'utilisez ce paramètre que si l'ordinateur est physiquement sécurisé et si vous vous assurez que les utilisateurs qui ne sont pas fiables ne peuvent pas visualiser le Registre à distance.

Vous pouvez utiliser l'Éditeur du Registre pour ajouter vos informations d'ouverture de session. Pour cela, procédez comme suit :
  1. Cliquez sur Démarrer, sur Exécuter, tapez regedit, puis cliquez sur OK.
  2. Recherchez la clé de Registre suivante :
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon
  3. En utilisant votre nom de compte et votre mot de passe, double-cliquez sur l’entrée DefaultUserName, tapez votre nom d'utilisateur, puis cliquez sur OK.
  4. Double-cliquez sur l'entrée DefaultPassword, tapez votre mot de passe dans la zone de données de la valeur, puis cliquez sur OK.

    S'il n'y a aucune valeur DefaultPassword, créez-en une. Pour cela, procédez comme suit :
    1. Dans l'Éditeur du Registre, cliquez sur Edition, sur Nouveau, puis sur Valeur chaîne.
    2. Tapez DefaultPassword comme nom de la valeur, puis appuyez sur ENTRÉE.
    3. Double-cliquez sur la clé qui vient d'être créée, puis tapez votre mot de passe dans la zone Données de la valeur.
    Si aucune chaîne DefaultPassword n’est spécifiée, Windows XP modifie automatiquement la valeur de la clé de Registre AutoAdminLogon en remplaçant 1 (vrai) par 0 (faux) afin de désactiver la fonctionnalité AutoAdminLogon.
  5. Double-cliquez sur l'entrée AutoAdminLogon, tapez 1 dans la zone Données de la valeur, puis cliquez sur OK.

    S'il n'y a aucune entrée AutoAdminLogon, créez-en une. Pour cela, procédez comme suit :
    1. Dans l'Éditeur du Registre, cliquez sur Edition, sur Nouveau, puis sur Valeur chaîne.
    2. Tapez AutoAdminLogon comme nom de la valeur, puis appuyez sur ENTRÉE.
    3. Double-cliquez sur la clé qui vient d'être créée, puis tapez 1 dans la zone Données de la valeur.
  6. Quittez l'Éditeur du Registre.
  7. Cliquez sur Démarrer, sur Redémarrer, puis cliquez sur OK.
Après le redémarrage de votre ordinateur et le démarrage de Windows XP, vous pourrez ouvrir une session automatiquement.

Si vous souhaitez contourner l'ouverture de session automatique et ouvrir une session en tant que nouvel utilisateur, maintenez la touche MAJ enfoncée après la fermeture de la session ou le redémarrage de Windows XP. Notez que cette procédure s'applique uniquement à la première ouverture de session. Pour appliquer ce paramètre lors des fermetures de session suivantes, l’administrateur doit définir la clé de Registre suivante :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon

Valeur :ForceAutoLogon
Type : REG_SZ
Données : 1
Vous pouvez également utiliser l'activation de l'ouverture de session automatique sans modifier le Registre dans Windows XP Édition familiale et dans Windows XP Professionnel sur un ordinateur non joint à un domaine. Pour cela, procédez comme suit :
  1. Cliquez sur Démarrer, puis sur Exécuter.
  2. Dans la zone Ouvrir, tapez control userpasswords2, puis cliquez sur OK.

    Remarque Lorsque des utilisateurs essaient d'afficher des informations d'aide dans la fenêtre Comptes d'utilisateurs dans Windows XP Édition familiale, les informations d'aide ne sont pas affichées. En outre, le message d'erreur suivant s'affiche :
    Impossible de trouver le fichier d'aide lecteur: \Windows\System32.hlp. Vérifiez si le fichier existe sur votre disque. Si ce n'est pas le cas, vous devez le réinstaller.
  3. Désactivez la case à cocher « Les utilisateurs doivent entrer un nom d'utilisateur et un mot de passe pour utiliser cet ordinateur », puis cliquez sur Appliquer.
  4. Dans la fenêtre Ouverture de session automatique, tapez le mot de passe dans la zone Mot de passe, puis retapez-le dans la zone Confirmer le mot de passe.
  5. Cliquez sur OK pour fermer la fenêtre Ouverture de session automatique, puis de nouveau sur OK pour fermer la fenêtre Comptes d'utilisateur.

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Windows XP Édition familiale
  • Microsoft Windows XP Professional
  • Microsoft Windows XP 64-Bit Edition

mardi, mars 10, 2009

XBMC use Shuttle VFD with LCDProc on Mythbuntu/Xubuntu

CONTEXTE:

XBMC installé sur Mythbuntu 8.10 (Xubuntu 8.10) dans un barebone de Shuttle incluant un affichage LCD en façade.

Modèles Shuttle potentiellement concernés :
SD32G5, SD30G2B, SG31G2B, SD36G5, SG33G5, SG33G6, SK22G2 ,SN68SG2, SN68PTG5, SN68PTG6 Deluxe ,SN21G5, SN95G5
LCD présent par défaut ou après achat du kit PF27 (http://eu.shuttle.com/DesktopDefault.aspx/tabid-123/241_read-13739/)

Version XBMC : from PPA SVN BUILD : XBMC Pre-9.04 R18324, MAR 7 2009




HOW-TO:

XBMC supporte le pilotage de LCD via LCDProc. (http://lcdproc.org)
LCDProc possède un pilote pour le LCD des boitiers Shuttle depuis mi-fin 2007 dans ses dépots CVS.
Le paquet LCDProc a disposition d'ubuntu/debian est le 0.5.2 et ne dispose pas du pilote pour LCD Shuttle

Vérification du support du LCD Shuttle
lsusb
On doit avoir ID 051c:0005 ou ID 051c:0x0003


Compilation de LCDProc (depuis les sources CVS)
wget http://lcdproc.sourceforge.net/nightly/lcdproc-CVS-current.tar.gz
tar xvf lcdproc-CVS-current.tar.gz
cd lcdproc-CVS-current.tar.gz

sudo apt-get install libusb-dev xmlto libncurses5-dev libsvga1-dev libxosd-dev
./configure --help
./configure --enable-drivers=shuttleVFD
make
sudo make install


Installation du démarrage automatique
sudo cp scripts/init-LCDd.debian /etc/init.d/LCDd
sudo cp scripts/init-lcdproc.debian /etc/init.d/lcdproc
sudo chmod 655 /etc/init.d/LCDd
sudo chmod 655 /etc/init.d/lcdproc
sudo update-rc.d LCDd defaults


Editer /usr/local/etc/LCDd.conf
DriverParth=/usr/local/lib/lcdproc/
Driver=shuttleVFD
ServerScreen=no
Hello="Welcome to XBMC"


Démarrage
sudo /etc/init.d/LCDd start





DANS XBMC:
Dans les paramètres systèmes, LCD : choisir Type LCD = LCDproc


Editer ~/.xbmc/userdata/LCD.xml
<lcd>
<music>
<line>* $INFO[MusicPlayer.Artist] * $INFO[MusicPlayer.Title] ** $INFO[Player.Time]/$INFO[Player.Duration] ** $INFO[System.Time] *</line>
</music>
<video>
<line>* $INFO[VideoPlayer.Title] ** INFO[Player.Time]/$INFO[Player.Duration] ** $INFO[System.Time] *</line>
</video>
<general>
<line>* $INFO[System.Time] ** $INFO[System.Date] *</line>
</general>
<screensaver>
<line>* $INFO[System.Time] ** $INFO[System.Date] *</line>
</screensaver>
</lcd>



Editer ~/.xbmc/userdata/advancedsettings.xml

<lcd>
<rows>1</rows> <!-- Number of rows to use for the LCD. -->
<columns>20</columns> <!-- Number of columns to use for the LCD. -->

<address1>0</address1> <!-- Memory address for row 1. -->
<address2>20</address2> <!-- Memory address for row 2. -->
<address3>64</address3> <!-- Memory address for row 3. -->

<address4>84</address4> <!-- Memory address for row 4. -->
<heartbeat>true</heartbeat> <!-- Enables LCDprocs heartbeat symbol. Defaults to false. -->
<scrolldelay>2</scrolldelay> <!-- Delay of the scroller widget. Defaults to 1. -->

</lcd>





AMELIORATIONS:

Une meilleure programmation de LCD.xml, notemment avec la prise en compte des icônes du LCD des shuttle.
- Le header (.h) du driver du shuttleVFD avec les codes pour les icones : http://lcdproc.cvs.sourceforge.net/viewvc/lcdproc/lcdproc/server/drivers/shuttleVFD.h?view=markup
- Le détail des codes pour LCD.xml : http://xbmc.org/wiki/index.php?title=LCD.xml

XBMC dans Mythbuntu - Xubuntu et partage réseau SMB (en mode user=security)

XBMC inclut son propre client SMB. La version 3.0.23a de libsmbclient figure dans les sources. Cette version peut poser de multiples problèmes d'accès aux répertoires (samba en mode share/user, kerberos, ntlm etc..)

PROBLEME :
Quand XBMC tente d'accèder à des partages samba, deux cas se présentent :
En mode security = share, XBMC n'a aucun problème avec les partages public ou privés et ne nécessite pas d'utiliser fusesmb. L'utilisation de l'ajout d'une source de type smb:// avec renseignement du login/pass le cas échéant suffit amplement.
En mode security = user, XBMC ne sait pas gérer ce type de source smb://


SOLUTION :
La solution de créer des points de montage via CIFS dans /etc/fstab ne résout pas le problème : XBMC on ne peut pas accéder au contenu des points de montage de type CIFS, pour une raison inconnue

Une des solutions, en attendant que les développeurs de XBMC intègre une version plus récente de la libsmbclient (http://xbmc.org/trac/ticket/5653), consiste à passer par un point de montage FUSESMB.


CONTEXTE:
Ma configuration est une installation de XBMC (version SVN PPA : XBMC Pre-9.04 R18324, MAR 7 2009) dans Mythbuntu 8.10 (Donc dans xubuntu 8.10)
A noter qu'ici XFCE est le gestionnaire de fenêtre et Thunar le gestionnaire de fichiers. Le serveur de partage est samba 3.0.24 sur une Debian 4.0 etch.

Le serveur samba partage des répertoires à accès public et privés. Les répertoires privés sont visibles (browseable=yes)
Il est en mode security = user et passdb backend = tdbsam (notamment à cause de la nécessité d'accès à ce serveur par un poste Vista)

Samba est installé et configuré sur la machine XBMC.




HOW-TO:

Installation fuse/fusesmb
sudo apt-get install fuse-utils libfuse2 fusesmb

Creation du point de montage
cd ~
mkdir -p Network


Ajout de l'utilisateur au groupe fuse
sudo gpasswd -a $USER fuse


NOTE BUG:
Il y a un bug identifié qui fait que fusesmb ne fonctionne pas correctement, comme par exemple monte les répertoires réseaux et les fait disparaitre quelques minutes après.
L'erreur provient d'une erreur dans libsmbclient qui surgit à l'utilisation de fusesmb.
https://bugs.launchpad.net/ubuntu/+source/fusesmb/+bug/198351
https://bugs.launchpad.net/ubuntu/+source/samba/+bug/290673
Solution :
downgrader le package avec la version contenue dans ubuntu hardy (8.04) => libsmbclient 3.0.28a au lieu de libsmbclient 3.2.3
Utiliser smbnetfs ne résout rien car il comporte la meme erreur vu qu'il repose lui aussi sur la même version de libsmbclient.


Downgrade de libsmbclient

Télécharger et décompresser le .deb de la 3.0.28a depuis http://packages.ubuntu.com/hardy-updates/libsmbclient puis
sudo mv /usr/lib/libsmbclient.so.0 /usr/lib/libsmbclient.so.0.bak
sudo cp /CONTENTS/usr/lib/libsmbclient.so.*
sudo ldconfig




Génération des fichiers de configuration

On les efface en premier lieu pour mieux gérer la configuration du cache, et éviter quelques bugs.
cd ~
rm .smb/
fusesmb Network && fusermount -u Network



Créer-éditer ~/.smb/smb.conf
Dans le cas où l'on souhaite accèder également à un serveur en mode security=share : La navigation dans le point de montage d'un serveur en mode share dans des répertoires demandant une authentification nécessite d'activer l'authentification lanman. (NOTE : il faut que les definitions de ces repertoires contiennent browseable=yes, available = yes, public = no)
[global]
workgroup = WORKGROUP
client lanman auth = yes #si on veut accéder à un serveur samba en mode share -reporter cette ligne eventuellement egalement dans /etc/samba/smb.conf-



Créer-éditer ~/.smb/fusesmb.conf
A adapter.
; Global settings
[global]

; Default username and password
username=user
password=totallysecret

; List hidden shares
showhiddenshares=true

; Connection timeout in seconds
timeout = 10

;Interval for updating new shares in minutes
interval = 0

; Share-specific settings
[/SERVER/SHARE]
username=john
password=doe

; Server-specific settings
[/SERVER]
username=jane
password=doe


Droits du fichier
chmod 600 ~/.smb/fusesmb.conf


Montage du réseau
fusesmb Network

Pour le faire démarrer automatiquement au démarrage de la session X
Applications > Settings > Autostarted Applications > ajouter une application qui sera la ligne de commande suivante : fusesmb Network


Dans Thunar :
Pour accèder au voisinage réseau, il suffit alors de naviguer dans le répertoire Network de son home. On peut éventuellement créer un lien de Network dans les raccourcis de Thunar

Dans XBMC:
Il suffit d'ajouter une source pointant sur /home/user/Network/WORKGROUP/SERVER/SHARE

vendredi, février 13, 2009

Human Remote concept for Elisa

Human Remote concept for Elisa

Abstract
Elisa can be control by several types of device. Keyboard, mouse,remote, with gyro, bluetooth remote and so on, only if they can be plugged to the host system. But if we consider evolution of HCI world in the past year, we will see that most of innovation try to make the most intuitive and easiest HCI for human. Without anything. No more interaction but with human. Motion detection, voice recognition, everything that is the most natural way for people. This is a technical how-to set up this in Elisa.


Le pilotage de l'interface d'Elisa peut être effectué par différents types de périphériques. Clavier, souris, télécommande IR, télécommande à gyro, etc.. pourvu que le système hote possède les connectiques adéquates. A la vue de la courbe de progression en matière d'IHM grand public et de leur périphérique de contrôle, la part belle est faite à l'interaction directe, ludique et la plus naïve possible. Abordé sous cet angle, l'utilisateur lui-même en tant qu'acteur de l'IHM devient évidente. Usage du corps, des mouvements, de la voix et de toute caractéristique naturelle de l'humain. On peut définir une façon d'utiliser une IHM sans passer par aucun périphérique de commande manipulé d'aucune sorte (ni par contact, ou par pression,etc..).

Dans le prototype mis en œuvre ici pour Elisa, il sera question d'expérimenter l'usage de la combinaison de la voix et de la détection des mouvements de mains.
A elle seule, la voix permet d'activer des fonctionnalités précises. Par exemple, lecture, pause, suivant, etc.. Mais celà ne suffit pas à couvrir l'usage complet de l'interface : il faut aussi des capacités de navigation, comme le défilement ou le feuilletage. Il faut donc adjoindre à la commande vocale, la détection de mouvements.

La plateforme visée est une distribution ubuntu de type standard sur un poste équipé d'une webcam avec micro intégré.


Principe de l'implémentation dans Elisa
Elisa pour sa gestion d'événements de périphérique propose un modèle objet ayant pour racine InputProvider.
Il faut ici implémenter une classe à partir de ce modèle, dérivé de PushInputProvider, prenant en charge la reconnaissance vocale et la gestion des mouvements. Elle injectera alors des ordres automatiquement via le modèle objet à l'IHM. Le tout prenant la forme d'un plugin pour Elisa.


La voix
La reconnaissance vocale doit permettre d'associer des mots ou des phrases à des actions. Il est nécessaire ici d'adopter des mots ou phrases courtes afin de rendre le service efficace. Bien qu'on reste tributaire de la qualité du matérielle.
En ce basant sur l'architecture d'Elisa, il est nécessaire de développer un plugin de reconnaissance vocale fonctionnant de manière asynchrone via GStreamer déclenchant des évenements.
Un corpus réduit choisi : PLAY, STOP, NEXT, BACK

Différents projets notamment de recherche universitaire se prêtent au besoin en mode SPEECH-TO-TEXT. Mais de manière générale plusieurs projets se basent sur des frameworks propriétaires ou sur des technologies présentes uniquement sur une seule plateforme. Quand il ne s'agit pas de simple wrapper de systèmes pré-installés.
Le projet The CMU Sphinx Group Open Source Speech Recognition Engines [http://cmusphinx.sourceforge.net/html/cmusphinx.php] présente les avantages suivant :
- portabilité système
- licence
- utilisable via des pipeline GStreamer
- binding python
Il propose plusieurs moteurs de reconnaissance vocale basés pour la plupart sur des algorithmes communs. Sphinx 2 qui est aujourd'hui abandonné au profit de Sphinx-3, ou Sphinx-4 qui lui fonctionne en environnement Java. PocketSphinx quant à lui est spécialement dédié aux mobile device et possède ses binding pythons.


La détection de mouvement
Il faut pouvoir détecter les mouvements de main de l'utilisateur. Plus précisément détecter une vitesse de mouvement et un sens. On passe par les techniques de détection de blob. Plusieurs implémentations existent.
L'algorithme naïf à utiliser est de détecter les bounding boxes de premier plan, étant ceux possédant la plus grande surface et de les tracker dans le temps, pour calculer une vitesse et le sens. A partir de là, et en fixant des seuils il devient possible d'envoyer des ordres de défilement à l'IHM de Elisa.

Les technologies autour de Processing.org (environnement de R&D pour IHM) permettent cela en Java. Notamment via une librairie appelée JMyron (dérivée de webcamxtra) initialement prévue pour Mac et possédant un noyau en C++ (appelé Myron).
[http://webcamxtra.sourceforge.net/index.shtml]
Myron offre les techniques suffisantes et nécessaires aux besoins. De plus Myron est largement répandu dans le domaine de l'expérimentation d'IHM ou des artistes visuels dès qu'il s'agit d'aborder la motion detection.


Etat du projet
[Au 09/02/09]
Le module de reconnaissance vocale basé sur le corpus défini est fonctionnel.
La navigation par détection de mouvement n'est pas terminée. pyMyron doit être finalisé pour celà.
pyMyron n'est pas complet, seule la fonction de detection de blob est prise en compte bien qu'une erreur dans Myron engendre des erreurs.


TODO list & note
L'efficacité de ce genre de système, surtout pour la partie motion detection, reste trop tributaire de la qualité du matériel.
Un portage win32 sera normalement facilité par le choix des librairies.
Affiner le choix de la librairie de reconnaissance vocale, utilisé sphinx-3 en lieu et place de pocketsphinx.
Finir PyMyron
Intégrer les événements de detection de blob à la classe InputProvider
Etendre le corpus pour activer les sections spécifiques de Elisa via le bus de son api (accès aux films, photos, etc...)


Implémentation de la reconnaissance vocale

Plateforme d'ensemble : ubuntu 8.10, gstreamer 0.10.21, gcc4.3.2, java 1.6.0_10, python 2.5.2, Elisa 0.5.X (from SVN 20090122)

Mise en place de PocketSphinx depuis les archives de sourceforge [http://sourceforge.net/project/platformdownload.php?group_id=1904]
pour créer la librairie, les binding python et le plugin pour gstreamer.

Puis l'utiliser dans le plugin HumanRemote.

1.Compilation de SphinxBase (v0.4.1)

cd sphinxbase-0.4.1
$./configure --enable-fixed --disable-shared
$make
$sudo make install

2.Compilation de pocketsphinx (v0.5.1)

$cd pocketsphinx-0.5.1
$./configure --prefix=`pwd`/build --with-sphinxbase=`pwd`/../sphinxbase-0.4.1 --disable-shared
$make
$make install


3.Test


$export LD_LIBRARY_PATH=`pwd`/pocketsphinx-0.5.1/build/lib
$export GST_PLUGIN_PATH=`pwd`/pocketsphinx-0.5.1/build/lib/gstreamer-0.10
$export PYTHONPATH=$PWD/pocketsphinx-0.5.1/build/lib/python2.5/site-packages:$PYTHONPATH
Test de la librairie python:
$python -c "import pocketsphinx"
Test plugin gstreamer:
$gst-inspect-0.10 pocketsphinx


4.Le corpus et le dictionnaire
A partir de là, il faut créer un modele de dictionnaire à destination du moteur de reconnaissance vocale. Et ceci à partir du corpus de mots définis. Ce dictionnaire définit le vocabulaire à reconnaitre par Elisa, et se présente sous la forme de fichier binaire compilé.
(cf documentation sphinx)


5.Integration au plugin Human Remote
En se basant sur un pipeline gstreamer captant une source sonore, il faut utiliser le plugin pocketsphinx pour lever des évenements Elisa.

Pipeline mis en place pour une webcam à micro intégré :
osssrc ! audioconvert ! vader name=vad auto-threshold=true ! pocketsphinx dict=model.dic lm=model.lm name=asr ! fakesink

On peut envisager, selon la qualité du matériel d'utiler des filtres comme audiochebband pour purger les bruits de fond ou autre parasite d'informations sonores.
Exemple :
audiochebband mode=band-pass lower-frequency=3000 upper-frequency=4000 type=2


def initialize(self):
dfr = super(HumanremoteInput, self).initialize()
...
self.pipeline = gst.parse_launch('osssrc ! audioconvert ! vader name=vad auto-threshold=true ! pocketsphinx dict=' + model_folder + 'model.dic lm=' + model_folder + 'model.lm name=asr ! fakesink')

asr = self.pipeline.get_by_name('asr')
asr.connect('partial_result', self.asr_partial_result)
asr.connect('result', self.asr_result)


Le filtre pocketsphinx va lever deux types d'événements : partial_result et result. Selon qu'une séquence de son représente un mot ou une phrase complet du corpus.

def application_message(self, bus, msg):
"""Receive application messages from the bus."""
msgtype = msg.structure.get_name()
if (msgtype == 'partial_result'):
pass
if (msgtype=='result'):
self.create_input_event(msg.structure['hyp'])
pass


Lors d'un évènement de type result, il faut ensuite via le bus lever un message applicatif qui se transformera un InputEvent et sera traité par l'InputManager d'Elisa.

def create_input_event(self, msg):
...
evt = InputEvent(EventSource.REMOTE, EventType.OTHER,
self.convert_table[data])


asr.set_property('configured', True)
self.info("HUMAN REMOTE : pipeline ok")


6.Human Remote v0.0.1a supportant la voix

Archive du plugin :
http://portail.studio-etrange.net/corailnumerique/humanremote/humanremote-0.0.1a.tar.gz
(nécessite les librairies compilées)

Test avec Elisa-SVN 0.5.24:
$../../pigment/pigment/misc/pgm-uninstalled
$export PYTHONPATH=$PWD/elisa-core:$PWD/elisa-plugins:$PYTHONPATH
$export LD_LIBRARY_PATH=`pwd`/pocketsphinx-0.5.1/build/lib
$export GST_PLUGIN_PATH=`pwd`/pocketsphinx-0.5.1/build/lib/gstreamer-0.10
$ELISA_DEBUG=3 python elisa-core/bin/elisa my_conf.conf


INFO Dummy-2 humanremote_input fév 13 09:31:26 HUMAN REMOTE : full result (elisa/plugins/humanremote/humanremote_input.py:99)
INFO Dummy-2 humanremote_input fév 13 09:31:33 HUMAN REMOTE : full result (elisa/plugins/humanremote/humanremote_input.py:99)
INFO MainThread humanremote_input fév 13 09:31:33 Callback create_input_event called (elisa/plugins/humanremote/humanremote_input.py:111)
INFO MainThread humanremote_input fév 13 09:31:33 Supported key code received: PLAY (elisa/plugins/humanremote/humanremote_input.py:
INFO MainThread humanremote_input fév 13 09:31:34 Humanremote input provider is shutting down (elisa/plugins/humanremote/humanremote_input.py:107)




Implémentation de la détection de mouvement

Plateforme d'ensemble : ubuntu 8.10, gstreamer 0.10.21, gcc4.3.2, java 1.6.0_10, python 2.5.2, Elisa 0.5.X (from SVN 20090122)

Mise en place de la librairie Myron sous ubuntu, et optionnellement à des fins de tests de JMyron pour processing dans ubuntu.
Création de pyMyron en vue d'une utilisation en python de la librairie dans le plugin HumanRemote.

1.Intégrer JMyron (v0025) avec v4l2
Il faut compiler Myron à partir de son code source C++ en librairie pour Java (appelée JMyron) tout en le modifiant pour qu'il supporte v4l2 et donc linux

$svn co https://webcamxtra.svn.sourceforge.net/svnroot/webcamxtra webcamxtra

Les modifications de Myron afin d'intégrer v4l2 ont en parti été réalisées ici
http://piratestudios.com/v4ljmyron/
copier v4l2Camera.h v4l2Camera.cpp Makefile.linux ezcam.cpp dans webcamxtra/ezcam
copier myron.cpp dans webcamxtra/source
Editer Makefile.linux
$(JAVAC)=/usr/bin/javac
$(PROCESSING)=/opt/processing-1.0.1

Pour compiler
$cd webcamxtra/ezcam
$make -f Makefile.linux


2.Intégrer JMyron pour v4l2 dans processing pour Ubuntu (optionnel)


Version : Ubuntu 8.10, sun-java-6, Processing 1.0.1, Jmyron0025

Depuis le site de processing.org
dezipper processing dans /opt/processing-1.0.1

Récupérer Jmyron for processing [http://webcamxtra.sourceforge.net/distro/JMyron0025.zip]
Installer JMyron in /opt/processing-1.0.1
Placer le répertoire JMyron dans /opt/processing-1.0.1/libraries
Placer le répertoire JMyron Examples dans /opt/processing-1.0.1/examples

Installation dans processing
$cp webcamxtra/ezcam/JMyron.jar /opt/processing-1.0.1/java/lib
$cp webcamxtra/ezcam/libJMyron.so /opt/processing-1.0.1/java/lib/i386


3.Création de pyMyron

Utilisation de SIP(v4.7.9) afin de créer des bindings python de la librairie python.

Compilation de SIP
[http://www.riverbankcomputing.co.uk/software/sip/download]
$cd sip-4.7.9
$python configure.py
$make
$sudo make install

Compilation de la lib Myron
edit webcamxtra/ezcam/Makefile.linux
all: Linux jniwrapper.o myron.o libJMyron.so JMyron.jar libMyron.so
libMyron.so: myron.o ezcam.o v4l2camera.o
g++ -shared -o libMyron.so myron.o ezcam.o v4l2Camera.o
$make

Création de pyMyron
dans pymyron copier myron.h et libMyron.so
creer myron.spi à partir de myron.h
creer configure.py comme suit


import os
import sipconfig
build_file = "myron.sbf"
config = sipconfig.Configuration()
os.system(" ".join([config.sip_bin, "-c", ".", "-b", build_file, "myron.sip"]))
makefile = sipconfig.SIPModuleMakefile(config, build_file)
makefile.extra_libs = ["Myron"]
makefile.extra_lib_dirs = ["."]
makefile.generate()


$python configure.py
$make

4.Test de pyMyron
export LD_LIBRARY_PATH=.
$python
>>import pyMyron
>>m=pyMyron.Myron()
>>m.start()
>>m.stop()
pour installer le module pyMyron: make install






Ressources
VIDEO

http://videocapture.sourceforge.net/
A Win32 Python Extension for Accessing Video Devices (e.g. a USB WebCam, a TV-Card, ...)


http://snippets.dzone.com/posts/show/4920
/ Python Motion Detection Library + Demo

http://janto.blogspot.com/2006/01/motion-capture-in-python.html

Myron
http://sourceforge.net/projects/webcamxtra

PYTHON AUDIO TOOLS
Sound toolkit
http://www.speech.kth.se/snack/

Python speech recognition with microsoft speech sdk
http://surguy.net/articles/speechrecognition.xml

speech0.5.1 is a Python module that provides a clean interface to Windows's voice recognition and text-to-speech capabilitie
http://pypi.python.org/pypi/speech/

The Festival Speech Synthesis System [TEXT TO SPEECH]
http://www.cstr.ed.ac.uk/projects/festival/
http://festvox.org/
PyFest 0.1 : ?

The CMU Sphinx Group Open Source Speech Recognition Engines
http://cmusphinx.sourceforge.net/html/cmusphinx.php

IBM Text to speech
http://www.research.ibm.com/tts/

samedi, janvier 24, 2009

Launcher : AzSMRC + Firefox + Ubuntu

Pour l'installation de AzSMRC sur ubuntu suivre le howto suivant : http://ubuntuforums.org/showthread.php?t=637160

Pour éviter le problème des fichiers torrents avec des noms d'espace,
modifier le script de lancement défini dans le howto par celui-ci :

#!/bin/sh
cd $HOME/AzSMRC
if [ "$1" != "" ]; then

parm="${1##*file://}"
java -classpath launcher.jar:/usr/local/lib -Djava.library.path=. lbms.tools.launcher.Launcher "$parm"

else
java -classpath launcher.jar:/usr/local/lib -Djava.library.path=. lbms.tools.launcher.Launcher
fi

mercredi, décembre 05, 2007

Elisa reads Youtube - Proof of concept

Last Elisa Head-CVS and Gstreamer Head-CVS used.

Snapshot CVS 2007-12-05
------------------------
Elisa
Pigment
gstreamer
gst-plugins
gst-plugins-base
gst-plugins-good
gst-plugins-bad
gst-plugins-ugly
gst-ffmpeg

code plugin you tube : here


Screencast :


jeudi, avril 05, 2007

Algo de flot - Un peu d'historique

Extrait de l'introduction de "New Distance-Directed Algorithms for Maximum Flow and Parametric Maximum Flow Problems"

The maximum flow problem is one of the most fundamental network problems and has been investigated extensively in the literature (for example, by Ford and Fulkerson 1956, Dinic 1970, Edmonds and Karp 1972, Karzanov 1974, Cherkasky 1977, Malhotra et. al 1978, Galil 1980, Galil and Naamad 1980, Sleator and Tarjan 1983, Gabow 1985, Goldberg 1985, Goldberg and Tarjan 1986, Ahuja and Orlin 1987). Efficient algorithms for computing maximum flows are important not only because they are applied directly to the analysis of traffic or communication networks, but are often employed in the subproblems of other network problems. Some of the network problems whose algorithms use the maximum flow algorithm as a subroutine are the time-cost tradeoff problem in CPM networks (Fulkerson 1961, Kelley 1961), the parametric network feasibility problem (Minieka 1972), the network design problem (Hu 1974) and the minimax transportation problem (Ahuja 1986). Moreover, it plays an important role in solving the minimum cost flow problem (Rock 1980, Tardos 1985, Bland and Jensen 1985). Recently, Goldberg and Tarjan (1987) have developed the fastest known algorithm for the minimum cost flow problem using an extension of their maximum flow algorithm as a major subroutine.


Ford and Fulkerson (1956) formulated the maximum flow problem and solved it using their augmenting path algorithm. Edmonds and Karp (1972) showed that by augmenting flows along shortest paths, the augmenting path algorithm runs in time O(nm 2 ) on networks with n nodes and m arcs. Independently, Dinic (1970) suggested an O(n 2 m) algorithm which proceeds by constructing shortest path networks (known as layered networks) and establishing blocking (or maximal) flows in these networks. Dinic's algorithm has been studied extensively by researchers who dramatically improved its worst case running time using sophisticated data structures. Most notable among these improvements is the 'dynamic trees' algorithm Their algorithm runs in O(nm log n) developed by Sleator and Tarjan (1983). steps. Gabow's (1985) scaling algorithm also uses Dinic's algorithm as a major subroutine.


Recently, Goldberg (1985) and Goldberg and Tarjan (1986) developed a new approach to solve the maximum flow problem that does not construct layered networks but instead maintains "distance labels". Informally, a distance label of a node is an integral lower bound on the length of the shortest augmenting path from that node to the sink. A distance label is called exact if it equals the length of the shortest augmenting path, and approximate otherwise. Distance labels have several advantages over layered networks. They are simpler to understand, easier to manipulate and have led to more efficient algorithms. We refer to algorithms that utilize distance labels as distance-directed algorithms. Goldberg (1985) developed the first distance-directed algorithm. Subsequently, Goldberg and Tarjan (1986) developed improved distance-directed algorithms. Currently, the fastest algorithm to solve the maximum flow problem, due to Ahuja and Orlin (1987a), is also a distance-directed algorithm. Its running time is O(nm + n 2 log U) steps, where U is an upper bound on the capacities of arcs directed from the source. So far all the proposed distance-directed algorithms have been preflow based algorithms, similar in essence to Karzanov's (1974) algorithm.

lundi, avril 04, 2005

Installation d'une plateforme de dev MSYS-MinGW


En quelques points résumés, la facon d'installer un environnement de développement complet sur windows..


1.Procédure d'installation d'une plateforme de développement MSYS/MINGW


Installation de MingGW
URL : http://www.mingw.org
Fichier : MinGW-3.1.0-1.exe
Folder : X:\mingw


Installation MSYS
URL : http://www.mingw.org
Info : Environnement posix sous win32 pour execution de script. Repose sur MingW
Fichier : MSYS-1.0.10.exe
Folder : X:\msys


Installation de MSYS Developer Tool Kit
URL : http://www.mingw.org/
Info : Divers outils supplémentaires dont automake, autoconf, libtool, autogen, guile, cvs, openssl, openssh, inetutils,perl ..
Fichier : msysDTK-1.0.1.exe
Folder : X:\msys

2.Exemple d'IDE Open-Source


Bloodshed Dev-C++
URL : http://www.bloodshed.net/devcpp.html
Fichier : devcpp-4.9.9.2_nomingw_setup.exe



3.Ressources



Mingw32 packages repository
URL : https://sourceforge.net/projects/mingwrep/
Info : Packages de librairies open-source compilées pour MinGW


GnuWin32
URL : http://gnuwin32.sourceforge.net/
Info : Fournit Win32 (MS Windows 95 / 98 / ME / NT / 2000 / XP) ports of tools with a GNU or similar open source license.


4.Divers


Chemin de recherche de gcc sous msys-mingw:
gcc -print-search-dirs

vendredi, mars 04, 2005

Python Distutils

 


Un résumé de comment utiliser le module distutils..
Python 2.4


EN COURS DE REDACTION


 



1.Afficher la liste des commandes distutils disponibles


python setup.py --help-commands


  build                  build everything needed to install
  build_py       "build" pure Python modules (copy to build directory)
  build_ext       build C/C++ extensions (compile/link to build directory)
  build_clib       build C/C++ libraries used by Python extensions
  build_scripts "build" scripts (copy and fixup #! line)
  clean             clean up output of 'build' command

  install                     install everything from build directory
  install_lib              install all Python modules (extensions and pure Python)
  install_headers   install C/C++ header files
  install_scripts     install scripts (Python or otherwise)
  install_data       install data files

  sdist            create a source distribution (tarball, zip file, etc.)
  
  bdist               create a built (binary) distribution
  bdist_dumb*   create a "dumb" built distribution
  bdist_rpm*     create an RPM distribution
  bdist_wininst* create an executable installer for MS Windows
* On utilisera plutot la commande --format adjointe à bdist ou sdist


  register         register the distribution with the Python package index



2.Créer un package pour distribuer un module sous forme dite *binaire*


Commandes :
python setup.py --bdist         ( format par défaut fichier zip )
python setup.py --bdist --formats=zip        fichier zip
python setup.py --bdist --formats=wininst fichier windows installer

Liste des formats de distributions :
python setup.py --bdist --help-formats


3.Créer un package pour distribuer les sources d'un module

Commandes :
python setup.py --sdist         ( format par défaut fichier zip )
python setup.py --sdist --formats=zip        fichier zip
python setup.py --sdist --formats=wininst fichier windows installer

Liste des formats de distributions :
python setup.py --sdist --help-formats

Résultat :
Une arborescence contenant les sources du module

manifest (log d'exécution de la commande sdist)
dist\name-version\
                       package1\ (les différents packages embarqués)
                       package2\
                       PKG-INFO (fichier d'information constitué d'infos de setup.py)
                       setup.py (le fichier setup.py qui a été exécuté)
                       readme.txt (copie d'un fichier readme.txt si présent au meme niveau que setup.py)


Remarques :
- La commande sdist ne prend pas en compte les fichiers déclarés dans data_files


 


Le fichier setup.py des différents cas


from distutils.sysconfig import *
from distutils.core import setup
from glob import glob
import os
import sys




setup(name="VoileIRC-API",
version="0.36",
description="VoileIRC Packaging : API IRC",
author="NoMorgan",
author_email=nomorgan@toto.com,
url=http://www.toto.net/corailnumerique,
packages=["voileirc","voileirc.config","voileirc.error","voileirc.event","voileirc.irc",
"voileirc.log","voileirc.net","voileirc.security","voileirc.tools",
"voileirc.web","voileirc.ia"],
package_dir={"voileirc":"voileirc"},
data_files=[(get_python_lib().split(sys.prefix)[1] + "\\voileirc", ['voileirc/README.txt']), (get_python_lib().split(sys.prefix)[1] + "\\voileirc\\data", ['voileirc/data/log.ini','voileirc/data/test.xml'])] )


packages : Liste des modules et sous-modules concernés par la commande
package_dir : chemin depuis le répertoire courant, c-a-d celui où se trouve setup.py, pour trouver les différents modules cités dans packages. Si certains sont des sous-modules, il n'est nécessaire que de préciser le chemin du module parent.
data_files : Liste de fichiers considérés comme des données du module. (par exemple : fichier image, xml ..)

mercredi, avril 21, 2004

PaP - Créer un client d'un WebService sous forme d'objet COM en VB.NET






[- Avec une utilisation minimale de Visual Studio.Net]
[- Il est conseillé d'utiliser la console lancée depuis "Invite de commandes Visual Studio.Net", car les variables d'environnement sont configurées (path,etc..)]


Objectif : créer un composant COM grâce à VB.NET jouant le rôle du client du webservice



1.Environnement


URL du fichier descriptif (fichier wsdl) du webservice:
http://www.site.com:8080/mywebservice?wsdl

2.Génération d'une classe "proxy" en vb.net


Cette classe jouera de rôle entre l'application utilisatrice du composant COM et le WebService.


En mode console, utilisation de l'outil du SDK.Net nommé "wsdl" :


wsdl /language:VB /out:ProxyWebService.vb http://www.site.com:8080/mywebservice?wsdl


/language:VB -> génération d'une classe en VB.NET
/out:ProxyWebService.vb -> nom du fichier généré


Si pour une raison de configuration de proxy, vous obtenez un message d'erreur, recopiez le fichier wsdl en local avec l'extension .wsdl et utilisez :


wsdl /language:VB /out:ProxyWebService.vb C:\dev\fichierWSDL.wsdl


3.Création d'un objet COM en VB.NET


Suivre l'article suivant : [PaP - Objet COM en VB.NET]


Sauf pour les étapes 3,4,6,7




  • étape 3 : Importer
    - Ajouter au début de maClasse.vb (avant le namespace)
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.ComponentModel
    Imports System.Diagnostics
    Imports System.Web.Services
    Imports System.Web.Services.Protocols
    Imports System.Xml.Serialization
    (en réalité ceux qui sont dans ProxyWebService.vb)



  • étape 4 : Méthodes
    - Modifier la déclaration de la classe maClasse
    En ajoutant tous les attributs de la classe ProxyWebService ainsi que la déclaration de son héritage à la classe maClasse
    Conserver : ComClass(maClasse.ClassId, maClasse.InterfaceId, maClasse.EventsId)
    Ex :
    <System.Diagnostics.DebuggerStepThroughAttribute(), _
    System.ComponentModel.DesignerCategoryAttribute("code"), _
    System.Web.Services.WebServiceBindingAttributeName:="WSSoapBinding", [Namespace]:=http://www.no.com/ws), _
    System.Xml.Serialization.SoapIncludeAttribute(GetType(Attribute)), _
    ComClass(maClasse.ClassId, maClasse.InterfaceId, maClasse.EventsId)>

    Public Class maClasse
    Inherits System.Web.Services.Protocols.SoapHttpClientProtocol
    ....
    End Class

    - Insérer les méthodes de la classe ProxyWebService dans maClasse

    - Insérer dans le namespace monNamespace du fichier maClasse.vb, les éventuelles autres classes du fichier ProxyWebService.vb directement en dessous de la classe maClasse

    - Si une configuration de proxy web est nécessaire
    Dans la méthode New() :
    (ou dans une méthode Init(..) qqconque)


    Dim URLToByPass() As String = {".*"} ' RegExp d'URL ne devant pas passer par le proxy

    Dim objProxy As New System.Net.WebProxy("http://proxy:81/", True, URLToByPass) ' l'argument 'True' indique que les adresses locales ne doivent pas passer par le proxy. Malgrè tout il vaut mieux quand même préciser URLToByPass

    objProxy.Credentials = System.Net.CredentialCache.DefaultCredentials


    Me.Proxy = objProxy




  • étape 6 : Importer
    - Au début du fichier Assembly.vb,ajouter
    Imports System
    Imports System.Attribute
    Imports System.Reflection
    Imports System.Runtime.InteropServices




  • étape 7 : Compiler la DLL
    - En mode console, en se plaçant dans le répertoire du projet

    set assemblies=System.Web.Services.dll,System.Xml.dll,System.dll[etc..] mettre ici toutes les autres références éventuellement nécessaires
    Il faut déterminer dans quelle DLL sont incluses les déclarations de type Import. On peut se servir de Visual Studio par exemple, en ajoutant une référence à la bibliothèque importer (menu "Références" dans l'explorateur de solutions) et consulter la propriété "Chemin d'accès".

    - Compilation :
    vbc *.vb /out:bin\nomFichier.dll /target:library /r:%assemblies%

mardi, janvier 06, 2004

Installation et Utilisation de Installer5 (packaging Py/Win)

 


Installer 5 permet de créer un executable à partir de sources python. Il crée un .exe à partir des sources d'un projet.

Il réunit ainsi dans un répertoire :
* un fichier .exe contenant les sources compilées
* le fichier python22.dll
* les différents fichiers .pyd (lilbrairie dynamique python) employés par le projet

[rédigé avec les versions Installer 5b4 et python 2.2.1]

1. Download l'archive installer5b4 à http://www.mcmillan-inc.com/installer_dnld.html

2. La décompresser dans un répertoire ex: c:\dev\installer

3. En mode console, se placer dans c:\dev\installer

4. Création d'un fichier .spec, contenant les détails du projet à packager.






Code:
makespec.py c:\projet\fichier_principal.py


    notes:
    - lors de la création du .spec, les sources n'ont pas besoin d'avoir été compilées, installer se charge de les compiler
    - le fichier_principal est celui qui doit contenir le point d'entrée de l'application


5. Création du package (répertoire contenant le .exe, la DLL python et les .pyd).






Code:
build.py fichier_principal\fichier_principal.spec


    notes:
    - un répertoire du nom du fichier source principal a été crée dans c:\installer
    - le répertoire fichier_principal\dist+fichier_principal\ contient tous les fichiers nécessaires à une installation de l'application sur un poste windows quelconque

jeudi, janvier 01, 2004

Divers 2004 - Python


Module re (Regular Expression) - Search vs Match

"Python offers two different primitive operations based on regular expressions: match and search. If you are accustomed to Perl's semantics, the search operation is what you're looking for. See the search() function and corresponding method of compiled regular expression objects.

Note that match may differ from search using a regular expression beginning with "^": "^" matches only at the start of the string, or in MULTILINE mode also immediately following a newline. The ``match'' operation succeeds only if the pattern matches at the start of the string regardless of mode, or at the starting position given by the optional pos argument regardless of whether a newline precedes it. "


La différence entre match et search réside dans l'emploi de ^ et sa signification. Search considère que "^" représente le début de toutes les lignes. Match considère que "^" représente uniquement le premier caractère de la chaine à analyser et non le premier caratère de chaque nouvelle ligne.

Illustration :






Code:
>>> re.compile("^a",re.M).match("\na") # echec
>>> re.compile("^a",re.M).search("\na") # success

>>> re.compile("^a",re.M).match("toto\nabc") # echec
>>> re.compile("^a",re.M).search("toto\nabc") # succes - ici search est valide car "^" indique pour lui le début de n'importe qu'elle nouvelle ligne


Si on précise une position de départ d'analyse dans la chaine, cette position de départ est représentée par "^", dans ce cas match considére que le premier caractère est celui possédant comme index la position

Illustration :






Code:
>>> re.compile("^bonjour",re.M).match("salut\nbonjour\ntout le monde") # echec
>>> re.compile("^bonjour",re.M).match("salut\nbonjour\ntout le monde",6) # success - la position 6 est le \n


[note:re.compile(RegExp).match(Expression a tester, pos debut de test, pos fin)]

Exemples de la documentation :






Code:
re.compile("a").match("ba", 1) # succeeds
re.compile("^a").search("ba", 1) # fails; 'a' not at start
re.compile("^a").search("\na", 1) # fails; 'a' not at start
re.compile("^a", re.M).search("\na", 1) # succeeds
re.compile("^a", re.M).search("ba", 1) # fails; no preceding \n


Autres exemples :






Code:
>>> re.compile("toto\n^a",re.M).match("toto\nabc") # succes


Exemples d'utilisation de variable :






Code:
>>> re.match("(?P<name>.+) (?!(?P=name))","55 55") # echec
>>> re.match("(?P<name>.+) (?!(?P=name))","55 56") # succes



Méthodes Statiques


A partir de la version 2.2, python gère les méthodes statiques via la fonction staticmethod() :






Code:
class C:

def foo(x, y):
print "staticmethod", x, y
foo = staticmethod(foo)

C.foo(1, 2)



Traitements sur List ou Tuple


Pour appliquer un traitement à tous les éléments d'une liste, ou d'un tuple, et celà, récursivement.

exemple:
on veut multiplier par deux toutes les valeurs de l
l = [1 , [ 4 , 3 ] , 2 , [ [3,9],8] ]
l = [2 , [ 8 , 6 ] , 4 , [ [6,18],16] ]

fonction récursive de parcours :







Code:
def function(sequence):
if (type(sequence) is list) or (type(sequence) is tuple):
index = 0
for val in sequence:
function(val)
pass
else:
print sequence # traitment
pass
pass


fonction récursive pour modifier tous les éléments :
(attention, seul le type list peut être modifié en python)







Code:
def function(sequence):
if (type(sequence) is list):
index = 0
for val in sequence:
sequence[index] = function(val)
index = index + 1
pass
return sequence
else:
return sequence * 2# traitment
pass
pass



SGBDR et SGBDOO en Python

SGBDR écrit en Python :
Gadfly
l'enregistrement direct d'objets pythons en base, avec construction automatique d'une table mappant l'objet en question


SGBDOO Python :
Durus - Systeme de Persistance d'objet et Transaction
ZODB - Idem en plus avancé, utilisé dans Zope


Liens


Site officiel
http://www.python.org

Plusieurs liens python
http://www.python-eggs.org/links.html

Packaging de script python sous Windows
http://www.mcmillan-inc.com/install5_ann.html
http://starship.python.net/crew/theller/py2exe/

IDE Performant - HAP Python Remote Debugger
http://hapdebugger.sourceforge.net/

Psyco - optimiser lexecution dun code python
"Psyco is a specializing compiler for the Python language"
http://psyco.sourceforge.net/

Pyrex - permet d'écrire des extensions a python compilées en C
"A Language for Writing Python Extension Modules"
http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/

Plex - Module python implémentant GNU Flex (=Lex) - Analyseur lexical
http://www.cosc.canterbury.ac.nz/~greg/python/Plex/

"The Biopython Project is an international association of developers of freely available Python tools for computational molecular biology"
http://www.biopython.org/

Python Performance Tips
http://manatee.mojam.com/~skip/python/fastpython.html

SciPy
"Python for Scientific Computing Workshop"
http://www.scipy.org/

Numerical Python
"Numerical Python adds a fast, compact, multidimensional array language facility to Python"
http://pfdubois.com/numpy/

[Intégration autres langages]
Weave - "a Tool for Inline C/C++ in Python"
http://www.scipy.org/site_content/weave
PyInline - "Inline for Python"
http://pyinline.sourceforge.net/

[Crypto]
*Eric A. Young
http://www.python.org/workshops/1995-12/papers/kuchling.html
*PyCrypto
http://www.amk.ca/python/code/crypto.html
et http://www.amk.ca/python/writing/pycrypt/ (doc. complète sur la cryptologie)

[Framework Jeux]
PyGame
http://www.pygame.org/
PyKyra
http://sourceforge.net/projects/kyra


PythonWare Daily Python-URL (WebLOG Dev Python)
http://www.pythonware.com/daily/

mercredi, décembre 17, 2003

Etendre le langage Python


Introduction

Il s'agit là d'étendre le langage en lui rattachant de nouveaux types de données, de nouvelles fonctionnalités, de nouveaux modules.

Pour celà, deux facons:

    Il suffit de créer un module en langage python et de placer les fichiers .py dans le repertoire /lib de python.
    Dans certains cas, cette méthode peut être limitée.

    Il s'agit cette fois d'écrire des fonctionnalités, des nouveaux types de données ... en C ou C++. Dans ce cas là, on passe par la librairie python, qui représente le coeur du langage.


C'est la deuxième méthode qui est détaillée ici.

En employant le C/C++ pour intégrer de nouvelles fonctionnalités à python, on va développer des modules statiques ou dynamiques

L'écriture de ces modules se base sur la librairie python livrée avec le langage. On utilise alors des fonctions, macros et constantes définies dans cette librairie.
(Lot d'éléments commencant par py, API Doc à http://www.python.org/doc/current/api/api.html)

Module dynamique :
Il faut ici compiler le nouveau module sous forme de shared object (.so) pour Unix ou de DLL pour Windows.

Je ne traite ici que de la compilation de module dynamique pour windows.
Il s'agit de créer des fichiers .pyd, sorte d'équivalent aux DLLs.
L'exemple suivant se base sur un environnement MinGW (GNU Win32) et python2.2.1 pour windows.
(Se reporter à la configuration d'une plateforme GNU Win32,
si vous désirez compiler des .pyd en environnement de developpement Visual Studio 6, et non GNU Win32, se reporter a la documentation livrée avec python)

A.La librairie python

Pour tout développement sur un environnement MinGW (gnu win32) il faut d'abord effectuer un travail préliminaire sur la librairie python. Elle contient le code compilé de l'interpréteur. Cette librairie a été écrite en C. Sur un syteme windows, elle se présente sous la forme de 3 fichiers
* system\python22.dll (librairie dynamique systeme)
* c:\python22\include\python.h (include à utiliser dans les modules)
* c:\python22\libs\python.lib (librairie statique)
Elle est directement exploitable avec Visual Studio, mais pour MinGW il nous faut obtenir les équivalents de ces fichiers.

1.Localiser le fichier python22.dll sur le syteme windows (en général dans \system32\)
2.Copier la dll dans un répertoire c:\lib
3.Lancer un mode console (ne pas oublier davoir régler le path pour la plateforme GNU)
4.Se placer dans le repertoire c:\lib
5.Utiliser pexports pour créer le fichier .def






Code:
pexports python22.dll >python22.def

6.Utiliser dlltool pour créer le fichier .a






Code:
dlltool --dllname python22.dll --def python22.def --output-lib libpython22.a




B.Réalisation d'un module

1.Création du fichier source
Le fichier source C/C++ doit contenir les différents éléments du module. Il doit se baser sur les fonctions, macros et constantes de python définis dans python.h (tout ce qui commence par Py).


Donc premier cas : Utiliser les fonctions C/C++ de la librairie python (de python.h). Et écrire entièrement le module. Ca sera le cas de l'exemple plus bas.

On peut ici utiliser un scrypt python qui, une fois paramétrer, va nous créer un fichier.c contenant toutes les déclarations nécessaires en exploitant les éléménts Py. Il génère en fin de compte un squelette vide, dans lequel il ne reste plus qu'a déposer le code C/C++.
Il s'agit de modulator.py et se trouve dans l'arborescence CVS des sources pythons à python\dist\src\Tools\modulator.

Deuxième cas : Compiler sous forme de module du code C/C++ déja existant. Il faut ici créer un wrapper du code existant. En général on utilise des outils se chargeant de ce travail.


Comme SWIG (http://www.swig.org). Il génère un fichier intermédiaire en analysant le code source C/C++ existant et y crée des fonctions qui vont faire appel à ce meme code source. SWIG est un générateur de wrapper. (Il supporte d'autres langagaes que python, comme perl ou ruby)


On peut aussi employer la librairie Boost.python, ( http://www.boost.org ) qui est une librairie C++ comprenant des classes et méthodes pour écrire à la main un wrapper.



Exemple 1er cas : Fichier C, représentant le module "myexemple" contenant une fonction "systeme" :







Code:

#include <Python.h>
static PyObject * myexemple_system(PyObject *self, PyObject *args)
{
    char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return Py_BuildValue("i", sts);
}

static PyMethodDef SpamMethods[] = {
     {"system",  myexemple_system, METH_VARARGS,
     "Execute une commande shell."},
     {NULL, NULL, 0, NULL}        /* Sentinel */
};

void initmyexemple(void)
{
    (void) Py_InitModule("myexemple", SpamMethods);
}


2.Compilation de myexemple.c






Code:
gcc -g -Wall -I c:\python22\include -fpic -c myexemple.c

Un fichier myexemple.o est alors généré. Pour chaque include que le fichier source utilise en plus de python.h, rajouter






Code:
-I rep_include


3.Compilation en module dynamique
En deux étapes:

* Génération d'un fichier .def
Tout d'abord créer dans le meme repertoire que myexemple.o, un fichier myexemple.def contenant :






Code:
EXPORTS
   initmyexemple


* Compilation du fichier .pyd






Code:
dllwrap --dllname myexemple.pyd --driver-name gcc --def myexemple.def -o myexemple.pyd myexemple.o -s --entry _DllMain@12 --target=i386-mingw32 -Lc:\lib -lpython22

Un fichier myexemple.pyd est alors généré. Pour chaque librairie utilisée en plus de celle de python, placer son chemin dans l'argument -L et le nom de la librairie avec -l.
Par exemple, pour c:\dev\lib\libmonfichier.a :






Code:
-Lc:\dev\lib -lmonfichier


4.Déploiement
Il suffit de copier le fichier myexemple.pyd dans c:\python22\DLLs. Pour le tester en mode console, essayer :






Code:
import myexemple



Module statique :

Il faut recompiler l'interpréteur lui-même en meme temps que le nouveau module. On utilise cette façon de procéder quand on veut intégrer définitivement le module à python. Ou encore sur un systeme d'exploitation ne supportant pas le chargement dynamique.
Il faut alors placer le fichier .C contenant le code source du module dans Modules/ directory et modifier le fichier de configuration Modules/Setup.local en ajoutant la ligne






Code:
nom_module nom_fichier.o

.
(pour chaque librairie utilisée, ajouter à la ligne -lmalib)
Il reste à relancer la compilation de l'interpréteur par un make




Ressources Webs :
Instructions for Python Extensions with GCC/mingw32