<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le coin du développeur</title>
	<atom:link href="http://dev.david.pilato.fr/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://dev.david.pilato.fr</link>
	<description>Quelques trucs et astuces utiles...</description>
	<lastBuildDate>Tue, 11 May 2010 22:33:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Installation FusionForge 5.0 sur Redhat 5</title>
		<link>http://dev.david.pilato.fr/?p=105</link>
		<comments>http://dev.david.pilato.fr/?p=105#comments</comments>
		<pubDate>Tue, 11 May 2010 22:23:27 +0000</pubDate>
		<dc:creator>David Pilato</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Forge]]></category>
		<category><![CDATA[FusionForge]]></category>

		<guid isPermaLink="false">http://dev.david.pilato.fr/?p=105</guid>
		<description><![CDATA[Voici la suite de l&#8217;article sur l&#8217;installation d&#8217;une forge.
Finalement, le temps d&#8217;obtenir une machine sous Redhat 5 a laissé le temps à la team FusionForge de sortir une release finale de la version 5.0.
Nous voilà donc lancés dans cette installation que je me propose de décrire ici.
A noter que pour le moment la forge n&#8217;est [...]]]></description>
			<content:encoded><![CDATA[<p>Voici la suite de l&#8217;article sur l&#8217;<a title="Installation de la Forge" href="/?p=23" target="_self">installation d&#8217;une forge</a>.</p>
<p>Finalement, le temps d&#8217;obtenir une machine sous Redhat 5 a laissé le temps à la team FusionForge de sortir une release finale de la version 5.0.</p>
<p>Nous voilà donc lancés dans cette installation que je me propose de décrire ici.</p>
<p>A noter que pour le moment la forge n&#8217;est pas totalement opérationnelle. Des évolutions dans la configuration devront être menées et j&#8217;espère pouvoir tenir à jour cet article pour les décrire.</p>
<h1>Processus d&#8217;installation</h1>
<h2>Préinstallation</h2>
<h3>Création du sous-domaine</h3>
<p>Il faut choisir un nom « agréable » pour la machine et le déclarer dans le DNS. Dans le reste du document, on considère qu&#8217;on installe la forme sous le nom <strong>maforge.mondomaine</strong>.</p>
<h3>Espace disque</h3>
<p>Il est recommandé également de prévoir un espace disque suffisant pour la forge en montant par exemple un disque sur une baie SAN. Dans le reste du document, on considère que le répertoire disponible est <strong>/maforge</strong>.</p>
<h3>Configuration YUM pour internet</h3>
<p>Les scripts d&#8217;installation nécessitent d&#8217;avoir un accès à internet pour télécharger à l&#8217;aide de yum les modules nécessaires pouvant manquer dans l&#8217;installation par défaut de la machine. Pour cela, si il est nécessaire de passer par un proxy, le déclarer dans yum.conf sous la forme d&#8217;une ligne :</p>
<pre class="brush: text">
proxy=http://adresseipproxy:port/
</pre>
<h3>Téléchargement de la distribution fusionforge</h3>
<p>Les packages à télécharger pour installer la forge sont disponibles à l&#8217;adresse :</p>
<p><a href="http://fusionforge.org/frs/?group_id=6">http://fusionforge.org/frs/?group_id=6</a></p>
<p>A noter que le document présent est basé sur la version 5.0 de la forge. Il est conseillé de prendre la version notée « allinone ».</p>
<p>Dans la suite, on considère qu&#8217;on a téléchargé le fichier : fusionforge-5.0-allinone.tar.bz2</p>
<h2>Processus  d&#8217;installation</h2>
<p>Une fois le fichier d&#8217;installation téléchargé, le déposer dans un répertoire temporaire de la machine, par exemple : /tmp</p>
<p>Puis en tant qu&#8217;utilisateur root :</p>
<pre class="brush: shell">
cd /tmp
bunzip2 fusionforge-5.0-allinone.tar.bz2
tar xf fusionforge-5.0-allinone.tar
</pre>
<p>On doit se retrouver avec un répertoire /tmp/fusionforge-5.0</p>
<pre class="brush: shell">
cd /tmp/fusionforge-5.0
install.sh maforge.modomaine
</pre>
<p>Ce script exécute l&#8217;installation de la forge :</p>
<ul>
<li>Téléchargement des dépendances 	(via le script fusionforge-install-1-deps.php)</li>
<li>Installation des scripts de la 	forge, des répertoires, &#8230; (via le script 	fusionforge-install-2.php)</li>
<li>Création de la base de données 	(fusionforge-install-3-db.php)</li>
</ul>
<p>Lors de l&#8217;installation, le script demande d&#8217;entrer le nom de l&#8217;utilisateur administrateur de la forge et son mot de passe.</p>
<p><strong>Note :</strong></p>
<p>Lors de l&#8217;installation, le script semble ne pas avoir complètement fonctionné correctement. Des analyses sont en cours.</p>
<p>De ce fait, un démarrage manuel de la base postgres a dû être effectué à l&#8217;aide la commande suivante.</p>
<pre class="brush: shell">
/etc/rc.d/init.d/postgresql start
</pre>
<p>Une fois ces opérations menées, il doit être possible d&#8217;ouvrir un navigateur web à l&#8217;adresse :</p>
<p style="text-align: center;"><a href="http://maforge.mondomaine/" target="_blank">http://maforge.modomaine/</a></p>
<div id="attachment_111" class="wp-caption aligncenter" style="width: 310px"><a href="http://dev.david.pilato.fr/wp-content/uploads/2010/05/maforge.png"><img class="size-medium wp-image-111" title="Page d'accueil de la forge" src="http://dev.david.pilato.fr/wp-content/uploads/2010/05/maforge-300x144.png" alt="" width="300" height="144" /></a><p class="wp-caption-text">Page d&#39;accueil de la forge</p></div>
<h2>Processus post-installation</h2>
<h3>Déplacement des fichiers sur la baie SAN</h3>
<p>La forge s&#8217;installe dans ses répertoires par défaut. En attendant que la communauté de développeur de la forge rende paramétrable les répertoires, un certain nombre d&#8217;action sont nécessaires pour déplacer les répertoires d&#8217;installation vers un disque adéquat (sur la baie SAN par exemple).</p>
<p>Pour faire ces déplacements, il est nécessaire de stopper la base de données :</p>
<p>/etc/rc.d/init.d/postgresql stop</p>
<p>Le tableau ci-dessous donne les répertoires par défaut d&#8217;installation de la forge et les répertoires cibles vers lesquels on souhaite se déplacer.</p>
<table>
<tbody>
<tr>
<th width="26%">Répertoire origine</th>
<th width="28%">Répertoire destination</th>
<th width="47%">Commentaire</th>
</tr>
<tr>
<td width="26%">/opt/gforge</td>
<td width="28%">/maforge/fforge50</td>
<td width="47%">Contient les sources, les scripts php, bref, toute le « programme » forge</td>
</tr>
<tr>
<td width="26%">/var/lib/gforge</td>
<td width="28%">/maforge/files</td>
<td width="47%">Contient les répertoires de travail (svn, uploads, &#8230;)</td>
</tr>
<tr>
<td width="26%">/var/lib/pgsql</td>
<td width="28%">/maforge/pgsql</td>
<td width="47%">Contient la base de données</td>
</tr>
<tr>
<td width="26%">/etc/gforge</td>
<td width="28%">/maforge/conf</td>
<td width="47%">Contient la configuration (forge, apache, plugins)</td>
</tr>
<tr>
<td width="26%">/opt/groups</td>
<td width="28%">/maforge/groups</td>
<td width="47%">???</td>
</tr>
</tbody>
</table>
<p>Pour déplacer les fichiers, faire :</p>
<pre class="brush: shell">
mkdir /maforge/conf
mv /etc/gforge/* /maforge/conf/
rmdir /etc/gforge
ln -s /maforge/conf/ /etc/gforge

mkdir /maforge/pgsql
mv /var/lib/pgsql/* /maforge/pgsql/
mv /var/lib/pgsql/.bash_profile /maforge/pgsql/
rmdir /var/lib/pgsql
ln -s /maforge/pgsql/ /var/lib/pgsql

mkdir /maforge/files
mv /var/lib/gforge/* /maforge/files/
rmdir /var/lib/gforge
ln -s /maforge/files/ /var/lib/gforge

mkdir /maforge/fforge50
mv /opt/gforge/* /maforge/fforge50/
rmdir /opt/gforge
ln -s /maforge/fforge50/ /opt/gforge

mkdir /maforge/groups
mv /opt/groups/* /maforge/groups/
rmdir /opt/groups
ln -s /maforge/groups/ /opt/groups
</pre>
<p>Puis redémarrer postgres :</p>
<pre class="brush: shell">
/etc/rc.d/init.d/postgresql start
</pre>
<h3>Patch sur les répertoires SVN et CVS</h3>
<p>L&#8217;installation de la forge semble poser des problèmes sur Redhat 5 et CentOS 5 car des répertoires attendus par la forge ne sont pas créés. Il faut donc, créer des liens symboliques pour corriger ce problème :</p>
<pre class="brush: shell">
ln -s /maforge/files/svnroot /maforge/files/svn
ln -s /maforge/files/cvsroot /maforge/files/cvs
ln -s /maforge/files /scmrepos
ln -s /maforge/files/svnroot /svnroot
ln -s /maforge/files/cvsroot /cvsroot
</pre>
<h3>Installation BIND et configuration DNS (PROVISOIRE/EN COURS)</h3>
<p>La forge doit gérer elle-même ses DNS afin de pouvoir déclarer chaque nouveau projet dans son espace propre (par exemple nomprojet.maforge.mondomaine).</p>
<p>Pour cela, une délégation de DNS doit être réalisée par le DNS principal du domaine mondomaine pour laisser le service BIND de la forge gérer le sous-domaine maforge.mondomaine.</p>
<p>Il faut donc également installer le service BIND sur la forge et le configurer.</p>
<p><strong>Note :</strong> A compléter</p>
<p>Voir aussi : <a href="https://fusionforge.org/docman/view.php/6/1/gforge_manual.plain.html#id2623367">https://fusionforge.org/docman/view.php/6/1/gforge_manual.plain.html#id2623367</a></p>
<fb:share-button href="http://dev.david.pilato.fr/?p=105" type="button_count"></fb:share-button>]]></content:encoded>
			<wfw:commentRss>http://dev.david.pilato.fr/?feed=rss2&amp;p=105</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Problème Jetty / Maven sous Windows</title>
		<link>http://dev.david.pilato.fr/?p=88</link>
		<comments>http://dev.david.pilato.fr/?p=88#comments</comments>
		<pubDate>Wed, 24 Feb 2010 20:14:51 +0000</pubDate>
		<dc:creator>David Pilato</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Jetty]]></category>

		<guid isPermaLink="false">http://dev.david.pilato.fr/?p=88</guid>
		<description><![CDATA[Lorsqu&#8217;on souhaite lancer une WebApp avec le plugin Jetty sous Maven 2 depuis un PC sous windows on obtient une erreur référencée sous JIRA #JETTY-1063 :

java.net.URISyntaxException: Illegal character in path at index 18: file:/C:/Documents and Settings/USER/.m2/repository/org/mortbay/jetty/jetty-maven-plugin/7.0.0.1beta2/jetty-maven-plugin-7.0.0.1beta2.jar

Ce problème n’est résolu que sous Maven 3. Pour ceux qui souhaitent rester sous Maven 2 (Maven 3 est encore [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsqu&#8217;on souhaite lancer une WebApp avec le plugin <a title="Plugin JETTY" href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin">Jetty</a> sous Maven 2 depuis un PC sous windows on obtient une erreur référencée sous JIRA <a title="JIRA #JETTY-1063" href="http://jira.codehaus.org/browse/JETTY-1063">#JETTY-1063</a> :</p>
<pre class="brush: php">
java.net.URISyntaxException: Illegal character in path at index 18: file:/C:/Documents and Settings/USER/.m2/repository/org/mortbay/jetty/jetty-maven-plugin/7.0.0.1beta2/jetty-maven-plugin-7.0.0.1beta2.jar
</pre>
<p>Ce problème n’est résolu que sous <a title="Release notes Maven 3" href="http://maven.apache.org/release-notes-3.0.x.html">Maven 3</a>. Pour ceux qui souhaitent rester sous Maven 2 (Maven 3 est encore en version alpha), il faut modifier l&#8217;emplacement de la repository pour éviter le souci du caractère ESPACE présent dans le chemin C:\Documents and settings\USER\.m2\repository (chemin par défaut).</p>
<p>Il est fortement recommandé de déplacer le répertoire repository dans c:\maven2\repository par exemple et modifier ensuite le fichier settings.xml qui se trouve normalement dans C:\Documents and settings\USER\.m2 ou (moins bien) dans votre répertoire d’installation de maven sous /conf.</p>
<pre class="brush: xml">
&lt;localRepository&gt;/c:/maven2/repository&lt;/localRepository&gt;
</pre>
<p>Ainsi, Maven ira chercher les libs dans un répertoire sans espaces…</p>
<fb:share-button href="http://dev.david.pilato.fr/?p=88" type="button_count"></fb:share-button>]]></content:encoded>
			<wfw:commentRss>http://dev.david.pilato.fr/?feed=rss2&amp;p=88</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilisation du mode Lazy d&#8217;Hibernate avec Struts et Spring</title>
		<link>http://dev.david.pilato.fr/?p=77</link>
		<comments>http://dev.david.pilato.fr/?p=77#comments</comments>
		<pubDate>Wed, 24 Feb 2010 13:56:56 +0000</pubDate>
		<dc:creator>David Pilato</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://dev.david.pilato.fr/?p=77</guid>
		<description><![CDATA[Lorsqu&#8217;on utilise Hibernate pour déléguer la gestion de la persistence, se pose alors le classique problème de l&#8217;exception LazyInitialisationException.
En effet, dans une modélisation assez classique, imaginons le cas suivant :
Couche Modèle (ou DAO)
Classe POJO contenant un attribut x et une collection cols

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Dossier {
	@Id
	@GeneratedValue
	private Long id;
	private String x;

	@OneToMany(cascade=CascadeType.ALL)
	private Collections&#60;String&#62; cols;
	// Getter et setters
}

Classe DAO
Voir [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsqu&#8217;on utilise Hibernate pour déléguer la gestion de la persistence, se pose alors le classique problème de l&#8217;exception <a title="JavaDoc" href="https://www.hibernate.org/hib_docs/v3/api/org/hibernate/LazyInitializationException.html">LazyInitialisationException</a>.</p>
<p>En effet, dans une modélisation assez classique, imaginons le cas suivant :</p>
<h2>Couche Modèle (ou DAO)</h2>
<h3>Classe POJO contenant un attribut x et une collection cols</h3>
<pre class="brush: java">
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Dossier {
	@Id
	@GeneratedValue
	private Long id;
	private String x;

	@OneToMany(cascade=CascadeType.ALL)
	private Collections&lt;String&gt; cols;
	// Getter et setters
}
</pre>
<h3>Classe DAO</h3>
<p>Voir le <a href="http://bit.ly/a05odS">blog</a> pour l&#8217;utilisation des generics de Java5 afin d&#8217;éviter d&#8217;avoir à coder toujours les mêmes méthodes CRUD.</p>
<pre class="brush: java">
@Repository
@Transactional
public class DossierDAO {
	@Autowired
	protected SessionFactory factory;

	public Dossier getOne (Long id) {
		Session session = factory.getCurrentSession();
		return (Dossier)(session.get(Dossier.class,id));
	}
}
</pre>
<h2>Couche Métier (ou Service)</h2>
<h3>Classe Service contenant l&#8217;injection du DAO</h3>
<pre class="brush: java">
@Transactional
public class DossierServiceImpl implements DossierService {
	@Autowired
	@Qualifier(&quot;dossierDao&quot;)
	private DossierDAO dossierDao;

	public Dossier read(Long id) {
		return dossierDao.getOne(Dossier.class.getName(), id);
	}
}
</pre>
<p>On voit ici que la transaction peut démarrer au niveau du service et que par défaut, en mode Lazy, seul l&#8217;attribut x de Dossier sera chargé.</p>
<p>Pour que l&#8217;application Web appelante puisse faire une itération sur la collection, il faudrait que celle-ci soit chargée.<br />
Il est possible de changer le mode LAZY pour dire à Hibernate de tout récupérer mais pour un arbre de données assez profond, cela peut devenir désastreux.<br />
Il est également de modifier la méthode read du service DossierService ainsi :</p>
<pre class="brush: java">
public Dossier read(Long id) {
	Dossier d = dossierDao.getOne(Dossier.class.getName(), id);
	d.getCols();
	return d;
}
</pre>
<p>Dans ce cas, on a déclenché manuellement la recherche du contenu de la collection&#8230;</p>
<p>Autre possibilité, garder la connexion avec Hibernate pendant tout le temps du traitement de la requête Web de l&#8217;utilisateur.<br />
Pour se faire, on doit ouvrir la transaction au début du traitement de la requête pour ne la restituer qu&#8217;à la fin de la génération de la vue.</p>
<p>On modifie le web.xml :</p>
<pre class="brush: xml">
	&lt;filter&gt;
		&lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt;
		&lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt;
		&lt;url-pattern&gt;*.do&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;
</pre>
<p>Dans cette configuration, le filtre <a title="JavaDoc OpenSessionInViewFilter" href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/support/OpenSessionInViewFilter.html">OpenSessionInViewFilter</a> mis sur tous les appels *.do va déclencher une ouverture de session hibernate jusqu&#8217;à la restitution de la vue.<br />
Ainsi, si dans la JSP, on trouve une itération de l&#8217;attribut cols du bean Dossier, un appel à la base de données via Hibernate sera déclenché à ce moment là (et seulement à ce moment là).<br />
Autrement dit, si pour une autre JSP vous n&#8217;avez pas besoin d&#8217;afficher la collection, l&#8217;appel à la base ne sera pas réalisé.</p>
<fb:share-button href="http://dev.david.pilato.fr/?p=77" type="button_count"></fb:share-button>]]></content:encoded>
			<wfw:commentRss>http://dev.david.pilato.fr/?feed=rss2&amp;p=77</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Publication de documentation fonctionnelle avec Maven</title>
		<link>http://dev.david.pilato.fr/?p=34</link>
		<comments>http://dev.david.pilato.fr/?p=34#comments</comments>
		<pubDate>Tue, 23 Feb 2010 12:40:26 +0000</pubDate>
		<dc:creator>David Pilato</dc:creator>
				<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://dev.david.pilato.fr/?p=34</guid>
		<description><![CDATA[Voici une astuce permettant de laisser les analystes ou concepteurs utiliser leurs logiciels habituels de documentation (oOo ou Word), tout en permettant de publier automatiquement avec la génération du site un document PDF lisible par tous.]]></description>
			<content:encoded><![CDATA[<p>Lorsqu&#8217;on utilise Maven, se pose souvent la question de génération de documents à intégrer dans le site web généré par Maven.</p>
<p>Au début, j&#8217;ai regardé le <a title="Format APT" href="http://maven.apache.org/doxia/references/apt-format.html">format APT</a> qui a l&#8217;avantage certain de générer du contenu directement consultable sous forme de page Web. Il existe de plus un plugin qui permet de fabriquer un PDF en regroupant les fichiers APT souhaités.</p>
<p>Mais, cela reste un nouveau langage à apprendre pour des équipes fonctionnelles et le format APT est trop limité pour permettre un travail efficace par les équipes de conception ou d&#8217;analyse.<br />
Après avoir tourné et viré, testé quelques solutions, j&#8217;en suis arrivé à la conclusion que le plus pratique est de laisser les concepteurs utiliser leurs outils office (<a title="Microsoft Office" href="http://www.microsoft.com/france/office/">Microsoft</a> ou <a title="Open Office" href="http://fr.openoffice.org/">oOo</a>) et de transformer ces documents en PDF lors de la fabrication du site.</p>
<p>Pour cela, un petit plugin miracle (<a title="JODConverter Site" href="http://artofsolving.com/opensource/jodconverter/guide">jodconverter-maven-plugin</a>) couplé à oOo permet de faire le travail.</p>
<p>Tout d&#8217;abord, il faut lancer oOo en mode serveur. Sous Linux, ça se fait comme ça :</p>
<pre class="brush: bash">
/opt/openoffice.org3/program/soffice -headless -accept=&quot;socket,host=localhost,port=8100;urp;&quot; -nofirststartwizard
</pre>
<p>Sous Windows :</p>
<pre class="brush: bash">
&quot;C:\Program Files\OpenOffice.org 3\program\soffice.exe&quot; -accept=&quot;socket,host=localhost,port=8100;urp;&quot;
</pre>
<p>Puis ajouter dans le pom.xml :</p>
<pre class="brush: xml">
&lt;build&gt;
&lt;plugins&gt;
&lt;plugin&gt;
&lt;groupId&gt;com.artofsolving&lt;/groupId&gt;
&lt;artifactId&gt;jodconverter-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;2.2.3&lt;/version&gt;
&lt;inherited&gt;false&lt;/inherited&gt;
&lt;configuration&gt;
&lt;sourceDirectory&gt;${basedir}/src/site/docs&lt;/sourceDirectory&gt;
&lt;outputDirectory&gt;${project.reporting.outputDirectory}/docs&lt;/outputDirectory&gt;
&lt;include&gt;**/*.odt,**/*.odp&lt;/include&gt;
&lt;outputFormat&gt;pdf&lt;/outputFormat&gt;
&lt;port&gt;8100&lt;/port&gt;
&lt;/configuration&gt;
&lt;executions&gt;
&lt;execution&gt;
&lt;id&gt;convert&lt;/id&gt;
&lt;phase&gt;pre-site&lt;/phase&gt;
&lt;goals&gt;
&lt;goal&gt;convert&lt;/goal&gt;
&lt;/goals&gt;
&lt;/execution&gt;
&lt;/executions&gt;
&lt;/plugin&gt;
&lt;/plugins&gt;
&lt;/build&gt;
</pre>
<p>Ainsi, lors de la génération du site, tous les documents odt ou odp présents dans le répertoire /src/site/docs et sous-répertoires seront transformés en documents PDF dans le répertoire de sortie du site sous /docs. Les sous-répertoires sont également recréés.</p>
<p>Il ne reste plus qu&#8217;à faire des liens vers ces documents générés que ce soit dans site.xml ou dans un fichier APT.</p>
<p>Dans l&#8217;exemple suivant, le fichier source MonDoc.odt se trouve dans /src/site/docs/1.</p>
<pre class="brush: xml">
&lt;!-- Extrait du site.xml --&gt;
&lt;body&gt;
&lt;menu name=&quot;Fonctionnel&quot;&gt;
&lt;item name=&quot;Mon document&quot; href=&quot;./docs/1/MonDoc.pdf&quot; /&gt;
&lt;/menu&gt;
&lt;/body&gt;
</pre>
<p>Dans le cadre des projets que je gère, j&#8217;ai mis en place <a title="Hudson" href="http://hudson-ci.org/">Hudson</a> qui me reconstruit toutes les nuits une vision documentaire de mes projets. Ainsi, lorsqu&#8217;un concepteur valide dans CVS ou SVN pendant la journée un document, il est automatiquement publié la nuit sur le site Maven correspondant.</p>
<p><span style="text-decoration: underline;">Autre intérêt :</span> à chaque livraison (<a title="Processus Release de Maven" href="http://maven.apache.org/plugins/maven-release-plugin/">release</a>), une photographie complète de l&#8217;état de la documentation au moment de la fabrication des livrables est générée. Il est ainsi possible de retrouver facilement le contexte fonctionnel d&#8217;une version particulière&#8230;</p>
<fb:share-button href="http://dev.david.pilato.fr/?p=34" type="button_count"></fb:share-button>]]></content:encoded>
			<wfw:commentRss>http://dev.david.pilato.fr/?feed=rss2&amp;p=34</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La mise en place d&#8217;une Forge</title>
		<link>http://dev.david.pilato.fr/?p=23</link>
		<comments>http://dev.david.pilato.fr/?p=23#comments</comments>
		<pubDate>Tue, 26 Jan 2010 22:13:47 +0000</pubDate>
		<dc:creator>David Pilato</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Forge]]></category>
		<category><![CDATA[FusionForge]]></category>
		<category><![CDATA[GForge]]></category>

		<guid isPermaLink="false">http://dev.david.pilato.fr/?p=23</guid>
		<description><![CDATA[Description de la mise en place de la forge GForge pour les besoins de mon centre informatique.]]></description>
			<content:encoded><![CDATA[<p>Pour les besoins internes de la douane, j&#8217;ai proposé la mise en place d&#8217;une forge afin de consolider nos moyens de développement et de gestion de projets.</p>
<p>Histoire d&#8217;être cohérent avec d&#8217;autres choix faits par l&#8217;administration, <a title="Forge publique de l'administration" href="http://adullact.net/">projet Adullact</a>, j&#8217;ai retenu la forge <a title="GForge" href="http://gforge.org/">GFORGE</a>.</p>
<p>Je vais décrire ici le processus d&#8217;installation que je vais suivre afin de partager cette information avec d&#8217;autres personnes qui pourraient être intéressés par cette démarche.</p>
<h2>Installation de la Forge sur Ubuntu 9.10</h2>
<p>Tout d&#8217;abord, il faut télécharger les <a title="Download GForge" href="http://gforgegroup.com/es/download.php" target="_blank">sources de la forge</a>. Je me suis basé sur la dernière version connue à ce moment : <a title="5.7b2" href="http://gforgegroup.com/dl/install-gforge-ce-57b2-src.zip" target="_self">5.7b2 Community Edition</a>.</p>
<h3>Correction du problème avec Postgresql</h3>
<p>La version de postgres téléchargée par Ubuntu ne correspond pas à la version attendue dans le script d&#8217;installation <strong>install-gforge-2-db.php</strong>.</p>
<p>Pour corriger ce problème, j&#8217;ai remplacé partout (sauf à la fin) la version 8.3 par 8.4.</p>
<p>Par exemple la ligne</p>
<pre class="brush: shell">
&#039;/etc/init.d/postgresql-8.3&#039;,
</pre>
<p>est devenue</p>
<pre class="brush: shell">
&#039;/etc/init.d/postgresql-8.4&#039;,
</pre>
<h3>Correction du problème avec la distribution Apache pour Ubuntu (Rewrite)</h3>
<p>La gestion de la configuration Apache n&#8217;est pas &laquo;&nbsp;standard&nbsp;&raquo; sur Ubuntu. J&#8217;ai donc suivi les recommandations du <a title="Blog de Josh Street" href="http://josh.st/2005/03/06/ubuntu-apache-and-making-mod_rewrite-happy/" target="_blank">blog de Josh Street</a> pour corriger le problème.</p>
<pre class="brush: shell">
cd /etc/apache2/mods-enabled
sudo ln -s ../mods-available/rewrite.load rewrite.load
sudo service apache2 start
</pre>
<p>Finalement, Adullact a annoncé vouloir passer sous <a href="http://fusionforge.org/">FusionForge</a> qui est un fork de GForge afin de conserver la forge dans le monde open-source. La team FusionForge travaille en ce moment sur la version 5.0 mais elle n&#8217;est pas encore stabilisée. Nous allons donc installer la <a href="http://fusionforge.org/frs/?group_id=6">version 4.8.3</a>.</p>
<p>La mise en place de FusionForge est abordée dans <a href="http://dev.david.pilato.fr/?p=105" target="_self">cet article</a>.</p>
<p>David <img src='http://dev.david.pilato.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<fb:share-button href="http://dev.david.pilato.fr/?p=23" type="button_count"></fb:share-button>]]></content:encoded>
			<wfw:commentRss>http://dev.david.pilato.fr/?feed=rss2&amp;p=23</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Découverte de Google App Engine pour Java</title>
		<link>http://dev.david.pilato.fr/?p=16</link>
		<comments>http://dev.david.pilato.fr/?p=16#comments</comments>
		<pubDate>Sat, 23 Jan 2010 13:34:32 +0000</pubDate>
		<dc:creator>David Pilato</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Google App Engine]]></category>

		<guid isPermaLink="false">http://dev.david.pilato.fr/?p=16</guid>
		<description><![CDATA[Je viens de découvrir Google App Engine pour Java. Je vais essayer de compléter cet article au fur et à mesure que je vais avancer dans son utilisation... Stay tuned...]]></description>
			<content:encoded><![CDATA[<p>En lisant le magazine de développez.com (<a title="Télécharger le document PDF" href="ftp://ftp-developpez.com/magazine/DevMag200912.pdf" target="_blank">Décembre 2009 &#8211; Janvier 2010</a>), j&#8217;ai découvert l&#8217;ouverture du service Google App Engine au monde Java.</p>
<p>De quoi s&#8217;agit-il ?</p>
<p>Ni plus, ni moins que ce que tout développeur Java cherche : <strong>un hébergement <span style="text-decoration: underline;">gratuit </span>d&#8217;applications Java</strong>. Bon, il ne s&#8217;agit pas d&#8217;un serveur J2EE du type JBoss, Glassfish ou autre mais il permet de faire tourner des applications Web (des Webapps Java)  et de pouvoir y intégrer les outils Google.</p>
<p>Je viens juste de créer mon compte, de diriger mon domaine vers ce site et de faire tourner une application de base générée avec le plugin Eclipse pour google.</p>
<p>Je vais compléter cet article au fur et à mesure de découvertes&#8230;</p>
<p>Stay tuned !</p>
<fb:share-button href="http://dev.david.pilato.fr/?p=16" type="button_count"></fb:share-button>]]></content:encoded>
			<wfw:commentRss>http://dev.david.pilato.fr/?feed=rss2&amp;p=16</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
