Archive for the ‘Development tools’ Category

June 29th, 2009 @ 9:09pm | njames | Categories Development tools | No Comments »
  • Pour la gestion de dépôt SVN, le plugin Subversive accompagné du connector SVN de Polarion est un brin buggy, sur certain (gros) dépôts SVN il me fait un heap space error, plutôt embêtant... Le plus étrange, c'est cette gestion d'erreur de la part d'Eclipse:

    screenshot-operation-failed

    Un fonctionnement anormal est détecté mais l'action "send report" est indisponible.

  • Pourquoi diable le gestionnaire de plugins/packages sous Eclipse est aussi complexe ? et surtout aussi LENT !! c'est purement incroyable ! et ça empire avec Eclipse Galileo (la nouvelle mouture d'Eclipse fraîchement sortie) pour ma part sur ma machine !

  • Avec Eclipse Galileo, il y a une nouvelle gestion des libraries (.jar et .jar externes). Pour ma part, j'aime bien avoir un sous-répertoire ./lib dans mon projet dans lequel je mets mes libraries (.jar et .so). C'est bien pratique de faire ainsi car le répertoire apparait dans l'arborescence du projet Eclipse, et les .jar qu'il contient apparaissent aussi dans Referenced Libraries:

    eclipse_annoyance1

    Avec Eclipse Galileo, le répertoire disparait de la vue arborescente, un développeur a trouvé pertinent de faire disparaitre le répertoire car il contient les libraries... je trouve cela complètement stupide: faire une vue système de fichier et une autre vue conceptualisée, orientée application Java qui ne reflète pas le système de fichier, oui! NetBeans le fait très bien, mais mélanger les deux... je suis tatillon mais je trouve cela stupide.

    Note: en fait c'est un comportement de l'import de jar automatique (une des nouveautés de Eclipse Galileo Java, voir la section Classpath resolution honors the 'Class-Path' header of JAR manifest file), on peut aller dans Referenced Libraries, clic droit sur le répertoire > remove from Referenced Libraries, ce qui fait réapparaitre le répertoire dans le package explorer.
    (Voir la page New and Noteworthy sur le site d'Eclipse pour toutes les nouveautés de Galileo).
June 22nd, 2009 @ 8:30pm | njames | Categories Development tools, Java | No Comments »
(Voir l'épisode précédent).
Nouvelle version de Galatee, mon petit projet de navigation dans une collection d'image en Java: Galatee_0.3.jar. Le projet est sous licence GPL.
(Attention: Je n'ai pas vérifié que l'application fonctionne bien sous d'autres systèmes d'exploitation (comme windows), je développe exclusivement sous GNU/Linux, et j'avoue que par exemple je n'utilise pas System.getProperty("path.separator")).
  • correction de bugs,
  • ajout et suppression de colonnes à la table d'affichage avec les touches '+' et '-',
  • activation du modèle de table dynamique (nombre de colonnes dans la table d'affichage fonction de la largeur de la fenêtre),
  • activation de la navigation dans la liste d'images avec pagination.
Pour tester le jar: java -jar Galatee-0.3.jar $path
L'application test est codée pour lancer la commande display de ImageMagick pour les images double-clickées.

Il reste encore un petit problème que je voudrais régler: une queue bornée pour les images chargées en mémoire (avec une gestion multi-pages, i.e. prenant en considération la pagination des documents), mais une stratégie intelligente (et la plus légère possible) pour cela, n'est pas facile à écrire.
May 14th, 2009 @ 6:33pm | njames | Categories Development tools, Java | 2 Comments »
Dans ce billet, je parlais d'une application SWT basée sur le widget SWT Nebula Gallery pour naviguer dans une collection en Java/SWT.
J'avais codé un thread de chargement pour avoir un load-when-you-see, et le tout fonctionne plutôt bien.

MAIS, c'est du SWT et cela m'embête un brin. Le but de ce projet est de naviguer dans de grande collection d'images, et il faut aussi que je puisse afficher un certain nombre de metadata associées à chaque image, ainsi je voulais afficher un petit ScrollPane pour chaque image contenant les metadata sous forme textuelle, et faire cela en SWT est apparemment une chose ardue.
C'est ainsi que je me suis mis à coder un widget similaire pour swing, j'ai renommé mon projet utilisant SWT Nebula Gallery en SWTGalatee, et mon nouveau projet swing devient Galatee.
Je pensais utiliser pour cela une JTable et un custom renderer pour les cellules de cette table. Ce custom renderer prendrait son rendu sur un JPanel qui contiendrait une image et un JScrollPane, mais c'est sans savoir comment fonctionne un Renderer en swing (voir ça), en fait un renderer ne produit que des images de composant swing: il ne faut pas s'attendre à une réponse d'événements souris ou clavier sur une image de composant.
Et un JScrollPane sans interaction via la souris, c'est inutile !

Solution adoptée: ne pas utiliser de JScrollPane pour afficher mes metadata, mais plutôt faire un JTextArea de la hauteur nécessaire pour afficher toutes les metadata.
Ainsi, la JTable à des lignes de hauteurs différentes, chaque ligne est de la hauteur de la cellule sur cette ligne qui a la hauteur max.

Le résultat sur la base MIRFlickr:

screenshot-iidf-browser


Plusieurs points sont à préciser tout de même:
  • pour le moment, je conserve en mémoire les thumbnails calculées pour le rendu, en fonction de leurs tailles, on peut vite être confronté à un java.lang.OutOfMemoryError: Java heap space.
    Pour le moment, utiliser les paramètres de la JVM -Xms<initial heap size> -Xmx<maximum heap size> est une solution à court terme. Une amélioration pourrait être d'améliorer le thread d'affichage en utilisant une liste bornée en taille pour les items chargés en mémoire.
  • le widget swing est plus lent que le widget SWT Nebula Gallery (sauf pour le temps de chargement du widget en lui même, swing est beaucoup plus rapide), sur deux points:
    • pour le calcul des thumbnails: dans un premier temps, j'ai utilisé BufferedImage.scaleInstance(...), puis dans un second temps JAI (j'ai testé avec et sans la library C, d'ailleurs étonnamment la library native de JAI est plus lente que la library pure java). Dans les deux cas SWT fait appel à des routines plus rapides.
    • pour l'affichage, la JTable est un widget assez rigide, il y a peut être des paramètres pour assouplir le scrolling mais je ne les connais pas. J'ai quand même positionné l'unité d'incrémentation du scroll (via sp.getVerticalScrollBar().setUnitIncrement(42), sp étant le JScrollPane de ma JTable, pour que le scrolling ne se fasse pas row par row mais sur une quantité de pixels.
  • le layout: avec SWT Nebula Gallery, le layout est dynamique, si la largeur de la fenêtre change le nombre de colonne de la grille d'images s'adapte pour afficher autant de colonnes que possible. Dans mon widget, la JTable empêche ce genre de chose.
    Je pourrais faire écouter le redimensionnement de la JTable et changer son modèle en fonction, mais j'ai peur que cela alourdisse cruellement l'affichage.
    Une solution à adopter serait peut être de changer le modèle sur demande de l'utilisateur, par exemple avec les touches '+' et '-', pour ajouter ou retirer des colonnes au modèle.
    edit 09-05-16: j'ai ajouté les deux comportements (1) '+' et '-' pour modifier le nombre de colonne, et (2) un modèle de table dynamique en fonction de la taille du JScrollPane contenant la JTable, ça se fait bien en codant futé pour modifier au minimum le modèle.
    Ainsi j'ai dû coder aussi l'update de la cellule sélectionnée dans le nouveau modèle (i.e. nouveau modèle car redimensionnement de la table, il faut que la cellule qui était sélectionnée dans l'ancien modèle soit toujours une cellule sélectionnée dans le nouveau modèle), et un scroll de la JTable pour que la cellule sélectionnée soit affichée (un scroll du rendu du nouveau modèle pour que la cellule sélectionnée soit affichée).

Archives:
  • Galatee-0.1.jar
  • edit 09-05-17: nouvelle version avec l'edit 09-05-16 (voir plus haut): Galatee-0.2.jar. Ajout également d'une interface GalateeListener à implémenter pour répondre aux événements sur la grille d'image:
    public interface GListener extends EventListener {
    	public void itemClicked(GEvent e);
     
    	public void itemDoubleClicked(GEvent e);
     
    	public void selectionChanged(GEvent e);
     
    	public void focusChanged(GEvent e);
    }
  • SWTGalatee-0.1.jar

Autres approches éventuellement possibles (mais que je n'ai pas investigué) pour réaliser un tel widget:
  • utiliser un Panel avec un GridLayout, spécifier la taille de la grille du layout en fonction du nombre d'images. Trouver un moyen pour savoir quand une cellule du panel doit être affichée et quand elle n'est plus sur l'écran. Quand elle doit être affichées faire un setComponentAt(...) de la cellule avec un custom panel pour mon image+metadata. Dès que la cellule quitte l'affichage de la fenêtre (par un scrolling), faire un setComponentAt(..., ..., null).
  • ne pas utiliser une table mais une succession de JList, ce qui permettrait de ne pas avoir des lignes de tailles fixes (et pas de ligne du tout d'ailleurs), cependant ce n'est peut être pas visuellement très louable.
June 12th, 2008 @ 2:47pm | njames | Categories Development tools | No Comments »
Comme je travaille avec un ami sur un même bout de code pour un petit projet prospectif, j'ai déployé un subversion sur mon serveur. Voici un mémo de quelques tests: La machine utilisée tourne sous Ubuntu8.04.
Pour un usage en local:
  • installer le paquet subversion.
  • pour créer un repo:
    $svnadmin create projectName
  • pour le checkout:
    $svn co file:///path/to/the/repository
  • pour flagger un fichier comme nouveau dans le repo (et donc à ajouter sur le repo distant)
    $svn add newFile
  • pour commiter:
    $svn co fileToCommit -m "message"
    Si échec du dernier commit et intégration nécessaire, il faut récupérer la version plus récente présente sur le serveur (pour faire la fusion à la main):
    $svn update fileToUpdate
    SVN va alors créer 3 fichiers: file.mine (copie de la version modifiée en local), file.r1 (version locale avant modification), file.r3 (version du serveur, donc plus récente que file.r1). Quand l'intégration est effectuée (fusion de file.mine et r3) alors il faut flagger le conflit comme résolu (et recommiter le fichier ensuite):
    $svn resolved fileResolved
    flags possibles: C : conflict (fichier conflictuel) A : added (fichier ajouté dans le projet) D : deleted (fichier supprimé du projet) G : fusion (fichier plus récent sur le repo et version locale modifiée depuis le dernier checkout mais la fusion ne pose pas de conflit) M : modified (modifications sur un fichier qui n'a pas été modifié localement, alors le fichier locale est écraser par sa version du repository).
  • pour créer une nouvelle branche à partir du trunk:
    $svn cp http://.../trunk http://.../branches/mybranch
En réseau avec svnserve (et donc écoute sur un port particulier, le 3690):
Rien de particulier, il suffit soit de lancer le deamon à la main, soit de faire un script à placer dans /etc/rc1.d/K20svnserve et /etc/rc2.d/S20svnserve (ou placer le script dans /etc/init.d, et utiliser l'outil Debian rcconf).
#!/bin/sh
case "$1" in
  start)
        start-stop-daemon --start --chuid www-data:www-data --exec /usr/bin/svnserve -- -d -r /home/subversion/usvn/svn
        ;;
  stop)
        start-stop-daemon --stop --exec /usr/bin/svnserve
        ;;
  restart)
	$0 stop
	$0 start
	;;
esac
exit 0
En réseau avec Apache sur le port 80:
  1. installer les paquets subversion, subversion-tools, libapache2-svn
  2. charger le module $a2enmod dav_svn
  3. rendre le repo accessible par apache: Éditer /etc/apache2/mods-available/dav_svn.conf
    <Location /svn> 
    DAV svn
    Require valid-user
    SVNParentPath /home/subversion/repo/
    AuthType Basic
    AuthName "Subversion repository"
    AuthUserFile /home/subversion/conf/htpasswd
    AuthzSVNAccessFile /home/subversion/conf/access
    </Location>
  4. gérer les utilisateurs avec $htpasswd /home/subversion/conf/passwd nicolas
  5. gérer les droits en éditant le fichier /home/subversion/conf/authz
    [groups]
    developer  = nicolas
    [projectName:/]
    @developer = rw
    * = r
En réseau avec USVN:
C'est la solution utilisée à la date de rédaction du billet. Plus léger et pratique qu'un Trac, mais certes bien moins puissant (ce n'est même pas comparable en fait, Trac étant un bug tracker), USVN ne propose pas de wiki, ni d'exploration du code (mais on peut naviguer dans l'arborescence du dépôt dans une interface Web). USVN, UserfriendlySVN est un projet de l'Epitech distribué sous licence CECILL, qui permet la gestion de repository SVN par une application PHP (création, gestion des droits), en fait c'est très partique pour créer des dépôts SVN à distance et gérer les droits d'accès.
  1. installer les paquets libapache2-mod-php5 php5-sqlite sqlite3
  2. activer le module $a2enmod rewrite
  3. récupérer l'archive de USVN et la copier dans /var/www, la décompresser et modifier le propriétaire des fichiers $chown -R www-data: usvn
  4. vérifier le /usvn est accessible sur votre website, et utilisez l'application php pour l'installation.
Eclipse et SVN:
Avec Eclipse Ganymede, un projet Eclipse est né pour intégrer SVN dans eclipse, subversive, mais le plugin subclipse fonctionne aussi avec Ganymede.
  1. installer le plugin subclipse disponible sur Tigris. Par défaut, une dépendance (buckminster) est nécessaire à l'installation du plugin (et semble poser problème), mais l'installation du plugin peut s'effectuer en décochant l'option "Integrations (Optional)".
  2. un "new project" puis "checkout projects from SVN", et ça roule tout seul.
Avec Subversive:
  1. installer le plugin subversive depuis les dépôts Eclipse http://download.eclipse.org/technology/subversive/0.7/update-site/.
  2. installer un SVN connector, par exemple celui de Polarion: http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/ On y trouve une implémentation de Polarion, SVNKit, et une autre de Tigris, JavaHL. Cependant, il semble que si vous avez des projets anciennement gérer avec subclipse, le plugin subversive n'arrive pas à reprendre la main dessus...
June 25th, 2007 @ 4:47pm | njames | Categories Development tools, GNU/Linux | No Comments »
Après quelques tests: - DIA: pas pratique pour faire des diagrammes UML, (et pas d'alternative aux liens en zigzag! du moins pas sans bidouillage) - UMBRELLO: pas pratique non plus, très strict, ne permet pas de bidouiller les schémas ou alors j'ai pas vu l'option... - BOUML: (ne pas oublier libqt3-compat-headers le paquet de compat avec qt1/qt2 pour avoir qlist.h dans l'installation de QT). - gaphor: en python, je n'arrive pas à faire fonctionner la dernière version, me demande des fichiers de zope... - TCM: aussi sexy qu'une affiche de recrutement pour kolkhoze soviétique...
June 22nd, 2007 @ 9:18am | njames | Categories Development tools, GNU/Linux | No Comments »
Sous windows il y a Camtasia (qui est très bien fait, pour l'avoir utilisé!), ou Lotus Screencam, ou fraps. Il existe de nombreuses manière de faire un screencast sous linux: - VLC et screen:// (en ligne de commande, avec un transcode et un access=file, cependant en fonction du muxer utilisé comme ts,ps ou ogg, j'ai des packetisation error, que je ne comprend pas, cependant avec avi c'est OK...)
$vlc -vvv screen:// --sout \ "#transcode{vcodec=mp4v,vb=1024,deinterlace}:duplicate{dst=display,dst=standard\ {access=file,mux=avi,dst=flux.avi}}"
- xvidcap : mais qui ne produit que des fichiers encodé vidéo Theora, en audio Vorbis, et OGG pour container. xvidcap website Une interface graphique est apparement dispo, gvixcap. - recordMyDesktop : dispo sur les dépots Ubuntu et gère le son apparement. recordMyDesktop website - istanbul : est un projet Gnome, très similaire à recordMyDesktop, dispo sur les dépots Ubuntu et gère le son. Istanbul website J'ai testé la version 0.2.1, buggée, l'enregistrement du son ne fonctionne pas (mauvaise configuration?), et l'arrêt de l'enregistrement est buggé aussi. - Cankiri : inspiré de Istanbul. http://www.tortall.net/mu/wiki/Cankiri (A noter: le website de l'auteur de Cankiri est intéressant, il est un système de wiki que j'aime bien, et une API ajax qui vaudrais le coup de jeter un œil). Je n'avais pas découvert ces trois derniers quand j'avais vraiment besoin de faire un screencast avec l'audio pris sur la sortie microphone. La solution que j'ai utilisé est quand même, pas très pratique, mais fonctionne! Une version patchée de ffmpeg: 1. Les paquets nécessaires: build-essential xlibs-dev ffmpeg 2. récupérer ffmpeg: $wget http://lecoindespotes.free.fr/ubuntu/screencast/ffmpeg-0.4.9-p20051216.tar.bz2 3. récupérer le path: $wget http://lecoindespotes.free.fr/ubuntu/screencast/ffmpeg-0.4.9-p20051216.diff 4. appliquer le patch: patch -Np1 -i ffmpeg-0.4.9-p20051216.diff 5. $./configure --extra-ldflags=-L/usr/X11R6/lib --enable-x11grab --enable-gpl && make $./ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -vd x11:0,0 -ad /dev/dsp -s 1280x800 screencast.avi Les options: -vd x11:0,0 : On récupère sur X11 et on regarde à la position de l'écran 0,0 (en haut de l'écran) -s 1024×768 est la taille de la vidéo capturé (si la valeur est trop grande, ffmpeg plante) Pour ne capturer qu'une zone précise de l'écran, d'une application par exemple, on peut utiliser xwininfo, qui renvoie la taille d'une fenêtre et sa position. Pour redimensionner la vidéo avec ffmpeg: $./ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -i ~/test.avi -s 800×600 ~/test-800-600.avi Il existe Kino sous Linux pour faire du montage, mais apparemment il permet de monter que des films DV. J'ai utilisé VirtualDub, que je savais utiliser, sous Windows par manque de temps, pour couper quelques secondes au début à la fin de la vidéo. Idée de projet: Utiliser cette version de ffmpeg patchée pour faire une application de screencast. Faire un script shell pour lancer une capture screencast avec audio sur microphone, dans un répertoire donné, suffixer le nom du fichier par un numéro (prendre ls -l|wc-l). Utiliser un raccourci Gnome pour lancer une capture, un autre pour killer le process. J'ai testé envoyé un sgnal 15 à ffmpeg ne corrompt pas le fichier écrit. Utiliser avimerge pour merger les différents fichiers. On pourrait aussi utilise jvlc pour faire une application en Java, pour le montage. Pour le moment, très rapidement avec quelques scripts, on peut obtenir quelque chose de très utilisable: 1. un script de démarrage de screencast ffmpeg, screencast_start.sh et un script d'arrêt screencast_stop.sh 2. lier ce script avec un raccourci GNOME, (gconf-editor, dans apps/metacity/global_keybindings et apps/metacity/keybinding_commands) Avec des combinaisons de touches de raccourcis judicieusement choisi, on peut gérer le fullscreen de OpenOffice Impress (comme F11 et F12 par exemple). Le script de démarrage précédent, crée un fichier vidéo dans un répertoire à indiquer dans le script, en suffixant le nom du fichier par un entier (le nombre de fichier dans le répertoire, mais il serait plus judicieux de suffixer par la date courante en ms), pour éviter les écrasement de fichier. Pour améliorer un peu ces script, on pourrait ajouter un on-screen-display avec un compteur "recording in 3... 2... 1... go!", pour cela utiliser xosd, mais c'est un peu vieillo et n'utilise que des fonts X (je ne sais pas trop comment fonctionne cela...), alors plutôt utiliser gnome-osd-client, qui est plus récent et utilise Bonobo ou dbus. voir: http://huygens.ca.infn.it/cgi-bin/man/man2html?gnome-osd-client+1 et http://developer.gnome.org/doc/API/2.0/pango/PangoMarkupFormat.html Après un rapide coup d'oeil sur le fonctionnement de gnome-osd-client, (qui fait apparaitre le message jusqu'a ce que le pointeur de souris soit over le message), il doit être possible de récupérer sur dbus un message comme quoi le message n'est plus affiché à l'écran. Il faudrait donc un programme qui se met en attente d'un message sur dbus relatif à gnome-osd-client. A la réception de ce message, on démarre l'enregistrement. A noter: Byzanz est une application qui peut être intéressante dans certains cas, elle permet de faire un screencast en image au format GIF, très pratique pour afficher dans une page HTML. Un billet à ce sujet: http://pwet.fr/blog/faire_une_capture_d_ecran_en_gif_anime_un_screencast
June 19th, 2007 @ 2:54pm | njames | Categories Development tools | No Comments »
From protocols to state and aspirations Dans cette présentation de Berners-Lee, on trouve le très connu diagramme en couche représentant la pile des langages (complèmentaires) du semantic web. semantic web stack Conceptual Graph and the semantic web, article pointé par la doc sur CORESE.
June 16th, 2007 @ 8:54pm | njames | Categories Development tools, GNU/Linux | No Comments »
OpenObex est une implémentation libre du protocole Obex, Object Exchange, qui est utilisé dans nombre d'appareil mobile. http://dev.zuckschwerdt.org/openobex/ http://www.tech-edv.co.at/programmierung/en/gplsw.html#download http://www.markup.fr/sony_ericsson_v600i_sous_linux http://ludomatic.com/blog43.html Il est utilisé par exemple, pour la communication avec le Ericsson v600i. L'utilisation en ligne de commande est très simple, et un paquet est dispo dans les dépots Ubuntu.


 Valid XHTML 1.0 Transitional Valid CSS! WordPress