<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<title type="html">alaux.net</title>
<subtitle type="html">// TODO figure out a nice tagline</subtitle>
<link href="http://www.alaux.net/feed.php?atom" rel="self" type="application/atom+xml"/>
<link href="http://www.alaux.net/" rel="alternate" type="text/html"/>
<updated>2011-08-22T15:09:00+01:00</updated>
<id>urn:md5:64096d0c7832df081160f64130261641</id>
<generator uri="http://pluxml.org/">PluXml 5.0.2
</generator>
<entry>
	<title>Jail Skype!</title> 
	<link href="http://www.alaux.net/index.php?article31/jail-skype"/>
	<id>urn:md5:af40ee12d743bb50cc9795e9c2126c0a</id>
	<updated>2011-08-22T15:09:00+01:00</updated>
	<author><name>Guillaume</name></author>
	<dc:subject>Arch Linux</dc:subject>
	<content type="html">&lt;p&gt;&lt;a href=&quot;http://www.skype.com/intl/fr/home&quot;&gt;Skype&lt;/a&gt; is the most used voip software used accross the world. Unfortunately when you dig a bit about it you may find yourself surprised with its developers&#039; way of understanding the word &quot;privacy&quot;. Reports have been made about &lt;a href=&quot;http://forum.skype.com/index.php?showtopic=95261&quot;&gt;Skype binaries reading sensitive Linux password files&lt;/a&gt; and &lt;a href=&quot;http://yro.slashdot.org/story/07/08/26/1312256/Skype-Linux-Reads-Password-and-Firefox-Profile&quot;&gt;user personal data&lt;/a&gt;. As Skype is the perfect example of closed source application one cannot even know if these statements are true. Moreover, it seems Skype makes heavy use of &lt;a href=&quot;http://en.wikipedia.org/wiki/Skype_protocol#Obfuscation_Layer&quot;&gt;obfuscation methods&lt;/a&gt;. It just so happens an &lt;a href=&quot;http://www.archlinux.org&quot;&gt;Archer&lt;/a&gt; explained this &lt;a href=&quot;https://wiki.archlinux.org/index.php/Skype#Use_Skype_with_special_user&quot;&gt;simple way of jailing Skype into a reserved Linux account&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The idea is very simple: create a &lt;tt&gt;skype&lt;/tt&gt; group and a &lt;tt&gt;skype&lt;/tt&gt; user with its own home directory. Then just setup your regular user to launch the &lt;tt&gt;skype&lt;/tt&gt; binary as this user using &lt;tt&gt;sudo&lt;/tt&gt;. If you grant this &lt;tt&gt;skype&lt;/tt&gt; user restricted rw rights, this will elegantly jail this impolite Skype software.&lt;/p&gt;</content>
</entry>
<entry>
	<title>Tunnel vinagre-vino (VNC) through SSH</title> 
	<link href="http://www.alaux.net/index.php?article30/tunnel-vinagre-vino-vnc-through-ssh"/>
	<id>urn:md5:b328ba1b97a1b99024ef690233a8f6ce</id>
	<updated>2011-08-22T14:39:00+01:00</updated>
	<author><name>Guillaume</name></author>
	<dc:subject>Arch Linux</dc:subject>
	<content type="html">&lt;p&gt;Remote desktop connections with &lt;a href=&quot;http://en.wikipedia.org/wiki/Virtual_Network_Computing&quot;&gt;VNC&lt;/a&gt; is very useful when you need to help regular users stuck on their desktop environment. &lt;a href=&quot;http://en.wikipedia.org/wiki/GNOME&quot;&gt;Gnome&lt;/a&gt; provides vino-server and its client side vinagre as VNC implementations. But vino is not fully secured. The password check between client and server looks OK but once the connection is made, the stream between the two is not encrypted. Using it through internet may be risky so why not tunnel it all through &lt;a href=&quot;http://en.wikipedia.org/wiki/Secure_Shell&quot;&gt;SSH&lt;/a&gt;?&lt;/p&gt;

&lt;h2&gt;Pros and cons&lt;/h2&gt;
Pros:
&lt;ul&gt;
	&lt;li&gt;Harden vino authentication&lt;/li&gt;
	&lt;li&gt;Encrypt stream between client and server&lt;/li&gt;
&lt;/ul&gt;

Cons:
&lt;ul&gt;
	&lt;li&gt;A little bit geeky I agree but hey you are still reading!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;How to procede&lt;/h2&gt;
&lt;p&gt;First of all we need to install vino an openssh on the server and vinagre and openssh on the client (Debian/Ubuntu users must be careful there: we need OpenSSH server part on the server and on the client side we need both the client and the server part). &lt;a href=&quot;http://www.archlinux.org&quot;&gt;Archers&lt;/a&gt; can run:&lt;/p&gt;

On the server side:
&lt;pre&gt;$ pacman -Sy vino openssh&lt;/pre&gt;
On the client side:
&lt;pre&gt;$ pacman -Sy vinagre openssh&lt;/pre&gt;&lt;br /&gt;

&lt;p&gt;We are then going to setup the server side: vino. This can be done with &lt;tt&gt;vino-preferences&lt;/tt&gt;: allow connections, and specify a password (this is optional as we will tunnel everything).&lt;/p&gt;

&lt;p&gt;On the &#039;client&#039; side, we need to forward some SSH to our host (here specified as the variable ${REMOTE_HOST}):&lt;/p&gt;

&lt;pre&gt;$ ssh -C -NL 9999:localhost:5900 ${REMOTE_HOST} &amp;&lt;/pre&gt;&lt;br /&gt;

&lt;ul&gt;
	&lt;li&gt;-L: paramater for port forwarding from on port 9999 on &lt;tt&gt;localhost&lt;/tt&gt; and forward it to port &lt;tt&gt;5900&lt;/tt&gt; to &lt;tt&gt;REMOTE_HOST&lt;/tt&gt;. Port &lt;tt&gt;5900&lt;/tt&gt; is the vino default port. Port &lt;tt&gt;9999&lt;/tt&gt; can be changed to any port you are allowed to use&lt;/li&gt;
	&lt;li&gt;-N do not execute a remote command (ie &quot;you do not get a prompt on the remote machine&quot;)&lt;/li&gt;
	&lt;li&gt;-C: compress data (optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the client side we can now launch any VNC client and connect to &lt;tt&gt;localhost:9999&lt;/tt&gt;.
With vinagre this would be:&lt;/p&gt;

&lt;pre&gt;$ vinagre ::9999&lt;/pre&gt;&lt;br /&gt;

&lt;p&gt;You now should be prompted for your password if you set one up on the previous step. The client side may also be prompted for a connection authorization depending on what you configured. Click OK and you should see your remote desktop on a window.&lt;/p&gt;

&lt;p&gt;Last but not least, let&#039;s prevent connections to vino-server on the remote side from other places than localhost. It seems this option used to be available in vino-preferences but it disappeared in the latest versions. We are thus goinf to use dconf-editor to setup this:&lt;/p&gt;

&lt;pre&gt;$ dconf-editor&lt;/pre&gt;&lt;br /&gt;

&lt;p&gt;Navigate the tree to the leaf &lt;tt&gt;desktop/gnome/remote-access&lt;/tt&gt; and set value &lt;tt&gt;network-interface&lt;/tt&gt; to &lt;tt&gt;lo&lt;/tt&gt;. This network interface is of course the localhost you can see when issuing &lt;tt&gt;ifconfig lo&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;There. You might need to re-login or at least restart &lt;tt&gt;/usr/lib/vino/vino-server&lt;/tt&gt; for these last options to take effects. Once done you should get your fully secured VNC connection tunneled to SSH.&lt;/p&gt;

Note: Do not forget to kill the port forwarding after you are done using vinagre.

&lt;p&gt;For automation, here is a script summarizing the client side:&lt;/p&gt;
&lt;pre&gt;
#!/bin/bash
LOCAL_PORT=9999
REMOTE_HOST=192.168.1.21
REMOTE_PORT=5900

echo &quot;Opening SSH tunnel&quot;
# Do not use &#039;-f&#039; because &#039;&amp;&#039; already forces background
# &#039;-f&#039; disables PID retrieval
ssh -C -NL ${LOCAL_PORT}:localhost:${REMOTE_PORT} ${REMOTE_HOST} &amp;
SSH_PID=$!
echo &quot;Connecting to ${REMOTE_HOST}&quot;
vinagre ::${LOCAL_PORT}
kill ${SSH_PID}
&lt;/pre&gt;</content>
</entry>
<entry>
	<title>Transparent encrypted partition unlocking/locking at login/unlogin in Arch Linux</title> 
	<link href="http://www.alaux.net/index.php?article29/transparent-encrypted-partition-unlocking-locking-at-login-unlogin-in-arch-linux"/>
	<id>urn:md5:05ed90989c2c660b6ea5b2852b5cf36a</id>
	<updated>2011-07-27T12:34:00+01:00</updated>
	<author><name>Guillaume</name></author>
	<dc:subject>Arch Linux</dc:subject>
	<content type="html">&lt;h3&gt;General overview for the impatients&lt;/h3&gt;
&lt;p&gt;In this article I first use cryptsetup to create a regular crypted partition. It needs to have the Linux users password as key to (un)lock the partition. I then use a pretty neat tool called &lt;a href=&quot;http://pam-mount.sourceforge.net/&quot;&gt;pam_mount&lt;/a&gt;. This PAM module enables volume mounting and decrypting at login.&lt;/p&gt;

&lt;h3&gt;Pros&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Quite simple to set up and pretty KISS&lt;/li&gt;
  &lt;li&gt;Usefulness of encrypted partitions but without the hassle of typing multiple passwords&lt;/li&gt;
  &lt;li&gt;Completely transparent for user&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Cons&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Using Linux users passwords as uncrypting passphrase may be seen as a flaw in the security of your box because your session password (thus your uncrypting passphrase) is stored in /etc/shadow. This file resides in your root partition which, in this method, must not be crypted. See &lt;a href=&quot;http://www.alaux.net/atom#more&quot;&gt;the ending comment&lt;/a&gt; for a &quot;solution&quot;.&lt;/li&gt;
  &lt;li&gt;Any user password change will need to be &quot;applied&quot; to this setup. ie removing the password from the luks keyring and adding the new one.&lt;/li&gt;
  &lt;li&gt;Will only work for 8 different users as all users passwords must be able to unlock the crypted parition and luks only allows 8 different passwords on its keyring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these pros and cons, I must say this solution suits me well: a single user on a laptop (with no real sensitive data) who knows how to modify a key on the unlocking keyring when changing the session password. So let&#039;s get started.&lt;/p&gt;

&lt;h3&gt;Warning&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;This howto is made for GDM but with few adaptations it should work for any kind of login manager.&lt;/li&gt;
  &lt;li&gt;I use &lt;a href=&quot;http://aur.archlinux.org/packages.php?ID=1976&quot;&gt;pam_mount&lt;/a&gt; which is provided in Arch Linux in &lt;a href=&quot;http://aur.archlinux.org/&quot;&gt;AUR&lt;/a&gt; aka &quot;Not officially supported&quot;. Paranoid users should check the PKGBUILD (and the sources ;)).&lt;/li&gt;
  &lt;li&gt;For this to work you will have to use the same locking passphrase for your partition as the one used when login to your Linux account.&lt;/li&gt;
  &lt;li&gt;In this howto I encrypt my home partition (/dev/sda4) but of course one could unlock/lock any other EXCEPT ROOT.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;How to procede&lt;/h3&gt;
&lt;p&gt;The first step when crypting a partition is to backup your data as this will erase it all on the target partition. The second step beeing to properly erase all data on the parition (&lt;a href=&quot;http://wiki.archlinux.org/index.php/LUKS#Secure_Erasure_of_the_Harddisk_Drive&quot;&gt;why and how to do so&lt;/a&gt;).&lt;br /&gt;
To create a crypted partition, let&#039;s be sure that we have all the tools in that intention:&lt;br /&gt;
&lt;pre&gt;
    % pacman -Qs
    local/cryptsetup 1.3.1-2 [0.50 MB] (base)
        Userspace setup tool for transparent encryption
        of block devices using the Linux 2.6 cryptoapi
&lt;/pre&gt;&lt;br /&gt;

Cryptsetup belongs to the &quot;base&quot; group in Arch Linux so you should be fine but otherwise just &quot;pacman -Sy cryptsetup&quot;. Now let&#039;s load the kernel modules depending on your architecture:&lt;br /&gt;
&lt;pre&gt;    modprobe dm-crypt aes-i586&lt;/pre&gt;
	or&lt;br /&gt;
&lt;pre&gt;    modprobe dm-crypt aes-x86_64&lt;/pre&gt;
We are then going to create a regular crypted partition. I usually use the following command for that purpose but any other cypher, keysize etc would work. This will ask you for the passphrase you want to use in order to crypt/decrypt your partition. As already said, you NEED to specify here the same password as the one for your Linux account. Change /dev/sda4 with your partition:&lt;br /&gt;
&lt;pre&gt;    cryptsetup -c aes-xts-plain -y -s 512 luksFormat /dev/sda4&lt;/pre&gt;&lt;br /&gt;
Also remember that in order for other accounts to still be able to unlock this partition, you need to add all Linux account passwords as keys to unlock the partition. This is made possible through the following command. To be done for all Linux account passwords. Beware that the fist password asked here is the master password you supplied in the previous step:&lt;br /&gt;
&lt;pre&gt;    cryptsetup luksAddKey /dev/sda4&lt;/pre&gt;&lt;br /&gt;

Let&#039;s open the newly created partition:&lt;br /&gt;
&lt;pre&gt;    cryptsetup luksOpen /dev/sda4 home&lt;/pre&gt;&lt;br /&gt;

You should be able to see the mapped device:&lt;br /&gt;
&lt;pre&gt;    ls /dev/mapper/home&lt;/pre&gt;&lt;br /&gt;

Create a filesystem on it (such as ReiserFS in this example or any other):&lt;br /&gt;
&lt;pre&gt;    mkfs.reiserfs /dev/mapper/home&lt;/pre&gt;&lt;br /&gt;

There! We have an encrypted partition. Now let&#039;s get it opened/closed and mounted/unmounted at login time.&lt;/p&gt;

&lt;p&gt;For that matter we will need pam_mount from AUR that enables volume mounting at login:&lt;br /&gt;
&lt;pre&gt;    yaourt pam_mount&lt;/pre&gt;&lt;br /&gt;

Add the following line to /etc/fstab (notice the &quot;noauto&quot;. We just declare it but ask it not to be mounted. Also be sure to specify the filesystem you used instead of &#039;reiserfs&#039; if required):&lt;br /&gt;
&lt;pre&gt;    /dev/mapper/home  /home  reiserfs  defaults,noauto  0  0&lt;/pre&gt;&lt;br /&gt;

Add the following line to /etc/security/pam_mount.conf.xml with the corresponding path:&lt;br /&gt;
&lt;/pre&gt;
    &amp;lt;pam_mount&amp;gt;
        ...
        &amp;lt;volume fstype=&quot;crypt&quot; path=&quot;/dev/sda4&quot; mountpoint=&quot;/home&quot; /&amp;gt;
        ...
    &amp;lt;/pam_mount&amp;gt;
&lt;/pre&gt;&lt;br /&gt;

Add the following lines to /etc/pam.d/gdm (and/or /etc/pam.d/login to perform encryption when on console):&lt;br /&gt;
&lt;pre&gt;
    ...
    auth    optional    pam_mount.so
    ...
    session optional    pam_mount.so
    ...
&lt;/pre&gt;&lt;br /&gt;

&lt;p&gt;There! Just reboot and enjoy your fully automated encrypted home opening when you log in. If that fails well... then you can&#039;t login so there should not be any complaint ;)&lt;/p&gt;

&lt;h3&gt;Explanation&lt;/h3&gt;
&lt;p&gt;At login time, gdm uses pam to authenticate the user. PAM will check all modules we asked it to &quot;activate&quot; when GDM asks for login (/etc/pam.d/gdm). PAM will thus launch pam_mount which opens and then mounts our encrypted partition.&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;more&quot;&gt;More&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As said in the introduction, using Linux users passwords as uncrypting passphrase may be seen as a security hole because your these passwords are stored in /etc/shadow. This file resides in your root partition which in this method must not be crypted. A possible hardening of this is just to &lt;a href=&quot;http://wiki.archlinux.org/index.php/SHA_Passwords&quot;&gt;use SHA passwords in /etc/shadows&lt;/a&gt;.&lt;/p&gt;</content>
</entry>
<entry>
	<title>HTMLUnit et JSFUnit : tester la couche de présentation</title> 
	<link href="http://www.alaux.net/index.php?article1/htmlunit-et-jsfunit-tester-la-couche-de-presentation"/>
	<id>urn:md5:2fa65d5eebf45734dead3bdfeee8238b</id>
	<updated>2010-09-14T18:01:00+01:00</updated>
	<author><name>Guillaume</name></author>
	<dc:subject>Java (Fr)</dc:subject>
	<content type="html">&lt;p&gt;&lt;a href=&quot;http://htmlunit.sourceforge.net/&quot;&gt;HTMLUnit&lt;/a&gt; est une extension de &lt;a href=&quot;http://www.junit.org/&quot;&gt;JUnit&lt;/a&gt; qui propose de tester une application &lt;em&gt;live&lt;/em&gt;, c&#039;est à dire en permettant au développeur d&#039;exécuter des tests d&#039;application de bout en bout. Ce &lt;em&gt;framework&lt;/em&gt; se décrit comme un navigateur web sans interface puisqu&#039;il offre la possibilité d&#039;appeler les éléments HTML de pages et ainsi de simuler une navigation. Le développeur peut donc remplir des formulaires, cocher des &lt;em&gt;checkbox&lt;/em&gt;, renseigner des champs et ensuite simuler un clic sur un bouton, un lien ou valider un formulaire.&lt;/p&gt;

&lt;p&gt;HTMLUnit peut être directement utilisé comme une extension de JUnit. Pour ce faire, il suffit d&#039;inclure les JARs nécessaires dans le CLASSPATH pour avoir accès aux fonctionnalités de test web. Ci-après un exemple dans lequel on retrouve l&#039;annotation &lt;code&gt;@Test&lt;/code&gt; qui témoigne de l&#039;utilisation de JUnit. Celui-ci invoque une page via la classe WebClient et en vérifie le nom ainsi que certains éléments constitutifs.&lt;/p&gt;

&lt;pre&gt;@Test
public void homePage() throws Exception {
  final WebClient webClient = new WebClient();
  final HtmlPage page =
    webClient.getPage(&quot;http://htmlunit.sourceforge.net&quot;);
  assertEquals(&quot;Welcome&quot;, page.getTitleText());

  final String pageAsXml = page.asXml();
  assertTrue(pageAsXml.contains(&quot;&quot;));

  final String pageAsText = page.asText();
  assertTrue(pageAsText.contains(&quot;Support for HTTP(S)&quot;));
}&lt;/pre&gt;

&lt;p&gt;À la vue de cet exemple, on comprend les possibilités d&#039;un tel outil : test de disponibilité, test de présence de certains éléments (techniques ou fonctionnels) mais aussi vérification du caractère bien formé d&#039;une page HTML/XML. HTMLUnit pousse la technique jusqu&#039;à simuler un navigateur spécifique. Cette possibilité n&#039;est pas superflue quand on connait le respect très variable de la norme HTML des différents navigateurs du marché.&lt;/p&gt;

&lt;p&gt;Le parti pris de HTMLUnit de traiter avec la partie présentation est intéressant car il teste la pile complète de l&#039;application et cela au plus près du résultat visible par l&#039;utilisateur. Cela implique cependant que l&#039;application complète soit démarrée et disponible pour être testée, ce qui peut s&#039;avérer lourd à prendre en charge.&lt;br /&gt;
Le &lt;em&gt;framework&lt;/em&gt; offre beaucoup de possibilités de tests mais attention à ne pas se perdre à tester trop d&#039;éléments HTML inutiles. Écrire les tests de pages HTML avec ce type d&#039;outil reste fastidieux. Pour y pallier, il existe des outils de plus haut niveau comme &lt;a href=&quot;http://jwebunit.sourceforge.net/&quot;&gt;JWebUnit&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/p/selenium/?redir=1&quot;&gt;WebDriver&lt;/a&gt; ou &lt;a href=&quot;http://www.jboss.org/jsfunit&quot;&gt;JSFUnit&lt;/a&gt; (voir la suite) qui s&#039;appuient justement sur HTMLUnit.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.jboss.org/jsfunit&quot;&gt;JSFUnit&lt;/a&gt; quant à lui est le concept de test de la partie présentation telle que vue par HTMLUnit (vu au paragraphe précédent) appliqué à JSF.&lt;br /&gt;
Les tests JSFUnit sont - comme tous les tests JUnits – des méthodes d&#039;une classe Java. Dans le cas particulier de JSFUnit, il est nécessaire que cette classe hérite de ServletTestCase afin de lui faire prendre en compte la spécificité Servlet de JSF. Une fois les JARs de JSFUnit intégrés au CLASSPATH, il est possible d&#039;utiliser les classes du &lt;em&gt;framework&lt;/em&gt; et ainsi de tester les Managed Beans, la navigation de page en page, les composants visuels, les résultats de sortie ainsi que la configuration de l&#039;application. L&#039;exemple suivant du site officiel montre le test de la page de présentation d&#039;une application :&lt;/p&gt;

&lt;pre&gt;public class JSFUnitTest extends ServletTestCase
{
  public static Test suite()
  {
    return new TestSuite(JSFUnitTest.class);
  }

  public void testInitialPage() throws IOException
  {
    // Send an HTTP request for the initial page
    JSFSession jsfSession = new JSFSession(&quot;/index.faces&quot;);

    // A JSFClientSession emulates the browser
    // and lets you test HTML
    JSFClientSession client = jsfSession.getJSFClientSession();

    // A JSFServerSession gives you access to JSF
    JSFServerSession server = jsfSession.getJSFServerSession();

    // Test navigation to initial viewID
    assertEquals(&quot;/index.jsp&quot;, server.getCurrentViewID());

    // Assert that the prompt component
    // is in the component tree and rendered
    UIComponent prompt = server.findComponent(&quot;greeting&quot;);
    assertTrue(prompt.isRendered());

    // Test a managed bean
    assertEquals(&quot;Stan&quot;,
                 server.getManagedBeanValue(&quot;#{foo.text}&quot;)
                 );
  }
}&lt;/pre&gt;

&lt;p&gt;Afin de pouvoir lancer ces tests, il est nécessaire d&#039;inclure dans le fichier web.xml les lignes suivantes :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;filter&amp;gt;
  &amp;lt;filter-name&amp;gt;
    JSFUnitFilter
  &amp;lt;/filter-name&amp;gt;
  &amp;lt;filter-class&amp;gt;
    org.jboss.jsfunit.framework.JSFUnitFilter
  &amp;lt;/filter-class&amp;gt;
&amp;lt;/filter&amp;gt;

&amp;lt;filter-mapping&amp;gt;
  &amp;lt;filter-name&amp;gt;
    JSFUnitFilter
  &amp;lt;/filter-name&amp;gt;
  &amp;lt;servlet-name&amp;gt;
    ServletTestRunner
  &amp;lt;/servlet-name&amp;gt;
&amp;lt;/filter-mapping&amp;gt;

&amp;lt;filter-mapping&amp;gt;
  &amp;lt;filter-name&amp;gt;
    JSFUnitFilter
  &amp;lt;/filter-name&amp;gt;
  &amp;lt;servlet-name&amp;gt;
    ServletRedirector
  &amp;lt;/servlet-name&amp;gt;
&amp;lt;/filter-mapping&amp;gt;

&amp;lt;servlet&amp;gt;
  &amp;lt;servlet-name&amp;gt;
    ServletRedirector
  &amp;lt;/servlet-name&amp;gt;
  &amp;lt;servlet-class&amp;gt;
    org.jboss.jsfunit.framework.JSFUnitServletRedirector
  &amp;lt;/servlet-class&amp;gt;
&amp;lt;/servlet&amp;gt;

&amp;lt;servlet&amp;gt;
  &amp;lt;servlet-name&amp;gt;
    ServletTestRunner
  &amp;lt;/servlet-name&amp;gt;
  &amp;lt;servlet-class&amp;gt;
    org.apache.cactus.server.runner.ServletTestRunner
  &amp;lt;/servlet-class&amp;gt;
&amp;lt;/servlet&amp;gt;

&amp;lt;servlet-mapping&amp;gt;
  &amp;lt;servlet-name&amp;gt;
    ServletRedirector
  &amp;lt;/servlet-name&amp;gt;
  &amp;lt;url-pattern&amp;gt;
    ServletRedirector
  &amp;lt;/url-pattern&amp;gt;
&amp;lt;/servlet-mapping&amp;gt;

&amp;lt;servlet-mapping&amp;gt;
  &amp;lt;servlet-name&amp;gt;
    ServletTestRunner
  &amp;lt;/servlet-name&amp;gt;
  &amp;lt;url-pattern&amp;gt;
    ServletTestRunner
  &amp;lt;/url-pattern&amp;gt;
&amp;lt;/servlet-mapping&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Une fois l&#039;application déployée, il est possible de lancer les test via une page de celle-ci. Le site officiel donne un exemple en utilisant un rapport &lt;a href=&quot;http://jakarta.apache.org/cactus/integration/integration_browser.html&quot;&gt;Cactus&lt;/a&gt; :&lt;/p&gt;
&lt;a href=&quot;http://08000linux.com/blogs/files/2010/09/servlettestrunner_html.jpeg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-2882&quot; src=&quot;http://08000linux.com/blogs/files/2010/09/servlettestrunner_html.jpeg&quot; alt=&quot;servlettestrunner_html&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;

&lt;p&gt;De même que HTMLUnit, l&#039;avantage de ce genre de &lt;em&gt;framework&lt;/em&gt; est de tester et d&#039;utiliser l&#039;application de bout en bout. On ne teste plus de petites parties mais bien l&#039;application dans sa totalité. Cette aspect a les défauts de ses qualités : il est nécessaire de conserver une application complète démarrée pour pouvoir effectuer les tests.&lt;/p&gt;

&lt;p&gt;Les possibilités de tests sont de plus nombreuses. Ce qui peut paraître ici comme un avantage peut aussi constituer un inconvénient au développeur : il peut se retrouver perdu au milieu de pages Jsp qu&#039;il serait tenté de tester dans leur intégralité. En cas d&#039;adoption d&#039;un tel outil, il est donc nécessaire de borner les tests à certains éléments précis, au risque de voir les développeurs se perdre dans des lignes de code de tests inutiles.&lt;/p&gt;

&lt;p&gt;JSFUnit étant une extension de HTMLUnit pour JSF, il sera plus adapté pour tester les applications JSF.&lt;/p&gt;

&lt;em&gt;Article publié sur &lt;a href=&quot;http://linuxfr.org/~galaux&quot;&gt;LinuxFr&lt;/a&gt; dans le cadre de mon activité professionnelle à &lt;a href=&quot;http://linagora.com/&quot;&gt;Linagora&lt;/a&gt;.&lt;/em&gt;</content>
</entry>
<entry>
	<title>Tests unitaires avec DBUnit et Jailer</title> 
	<link href="http://www.alaux.net/index.php?article28/tests-unitaires-avec-dbunit-et-jailer"/>
	<id>urn:md5:32b5603062a214502cd9d3e028368516</id>
	<updated>2010-07-02T19:01:00+01:00</updated>
	<author><name>Guillaume</name></author>
	<dc:subject>Java (Fr)</dc:subject>
	<content type="html">&lt;p&gt;Dans le domaine du développement, et particulièrement le développement Java, les outils Open Source sont très largement utilisés en entreprise. Quand il s&#039;agit de mettre en place des tests unitaires en Java, le nom de &lt;a href=&quot;http://www.junit.org/&quot;&gt;JUnit&lt;/a&gt; revient souvent. Même si quelques alternatives ont vu le jour (en particulier &lt;a href=&quot;http://testng.org/doc/index.html&quot;&gt;TestNG&lt;/a&gt;), ce &lt;em&gt;framework&lt;/em&gt; reste le &lt;em&gt;leader&lt;/em&gt; dans son domaine.&lt;/p&gt;

&lt;p&gt;Pour ceux qui utilisent déjà JUnit, voici deux outils complémentaires qui en facilitent l&#039;emploi : &lt;a href=&quot;http://www.dbunit.org/&quot;&gt;DBUnit&lt;/a&gt; et &lt;a href=&quot;http://jailer.sourceforge.net/&quot;&gt;Jailer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBUnit&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.dbunit.org/&quot;&gt;DBUnit&lt;/a&gt; est une extension de JUnit dont la tâche principale est de gérer des jeux de données qui seront retournés comme s&#039;ils étaient le résultat d&#039;une requête sur la base de données. Le premier avantage est de maintenir l&#039;indépendance du code des tests vis-à-vis de la base de données réelle. Ensuite, DBUnit garantit que tous les tests unitaires retrouveront la base de données dans le même état et non dans l&#039;état dans lequel le test précédent a pu la laisser.&lt;/p&gt;

&lt;p&gt;Les jeux de données de DBUnit sont conservés sous forme XML. La première étape à son utilisation  est donc de constituer les fichiers XML qui contienent les données (On pourra se référer au paragraphe suivant qui traite d&#039;une méthode d&#039;automatisation de cette étape).  Voir ci-après un exemple de fichier XML de données :
&lt;pre&gt;&amp;lt;!DOCTYPE dataset SYSTEM &quot;dataset.dtd&quot;&amp;gt;
&amp;lt;dataset&amp;gt;
    &amp;lt;table name=&quot;TEST_TABLE&quot;&amp;gt;
        &amp;lt;column&amp;gt;COL0&amp;lt;/column&amp;gt;
        &amp;lt;column&amp;gt;COL1&amp;lt;/column&amp;gt;
        &amp;lt;column&amp;gt;COL2&amp;lt;/column&amp;gt;
        &amp;lt;row&amp;gt;
            &amp;lt;value&amp;gt;row 0 col 0&amp;lt;/value&amp;gt;
            &amp;lt;value&amp;gt;row 0 col 1&amp;lt;/value&amp;gt;
            &amp;lt;value&amp;gt;row 0 col 2&amp;lt;/value&amp;gt;
        &amp;lt;/row&amp;gt;
        &amp;lt;row&amp;gt;
            &amp;lt;null/&amp;gt;
            &amp;lt;value&amp;gt;row 1 col 1&amp;lt;/value&amp;gt;
            &amp;lt;null/&amp;gt;
        &amp;lt;/row&amp;gt;
    &amp;lt;/table&amp;gt;
    &amp;lt;table name=&quot;SECOND_TABLE&quot;&amp;gt;
        &amp;lt;column&amp;gt;COLUMN0&amp;lt;/column&amp;gt;
        &amp;lt;column&amp;gt;COLUMN1&amp;lt;/column&amp;gt;
        &amp;lt;row&amp;gt;
            &amp;lt;value&amp;gt;row 0 col 0&amp;lt;/value&amp;gt;
            &amp;lt;value&amp;gt;row 0 col 1&amp;lt;/value&amp;gt;
        &amp;lt;/row&amp;gt;
    &amp;lt;/table&amp;gt;
    &amp;lt;table name=&#039;EMPTY_TABLE&#039;&amp;gt;
        &amp;lt;column&amp;gt;COLUMN0&amp;lt;/column&amp;gt;
        &amp;lt;column&amp;gt;COLUMN1&amp;lt;/column&amp;gt;
    &amp;lt;/table&amp;gt;
&amp;lt;/dataset&amp;gt;&lt;/pre&gt;
Comme les autres &lt;em&gt;frameworks&lt;/em&gt; de test, DBUnit nécessite d&#039;inclure ses JARs dans le CLASSPATH pour accéder aux classes natives. Le codage même d&#039;un test passe ensuite par l&#039;habituel héritage de la classe mère (ici DBTestCase). La première action à entreprendre est d&#039;initialiser les propriétés de la base de données que DBUnit simulera puis d&#039;y attacher le fichier XML de données précédemment créé comme dans l&#039;exemple suivant :
&lt;pre&gt;public class SampleTest extends DBTestCase
{
    public SampleTest(String name)
    {
        super( name );
        System.setProperty(
            PropertiesBasedJdbcDatabaseTester
                .DBUNIT_DRIVER_CLASS,
            &quot;org.hsqldb.jdbcDriver&quot;);
        System.setProperty(
            PropertiesBasedJdbcDatabaseTester
                .DBUNIT_CONNECTION_URL,
            &quot;jdbc:hsqldb:sample&quot;);
        System.setProperty(
            PropertiesBasedJdbcDatabaseTester
                .DBUNIT_USERNAME,
            &quot;sa&quot; );
        System.setProperty(
            PropertiesBasedJdbcDatabaseTester
                .DBUNIT_PASSWORD,
            &quot;&quot;);
    }&lt;/p&gt;

&lt;p&gt;    protected IDataSet getDataSet() throws Exception
    {
        return new FlatXmlDataSetBuilder().build(
            new FileInputStream(&quot;dataset.xml&quot;)
        );
    }
}&lt;/pre&gt;
Outil puissant et offrant une réelle valeur ajoutée, DBUnit devrait avoir sa place dans tous les environnements de tests. L&#039;indépendance et la stabilité qu&#039;il induit par rapport à la couche de persistance est un réel confort et un garant d&#039;exécution correcte des tests. La mise en place est de plus simple.
La constitution des fichiers XML peut cependant être fastidieuse et il est conseillé d&#039;utiliser des outils automatiques de génération tels que Jailer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jailer&lt;/strong&gt;&lt;br /&gt;
Comme on l&#039;a vu précédemment, il est utile de s&#039;affranchir de la partie persistance quand on teste une application afin de s&#039;assurer du déterminisme des réponses de requêtes (et aussi pour rendre les tests moins consommateurs en ressources). De ce point de vue, des outils comme DBUnit sont des &lt;em&gt;mocks&lt;/em&gt; de base de données.
Mais écrire les jeux de données de DBUnit peut être fastidieux et il vaut mieux souvent automatiser cette tâche. Dans ce sens, &lt;a href=&quot;http://jailer.sourceforge.net/&quot;&gt;Jailer&lt;/a&gt; permet d&#039;extraire des jeux de tests DBUnit cohérents d&#039;une base de données. La cohérence est assurée sur le plan des relations fonctionnelles des données tout en respectant les relations d&#039;intégrité. Les sous-ensembles extraits présentent donc une « vue » pleinement utilisables par les tests et nettoyée des données superflues.&lt;/p&gt;

&lt;p&gt;Jailer est une application lourde qu&#039;un développeur lance et connecte à la base de données :
&lt;a href=&quot;http://08000linux.com/blogs/files/2010/07/jailer_settings.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-2830&quot; src=&quot;http://08000linux.com/blogs/files/2010/07/jailer_settings.png&quot; alt=&quot;jailer_settings&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;
Après quelques paramétrages optionnels de plus, Jailer permet la sélection de données choisies comme le montre la capture suivante d&#039;une base exemple d&#039;employés :
&lt;a href=&quot;http://08000linux.com/blogs/files/2010/07/jailer_export.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-2831&quot; src=&quot;http://08000linux.com/blogs/files/2010/07/jailer_export.png&quot; alt=&quot;jailer_export&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dans la capture précédente issue du site officiel, on a demandé un export SQL mais on peut voir que l&#039;outil permet de créer un fichier XML (au format DBUnit).&lt;/p&gt;

&lt;p&gt;Jailer est simple d&#039;emploi et il permet de créer voir d&#039;enrichir des jeux de données au fil des développements très rapidement. Le gain de temps qu&#039;il assure au développeur est conséquent et il lui évite une tâche laborieuse et rébarbative.
Allié à DBUnit, Jailer est l&#039;outil parfait pour envisager des tests unitaires de façon sereine. Pas de problème de cohérence ou de déterminisme des données.&lt;/p&gt;

&lt;p&gt;Le binôme DBUnit-Jailer apporte la flexibilité et la rapidité de mise en place aux tests unitaires. Pas d&#039;hésitation donc sur ces deux outils : les tests, même s&#039;ils devraient toujours être un passage obligatoire dans un projet informatique ne sont pas une finalité. Tout processus visant à les accélérer ou les faciliter est donc bon à prendre.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Article publié sur &lt;a href=&quot;http://linuxfr.org/~galaux/&quot;&gt;LinuxFr&lt;/a&gt; dans le cadre de mon activité professionnelle à &lt;a href=&quot;http://linagora.com/&quot;&gt;Linagora&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>Neo4j, un SGBD en graphe pour Java</title> 
	<link href="http://www.alaux.net/index.php?article27/neo4j-un-sgbd-en-graphe-pour-java"/>
	<id>urn:md5:7d0a57022a5defa865c1b060828e8ea3</id>
	<updated>2010-07-01T18:55:00+01:00</updated>
	<author><name>Guillaume</name></author>
	<dc:subject>Java (Fr)</dc:subject>
	<content type="html">&lt;p&gt;Le NoSQL, ce mouvement qui plaide pour un relâchement de certaines règles sur le stockage des données, a le vent en poupe. Son nom évocateur se veut en opposition avec les principes de stockage en base de données SQL, très répandu et régis par des règles de stockage très strictes. Il est le sujet de beaucoup d&#039;articles sur internet et on le retrouve dans les projets de géants du web comme &lt;a href=&quot;http://cassandra.apache.org/&quot;&gt;Facebook&lt;/a&gt; et &lt;a href=&quot;http://github.com/traviscrawford/scribe&quot;&gt;Twitter&lt;/a&gt;. Dans la lignée du NoSQL, &lt;a href=&quot;http://neo4j.org/&quot;&gt;Neo4j&lt;/a&gt; propose l&#039;idée originale de stocker des données sous la forme d&#039;un graphe.&lt;/p&gt;

&lt;p&gt;Fini donc les tables et les colonnes des bases de données relationnelles: Neo4j est une SGBD embarqué pour Java qui se repose sur des graphes. Comprendre par là des &lt;a href=&quot;http://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes&quot;&gt;graphes mathématiques&lt;/a&gt; faits de noeuds, de relations nommées entre ces nœuds, à l&#039;exception que les nœuds deviennent des objets de la vie réelle avec leurs propriétés. Les relations entre ces objets sont conservées et peuvent de fait porter un nom. Dans l&#039;exemple suivant, les développeurs de Neo4j recrééent le réseau des personnages du film Matrix :
&lt;pre&gt;NeoService neo = ... // Utilisation d&#039;une factory
// Création de Thomas Anderson
Node mrAnderson = neo.createNode();
mrAnderson.setProperty( &quot;name&quot;, &quot;Thomas Anderson&quot; );
mrAnderson.setProperty( &quot;age&quot;, 29 );

// Création de Morpheus
Node morpheus = neo.createNode();
morpheus.setProperty( &quot;name&quot;, &quot;Morpheus&quot; );
morpheus.setProperty( &quot;rank&quot;, &quot;Captain&quot; );
morpheus.setProperty( &quot;occupation&quot;, &quot;Total bad ass&quot; );

// Création de la relation
// afin de représenter le lien entre ces personnages
mrAnderson.createRelationshipTo( morpheus, RelTypes.KNOWS );
// Traduction : &quot;mrAnderson KNOWS morpheus&quot;&lt;/pre&gt;
On retrouve cette relation, ainsi que d&#039;autres, dans le graphe suivant :
&lt;a href=&quot;http://08000linux.com/blogs/files/2010/05/graphe.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-2792&quot; src=&quot;http://08000linux.com/blogs/files/2010/05/graphe.png&quot; alt=&quot;graphe&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L&#039;utilisation des données que le code précédent a créé est assez triviale ; par exemple pour retrouver les amis de &quot;Mr Anderson&quot; :
&lt;pre&gt;// Instantiation d&#039;un mécanisme de parcours (traverser)
// qui retourne les amis de mrAnderson
Traverser friendsTraverser = mrAnderson.traverse(
   // recherche en largeur d&#039;abord
   Traverser.Order.BREADTH_FIRST,
   StopEvaluator.END_OF_NETWORK,
   // ne pas retrourner mrAnderson
   ReturnableEvaluator.ALL_BUT_START_NODE,
   RelTypes.KNOWS,
   Direction.OUTGOING );

// Utilisation de ce mécanisme de parcours
// pour afficher le résultat
System.out.println( &quot;Mr Anderson&#039;s friends:&quot; );
for ( Node friend : friendsTraverser )
{
   System.out.printf( &quot;At depth %d =&amp;gt; %s%n&quot;,
       friendsTraverser.currentPosition().getDepth(),
       friend.getProperty( &quot;name&quot; ) );
}&lt;/pre&gt;
L&#039;originalité de cette conception en graphe est de stocker les objets et leurs relations tels qu&#039;ils existent dans les cas réels.&lt;/p&gt;

&lt;p&gt;Le projet Neo4j n&#039;est pas nouveau : depuis 10 ans déjà, cette implémentation de la base de données en graphes propose ses services et s&#039;enorgueillit d&#039;être utilisé en environnements de production depuis 7 ans. Les capacités annoncées n&#039;ont pas à pâlir devant un SGBD relationnel : ses développeurs annoncent de bonnes qualités de scalabilité et de performances ainsi que la capacité à stocker jusqu&#039;à plusieurs milliards de noeuds!&lt;/p&gt;

&lt;p&gt;C&#039;est un point de vue original sur le stockage de données que proposent les SGBD objets comme Neo4j. À l&#039;heure où les SGBD &lt;em&gt;leaders&lt;/em&gt; du marché se basent tous sur le modèle relationnel, voilà une solution qui prend le contrepied de la tendance. Un grand bravo donc à ces projet originaux comme &lt;a href=&quot;http://www.db4o.com/&quot;&gt;db4o&lt;/a&gt;, &lt;a href=&quot;http://www.zodb.org/&quot;&gt;Zope Object Database&lt;/a&gt; et Neo4J qui semble bien détenir une réponse efficace au problème du stockage de données objets.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Article publié sur &lt;a href=&quot;http://linuxfr.org/~galaux/&quot;&gt;LinuxFr&lt;/a&gt; dans le cadre de mon activité professionnelle à &lt;a href=&quot;http://linagora.com/&quot;&gt;Linagora&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>OSGi pour l&#039;architecture Java EE</title> 
	<link href="http://www.alaux.net/index.php?article26/osgi-pour-l-architecture-java-ee"/>
	<id>urn:md5:9d6bb6f98846c22724ad90dfa27cd94a</id>
	<updated>2010-05-26T18:53:00+01:00</updated>
	<author><name>Guillaume</name></author>
	<dc:subject>Java (Fr)</dc:subject>
	<content type="html">&lt;p&gt;&lt;img class=&quot;alignleft size-full wp-image-2769&quot; src=&quot;http://08000linux.com/blogs/files/2010/05/OSGi.png&quot; alt=&quot;OSGi&quot; width=&quot;200&quot; height=&quot;115&quot; /&gt;
Bien qu&#039;ayant de nombreux avantages, Java EE génère souvent des applications ou &lt;em&gt;frameworks&lt;/em&gt; monolithiques, aux tailles conséquentes et donc peu flexibles. Plusieurs sociétés très impliquées dans le développement logiciel se sont donc posé la question de classifier, trier, organiser et homogénéiser les tâches que l&#039;on retrouve régulièrement dans les WARs et EARs. C&#039;est le but du standard &lt;a href=&quot;http://www.osgi.org/&quot;&gt;Open Services Gateway initiative&lt;/a&gt; (OSGi), qui définit un modèle de gestion de cycle de vie d’une application, un répertoire (registry) de services, un environnement d&#039;exécution et des modules.&lt;/p&gt;

&lt;p&gt;Pour combattre la horde insoumise de fonctionnalités récurrentes des applications Java EE, il fallait bien une Alliance : l&#039;&lt;a href=&quot;http://www.osgi.org/Main/HomePage&quot;&gt;OSGI Alliance&lt;/a&gt; ! Celle-ci a été créée en 1999 par &lt;a href=&quot;http://www.osgi.org/About/Members&quot;&gt;des entreprises&lt;/a&gt; conscientes dès lors de ce besoin d&#039;harmonisation. On y retrouve les grands noms habituels de l&#039;industrie informatique mondiale tels qu&#039;Oracle, IBM, Red Hat, feu SUN, etc. Le résultat de leurs travaux est la spécification du standard ouvert OSGi &lt;a href=&quot;http://www.osgi.org/Specifications/HomePage&quot;&gt;aujourd&#039;hui dans sa version 4&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Un des premiers chantier de l&#039;OSGi a été d&#039;identifier les services habituels des applications et &lt;em&gt;frameworks&lt;/em&gt; Java EE :
&lt;ul&gt;
	&lt;li&gt;Journalisation&lt;/li&gt;
	&lt;li&gt;Configuration, administration&lt;/li&gt;
	&lt;li&gt;Accès aux périphériques&lt;/li&gt;
	&lt;li&gt;Authentification&lt;/li&gt;
	&lt;li&gt;Connections d&#039;entrée/sortie&lt;/li&gt;
	&lt;li&gt;Préférences&lt;/li&gt;
	&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
Voir &lt;a href=&quot;http://en.wikipedia.org/wiki/OSGi#Services&quot;&gt;la liste exhaustive sur Wikipedia&lt;/a&gt; ainsi que le graphique suivant qui décrit l&#039;architecture.
&lt;img class=&quot;alignright size-full wp-image-2770&quot; src=&quot;http://08000linux.com/blogs/files/2010/05/osgi31644_archi.gif&quot; alt=&quot;osgi31644_archi&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le standard OSGi préconise ainsi à tout projet Java souhaitant implémenter la norme de découper son code selon ces catégories et d&#039;utiliser un sous-format de &lt;em&gt;bundle&lt;/em&gt;, un JAR contenant les informations de nom, versions et autres dans un fichier MANIFEST spécifique. Cette proposition d&#039;agencement apporte une grande modularité entre les différents services qui pourront s&#039;appeler entre eux ou proposer leurs services.
La norme OSGi spécifie aussi tout un cycle de vie des &lt;em&gt;bundles&lt;/em&gt; qui doivent pouvoir être installés, démarrés, utilisés, arrêtés, redémarrés et désinstallés automatiquement et à chaud comme le schématise le diagramme ci-contre. Ceci implique la possibilité de mettre à jour et de redémarrer une partie de l&#039;architecture sans impact lourd pour la plate-forme ; une fonctionnalité assez rare en Java.
&lt;img class=&quot;alignright size-full wp-image-2771&quot; src=&quot;http://08000linux.com/blogs/files/2010/05/250px-OSGi_Bundle_Life-Cycle.svg.png&quot; alt=&quot;250px-OSGi_Bundle_Life-Cycle.svg&quot; width=&quot;250&quot; height=&quot;189&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Les projets qui tombent dans le giron de cette norme sont très divers : on y retrouve pêle-mêle les serveurs d&#039;applications &lt;a href=&quot;https://glassfish.dev.java.net/&quot;&gt;GlassFish&lt;/a&gt;, &lt;a href=&quot;http://www.jboss.org/&quot;&gt;JBoss&lt;/a&gt;, &lt;a href=&quot;http://wiki.jonas.ow2.org/xwiki/bin/view/Main/WebHome&quot;&gt;JOnAS&lt;/a&gt; et &lt;a href=&quot;http://www.oracle.com/us/products/middleware/application-server/index.htm&quot;&gt;Weblogic&lt;/a&gt;, des &lt;em&gt;frameworks&lt;/em&gt; comme &lt;a href=&quot;http://wiki.easybeans.org/xwiki/bin/view/Main/WebHome&quot;&gt;EasyBeans&lt;/a&gt; ainsi que les IDE libres leaders du marché &lt;a href=&quot;http://netbeans.org/&quot;&gt;NetBeans&lt;/a&gt; et &lt;a href=&quot;http://www.eclipse.org/&quot;&gt;Eclipse.&lt;/a&gt; Ce dernier est d&#039;ailleurs un très bon exemple OSGi puisque depuis sa version 3, son coeur (&lt;a href=&quot;http://www.eclipse.org/equinox/&quot;&gt;Equinox&lt;/a&gt;) est une pure implémentation de la norme OSGi dans sa dernière version.&lt;/p&gt;

&lt;p&gt;La concertation des acteurs de l&#039;industrie Java sur des normes telle que l&#039;OSGi ainsi que l&#039;adoption de celle-ci par de grand projets est le garant d&#039;une interopérabilité aujourd&#039;hui indispensable dans le puzzle des &lt;em&gt;frameworks&lt;/em&gt; Java. On ne peut donc que saluer et encourager ce genre de travaux qui permettent de clarifier la conception d&#039;applications.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Article publié sur &lt;a href=&quot;http://linuxfr.org/~galaux/&quot;&gt;LinuxFr&lt;/a&gt; dans le cadre de mon activité professionnelle à &lt;a href=&quot;http://linagora.com/&quot;&gt;Linagora&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>L&#039;administration Tomcat facile avec PSI-probe</title> 
	<link href="http://www.alaux.net/index.php?article10/l-administration-tomcat-facile-avec-psi-probe"/>
	<id>urn:md5:0aed8df3750c74a774e99cdf64538b84</id>
	<updated>2010-04-26T21:07:00+01:00</updated>
	<author><name>Guillaume</name></author>
	<dc:subject>Java (Fr)</dc:subject>
	<content type="html">&lt;p&gt;&lt;a href=&quot;http://tomcat.apache.org/&quot;&gt;&lt;img class=&quot;alignleft size-full wp-image-2680&quot; src=&quot;http://08000linux.com/blogs/files/2010/04/logo1.png&quot; alt=&quot;logo&quot; width=&quot;48&quot; height=&quot;48&quot; /&gt;Tomcat&lt;/a&gt;, le serveur web (conteneur de servlets) bien connu de la fondation Apache séduit par sa robustesse et sa simplicité.  Robuste, simple, fiable, clusterisable, tout ça est très bien mais qu&#039;en est il de la supervision ? Il est essentiel pour des équipes d&#039;exploitation de garder une vue des métriques vitales des serveurs qu&#039;elles administrent surtout en ces temps de &lt;em&gt;clustering,&lt;/em&gt; qui rajoute une couche de complexité. Petit retour sur un projet qui renait de ses centres, pour garder la main sur Tomcat donc, rien de tel que &lt;a href=&quot;http://code.google.com/p/psi-probe/&quot;&gt;PSI-probe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;L&#039;historique de l&#039;outil est tumultueux : initié sous le nom de &quot;Tomcat-Probe&quot;, le projet a été renomé en &lt;a href=&quot;http://www.lambdaprobe.org/&quot;&gt;Lambda-probe&lt;/a&gt; avant de rentrer dans une phase d&#039;inactivité encore effective aujourd&#039;hui. Alors Lambda-probe, projet mort? C&#039;était sans compter sur la force des communautés &lt;em&gt;Open Source&lt;/em&gt;. Sans nouvelles du développeur et confortés par la licence GPL, des utilisateurs du forum ont repris le développement de l&#039;outil d&#039;administration de serveur Tomcat en le &lt;em&gt;forkant&lt;/em&gt; : PSI-probe.&lt;/p&gt;

&lt;p&gt;Les mesures proposées par PSI-probe dans sa version 2.0.2 sont très diverses :
&lt;ul&gt;
	&lt;li&gt;gestion des applications déployées (affichage des sessions et de leurs détails, désactivation de celles-ci), de leurs composantes (connexions JDBC)&lt;/li&gt;
	&lt;li&gt;gestion des &lt;em&gt;datasources&lt;/em&gt;, visualisation de leurs taux d&#039;engorgement&lt;/li&gt;
	&lt;li&gt;déploiement d&#039;applications&lt;/li&gt;
	&lt;li&gt;affichage des &lt;em&gt;logs&lt;/em&gt; Tomcat et des logs applicatifs&lt;/li&gt;
	&lt;li&gt;informations sur les processus en cours&lt;/li&gt;
	&lt;li&gt;gestion en &lt;em&gt;clusters&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;informations système de l&#039;hôte&lt;/li&gt;
	&lt;li&gt;état du serveur&lt;/li&gt;
&lt;/ul&gt;
La liste impressionantes de ses possibilités par rôle est à consulter &lt;a href=&quot;http://code.google.com/p/psi-probe/wiki/Features&quot;&gt;sur le site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PSI-probe gère en effet les utilisateurs en plusieurs rôles ce qui devrait intéresser les environnements fortement industrialisés dans lesquels plusieurs utilisateurs d&#039;équipes différentes doivent accéder à certaines statistiques ou actions selon leurs fonctions. Les développeurs ont mis l&#039;accent sur la gestion des instances de serveurs en &lt;em&gt;cluster&lt;/em&gt; qui est implémentée nativement.&lt;/p&gt;

&lt;p&gt;Le logiciel est proposé sous forme d&#039;application &lt;em&gt;web&lt;/em&gt; qui se déploie naturellement sous Tomcat mais aussi sous JBoss de façon triviale. L&#039;ancien site de LambdaProbe propose des &lt;a href=&quot;http://www.lambdaprobe.org/d/screenshots.shtml&quot;&gt;captures d&#039;écran&lt;/a&gt; et une &lt;a href=&quot;http://demo.lambdaprobe.org/probe/index.htm&quot;&gt;démonstration en ligne&lt;/a&gt; (d&#039;une ancienne version 1.7) qui donnent une bonne idée des mesures déjà disponibles à l&#039;époque ainsi que de l&#039;interface utilisateur ergonomique, claire et complète que l&#039;on peut retrouver en français. Pour info, PSI-probe nécessite une exécution en environnement privilégié afin de pouvoir administrer les WARs de son serveur ainsi que de l&#039;activation de la console JMX dans la machine virtuelle Java.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://08000linux.com/blogs/files/2010/04/charts.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-2681&quot; src=&quot;http://08000linux.com/blogs/files/2010/04/charts.png&quot; alt=&quot;charts&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comme on a pu le voir au moment de l&#039;inactivité du projet, &lt;a href=&quot;http://www.lambdaprobe.org/forum2/index.jspa&quot;&gt;le forum&lt;/a&gt;, véritable ligne de vie d&#039;un logiciel Open Source, est actif et les demandes d&#039;informations ne restent pas lettre morte. Les &lt;a href=&quot;http://code.google.com/p/psi-probe/wiki/DevelopmentRoadmap&quot;&gt;idées de développement futurs&lt;/a&gt; ne manquent pas comme par exemple &lt;a href=&quot;http://www.alaux.net/http://code.google.com/p/psi-probe/issues/list?can=2&amp;amp;q=Milestone:2.2&quot;&gt;le support de Tomcat 6&lt;/a&gt; ou les avertissements par email. PSI-probe est le parfait exemple de projet Open Source : basé sur une communauté active et qualifiée, à même de reprendre le projet de bout en bout, et de proposer une réponse pertinente à un besoin souvent exprimé.&lt;/p&gt;

&lt;p&gt;PSI-probe? Un incontournable!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Article publié sur &lt;a href=&quot;http://linuxfr.org/~galaux/&quot;&gt;LinuxFr&lt;/a&gt; dans le cadre de mon activité professionnelle à &lt;a href=&quot;http://linagora.com/&quot;&gt;Linagora&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content>
</entry>
</feed>
<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://stats.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://stats.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->

