#!/bin/bash
echo "processing files to add..."
svn status | grep "^?" | sed -r 's/^\?[ ]+//' | xargs -r svn add
echo "processing files to delete..."
svn status | grep "^!" | sed -r 's/^\![ ]+//' | xargs -r svn delete
echo "processing commit..."
svn commit
Galatee is my Java library for visualizing image collection, and Jmagine is my other Java library for displaying images with annotated polygons using the
SVG specification and Apache Batik.
Using this two libraries it's easy to code a quick browser for a specific image collection with a specific annotation file format and annotation model.
In the case of PascalVOC, since the challenge of 2007 the annotation files are
XML files, so with the help of an XSD grammar related to the
XML files and using JAXB it's easy to retrieve all the data contained in the annotation files that we want. Considering this, using the Galatee and Jmagine libraries, browse and visualize the PascalVOC data need less than 300 lines of codes!
Obviously the browser takes much time for starting (the time for JAXB to parse all the annotation files that are XML files), but using a serialization of the inputs needed by the Galatee library, this time is needed only at the first launch of the program.
The archive of the project: PascalVOC-0.2-2010.07.01.tar.gz (18.9 MB, it's heavy but the archive includes the Galatee, Jmagine, Apache Batik, Lucene and JAI libraries).
The archive contains java code and classes, a shell script PascalVOC.sh for GNU/Linux and a batch file PascalVOC.bat for MS-Windows.
NOTE: How to make the
XML binding generated by JAXB serializable?
- add
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0" to the namespaces declaration of the XSD schema element
- add this element in the schema body:
<xs:annotation>
<xs:appinfo>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
<jaxb:bindings schemaLocation="/home/nicolas/dev/eclipse-java-workspace/PascalVOC/pascalvoc_annotation.xsd">
<jaxb:globalBindings>
<jaxb:serializable />
</jaxb:globalBindings>
</jaxb:bindings>
</jaxb:bindings>
</xs:appinfo>
</xs:annotation>
Dans l'arsenal de commandes de
SVN il n'y a pas de commande pour supprimer une révision, la façon la plus simple de faire est de créer un dump du repository incriminé, supprimer le repository, créer un repository avec le même nom, et y importer le dump précédemment crée.
$tar czf cbiaproto3.tar.gz ./cbiaproto3
$svnadmin dump -r1:13 cbiaproto3 > cbiaproto3.dump
$rm -fr cbiaproto3
$svnadmin create cbiaproto3
$svnadmin load cbiaproto3 < cbiaproto3.dump
Sous Ubuntu Jaunty la dernière version du package Latex
algorithm2e est 3.9, alors que la version 4.01 est disponible. Dans cette dernière version certaines commandes ont changées notamment
\SetLine devient
\SetalgoLined (voir la
documentation).
Plutôt que d'écraser le fichier apporté par le paquet ubuntu (i.e.
/usr/share/texmf-texlive/tex/latex/algorithm2e/algorithm2e.sty), une façon simple d'utiliser la dernière version est de se créer un répertoire
~/texmf (texmf pour
tex macros & fonts), d'y copier le fichier
algorithm2e en version 4.01, et de positionner la variable d'environnement
TEXINPUTS avant de lancer la compilation de son latex:
$export TEXINPUTS=.:/home/nicolas/texmf:
NOTES:
- le positionnement
[H] sur un algorithm (i.e. \begin{algorithm}[H]) n'est pas autorisé en mode deux colonnes comme dans la classe IEEETran.
- la classe Latex LLNCS a été mise à jour, et le package hyperref est (enfin! ) supporté (lien).
Le temps passant, j'ai fait beaucoup de modifications et d'ajouts sur ce site. La validation xhtml des pages n'est plus depuis belle lurette! Pour remédier à cela, je me suis mis à cette fastidieuse tâche:
- A propos de contenu html embedded dans une page dokuwiki: (i.e. ma homepage personnelle), il existe en fait deux façon d'encapsuler du html dans une page dokuwiki:
- avec le tag
<html> et le contenu html doit être uniquement inline
- avec le tag
<HTML> et le code html peut contenir des éléments block
La différence est qu'avec le premier, le code html est à l'intérieur d'un un tag <p> donc si le code html imbriqué contient des éléments blocks alors la validation html est impossible !
C'est un problème qui m'agaçait depuis longtemps, mais je ne connaissais pas l'existence du tag <HTML>.
- Pour la validation des pages WordPress: ce moteur de weblog à la très sale habitude de formater le contenu des billets, notamment en ajoutant des balises
<p> un peu partout. Il est possible de désactiver cela via le plugin disable-wpautop. Une fois ce plugin activé, la validation xhtml 1.0 transitional est à portée de main...
Un petit souci cependant: le plugin désactive aussi l'ajout des balises <br>, ce qui est embêtant pour la rédaction.
Les mp3 players UMS n'apparaissent pas automatiquement dans Rhythmbox, il faut créer un fichier
.is_audio_player à la racine du filesystem du player.
Voir
http://live.gnome.org/Rhythmbox/FAQ.
Pour mettre au point un petit annotateur graphique d'image (placement de symboles graphique, différents mode de sélection de patch), j'utilise Apache Batik.
Cela me permet de contenir les annotations en
SVG, ce qui est bien pratique, autant pour la gestion en interne des annotations (e.g. les layers sont des groupes de symboles graphiques dont la propriétés
SVG visibility change), un arbre
XML c'est la panacée.
J'avais déjà travaillé un peu là dessus, mais c'était codé à la va-vite et uniquement pour afficher les annotations LabelMe:
C'est ainsi que je me suis frotté aux obscurs rouages du pipeline graphique de Batik... et un petit problème que je viens de résoudre est celui-ci:
Si un objet JSVGCanvas est dans le viewport d'un JScrollPane, comment positionner une texture de rendu sur le background du JSVGCanvas (i.e. positionner un background particulier sur l'objet qui est dans le viewport du JScrollPane ! ).
Il faut faire attention à ce que fait la méthode de rendu
paint(...) de JSVGCanvas. En fait, cette méthode
paint(...) est héritée de JComponent:
Un objet JSVGCanvas est un JComponent qui contient une liste de CanvasGraphicsNode. Positionnner un background sur JSVGCanvas, revient à positionner un background sur un JComponent, et la méthode paintComponent(Graphics g) est redéfinie dans la classe JGVTComponent, c'est donc dans cette classe que l'on doit faire quelque chose.
Il n'y a rien de prévu pour cela dans Batik, la solution que j'ai mise en place est de modifier les sources, ça se fait facilement en modifiant la classe org.apache.batik.swing.gvt.JGVTComponent:
private TexturePaint texpaint;
public void setTexturePaint(TexturePaint texpaint){
this.texpaint = texpaint;
}
/**
* Paints this component.
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
Rectangle visRect = getRenderRect();
g2d.setComposite(AlphaComposite.SrcOver);
//les deux lignes suivantes sont commentées.
//g2d.setPaint(getBackground());
//g2d.fillRect(visRect.x, visRect.y, visRect.width, visRect.height);
//et on ajoute les deux lignes suivantes:
g2d.setPaint(texpaint);
g2d.fillRect(0, 0, getWidth(), getHeight());
if (image != null) {
if (paintingTransform != null) {
g2d.transform(paintingTransform);
}
g2d.drawRenderedImage(image, null);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_OFF);
Iterator it = overlays.iterator();
while (it.hasNext()) {
((Overlay)it.next()).paint(g);
}
}
}
Rien de bien sorcier: on ajoute de quoi positionner un TexturePaint, et on modifie un brin paintComponent(Graphics g) pour texturer le panel plutôt que peindre avec la couleur de background.
that's it !
Quelques notes à propos de Apache Batik
- le format PGM n'est pas supporté dans un SVG Batik.
- netpbm est une bibliothèque de processus de traitement d'image à l'instar de ImageMagick, mais sous la forme de filtre unix.
Sous Ubuntu, la compilation nécessite le paquet libsvga-dev (apporte à des programmes en console la capacité de traiter des ressources graphiques, donne un accès au hardware video). Attention également à correctement positionner libX11.so pendant le script de configure.
- pour compter le nombre de champ d'une ligne via un délimiteur en particulier:
echo $line |tail -1 |awk '{print NF}'
- un script Greasemonkey pour désactiver l'effet de fade in sur la page Google: http://userscripts.org/scripts/show/63436
Depuis quelques jours, je m'intéresse à de la génération automatique d'une hiérarchie de topics en utilisant Flickr.
Pourquoi Flickr ? pour ses données textuelles (le tagging social des images par les utilisateurs du website) et ses données images. J'intègre tout cela à mon modèle de donnée pour construire des collections d'image, et j'explore ces collections avec des outils que j'ai développé il y a quelques mois, je voudrais pouvoir explorer facilement le dataset et gérer les documents (retrait d'image ou de tag).
C'est ainsi que comparativement à mes autres expérimentations, le modèle textuel associé à mes images contient:
- des documents faiblement taggés (weakly tagged).
- des informations textuelles qui ne sont pas forcément en anglais, ni basé sur un alphabet latin.
Jusqu'à présent mes images étaient annotées en anglais et avec l'objectif explicite de construire un jeu de donnée image pour la vision par ordinateur, on peut donc dire que ses images étaient annotées par des
iconographes de l'ordinaire en le sens que les annotations sont pertinentes (i.e. fiable, c'est pour cela que je dis
iconographe) et portent sur des objets de la vie de tous les jours (d'où
iconographe de l'ordinaire).
Le sujet de ce billet est le second point, Java gère très bien l'UTF, mais il est évident que l'index des fonts disponibles pour les UI graphique est délégué à l'installeur de Java sur la machine, car on ne peut pas localiser les fonts de façon standard pour tous les
OS pour lesquels Java est disponible.
Sur ma machine, j'installe toujours Java à la main, dans
/opt, je trouve cela plus propre, je suis contre ce qui est fait pour java-6-openjdk par exemple (mettre les fichiers de configuration de Java dans
/etc... pourquoi vouloir complètement intégrer Java à l'
OS, je trouve que c'est particulièrement microsoftien comme façon de faire... ).
Le fichier
~jrehome/lib/fontconfig.properties qui renseigne Java sur les fonts disponibles sur le système n'est donc pas renseigné quand on installe Java à la main: dans le cas d'Ubuntu il suffit de piocher le fichier installé pour java-6-openjdk
/etc/java-6-openjdk/fontconfig.properties et le copier dans
~jrehome/lib/fontconfig.properties.
En Java pour exécuter des commandes système, on peut se servir des classes
Runtime et
Process.
C'est ainsi que j'ai programmé dans ma toolbox perso une classe
SystemCommandHandler.
En réalité, sur une plateforme GNU/Linux l'objet
Process retourné par
runtime.exec(String command) utilise un
$sh -c command, ce qui n'autorise pas une séquence de commande (i.e. plusieurs commandes séparées par un semicolon) car
$sh -c ne prend qu'une seule et unique commande, et les commandes en background ne sont pas tolérées non plus: si la commande est lancée en background le shell se termine et un signal HUP est lancé.
De plus pour certaines commandes utiliser un NOHUP ne fonctionne pas, comme sshpass par exemple qui se tue à la réception d'un SIGHUP avec ou sans NOHUP.
De plus, le gros désavantage de cette méthode est qu'on ne connait pas le pid du process lancé.
Une autre méthode est de lancer un shell et d'injecter les commandes dans l'entrée du shell, ainsi tant que le flux d'entrée n'est pas fermé le shell ne se termine pas (lecture bloquante).
Ainsi, on peut envoyer sur l'entrée un
$echo $$, pour récupérer le pid du shell, et ensuite envoyer la commande que l'on veut exécuter (et éventuellement en background :-) ). On ne connait pas exactement le pid de la commande que l'on veut lancer, mais on connait le pid de son père qui est le shell: si on veut killer la commande, on n'a qu'a killer le shell via son pid.
Pour rédiger du LaTeX sous GNU/Linux, j'ai longtemps utilisé le plugin TeXlipse pour Eclipse, mais il y a pas mal de bugs dans ce dernier, je suis en train de switcher vers Gedit et son plugin GeditLaTeXPlugin qui est vraiment bien, plus agréable à utiliser, et de plus apporte les fonctionnalités suivantes:
- un index des chapters / sections / subsections / images / figures même avec des includes !!
- un index des auteurs dans les fichiers bib.
- la chaine de compilation est entièrement paramétrable.
- une visualisation intégrée du pdf.
- un environnement (minimal) pour les symboles mathématiques.
Cependant, le plugin utilise par défaut
rubber pour automatiser la compilation des documents, ce qui m'embête car je n'arrive pas générer des pdf avec index en utilisant rubber (je n'y arrive que en utilisant pdflatex), c'est ainsi que j'utilise ma propre chaine de compilation pour le plugin.
Ma chaîne de compilation Latex avec Gedit:
/usr/bin/pdflatex -interaction=nonstopmode --src-specials "$filename"
/usr/bin/bibtex "$shortname"
/usr/bin/pdflatex -interaction=nonstopmode --src-specials "$filename"
/usr/bin/makeindex "$shortname.nlo" -s nomencl.ist -o "$shortname.nls"
/usr/bin/pdflatex -interaction=nonstopmode --src-specials "$filename"
gnome-open "$shortname.pdf"
Avec l'option
must succeeded == true à toutes les commandes
sauf pour la commande
bibtex (dans le cas où le bibtex est vide et pas de citation dans le fichier tex, voir plus bas dans ce post).
Quelques difficultés avec pdflatex que j'utilise depuis que je suis sous gedit pour écrire mon latex:
- pour des raisons obscures je n'arrive pas à générer l'index pdf avec autre chose que
pdflatex...
pdflatex n'aime pas les chemins de fichier contenant des caractères accentués.
bibtex retourne une erreur quand le fichier bibtex est vide et aucune citation dans un fichier tex.
UPDATE 2010.01.18:
Le contenu du répertoire du plugin (a coller dans
~/.gnome2/gedit/plugins/GeditLaTeXPlugin):
gedit.plugins.GeditLaTeXPlugin.tar.gz.
(nouvelle version 2010.05.25: avec un clean.sh récursif et une option supplémentaire pour ouvrir le PDF, GeditLaTeXPlugin.tar.bz2)
La dernière version en date du plugin LaTeXPlugin-0.2rc3.tar.gz, contient comme les précédentes un gros bug de
GUI dans la définition des chaines de compilation: lors de la modification de la chaine de compilation d'un tool (les tools sont les commandes spécifiques de compilation, par exemple
LaTeX -> PDF, ou
LaTeX -> PS) via les
GUI suivantes:

Dans la première fenêtre, celle de gauche, on ne peut modifier effectivement que le premier élément de la liste, dans tous les cas c'est dans le premier élément de la liste que la nouvelle configuration est enregistrée, que l'on ai tenté de modifier le premier tool ou un autre de la liste. Ce qui est plutôt embêtant !
La solution est de modifier à la main le contenu du fichier
~/.gnome2/gedit/plugins/GeditLaTeXPlugin/tools.xml dont le formatage est assez simple.
UPDATE 2010.06.29:
Un style pour GEdit à coller dans
~/.gnome2/gedit/styles qui permet d'avoir un highlight plus visible de la ligne courante:
classicWithCurrentLineHighlighted.
- De l'annotation automatique sur Flickr avec le Blind Astrometry Server, (un robot web pour annoter automatiquement des images), http://astrometry.net/: cela date du début de l'année 2009, sur des photographies du ciel nocturne du groupe Flickr astrometry, détection et ajout d'annotations pour les astres répertoriés (planètes, galaxies, nébuleuses etc.) via astrometry.net.
C'est un projet très intéressant, les bots pour l'annotation automatique des images reste encore quelque chose de nouveau !
- De la CBIR sur Bing.
Le plugin Silverlight est nécessaire pour utiliser cette fonctionnalité du moteur Bing, ce qui est absolument ridicule car il semble que Silverlight n'est utilisé que pour faire du rendu eye-candy avec des effets de gloss, blend et des miniatures d'image (thumbnails) flottantes...
- Un nouveau Google Labs, Google Image Swirl, sur la recherche d'image itérative avec une navigation dans une hiérarchie de clusters.
Flash et Javascript sont nécessaires pour utiliser l'interface, et contrairement à la fonctionnalité Visual Search de Bing cité plus haut qui nécessite Silverlight, utiliser du Flash dans Google Image Swirl se justifie complètement, il y a une interface pour l'exploration des résultats qui n'est pas un simple listing des image-résultats.
D'après Google, Image Swirl réalise deux opérations: (1) l'organisation des résultats de la recherche d'image sur la base de mesures de similarité visuelle et sémantique entre document, et (2) présentation des résultats organisés dans une interface d'exploration.
screenshot d'une navigation dans Google Image Swirl pour la requête "Pablo Picasso".
Google propose des requête-exemples attaquant le problème de la polysémie telle que "apple", "beetle", "jaguar", et d'autres requêtes attaquant le problème de la perspective visuelle.
D'après le Official Google Blog, Google Image Swirl utilise et étend les technologies développées pour Picasa Face Recognition et Google Similar Images, pour réaliser le grouping des images et la construction de la hiérarchie de clusters.
Remarque 1:
L'utilisateur naviguant de cluster en cluster, une succession d'interactions utilisateur dans une recherche d'image est ainsi une hiérarchie de clusters.
Lorsque l'utilisateur affiche un cluster qui n'a pas de cluster fils (i.e. on ne peut pas construire de nouveaux cluster à partir d'un des documents contenus dans le cluster courant), les résultats sont souvent des plus proches duplicata (near duplicates).
Remarque 2:
Quelque chose qui serait réellement intéressant, bluffant en réalité car c'est un problème très difficile, c'est de justifier une relation entre deux documents dans une navigation dans Google Image Swirl.
Google dit que pour calculer les clusters, ils utilisent des mesures de similarités visuelle et sémantique, nous pourrions vouloir savoir pourquoi google dit que deux documents sont liés: est-ce une prédominance de la similarité visuelle ? une prédominance de la similarité sémantique ? une expansion sémantique ? est-ce deux documents appartenant à une même thématique selon une taxonomie reconnue autour de laquelle il y a consensus ? est-ce deux documents liés via une relation related-to (co-occurrence statistique) ?
- un projet rigolo http://richard.jones.name/google-hacks/google-cartography/google-cartography.html.
- Apache Pig.
- il y a depuis le mois de mai une nouvelle version de texlipse, le plugin eclipse pour rédiger du latex, cette version 1.3.0 corrige des bugs notamment celui des captions contenant des citations dans un bloc figure qui étaient considérées dans la version précédente comme des erreurs de syntaxe.
- calc2latex une macro OpenOffice pour obtenir du code latex à partir d'un sheet calc.
- Pour faire de l'UML sous Eclipse, il y a l'UML2 Tools, mais c'est très lent (popup bars, animated layout, animated zoom et anti-aliasing sont activés par défaut! c'est déjà moins lent quand tout cet inutile eye-candy est désactivé) et de plus fourmille d'options et spécificités pas forcément UML.
Un plugin pour Eclipse qui permet de faire de l'UML 1.4 classique, un peu dans une optique KISS, Keep It Short and Simple, (ce dont sont infiniment éloignés les outils UML que l'on trouve ces derniers temps) est AmaterasUML.
Le ppa de empathy:
https://launchpad.net/~telepathy/+archive/ppa
- empathy2.27 et libempathy27:
- empathy2.27 et libempathy30:
La méthode over http sur le protocole msn disparaît à nouveau, et l'ajout de contact sur un compte msn est impossible car buggé.
Disparu aussi le très chouette
"contacts on map"... :-(
Et les chat rooms sur talk.google.com ne sont plus supportées.
=> Le package empathy2.28 ne compile pas pour jaunty, il est cependant disponible pour karmic, autant attendre karmic donc!
Depuis bien longtemps j'utilise un plugin firefox de synchronisation des bookmarks et passwords nommé
Xmarks, anciennement foxmarks. Ce changement de nom date de plusieurs mois déjà, et le service a été pour l'occasion étendu, il est proposé depuis un ranking des liens et bookmarks et autres web2.0 joyeusetés tartinées à la truelle...
Là, déjà, j'avais tiqué un peu, cela ne me plaisait guère, mais pas de problèmes: c'est désactivable.
Le plugin fonctionne ainsi: il faut se créer un compte sur le site du service, et à chaque besoin de synchronisation un dialogue est effectué entre son firefox et le site du service xmarks.
C'est très pratique lorsque l'on possède plusieurs machines de travail, personnellement j'ai ma machine maison, un portable, et la machine du labo.
Cette semaine, un dossier de mes bookmarks, nommé "conf&gdr&labs&people" (un dossier plutôt important donc...) a disparu...
"Pas de panique", me suis-je dis, c'est un problème de synchronisation, et xmarks conserve un historique des versions des bookmarks, je n'ai qu'a restaurer une version ultérieure!!
Seulement voilà:
nicolas@trantor:~/tmp$ diff Bookmarks603.html Bookmarks556.html
nicolas@trantor:~/tmp$ diff Bookmarks556.html Bookmarks297.html
(les différences entre chaque documents sont vides).
La version 603 est celle d'aujourd'hui, la 556 en juillet, et la 297 en mai... [sic!]
Et en fait, le résultat de cette commande est identique pour toutes les versions archivés dans l'historique sur le serveur de xmarks.
Conclusion: non seulement mon dossier de bookmarks a disparu, mais chaque version dans l'historique est identique à la dernière version uploadée, c'est à dire qu'historique il n'y a point... !
Il est donc grand temps de changer de plugin de synchronisation, et pour cela
Mozilla Weave est tout indiqué!!
TinEye, de la société Canadienne Idée Inc., est un moteur de recherche inversée d'image, i.e. l'interface de requêtage est de type QBE, Query By Example (i.e. la requête est une image exemple), la page de résultats retournée par TinEye est une liste d'
URL, i.e. des pointeurs sur des images qui sont des near duplicates de l'image donnée en requête.
Les points important sont:
- c'est une recherche de "near duplicate"
- c'est à l'échelle du web!! 1,121,525,514 images indexées d'après la faq du site (à la date de rédaction de ce billet 2009.10.02).
D'après Idée Inc.,
"TinEye does for images what Google does for text".
Petit exemple pris sur le vif: dans un
tutoriel du workshop Learning to Rank 2008 de SIGIR'08, l'auteur du tutoriel utilise l'image suivante:

.
J'aime cette illustration de l'explosion de la quantité d'information disponible, j'étais curieux et je voulais connaitre l'origine de l'image: TinEye a indexé 2 sites sur lesquels se trouve une proche réplique de cette image, cependant le site présumé auteur de la publication originale de l'image n'est pas retourné, c'était
http://astech.library.cornell.edu/ast/phys/additional/Physical-Review-Comes-Home.cfm (retrouvé via Google Image et la requête
"information explosion").
La légende associée à cette photographie (retrouvée sur ce dernier site) est donc finalement la suivante:
Evidence of the information explosion, the yearly bound volmes of the Physical Review and Physical Review Letters from 1898, 1908, 1918.... to 1978. The earliest volumes (on the left) form an amiable several-inch stack, while the most recent ones (on the right) form a tower of paper that threatens to topple on Val Fitch, standing behind it, in the Princeton physics and mathematics library. The 1988 stack was left out of the photograph because it would have been much too high. (Source: Physics Today 42(12): 53, 1989. Credit: Robert P. Matthews.)
En sus de l'indexation d'image, le travail de TinEye est le crawling du web, qui est une tâche non moins ardue.
Le site à l'origine de la publication de l'image n'est pas retourné par TinEye pour l'instant, et c'est là une question de crawling du web, mais le nombre d'image indexée par TinEye est déjà très impressionnant, et il a tout de même indexé 2 proches répliques de l'image donnée en requête!
NOTES
Cette année je suis assistant d'enseignement pour le cours Algorithmique - Programmation (en python), et dans ce cadre je cherchais un éditeur Python se rapprochant de (l'horrible, il faut bien le dire)
IDLE.
De plus, IDLE n'est habituellement pas inclus dans les packages python sous GNU/Linux (sous Ubuntu par exemple, idle se trouve dans le paquet
idle non installé en dépendance par le paquet de la distribution python).
gedit
- Il y a le plugin Python Console intégré à gedit, qui apporte une console python (le shell interactif de python de base), mais ce n'est pas très utile. Le plugin Embedded Terminal est plus utile...
- Installer le paquet gedit-plugins qui apporte les plugins suivant:
gedit-plugins contain a set of plugins for gedit, GNOME's text editor.
The following plugins are included:
* Bookmarks: Easy document navigation with bookmarks
* Bracket Completion: Automatically adds closing brackets.
* Character Map: Insert special characters just by clicking on them.
* Code comment: Comment out or uncomment a selected block of code.
* Color Picker: Pick a color from a dialog and insert its hexadecimal representation.
* Draw Spaces: Draw Spaces and Tabs
* Join/Split Lines: Join several lines or split long ones
* Session Saver: Save and restore your working sessions
* Show/Hide Tabbar: Add a menu entry to show/hide the tabbar.
* Smart Spaces: Forget you're not using tabulations.
* Embedded Terminal: Embed a terminal in the bottom pane.
- le plugin BetterPythonConsole.
- le plugin class browser.
Il y a un comportement de
GUI qui diffère selon la version du
JDK, soit SUN soit OpenJDK.
Lorsque l'on utilise un JTree avec CheckBox dans les TreeNode, avec une implémentation de l'interface TreeCellEditor, le JRE de OpenJDK a un comportement d'interaction utilisateur étrange: lors du premier clic souris dans le JTree, si le clic concerne la CheckBox, le clic n'est pas pris en compte, et donne uniquement le focus au noeud du JTree concerné. Les clics suivants sont bien attribués à la CheckBox.
Tant que le dernier élément qui a obtenu le focus dans le JTree n'a pas changé, les clics suivant sont bien gérés même si entre temps le focus passe à une autre fenêtre: cela ne concerne uniquement le premier clic souris sur le node d'un JTree, cela ressemble fort à un bug...
Le JRE de SUN à un comportement normal: si un clic souris survient au dessus de la JCheckBox d'un noeud (dans le JTree), un ActionEvent est levé concernant la JCheckBox même si le composant associé au noeud n'avait pas le focus.