vendredi 27 avril 2012
Par guillaume le vendredi 27 avril 2012, 16:06 - linux
Après avoir essayé plusieurs trucs, j'ai enfin trouvé une solution
intéressante pour commenter un bloc de code sous vi qui ne propose pas du mode
visuel. Bien qu'intéressant quand on est sous vim, lorsqu'on est sur un serveur
sur une configuration Apache, les choses sont tout de suite moins visuelles...
L'idéal est d'utiliser les markers
et la substitution
:
- se placer sur la première ligne du bloc de code et taper
ma
pour placer le marqueur a
- positionner le curseur sur la dernière ligne du bloc à commenter
- du marqueur a ('a) à la ligne courante (.) remplacer chaque début de ligne
par un # :
:'a,.s/^/#/
Et voilà!
aucun rétrolien
Par guillaume le vendredi 27 avril 2012, 14:56 - flex
Au secours! Lorsque Flex vous met un joli message RSL error 1 of 1
c'est que vous avez tout simplement oublié de lui indiquer une librairie Flex
(librairie SWC ou SWZ).
Dans mon cas c'est la librairie RPC (il y a en trois essentiel framework,
rpc et datavizualisation).
Ensuite tout va beaucoup mieux!
Sources :
http://livedocs.adobe.com/flex/3/html/help.html?content=rsl_09.html
aucun rétrolien
mardi 31 janvier 2012
Par guillaume le mardi 31 janvier 2012, 10:49 - java / j2ee
Changer le niveau de log directement sans avoir à redéployer l'application
est parfois indispensable sur des plateformes critiques où il est impossible
d'interrompre le service. C'est aussi un moyen de déboguer directement sur une
plateforme qui est la seule à présenter un bug non reproductible ailleurs.
Il existe plusieurs solutions dont :
- relecture de la configuration Log4j à intervalle régulier; il suffit alors
de modifier la configuration des niveaux de log directement (soit avec l'API
Log4j, soit avec les classes utilitaires de Spring Log4jWebConfigurer)
- changement des niveaux de log à l'aide de JMX
C'est cette dernière solution que je préfère, car il est généralement
déconseillé de modifier directement des fichiers à chaud dans un serveur
d'applications.
Il faut d'abord créer une classe avec une méthode permettant de modifier le
niveau de log de n'importe quel package :
Lire la suite...
aucun rétrolien
mercredi 4 janvier 2012
Par guillaume le mercredi 4 janvier 2012, 12:15 - java / j2ee
Je déploie habituellement les applications web dans Tomcat en multi-instance
avec une instance Tomcat par application (ceux qui croient que c'est une
hérésie iront voir les concepteurs de Tomcat Mark Thomas et Filip Hanik qui
préconisent eux mêmes cette solution). Cependant, dans certains contextes, et
notamment chez certains clients, les contraintes font que l'on est obligé de
faire autrement...
Dans le cas présent, c'est la configuration de log4j via Spring qui pose
(encore) problème : je déploie 2 applications identiques (avec configuration
applicative légèrement différente) sous 2 contextes différents dans le même
serveur Tomcat. Se posent donc 2 problèmes :
- il faut pouvoir packager l'application sous des formes différentes et
notamment 2 contextes différents : /my-app1 et /my-app2, donc paramétrer le
packaging
- la configuration log4j est à priori identique pour ces 2 applications
(packages identiques) : ceci pose le problème de la séparation des logs (et
éventuellement la différenciation des niveaux de log)
Lire la suite...
aucun rétrolien
vendredi 18 novembre 2011
Par guillaume le vendredi 18 novembre 2011, 23:33 - linux
La commande find est très puissante mais il faut parfois creuser un peu pour
trouver la bonne syntaxe...
Pour trouver tous les fichiers réguliers modifiés dans les dernières 24
heures dans un répertoire et ses sous-répertoire voici la commande :
find /mydir -type f -mtime -1 -print
Pour trouver tous les fichiers réguliers modifiés à partir du début de la
journée dans un répertoire et ses sous-répertoire il faut ruser un peu...
On créée d'abord un fichier factice à l'aide de la commande touch en forçant
la date de ce dernier :
$ touch -t `date +%m%d0000` /tmp/$$
$ ls -l /tmp/
-rw-r--r-- 1 moi moi 0 2011-11-18 00:00 5992
$ find /mydir -type f -newer /tmp/5992
$ rm /tmp/5992
En effet dans la documentation de la commande touch on lit ceci sur l'option
-t :
-t STAMP use
[[CC]YY]MMDDhhmm[.ss] instead of current time
Il est donc ensuite très facile d'étendre la commande précédente pour lui
faire rechercher des fichiers après n'importe quelle date.
aucun rétrolien
mardi 27 septembre 2011
Par guillaume le mardi 27 septembre 2011, 09:50 - OFBiz
Lorsqu'on doit inclure du code HTML généré dans une page freemarker (sous la
forme d'une chaîne), il faut utiliser cette syntaxe pour que les tags HTML ne
soient pas "échappés" :
${StringUtil.wrapString( htmlString ? if_exists ) }
htmlString étant une chaine qui aura par exemple été mis dans le contexte
via un script grovvy ou un service.
aucun rétrolien
mardi 23 août 2011
Par guillaume le mardi 23 août 2011, 15:03 - java / j2ee
Obtenir les traces des prepared statements d'Hibernate est assez simple et
tout le monde connaît cette configuration. Il suffit d'indiquer
hibernate.show_sql=true
dans le fichier de configuration XML Hibernate pour obtenir la requête qui
sera utilisé avec le SGBD. La requête sera affichée sous la forme d'un
preparedStatement avec des "?" à la place des valeurs.
Une question alors fréquemment posée est : comment obtenir aussi les valeurs
passée avec la requête?!
L'information est quelque part connue en interne dans Hibernate : le tout
est de la mettre en valeur en modifiant le paramétrage du logger. Par exemple
avec log4j il suffit de mettre en level DEBUG les packages suivants et de les
router vers un appender spécifique avec une additivité à false :
log4j.logger.org.hibernate.SQL=DEBUG,SQL_APPENDER
log4j.additivity.org.hibernate.SQL=false
org.hibernate.type=DEBUG,SQL_APPENDER
log4j.additivity.org.hibernate.type=false
aucun rétrolien
mardi 3 mai 2011
Par guillaume le mardi 3 mai 2011, 15:39 - linux
Dans les scripts shell, il est toujours utile de savoir manipuler
correctement les commandes courantes de compression comme bzip2, gzip et tar,
et notamment leurs interactions possibles avec l'entrée standard (stdin) et la
sortie standard (stdout). L'avantage d'utiliser cette méthode est qu'elle est
compatible avec tous les systèmes *NIX !
Créer des archives
On utilise l'option c(reate) de tar dont le résultat est envoyé dans un pipe
vers gzip ou bzip2. La redirection > permet d'envoyer le résultat final dans
un fichier :
tar cv file1 [file2] ... | gzip > archname.tar.gz
tar cv file1 [file2] ... | bzip2 > archname.tar.bz2
Décompacter des archives
gzip -cd archname.tar.gz | tar xv
bzip2 -cd archname.tar.bz2 | tar xv
Lire le contenu d'une acrhive
gzip -cd archname.tar.gz | tar tv
bzip2 -cd archname.tar.bz2 | tar tv
NOTA BENE
Le programme tar
peut parfois pointer par défaut sur un device
prédéfini (comme un magnéto à bande) si l'option f
n'est pas précisée.
Sur certains systèmes il faut donc préciser f -
pour forcer tar
à
orienter vers l'entrée / sortie standard. Exemple :
tar cvf - file1 [file2] ... | gzip > archname.tar.gz
aucun rétrolien
mercredi 2 mars 2011
Par guillaume le mercredi 2 mars 2011, 11:15 - java / j2ee
Pour récupérer les codes sources et la javadoc, il suffit d'ajouter au
lancement de maven
-DdownloadSources=true -DdownloadJavadocs=true
ou bien ceci dans le pom.xml
<properties>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
....
</properties>
Il est utile d'avoir les sources lors des phases de debugging pour
comprendre parfois le comportement d'un framework.
aucun rétrolien
mardi 22 février 2011
Par guillaume le mardi 22 février 2011, 18:23 - java / j2ee
Sur une application destinée à l'international, j'ai tout naturellement
souhaité introduire l'internationalisation (i18n) des messages destinés aux
utilisateurs, aux logs, aux erreurs etc.
Je me suis penché sur ce que propose Spring et j'ai commencé avec cette
configuration très sommaire :
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message"/>
</bean>
Le premier problème c'est l'apparition de ???
à la place de certains
caractères UTF-8 : gênant non?! Ceci est en fait dû au
ResourceBundleMessageSource de Spring qui utilise les classes
standards java.util.ResourceBundle et
java.util.Properties, or ces dernières ne supportent visiblement
que l'encodage ISO-8859-1 !!!
La solution est d'utiliser le
ReloadableResourceBundleMessageSource de Spring, plus complet. Il
suffit de lui indiquer le defaultEncoding choisi.
L'autre problème est la non reconnaissance des fichiers de properties (mis
dans le classpath) que j'ai nommés message_en.properties ,
message_fr.properties, etc. Apparemment il faut ajouter le
paramètre fallbackToSystemLocale=false sur le
ReloadableResourceBundleMessageSource de Spring pour éviter que
soient recherchés les fichiers du type message_fr_FR ou
message_en_FR.
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:message"/>
<property name="fallbackToSystemLocale" value="false" />
<property name="defaultEncoding" value="UTF-8"/>
</bean>
Sources :
http://www.cakesolutions.net/teamblogs/2009/04/02/utf-8-encoding-and-message-sources/
http://forum.springsource.org/showthread.php?t=18199&page=2
aucun rétrolien
jeudi 17 février 2011
Par guillaume le jeudi 17 février 2011, 16:11 - java / j2ee
Lors d'un changement de JVM, il se peut que les données de configuration
VisualVM ne soient pas récupérées (notamment passage de Java 6 à Java 7). Sur
un poste windows, il est très simple de récupérer ses configurations d'hôtes à
monitorer. Elles se trouvent dans :
C:\Documents and Settings\utilisateur\Application Data\.visualvm\6u30
Les hôtes déclarés sont dans le répertoire repository. Il suffit de recopier
les données vers le répertoire C:\Documents and
Settings\utilisateur\Application Data\.visualvm\7 si vous venez d'installer la
dernière JVM 7.
D'une version 6 à une autre, le premier répertoire créé semble être conservé
pour les versions suivantes.
aucun rétrolien
mercredi 16 février 2011
Par guillaume le mercredi 16 février 2011, 16:12 - java / j2ee
Lors d'un test de l'archetype plugin de maven, j'obtenais un build
failure
avec un Required goal not found
alors que tout fonctionnait
auparavant...
Voici le contenu du
.m2\repository\org\apache\maven\plugins\maven-archetype-plugin\maven-metadata-central.xml
<?xml version="1.0"?><metadata>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<versioning>
<latest>1.0-alpha-4</latest>
<release>1.0-alpha-4</release>
<versions>
<version>1.0-alpha-3</version>
<version>1.0-alpha-4</version>
</versions>
<lastUpdated>20060507072802</lastUpdated>
</versioning>
</metadata>
En fait, il faut le corriger comme ceci pour que tout fonctionne
correctement (en téléchargeant directement sur un repository en ligne le
fichier maven-metadata.xml)
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<versioning>
<latest>2.0</latest>
<release>2.0</release>
<versions>
<version>1.0-alpha-3</version>
<version>1.0-alpha-4</version>
<version>1.0-alpha-7</version>
<version>2.0-alpha-1</version>
<version>2.0-alpha-2</version>
<version>2.0-alpha-3</version>
<version>2.0-alpha-4</version>
<version>2.0-alpha-5</version>
<version>2.0</version>
</versions>
<lastUpdated>20101028011818</lastUpdated>
</versioning>
</metadata>
Et voilà!
aucun rétrolien
Par guillaume le mercredi 16 février 2011, 11:57 - java / j2ee
Les archetypes maven ne semblent pas très fonctionnels... Pour créer un
template de projet à partir d'un archetype existant voici la commande à
exécuter :
$ mvn archetype:generate
Maven sort alors une liste d'une vingtaines d'archetypes possibles. On peut
alors choisir l'archetype à utiliser et le customiser. Maven génère alors un
répertoire projet prêt à l'emploi. En les testant on s'aperçoit que sur la
majorité des archetypes disponibles, seuls quelques uns fonctionnent
vraiment...
La liste des archetypes possibles se trouve ici :
http://docs.codehaus.org/display/MAVENUSER/Archetypes+List
C'est un peu décevant...
De même, j'ai cherché un archetype pour Spring-batch. Visiblement rien n'existe
et l'infrastructure maven ne semble pas être utilisée pour ça. Le mieux que
j'ai trouvé c'est d'aller directement récupérer les exemples de code qui
existent sur le repository SVN de spring !
$ svn export
https://src.springframework.org/svn/spring-batch/trunk/archetypes/simple-cli
$ cd simple-cli
$ mvn test
Et voilà! On y trouvera aussi d'autres exemples de projet.
aucun rétrolien
mercredi 15 décembre 2010
Par guillaume le mercredi 15 décembre 2010, 17:28 - linux
Pour connaitre le temps d'activité d'un serveur depuis son dernier
démarrage, sous Linux, c'est la commande uptime :
# uptime
10:38:26 up 153 days, 19:49, 1 user, load average: 1.18, 0.76, 0.46
Par contre sous windows, c'est un peu plus compliqué, et les calculs sont à
faire par vos soins (où alors je n'ai pas trouvé la commande!)... Je n'ai
trouvé que ça :
>net statistics serveur
Statistiques de serveur de \\MYSERVER
Statistiques depuis 10/13/2010 10:07 AM
Sessions acceptées 1
Déconnexions automatiques 0
Déconnexions sur erreur 6
Kilo-octets envoyés 8
Kilo-octets reçus 11
Temps de réponse moyen (ms) 0
Erreurs système 0
Violations d'autorisation 12
Violations de mot de passe 0
Fichiers utilisés 0
Périphériques comm. utilisés 0
Travaux d'impression mis en file d'attente 0
Saturation des zones tampon
de grande taille 0
de demande 0
La commande s'est terminée correctement.
aucun rétrolien
mardi 30 novembre 2010
Par guillaume le mardi 30 novembre 2010, 11:28 - java / j2ee
Pour réaliser des tests plus industriels, il est nécessaire que le script de
test puisse accéder à une base de données. Sur la version non payante de
SOAPUI
import com.eviware.soapui.*;
import groovy.sql.Sql;
def dbUrl = "jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = host1.mydomain.com)(PORT = 1523))(ADDRESS = (PROTOCOL = TCP)(HOST = host2.mydomain.com
)(PORT = 1521))(FAILOVER = false))(CONNECT_DATA =(SERVICE_NAME = MYDB.MYDOMAIN.COM)))";
def dbUser = "user";
def dbPwd = "mypassword";
def sql;
try {
sql = Sql.newInstance(dbUrl, dbUser, dbPwd, "oracle.jdbc.OracleDriver");
//def res = sql.firstRow("SELECT * FROM MA_TABLE");
//log.info res.ID + " " + res.CHAMP1;
//res.close();
sql.eachRow("SELECT * FROM MA_TABLE") {
log.info "${it.ID} / ${it.CHAMP1}"
}
sql.close();
log.info "Closed Database Connection.";
} catch (Exception e) {
log.error "Could not establish connection to the database.";
}
Voilà une première étape de franchie. On peut aller plus loin en utilisant
ceci au niveau des scripts de setup
et tear down
d'un jeu de
test.
aucun rétrolien
dimanche 7 novembre 2010
Par guillaume le dimanche 7 novembre 2010, 23:15 - java / j2ee
Bien d'Hibernate soit capable d'aller chercher des données dans des tables
situées dans différents schémas, il n'est pas possible directement de changer
le schéma à l'exécution. En effet, les annotations sont lues à la
compilation et le code d'une @Entity est alors figé sur un schéma et une
table.
@Entity
@Table(name="MON_OBJET",schema="MON_SCHEMA")
public class MonObjet implements Serializable {
...
private Etat etat;
...
@OneToOne(...)
public Etat getEtat() { ... }
public void setEtat(Etat etat) { ... }
}
@Entity
@Table(name="ETAT",schema="MON_SCHEMA")
public class Etat {
...
}
Ceci devient gênant lorsque par exemple, une des entités peut se trouver
dans différents schémas qui correspondent par exemple à des environnements
différents. Par exemple, si MonObject est attaché en relation un à un à un
objet Etat qui peut se trouver dans MON_SCHEMA, SCHEMA_PREPROD ou SCHEMA_PROD,
on devra alors packager une application par schéma!
Une solution possible serait de créer un profile maven pour chaque
environnement, puis d'utiliser la phase de génération des sources pour modifier
les annotations dans le code java... Ce qui semble plutôt lourd à mettre en
place! Et au final, il faut toujours une application par schéma utilisé! Il
existe cependant une solution avec les interceptor d'Hibernate pour ne
déployer qu'une seule application...
Lire la suite...
aucun rétrolien
mercredi 13 octobre 2010
Par guillaume le mercredi 13 octobre 2010, 12:24 - java / j2ee
La configuration d'un proxy HTTPS pour Tomcat est plus cohérente que celle
de maven et plus directe; il suffit juste d'indiquer les propriétés système de
Java dans le fichier $CATALINA_HOME/conf/catalina.properties :
http.proxyHost=proxy.mydomain.com
http.proxyPort=8080
http.nonProxyHost=localhost|10.*
https.proxyHost=proxy.mydomain.com
https.proxyPort=8080
aucun rétrolien
Par guillaume le mercredi 13 octobre 2010, 12:08 - java / j2ee
La configuration d'un proxy sous maven est a priori simple : il suffit
d'ajouter la section suivante dans le fichier ~/.m2/settings.xml :
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>proxy.somewhere.com</host>
<port>8080</port>
<username>proxyuser</username>
<password>somepassword</password>
<nonProxyHosts>localhost|10.*</nonProxyHosts>
</proxy>
</proxies>
Mais pour le protocole HTTPS la documentation n'indique rien! Si l'on essaye
de transposer et d'ajouter un proxy avec
<protocol>https</protocol>
cela ne marche pas beaucoup plus...
La solution consiste à ajouter ceci à la variable d'environnement MAVEN_OPTS
:
MAVEN_OPTS=$MAVEN_OPTS -Dhttps.proxyHost=proxy.somewhere.com -Dhttps.proxyPort=8080
aucun rétrolien
lundi 4 octobre 2010
Par guillaume le lundi 4 octobre 2010, 11:59 - java / j2ee
Les intercepteurs de CXF permettent, comme leur nom l'indique, d'intercepter
le flux en entrée ou en sortie d'un webservice et d'exécuter un traitement.
Tout comme les filtres de servlet, ils sont puissant pour réaliser des
opérations techniques sur les données.
Si l'on veut tracer le temps d'exécution d'un webservice à toutes les étapes
et notamment juste avant l'entrée dans l'implémentation.
Lire la suite...
aucun rétrolien
samedi 2 octobre 2010
Par guillaume le samedi 2 octobre 2010, 23:37 - java / j2ee
La puissance de Spring AOP se limite a priori à son contexte (cf ce post
http://forum.springsource.org/archive/index.php/t-11673.html )... Les servlets
sont hors contexte Spring car gérées par le serveur d'application JEE et
semblent exclues du champ de Spring AOP. Cependant, il est tentant de vouloir
quand même utiliser Spring AOP sur les servlets sans avoir à passer par
d'autres tisseurs d'aspects (comme AspectJ) qui complexifient la configuration
du serveur d'application et le déploiement de l'application. Il s'avère que
c'est possible par un moyen détourné. Il fallait juste y penser.
Lire la suite...
aucun rétrolien
Par guillaume le samedi 2 octobre 2010, 22:11 - java / j2ee
Il est parfois difficile d'identifier le bon endroit pour une "coupe"
(pointcut), et il ne faut pas perdre de vue qu'une méthode protected ne pourra
jamais être interceptée par Spring AOP.
J'ai donc écris ce bout de code pour me faciliter la tâche et identifier
plus aisément quelle pourrait être la méthode déclarée en public et donc
candidate au pointcut.
Ce code est à placer dans la méthode qui sera appelée en dernier dans le fil
d'exécution afin d'avoir une liste complète des méthodes pouvant être
interceptée
// récupération d'une trace de la pile pour notre thread courant
StackTraceElement[] stack = Thread.getAllStackTraces().get(Thread.currentThread());
for(StackTraceElement ste : stack) { // on parcourt la pile
// on parcours la liste de toutes les méthodes pour la classe
// trouvée dans la stack trace et l'on vérifie si la méthode
// utilisée dans la stacktrace est bien publique
Method[] methods = Class.forName(ste.getClassName()).getMethods();
for(Method m : methods) {
if(m.getName().equals(ste.getMethodName())) {
if(Modifier.isPublic(m.getModifiers()) ) {
logger.debug( ste.getClassName() + "." + ste.getMethodName() );
}
}
}
}
aucun rétrolien
vendredi 1 octobre 2010
Par guillaume le vendredi 1 octobre 2010, 22:42 - java / j2ee
Cette exception peut se produire lorsque votre webservice contient des
objets complexes (objets imbriqués) qui ne sont pas forcément visible dans
votre déclaration de service. Pour qu'ils soient pris en compte, la solution
est d'utiliser l'annotation @XmlSeeAlso(MyObjectFactory.class,
MyOtherObjectFactory.class) sur votre webservice JAX-WS en lui
indiquant les fabriques d'objets souhaitées. JAX-B pourra alors fabriquer tous
les objets nécessaire au fonctionnement du webservice.
Source : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6419632
aucun rétrolien
lundi 13 septembre 2010
Par guillaume le lundi 13 septembre 2010, 09:37 - java / j2ee
La sécurisation des webservices devient de plus en plus nécessaire dans le
monde de l'entreprise. Il y a une époque pas si lointaine, les entreprises ne
se souciaient pas trop de la sécurisation de leurs données à l'intérieur de
l'entreprise. Or il s'avère que les risques sécuritaires viennent
majoritairement de l'intérieur!
Voici donc un tutoriel qui explique comment mettre en place toute
l'infrastructure webservice : serveur et client. Nous utiliserons CXF qui nous
parait être une des solutions les plus efficaces et maniables. CXF allie
performances et simplicité d'intégration avec la plupart des frameworks (Spring
et WSS4J).
Lire la suite...
aucun rétrolien
mercredi 1 septembre 2010
Par guillaume le mercredi 1 septembre 2010, 18:03 - java / j2ee
Il est parfois utile de comprendre ce que fait le driver JDBC Oracle que les
développeurs connaissent sous le nom de ojdbc14.jar. Il existe en fait un autre
driver destiné au debug : ojdbc14_g.jar pour lequel il suffit d'ajouter ceci
dans les JAVA_OPTS pour activer les traces
JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.config.file=OracleLog.properties
-Doracle.jdbc.Trace=true"
Ensuite, un fichier OracleLog.properties doit être placé
avec le jar pour configurer les traces souhaitées. Il est conseillé de le
modifier sinon vous allez avoir beaucoup de traces...
aucun rétrolien
mardi 24 août 2010
Par guillaume le mardi 24 août 2010, 00:45 - linux
Récemment j'ai eu la surprise d'avoir cet écran lors d'une mise à jour
Debian :

Il suffit de suivre les indications... Arf!
Voici les liens qui pourront vous permettre de réussir votre migration :
Dans mon cas la migration a été très simple :
- un nettoyage des packages enlevés mais encore configuré avec
dpkg
--purge package pour enlever les fichiers de configuration (en vérifiant
au préalable la liste des fichiers de configuration et s'il faut conserver
quelque chose)
- une mise à jour de mes scripts maison au format LSB
- la reconfiguration de sysv-rc avec
dpkg-reconfigure sysv-rc
comme l'indique l'écran d'apt-get
Après ça votre Linux devrait être capable de lancer plusieurs scripts d'init à
la fois en parallèle tout en respectant les dépendances entre scripts.
aucun rétrolien
Par guillaume le mardi 24 août 2010, 00:11 - java / j2ee
J'ai souvent cherché sur Internet des ressources claires et précises sur les
expressions régulières en Java. En voici une qui a le mérite d'être claire,
complète, avec des exemples et en français :
http://prevert.upmf-grenoble.fr/Prog/Java/CoursJava/expressionsRegulieres.html
Il y a bien sûr la documentation SUN (oops... Oracle) sur les
regexp
en java mais je la trouve illisible.
aucun rétrolien
jeudi 8 juillet 2010
Par guillaume le jeudi 8 juillet 2010, 13:18 - java / j2ee
L'application AVWorks est une application fournie avec les KVM IP d'Avocent
et notamment la série des Autoview. Ces anciens KVM IP ne fonctionnent qu'en
IPv4. AVWorks est réalisée en Java et il semblerait que la façon dont Sun ait
implémenté la dual stack IPv4 / IPv6 dans la JVM est plutôt étrange ( cf.
article suivant sur
debian et ipv6 )... Surprise donc lorsqu'en passant en dual stack IPv4 /
IPv6 sur Debian je me retrouve avec l'application AVWorks et toutes les autres
applications java qui ne marchent plus.
J'ai donc cherché à patcher l'application afin qu'elle refonctionne et c'est
possible. Voici comment faire :
- surtout garder l'ancienne version 2.1 d'AVWorks et ne pas installer la
nouvelle version 3.1 qui contient pas mal de bugs
- dans le fichier AVWORKS_HOME/Avocent_AVWorks.lax il suffit d'y ajouter la
variable d'environnement java "java.net.preferIPv4Stack=true" vers la ligne 68
comme ceci:
lax.nl.java.option.additional=-Djava.library.path=AVWORKS_HOME/Avocent_AVWorks
-Duser.variant=avct -Djava.net.preferIPv4Stack=true
(avec AVWORKS_HOME qui doit être remplacé par votre répertoire d'installation
d'AVWorks)
Edit :
En fait, après enquête, il s'avère que le dysfonctionnement venait d'un
problème plus général lié à la mise à jour de l'OS (i.e. une Debian)... Le
paramètre noyau net.ipv6.bindv6only était à 1 !!! Ceci privilégie IPv6 avant
tout, d'où les problèmes de java qui cherchait à se connecter en IPv6 avec des
adresses IPv4. Pour remédier au problème il suffit de mettre
net.ipv6.bindv6only=0 dans le fichier
/etc/sysctl.d/bindv6only.conf et de lancer
invoke-rc.d
procps restart pour faire appliquer la nouvelle configuration.
Sources :
sun-java6-jre:
net.ipv6.bindv6only=1 breaks java networking
net.ipv6.bindv6only=1
breaks java networking
ERROR: transport error 202: connect failed: Connection refused
aucun rétrolien
jeudi 3 juin 2010
Par guillaume le jeudi 3 juin 2010, 10:01 - méthodes agiles
Ils l'ont fait!
Deux architectes java d'Openfarm sont désormais certifiés Scrum Master :
L'explication de
Scrum est ici pour ceux qui ne connaissent pas
aucun rétrolien
lundi 3 mai 2010
Par guillaume le lundi 3 mai 2010, 18:29 - java / j2ee
Il peut arriver que l'on ait besoin de naviguer dans les sources d'un jar
fait maison à travers Eclipse. Ce jar fait souvent d'un projet externe au
projet courant, mais vous souhaitez pouvoir naviguer ou débugger dans ce
code.
Il suffit d'ajouter ceci à votre pom.xml
<project> ...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
Ensuite la commande suivante fera l'affaire
$ mvn source:jar-no-fork
La solution se trouve en fait ici avec plus de détails :
http://maven.apache.org/plugins/maven-source-plugin/usage.html
aucun rétrolien
Par guillaume le lundi 3 mai 2010, 18:08 - java / j2ee
Optimiser le temps de déploiement devient parfois crucial pour éviter de
perdre des heures... Après avoir tenté des plugins maven (comme cargo par
exemple) sans être totalement convaincu par leur efficacité (quand ça marche!),
il m'a semblé plus efficace de recourir au script shell.
Maven est idéal pour toutes ces tâches mais nécessite parfois un peu de
tuning, notamment lorsqu'on lui demande le packaging de l'application avec le
plugin maven-war-plugin. L'opération est laborieuse et nécessite ensuite le
déploiement d'un WAR ce qui veut dire que (de façon raccourcie car maven fait
plus de choses en réalité) :
- maven compile l'application
- Maven copie les classes compilées et les fichiers de ressource dans une
structure éclaté (dans le répertoire target)
- Maven zippe le tout dans un WAR (et c'est long!)
- ensuite il faut uploader le WAR vers le serveur cible
- Tomcat ou votre serveur d'application java doit ensuite dézipper
l'archive...
Au final vous avez plusieurs opérations couteuses en temps et en ressource.
Tout doit être fait manuellement.
Comment accélérer le processus ?
Julien DUBOIS propose sur le
blog de Responcia une
solution intéressante pour optimiser vos développements avec Jetty. Il
apporte la preuve en vidéo que l'on peut
améliorer les productivité des développements Java de cette façon. Mais
parfois, il n'est pas possible d'opter pour Jetty...
Lire la suite...
aucun rétrolien
mardi 6 avril 2010
Par guillaume le mardi 6 avril 2010, 16:53 - linux
Souvent, lorsque ça marche bien, on ne touche à rien... Et puis le temps
passe, et la distribution Debian vieillit...
Pour pouvoir mettre à jour une sarge il faut mettre comme nom de repository
archive.debian.org au lieu de
ftp.debian.org
(pour security je ne sais pas)
aucun rétrolien
jeudi 1 avril 2010
Par guillaume le jeudi 1 avril 2010, 20:00 - java / j2ee
L'utilisation d'API Oracle Java, comme par exemple la SDO API (sdoapi.jar)
ou Oracle Network Modeling (sdonm.jar) pour gérer les graphes, nécessite
d'avoir une connexion native Oracle. Or les applications sont souvent
configurées avec un pool de connexions gérées par le conteneur JEE. Ceci pose
alors problème pour les opérations spécifiques qui nécessitent d'avoir une
connexion de type oracle.jdbc.OracleConnection et non une connexion de type
java.sql.Connection. Cette dernière ne pourra en effet pas être utilisée avec
les méthodes des API Oracle en Java.
Il faut alors extraire la connexion native sous-jacente à la connexion du
pool de connexions.
Lire la suite...
aucun rétrolien
mardi 30 mars 2010
Par guillaume le mardi 30 mars 2010, 15:59 - oracle
Que signifie l'exception ORACLE ORA-04061 ?
Souhaitant rationaliser un projet de plusieurs milliers de lignes de PL/SQL,
j'ai rencontré cette exception lorsque nous avons mis en package les procédures
et fonctions. L'exception se présente comme suit :
ORA-04061: existing state of package "SCHEMA_REF.MON_PACKAGE" has been
invalidated
ORA-04065: not executed, altered or dropped package
"SCHEMA_REF.MON_PACKAGE"
ORA-06508: PL/SQL: could not find program unit being called:
"SCHEMA_REF.MON_PACKAGE"
ORA-04088: error during execution of trigger
'MON_SCHEMA.MON_TRIGGER'
L'erreur est déroutante au premier abord car le package MON_PACKAGE, une
fois compilé, est tout à fait valide et il n 'y a a priori aucune erreur à la
compilation d'après ORACLE. Ce n'est qu'à la deuxième exécution (par un tiers)
que les problèmes surviennent. Alors que se passe-t-il exactement?
Lire la suite...
aucun rétrolien
samedi 27 mars 2010
Par guillaume le samedi 27 mars 2010, 15:47 - FreeNAS
Lors de la réinstallation de FreeNAS 0.69.2 (downgrade depuis la version
0.7.1) sur carte flash j'obtiens ça :
Cannot dump. No dump device defined.
Automatic reboot in 15 seconds - press a key on the console to abort
Beuh... En fait il s'avère qu'il faille démarrer en mode no ACPI
sur
le premier menu de démarrage. Le problème est : comment automatiser le
démarrage pour que ce soit toujours l'option 2 du boot qui soit prise en
compte?
Lire la suite...
aucun rétrolien
vendredi 26 mars 2010
Par guillaume le vendredi 26 mars 2010, 23:15 - FreeNAS
Décidément, pas de chance en ce moment... Cascade de bugs... Faut dire que
je le cherche un peu, en étant sous Debian SID. Mais là, c'est pas Debian! Nous
avons mis à jour notre serveur NAS avec la dernière version de FreeNAS et
apparemment quelques soucis sur les montages NFS. En effet, une tentative de
connexion donne le message suivant :
mount.nfs: mount to NFS server failed: timed out, giving up
Yuk! Après avoir vérifié le ping, que tous les ports étaient ouverts, une
petite trace avec wireshark m'a permis de constater qu'un échange avait bien
lieu mais que la connexion entre le client et le serveur n'aboutissait pas. Et
il semblerait que je ne sois pas le seul à avoir ce problème vu ce bug sur le
bug tracker de FreeNAS
http://sourceforge.net/tracker/?func=detail&aid=2812161&group_id=151951&atid=782616
La meilleure parade est de revenir à la version 0.69.2 en attendant
mieux.
aucun rétrolien
jeudi 25 mars 2010
Par guillaume le jeudi 25 mars 2010, 23:37 - linux
Nous utilisons rsnapshot pour réaliser nos sauvegardes. En le résinstallant
sur une machine je remarque sur le log de sauvegarde le message suivant :
require Lchown
Lchown module not found
Lire la suite...
aucun rétrolien
Par guillaume le jeudi 25 mars 2010, 00:37 - linux
La programmation de tâches par CRON peut se faire de différentes façon, et
notamment par l'intermédiaire de fichiers de configuration situés dans
/etc/cron.d
En voulant programmer des tâches de sauvegarde rsnapshot avec cron, je
constate l'erreur suivante dans mon /var/log/syslog
Mar 24 23:04:01 myhost CRON[8435]: Erreur critique - abandon immédiat
Mar 24 23:04:01 myhost CRON[8435]: PAM pam_end: NULL pam handle passed
ou pour la version originale
Mar 24 23:04:01 myhost CRON[8435]: Critical error - immediate abort
Mar 24 23:04:01 myhost CRON[8435]: PAM pam_end: NULL pam handle passed
Que se passe-t-il ?
Lire la suite...
aucun rétrolien
mercredi 24 mars 2010
Par guillaume le mercredi 24 mars 2010, 18:37 - java / j2ee
La documentation Oracle
FCF (Fast Connection Failover) pour configurer un pool de connexion JDBC
avec un cluster Oracle RAC 10g est plutôt obscure et manque d'exemple...
Après quelques tâtonnements et en fouillant un peu, voici une configuration
sous Tomcat à mettre dans le context.xml de l'application web ou dans
server.xml (déconseillé sauf en ressource globale) qui semble plaire à Oracle
:
<Resource name="jdbc/myRacDb"
auth="Container"
type="oracle.jdbc.pool.OracleDataSource"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
description="My Oracle RAC DB"
user="myschema" password="mypass"
url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac1.mydomain.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=rac2.mydomain.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myservice.mydomain.com)))"
driverClassName="oracle.jdbc.OracleDriver"
maxActive="10"
maxIdle="5"
minIdle="2"
maxWait="5000"
connectionCacheName="myCache"
connectionCachingEnabled="true"
fastConnectionFailoverEnabled="true"
onsConfigStr="nodes=rac1.mydomain.com:4200,rac2.mydomain.com:4200"
connectionProperties="oracle.jdbc.ReadTimeout=30000" />
Cette datasource est accessible via le JNDI sous le nom
java:comp/env/jdbc/myRacDb (sous Tomcat).
Le cluster Oracle RAC est ici composé de 2 noeuds rac1.mydomain.com et
rac2.mydomain.com. On travaille avec un driver Oracle thin
.
Sous tomcat, il faut mettre la
librairie Oracle JDBC ons.jar (Oracle Notification Services) dans le
common/lib (du moins sous tomcat 5) avec les autres librairies Oracle
(ojdbc14.jar et orai18n.jar notamment).
Afin de ne pas avoir d'ennuis, il est obligatoire de mettre l'attribut nodes
dans l'onsConfigString et préférable qu'il soit à l'identique de la
configuration Oracle (pour cela une bonne communication avec votre DBA est
nécessaire).
Nous avons surtout tâtonné pour trouver le type et la factory car la
documentation n'est pas orienté tomcat mais plutôt grand serveurs
d'applications commerciaux (je vous laisse deviner lesquels!).
Si vous faites des déploiements à chaud sur Tomcat (déconseillé) il est
préférable d'enlever le connectionCacheName
pour éviter que Tomcat se
plaigne de l'existence d'un cache portant le même nom (apparemment pas de
nettoyage à chaud!) : vous serez alors obligé de redémarrer votre serveur
Tomcat.
aucun rétrolien
lundi 15 mars 2010
Par guillaume le lundi 15 mars 2010, 14:39 - java / j2ee
Un peu déçu par SVN, nous nous sommes mis à la recherche d'un nouveau
système SCM ou de
Gestion de Version .
Notre futur SCM sera très
probablement GIT.
L'article suivant permet de bien débuter sur GIT : http://www.unixgarden.com/index.php/administration-systeme/git-it
aucun rétrolien
Par guillaume le lundi 15 mars 2010, 14:31 - linux
Pour éviter des sed dans tous les sens, on oublie souvent les substitutions
qui couvrent un majorité des besoins pour traiter les noms de fichier :
http://djmathos2.free.fr/joomla/index.php/astuceslinux/67-changer-lextension-dun-fichier-en-shell-bash
aucun rétrolien