Pour avoir un accès IPv6 de chez soi sans avoir de box ou routeur en IPv6, il faut faire appel à un IPv6 tunnel broker (si possible gratuit). Voici comment je procède avec Hurricane Electric (car mon wifi ne veut entendre parler de l'IPv6)...
mercredi 6 mars 2013
cloner une VM sous Proxmox
Par guillaume le mercredi 6 mars 2013, 23:54 - linux
L'interface d'administration de proxmox permet de créer, détruire, modifier, migrer une VM. Mais l'interface ne permet pas de cloner la VM. Voici comment j'ai procédé :
vendredi 27 avril 2012
vi commenter un bloc de code
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
pour placer le marqueur ama - 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à!
Flex "RSL error 1 of 1"
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
mardi 31 janvier 2012
Log4j : changer le niveau de log à chaud via JMX
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 :
mercredi 4 janvier 2012
Log4j avec Spring et applications multiples dans Tomcat
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)
vendredi 18 novembre 2011
commande find : trouver les derniers fichiers modifiés à partir d'une certaine date
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.
mardi 27 septembre 2011
OFBiz : affichage d'une chaine HTML avec Freemarker
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.
mardi 23 août 2011
Audit des requêtes SQL Hibernate
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
mardi 3 mai 2011
bzip2 gzip tar avec stdin et stdout
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
mercredi 2 mars 2011
Maven récupération du code source et de la javadoc
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.
mardi 22 février 2011
Message Bundle avec Spring et problèmes d'encodage des fichiers de properties
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
jeudi 17 février 2011
Données utilisateur visualVM
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\7u4 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.
mercredi 16 février 2011
Problème avec le Maven archetype plugin
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à!
Archetype maven et quickstart pour spring batch
Par guillaume le mercredi 16 février 2011, 11:57 - java / j2ee
$ 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.
mercredi 15 décembre 2010
Uptime d'un serveur
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.
mardi 30 novembre 2010
SOAPUI connexion JDBC
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.
dimanche 7 novembre 2010
Hibernate interceptor : nom de schéma dynamique
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...
mercredi 13 octobre 2010
Tomcat : configuration proxy HTTPS
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
Maven : configuration proxy HTTPS
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
lundi 4 octobre 2010
Implémentation d'un Interceptor CXF pour logger le temps d'exécution
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.
samedi 2 octobre 2010
Spring AOP advice et pointcut sur Servlet
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.
Spring AOP : trouver le bon pointcut avec la stack trace
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() );
}
}
}
}
vendredi 1 octobre 2010
Erreur classique de JAXB : JAXBException nor any of its super class is known to this context
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
lundi 13 septembre 2010
Web services securisés avec CXF et WSS4J (partie 1)
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).
mercredi 1 septembre 2010
Activation des traces du driver JDBC Oracle
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...
mardi 24 août 2010
Migration des scripts de démarrage de la Debian vers le LSB (Linux Standard Base)
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 :
- explication de l'introduction du dependency based boot dans Debian
- pour convertir un script d'init au format LSB
- les spécifications LSB sur les scripts d'init
Dans mon cas la migration a été très simple :
- un nettoyage des packages enlevés mais encore configuré avec
dpkg --purge packagepour 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-rccomme l'indique l'écran d'apt-get
Expressions régulières ou regexp en java
Par guillaume le mardi 24 août 2010, 00:11 - java / j2ee
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.
jeudi 8 juillet 2010
AVWorks , Java et IPv6
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)
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
jeudi 3 juin 2010
Chez Openfarm des architectes java certifiés Scrum Master
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
lundi 3 mai 2010
Maven comment créer un jar des sources
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-forkLa solution se trouve en fait ici avec plus de détails : http://maven.apache.org/plugins/maven-source-plugin/usage.html
Maven optimiser le déploiement avec un WAR éclaté
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...
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...
mardi 6 avril 2010
Comment mettre à jour une vieille Debian Sarge ?
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)
jeudi 1 avril 2010
Oracle native JDBC connection extractor
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.
mardi 30 mars 2010
ORA-04061 ô désespoir, ô variable ennemie
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?
samedi 27 mars 2010
FreeNAS Cannot dump. No dump device defined
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?
vendredi 26 mars 2010
FreeNAS versions 0.7 et 0.7.1 : impossible de monter un volume NFS
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.
jeudi 25 mars 2010
rsnapshot : module Lchown manquant
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 foundlinux debian squeeze : bug sur la configuration PAM pour CRON
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 ?
mercredi 24 mars 2010
Configuration d'un pool de connexions JDBC avec Oracle RAC
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.
« billets précédents - page 1 de 2
