noirbizarre.info
Encore un blog de GeeK
Encore un blog de GeeK
3/10/11
Avec Maven, il arrive souvent d’avoir à définir plusieurs exécutions d’un plugin pour différentes phases mais de vouloir en garder une par défaut (celle utilisée en ligne de commande).
Depuis la version 2.2 de maven, le ticket MNG-3401 le permet en donnant l’identifiant d’exécution default-cli:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
<descriptorRef>project</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
3/08/11
En Flex/ActionScript, il n’est pas rare de vouloir écouter un évènement au niveau le plus haut et de voir du code tel que:
if (stage) {
stage.addEventListener(MonEvent.MON_TYPE, _monHandler);
} else {
this.addEventListener(Event.ADDED_TO_STAGE, function(e:Event):void{
stage.addEventListener(MonEvent.MON_TYPE, _monHandler);
});
}
En effet, lors de l’inialisation des composants Flex, l’attribut stage n’est pas encore disponible.
Pourtant, il est plus simple et plus propre d’utiliser SystemManager:
systemManager.addEventListener(MonEvent.MON_TYPE, _monHandler);
Ce morceau de code ne plantera pas car systemManager est initilisé dès le lancement de l’application et est toujours présent dans les composants, contrairement à stage.
6/04/11
Comment faire en sorte qu’une application Java passe par un proxy HTTP (comme c’est souvent le cas en entreprise) ?
Il faut le spécifier dans les options de la JVM à l’execution!
On me pose souvent la question et même si je connais la réponse, je doit toujours la rechercher pour être sur de la syntaxe.
Les options à passer sont:
http.proxyHost pour spécifier l’hôtehttp.proxyPort pour spécifier le porthttp.proxyUser pour spécifier le nom d’utilisateur (optionnel)http.proxyPassword pour spécifier le mot de passe (optionnel)Ce qui donnerai en ligne de commande pour un proxy dont l’url est http://user:password@proxy.maboite.com:8080
~$ java -Dhttp.proxyHost=proxy.maboite.com -Dhttp.proxyPort=8080 -Dhttp.proxyUser=user -Dhttp.proxyPassword=password maClasse
7/01/11
Dans cet article décrit l’installation en tant que service de Jetty 7 sur Debian Lenny ainsi que le déploiement de Hudson.
Avant toute chose, il faut une installation de JRE fonctionnelle, dans mon cas OpenJDK 6 Headless.
noirbizarre:~$ sudo aptitude install openjdk-6-jre-headless
Nous allons créer un utilisateur jetty et le groupe associé et les utiliser pour installer et exécuter jetty.
noirbizarre:~$ sudo groupadd jetty noirbizarre:~$ sudo useradd -s /bin/bash -d /home/jetty -m -g jetty jetty noirbizarre:~$ sudo passwd jetty
Après voir récupéré la dernière version stable de Jetty 7 disponible ici, dans mon cas la version 7.2.2.v20101205., et on l’installe dans le $HOME de notre utilisateur.
noirbizarre:~$ sudo -i -u jetty jetty:~$ JETTY_VERSION=7.2.2.v20101205 jetty:~$ wget http://download.eclipse.org/jetty/$JETTY_VERSION/dist/jetty-distribution-$JETTY_VERSION.tar.gz jetty:~$ tar -xvzf jetty-distribution-$JETTY_VERSION.tar.gz jetty:~$ ln -s jetty-distribution-$JETTY_VERSION jetty7
Nous allons lancer jetty une première fois pour vérifier que tout s’execute bien:
jetty:~$ cd jetty7 jetty:~/jetty7$ java -jar start.jar 2011-01-07 00:58:19.337:INFO::jetty-7.2.2.v20101205 2011-01-07 00:58:19.410:INFO::Deployment monitor /home/jetty/jetty-distribution-7.2.2.v20101205/webapps at interval 1 2011-01-07 00:58:19.426:INFO::Deployment monitor /home/jetty/jetty-distribution-7.2.2.v20101205/contexts at interval 1 2011-01-07 00:58:19.432:INFO::Deployable added: /home/jetty/jetty-distribution-7.2.2.v20101205/contexts/test.xml 2011-01-07 00:58:19.568:INFO::Extract jar:file:/home/jetty/jetty-distribution-7.2.2.v20101205/webapps/test.war!/ to /tmp/jetty-0.0.0.0-8080-test.war-_-any-/webapp 2011-01-07 00:58:21.438:INFO:org.eclipse.jetty.servlets.TransparentProxy:TransparentProxy @ /javadoc to http://download.eclipse.org/jetty/stable-7/apidocs 2011-01-07 00:58:21.441:INFO::Deployable added: /home/jetty/jetty-distribution-7.2.2.v20101205/contexts/javadoc.xml 2011-01-07 00:58:21.523:INFO::Started SelectChannelConnector@0.0.0.0:8080
Une fois l’initialisation terminée, on peut se connecter sur http://localhost:8080 pour afficher la page d’accueil de Jetty ainsi que quelques exemples.
On peut maintenant couper le serveur et quitter la session de l’utilisateur jetty.
Pour démarrer Jetty en tant que service on utilise le script fourni dans le repertoire bin.
noirbizarre:~$ sudo cp /home/jetty/jetty7/bin/jetty.sh /etc/init.d/jetty noirbizarre:~$ sudo chmod u+x /etc/init.d/jetty
Toutes les variables d’environnement sont à déclarer dans /etc/default/jetty.
JETTY_USER=jetty JETTY_HOME=/home/$JETTY_USER/jetty7
noirbizarre:~$ sudo /etc/init.d/jetty check
Checking arguments to Jetty:
JETTY_HOME = /home/jetty/jetty7
JETTY_CONF = /home/jetty/jetty7/etc/jetty.conf
JETTY_RUN = /var/run
JETTY_PID = /var/run/jetty.pid
JETTY_PORT =
JETTY_LOGS =
START_INI = /home/jetty/jetty7/start.ini
CONFIGS = --pre=etc/jetty-logging.xml
JAVA_OPTIONS = -Djetty.home=/home/jetty/jetty7 -Djava.io.tmpdir=/tmp
JAVA = /usr/bin/java
CLASSPATH =
RUN_CMD = /usr/bin/java -Djetty.home=/home/jetty/jetty7 -Djava.io.tmpdir=/tmp -jar /home/jetty/jetty7/start.jar --pre=etc/jetty-logging.xml
noirbizarre:~$ sudo /etc/init.d/jetty
Usage: jetty [-d] {start|stop|run|restart|check|supervise} [ CONFIGS ... ]
noirbizarre:~$ sudo /etc/init.d/jetty start
Starting Jetty: OK
noirbizarre:~$ sudo /etc/init.d/jetty stop
Stopping Jetty: OK
Une fois toutes les vérifications effectuées, pour lancer Jetty au démarrage du serveur:
noirbizarre:~$ sudo update-rc.d jetty defaults
On installe Hudson avec l’utilisateur jetty en lui specifiant de travailler dans le répertoire /home/jetty/hudson:
noirbizarre:~$ echo 'export HUDSON_HOME=/home/$JETTY_USER/hudson' | sudo tee -a /etc/default/jetty noirbizarre:~$ sudo -i -u jetty jetty:~$ cd jetty7/webapps jetty:~/jetty7/webapps$ wget http://mirrors.hudson-labs.org/war/latest/hudson.war
Il n’y a plus qu’a démarrer jetty et vérifier que http://localhost:8080/hudson affiche bien l’accueil de Hudson.
10/12/10
Voici la marche à suivre pour installer Python, pip, virtualenv et virtualenvwrapper dans Cygwin (version 1.7.7-1 à ce jour).
Python doit être installé via l’installeur de Cygwin.
Pour installer pip, nous allons utiliser easy_install qui est fourni par setuptools (version 0.6c11 au moment où j’écris ces lignes). Pour trouver la dernière version en date correspondant à notre version de Python (version 2.6.5 fournie par Cygwin), il faut se rendre sur la page officielle.
~$ wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg ~$ sh setuptools-0.6c11-py2.6.egg ~$ easy_install pip
Une fois pip installé, il suffit de l’utiliser pour installer virtualenv et virtualenvwrapper
~$ pip install virtualenv virtualenvwrapper
On configure notre environnement dans .bashrc:
# Python pip / virtualenv / virtualenvwrapper export WORKON_HOME=$HOME/.virtualenvs export PIP_VIRTUALENV_BASE=$WORKON_HOME export PIP_RESPECT_VIRTUALENV=true source /usr/bin/virtualenvwrapper.sh
Ensuite, tout fonctionne comme dans cet article.
6/12/10
Git est un scm qu’on ne présente plus. Bien que très pratique il peut se révéler très compliqué à utiliser.
Voici les commandes que j’utilise le plus:
git gère 3 niveaux de configuration:
/etc/gitconfig qui s’applique à tous les utilisateurs~/.gitconfig qui s’applique à l’utilisateur courant$GIT_REPO/.git/config qui s’applique uniquement au repository courantCelui qui nous intéresse en l’occurrence est le niveau global.
Pour commencer, il va contenir la section user permettant de nous identifier:
[user] name = Axel H. email = noirbizarre@gmail.com
Pour certains projet, il pourra être intéressant de modifier ces informations d’identification.
Ces informations pourront être spécifiées directement depuis le shell:
~$ git config --global user.name "Axel H." ~$ git config --global user.email noirbizarre@gmail.com
D’autres options pourront être ajoutées, telle que la coloration:
[color] diff = auto status = auto branch = auto interactive = auto ui = true pager = true
ou encore des alias:
[alias] co = checkout ci = commit st = status br = branch
Avec ces alias on pourra tapper:
~$ git co mabranch ~$ git ci -m "Mon commentaire" ~$ git st
Il est possible de trouver énormément d’options à rajouter dans ~/.gitconfig sur la web, notemment sur StackOverflow, et particulièrement ce thread.
Comme d’habitude, pas de secrets, tout est dans le man.
Le fichier .gitignore permet de spécifier une liste de fichiers qui ne seront jamais pris en compte par git.
Je ne referais pas la documentation officielle, mais ce qu’il faut retenir c’est:
Pour une documentation complète sur gitignore, la page man reste la référence.
Il est possible de spécifier un .gitignore global, par exemple:
~$ echo "*~" >> ~/.gitignore ~$ echo "*.swp" >> ~/.gitignore ~$ echo "*.pyc" >> ~/.gitignore ~$ git config --global core.excludesfile ~/.gitignore
Cela permet d’éviter de ressaisir les fichiers qui sont toujours à exclure de git (fichiers temporaires, produits de compilation, ….).
4/12/10
Pour faire tourner une installation secure de dokuwiki dans Cherokee avec les spécifications suivantes:
Ce tutoriel a été rédigé pour une version 1.0.8 de Cherokee tournant sous Debian Lenny. Les libellés et les screenshots peuvent varier d’une version à l’autre.
Pour commencer on récupère la dernière version de dokuwiki ici et on crée l’arborescence nécéssaire.
~$ wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2010-11-07.tgz ~$ sudo mkdir -p /var/www/noirbizarre.info ~$ tar xvzf dokuwiki-2010-11-07.tgz ~$ sudo mv dokuwiki-2010-11-07 /var/www/noirbizarre.info/wiki ~$ sudo chown -R www-data:www-data /var/www/noirbizarre.info/wiki ~$ sudo mkdir -p /var/log/cherokee/noirbizarre.info ~$ sudo chown -R www-data:www-data /var/log/cherokee/noirbizarre.info
Pour cet exemple, nous allons utilisé un certificat autosigné. Il permet de crypter la communication mais le fait qu’il soit auto signé ne permet d’authentifier l’hôte distant. OpenSSL doit être installé pour cette étape. En répondant aux questions, on s’assurera que Common Name est bien rempli avec le nom de domaine (Cherokee s’en sert pour le routage).
~$ openssl req -new -x509 -nodes -out wiki.crt -keyout wiki.key -days 3650 Generating a 1024 bit RSA private key ...............................................++++++ .++++++ writing new private key to 'wiki.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]:France Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:noirbizarre.info Organizational Unit Name (eg, section) []:WiKi Common Name (eg, YOUR name) []:wiki.noirbizarre.info Email Address []: ~$ mv wiki.crt wiki.key /var/www/noirbizarre.info
Pour cette étape, nous considérons que Cherokee est installé, fonctionnel, configuré pour géré le SSL sur le port 443 et tourne avec les droits de www-data:www-data.
On se connecte sur l’interface d’administration via localhost:9090.
On crée un nouveau vServer nommé wiki.noirbizarre.info et ayant pour DocumentRoot /var/www/noirbizarre.info/wiki.
Le nom du vServer est important, il permet à Cherokee de router les requetes vers le bon vServer.
Dans l’onglet journalisation du vServer créé, spécifier:
Sur l’onglet sécurité on spécifie les chemins des fichiers .crt et .key générés.
Sur l’onglet Behavior, on clique sur Rule Management pour ouvrir le gestionnaire de règle et on supprimer les 2 règles Contenu statique créées par défaut de façon à ne garder que la règle Par défaut.
Nous allons maintenant modifier la règle Par défaut pour lui faire prendre en charge les redirections et ajouter 3 règles supplémentaires:
Sur l’onglet Gestionnaire, on choisit Redirection dans la liste déroulante et on rentre les règles internes suivantes:
L’ordre est important puisque Cherokee s’arrêtera à la première règle qui match.
On pourra aussi autoriser la compression gzip et deflate depuis l’onglet Encodage pour optimiser les transferts, et ce pour chaque règle que l’on rajoute.
On va spécifier à Cherokee que le fichier favicon.ico et le repertoire /lib sont du contenu statique et qu’il doit le traiter comme tel.
On rajoute alors la règle et le handler correspondant.
Il n’est pas nécéssaire de respécifier le DocumentRoot puisque celui du vServer est repris par défaut.
Pour cette étape, on considère que php5 et php5-cgi sont installés.
On rajoute maintenant une règle extension pour capter tous les appels de fichiers php.
Pour cela, Cherokee fourni un assitant qui créée automatiquement la règle. On pourra personnaliser les valeurs, comme par exemple l’encodage, ou encore la prise en charge de fcgi.
Il faut ensuite passer la règle en status FINAL en cliquant sur NON FINAL dans la liste des règles à gauche.
Cette dernière règle va automatiquement rediriger l’utilisateur sur la version sécurisée du site.
Pour cela on rajoute une règle SSL/TLS dont on va prendre la négation et on y affecte un handler de redirection externe (visible par l’utilisateur).
Nous pouvons maintenant enregistrer nos changements et rédémarrer Cherokee.
Nous pouvons maintenant accéder à https://wiki.noirbizarre.info/install.php et suivre la procédure d’installation. Il faut pour cela que votre serveur DNS redirige bien wiki.noirbizarre.info vers votre serveur.
Un message d’avertissement nous signalera que notre certificat n’est pas sur puisqu’il est autosigné.
Une fois l’installation effectuée, authentifiez vous et dans les paramètres de configurations spécifier les URLs esthétiques sur .htaccess.
Et voilà, vous pouvez maintenant tester la redirection HTTPS et les URLs esthétiques. Tout fonctionne correctement.
10/07/10
L’une des difficultés majeures du développement aujourd’hui est la gestion des dépendances et en particulier pour Python l’isolement de l’environnement de développement.
Pour résoudre ce problème, nous allons utiliser :
Si ce n’est déjà fait, il faut installer un environnement de développement python classique:
~$ sudo aptitude install python-setuptools python-dev build-essential
Nous installons la dernière version de pip:
~$ sudo easy_install pip
Puis nous installons virtualenv et virtualenvwrapper
~$ sudo pip install virtualenv virtualenvwrapper
Il faut maintenant configurer notre environnement en ajoutant au fichier ~/.bahrc
# Python pip / virtualenv / virtualenvwrapper export WORKON_HOME=$HOME/.virtualenvs export PIP_VIRTUALENV_BASE=$WORKON_HOME export PIP_RESPECT_VIRTUALENV=true source /usr/local/bin/virtualenvwrapper.sh
Puis nous initialisons l’environnement:
~$ mkdir ~/.virtualenvs ~$ source ~/.bashrc virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/initialize virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/premkvirtualenv virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/postmkvirtualenv virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/prermvirtualenv virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/postrmvirtualenv virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/predeactivate virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/postdeactivate virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/preactivate virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/postactivate virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/get_env_details
Nous sommes maintenant prêts à instancier notre premier environnement.
Il suffit maintenant d’utiliser la commande mkvirtualenv.
~$ mkvirtualenv --no-site-packages myenv New python executable in myenv/bin/python Installing setuptools............done. virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/myenv/bin/predeactivate virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/myenv/bin/postdeactivate virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/myenv/bin/preactivate virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/myenv/bin/postactivate virtualenvwrapper.user_scripts Creating /home/noirbizarre/.virtualenvs/myenv/bin/get_env_details (myenv)~$
L’option –no-site-packages permet d’avoir une installation de python nue, c’est à dire sans aucune des dépendances python ajoutées dans l’installation courante.
Une fois l’environnement actif, le prompt du shell est préfixé par « (nom de l’environnement) ».
Pour désactiver l’environnement, il suffit d’executer:
(myenv)~$ deactivate ~$
Pour réactiver l’environnement il suffit d’executer
~$ workon myenv (myenv)~$
La liste complète des commandes de virtualenvwrapper est disponible ici.
Pour utiliser cet environnement dans eclipse avec Pydev il suffit d’aller dans Preferences > Pydev > Interpreter Python et d’ajouter l’executable python qui correspond, dans notre cas ~/.virtualenvs/myenv/bin/python.
Sur l’écran qui apparait ensuite, il ne faut selectionner que les chemin qui correspondent à notre environnement (ceux commençant par ~/.virtualenvs/myenv/).
L’environnement apparait ensuite dans la liste des environnement disponibles.
Il suffit ensuite de le sélectionner dans les préférences des projets concernés.
Lorsque l’environnement est actif, pip s’utilise comme apt/aptitude.
# Recherche de paquets (myenv)~$ pip search mypackage # Installation d'un paquet (myenv)~$ pip install mypackage
Lorsque l’environnement est inactif, il est possible de specifier à pip un environnement pour l’installation avec l’option -E:
~$ pip install -E myenv mypackage
Il est possible de dumper tous les modules installé dans un fichier:
~$ pip freeze > requirements
Puis de les recharger d’un coup dans un autre environnement:
~$ pip install -r requirements
Pour plus de détails sur l’utilisation de pip, la page officielle fait office de documentation.