Let's have a dream

Vincent Demeester personal weblog.

To content | To menu | To search

Sunday 25 May 2008

Switcher je suis, Logiciels OS X indispensables

Ce n'est pas la fin du monde, et aucun pan du continium espace temps ne s'est effondré. Mais je suis désormais sous Mac OS X, comment quoi, tout est toujours possible. Cela fait 5 jours maintenant que j'ai un ordinateur frappé de la Pomme, et je ne suis pas déçu, bien au contraire.

Hardware

Le mac mini est une belle bette. Très simple visuellement, ça fait pas trop de lumière, y a juste les connecteur qu'il faut. Dans la babbasse c'est plutôt bien aussi puisque c'est "de loin" les meilleures performances que j'ai depuis longtemps (je me traine des PCs vieux de 7 et 3 ans). Au niveau connecteurs, c'est presque juste, mais avec un hub usb (et un disque dur usb qui fait également hub usb) tout va bien.

mac mini

Mac OS X

Je ne vais pas détailler ce que j'aime et/ou pas dans le système d'exploitation de la pomme. Mais ma première impression peut se résumer en : homogène, beau et bénéficiant de la puissance des Unix. En gros, c'est assez proche du système d'exploitation dont je rêve. Les logiciels installé par défaut sont surtout très bien intégré. Tout est assez simple à prendre en main. Je pense que la courbe d'apprentissage est assez linéaire.

Enfin, la surprise du chef, les raccourcis clavier Emacs (CTRL+A, etc..) marche dans toutes les applications.. J'aime !

Software

C'est l'objet de ce billet.. Après 5 jours, voilà la liste des logiciels que j'utilise souvent, ou que je trouve nécessaire :

  • AppCleaner : nettoyer les applications qu'on a installé pour tester.
  • TextMate : l'éditeur de texte de référence sous Mac OS X.
  • Emacs : parce que je ne change pas tant que ça.
  • Adium : le pidgin d'OS X.
  • Colloquy : client IRC
  • Burn : graver en toute simplicité
  • CyberDuck : client ftp, sftp, webdav, amazon S3..
  • Logiciel MacUpdate : pour trouver les mise à jour
  • Max : pour convertir des fichiers audio.. Je m'en sers pour mettre mes ficher FLAC dans un conteneur Ogg pour qu'iTunes les lise (grace à XiphQT).
  • NeoOffice et/ou openOffice 2/3 : pour la suite office (openOffice 3 n'a pas besoin de X11, mais c'est une beta)
  • iWork : parce que KeyNote est indispensable.
  • MPlayer : version OSX (et une compilée à la mano aussi), parce que QuickTime sux
  • QuickSilver : parce que c'est le meilleur des launcher
  • sshfs et macfuse : pour pouvoir monter des disque via ssh.
  • unrarX : pour pouvoir ouvrir des rar.. pratique.. (ou juste unrar).
  • TImeMachineScheduler : pour pouvoir customizer un peu TimeMachine (qui fait des sauvegardes trop rapporchées à mon gout)
  • MacTex : texlive 2007 sous mac.. Parce que moi, j'aime LaTeX :)
  • ScreenFlick : pour les screencasts.. mais j'ai pas de sous.. :'(
  • Transmission : client torrent simple, gratuit et efficace
  • Growl : pour les notifications toute mini.
  • Java SE 6 : la mise à jour bien venue d'Apple pour avoir le SDK de java en version 1.6
  • XCode : parce que.. je sais pas, pour le tester.. :)
  • Wrap : pour pouvoir se déplacer de "Space" en "Space" avec la souris.. (et donc surtout de déplacer les fenêtre sur d'autres Space).
  • extfsX : pour pouvoir monter (en read-only) des disques dur formatter dans le système de fichier de Linux.
  • NewsFire : lecteur RSS/Atom pratique et simple.

Et j'ai gardé le meilleur pour la fin : MacPort.. Parce que ça permet d'avoir un système de port à la FreeBSD (basiquement le même mais un peu adapté), et donc disposé de tous plein de logiciels open source facilement, en les compilant.

J'en ai forcément oublié, et puis je me suis pas relu et j'ai pas envie.. J'ai pas mis les liens, puisque qu'un petit google dessus, ça marche très bien. C'est un billet fait très très vite fait. Je reviendrais sur tout ça bien plus tard.. Quand letshaveadream aura sa nouvelle peau de serpent (django) (preview).

Monday 5 May 2008

Préparatifs...

AppleQuelques évenements à venir, mais je n'en dis pas plus, laissons parler les images. Miam

J-(4+8)

Thursday 24 April 2008

Refonte, à la biologeek

Je suis un peu provocateur, mais j'annonce, avec probablement 1 an d'avance (*), le refonte en Django de ce blog, mais bien entendu, tout se fera de manière transparente, et comme David, je vais prendre mon temps... Au passage, le design aussi sera.. plus leché, et mine (vous le connaissez déjà en partie).

Pourquoi ?

C'est la raison essentielle de cette refonte : reprendre le contrôle du code de l'application dont je me sers pour avoir la liberté de faire ce qui me plaît facilement et rapidement. Je ressens une énorme frustration actuellement à ne pas pouvoir ajouter les fonctionnalités qui me semblent intéressantes sans devoir passer par un plugin (lorsqu'il existe...). D'autant que je dois avoir une aversion au moins équivalente pour PHP de celle que j'ai pour Java (hop un petit troll au passage ça fait pas de mal ;-)).

En enlevant la petite phrase sur Java, je suis complètement d'accord. J'aime bien Dotclear, mais, je sais pas, je préfère reST, et je sais pas..

(*) C'est surtout une manière de pas m'imposer une date à respecter.

Tuesday 22 April 2008

Deploiement : Ant et Tomcat sont dans un bateau

J'ai mis un peu de temps à comprendre de façon sommaire de la façon dont fonctionne la deploy task sous ant, fournis par tomcat, alors autant en faire profiter tout le monde..

Edition 23.04 : il est à noter que j'ai ensuite découvert le Tomcat client deployer, téléchargeable pour les version 5.x et 6.x au moins. La documentation se trouve ici. La technique expliqué ci-dessous doit être similaire, sauf qu'elle est intégré à votre build.xml.

But

Le but de l'opération est assez simple : être en mesure, via une commande ant, de déployer un projet J2EE sur le Servlet Containre Tomcat. Pour aller un peu plus loin, je voulais aussi pouvoir avoir plusieurs profils de déploiement, ou autrement dit, pouvoir déployer le code sur différent Tomcat.

Préalable(s)

Certaines librairies en plus sont nécessaire au bon fonctionnement de ces tâches Ant. Nous utilisons les tasks de déploiement et les task ssh. Il est nécessaire d'ajouter les 2 librairies suivantes dans le classpath de Ant.

  • catalina-ant.jar : provenant de Apache Tomcat. La librairie se trouve dans le répertoire Tomcat, puis server/lib/catalina-ant.jar.
  • jsch-xxx.jar : permet l'utilisation des tâches sshexec et scp.

En temps normal, les librairies nécessaires sont dans ${basedir}/lib/ant, et le fichier build.xml les prend en considération. On verra dans la Mise en place qu'il peut en être autrement (on embarque tout avec nous).

Dans mon cas particulier, les ports d'apache tomcat ne sont pas ouvert sur l'exterieur, et la manager de tomcat non plus, et ceci pour des raisons presque évidentes de sécurité. Il est alors nécessaire de faire un tunnel ssh, avec les moyens du bord. Voici un exemple, en ligne de commande, sous Linux :

ssh -N -p 22 root@host -L 9080/127.0.0.1/8080

Ici, le port distant 8080 de la machine host est redirigé, via un tunnel ssh, au port local 9080. Ainsi, l'instance distante tomcat, ainsi que son manager, vont être accessible en local, sur le port 9080.

Mise en place

La façon dont le déploiement s'effectue va suivre les différentes étapes :

  1. Compilation : étape normale de ant
  2. Génération du war : un fichier war (web archive) est généré (dans distbin/war/)
  3. Upload du war sur la machine distante, en utilisant ssh, dans le répértoire /tmp/
  4. Un-deploy de l'application, afin de pouvoir la re-déployer ensuite.
  5. Deploy de l'application.
  6. Reload du context de l'application.
  7. Diverses tâches : suppression du war dans le /tmp/ et copie des fichiers images nécessaires.

Nous allons maintenant étudiés comment mettre en place ces étapes dans notre build.xml.

Définir les tâches

La première étape va être de définir les tâches. Prenons par exemple la tâche deploy, fournit par le fichier catalina-ant.jar. Nous avons les deux librairies java dans le répertoire lib/ant/. La définition de la tâche deploy se fait en début de fichier, en utilisant le tag taskdef.

<taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask">
  <classpath>
    <pathelement path="${lib.ant}/catalina-ant.jar"/>
  </classpath>
</taskdef>

Nous spécifions à ant le classpath, pour qu'il trouve la classe Deploytask. Il est à noter que ${lib.ant} est définit en début de fichier, pointant vers le dossier où les librairies sont. Nous faisons de même pour les autres tâches, soit :

<taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask">
  <classpath>
    <pathelement path="${lib.ant}/catalina-ant.jar"/>
  </classpath>
</taskdef>
<taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask">
  <classpath>
    <pathelement path="${lib.ant}/catalina-ant.jar"/>
  </classpath>
</taskdef>
<taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask">
  <classpath>
    <pathelement path="${lib.ant}/catalina-ant.jar"/>
  </classpath>
</taskdef>
<taskdef name="sshexec" classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec">
  <classpath>
    <pathelement path="${lib.ant}/jsch.jar"/>
    <pathelement path="${lib.ant}/ant-jsch.jar" />
  </classpath>
</taskdef>
<taskdef name="scp" classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp">
  <classpath>
    <pathelement path="${lib.ant}/jsch.jar"/>
    <pathelement path="${lib.ant}/ant-jsch.jar" />
  </classpath>
</taskdef>

Gestion des profils

On va utiliser une astuce pour pouvoir spécifier un profil a ant et surtout en définir un par défault. Pour définir une variable au moment de l'exécution de ant, il faut faire quelque chose du genre : ant -Dprofil=xxx. Tout se passe en 3 lignes :

<property name="profil" value="local" />
<property name="undeploy" value="true" />
<!-- On charge un fichier en fonction du profil.. définit par défault ou écraser par la ligne de commande -->
<property file="${basedir}/${profil}.properties"/>

Le fichier xxx.properties

Le fichier ${profil}.properties contient toutes les variables nécessaire au déploiement. Dans mon cas, voici mon local.properties :

 deploy.host=localhost
 deploy.username=vincent
 deploy.password=412hez
 deploy.app.path=/qualif
 deploy.app.webip=127.0.0.1
 deploy.app.webimages=/usr/share/energy/images
 deploy.manager=http://${deploy.host}:8180/manager
 deploy.manager.username=admin
 deploy.manager.password=xxxxxxxx

Tâche et astuces finale

Enfin, on définit les tâches, mais faudra vous débrouiller pour les tâches de compilation, de génération du war, et autres (très bien documenté).

On va aussi faire preuve de malice ici. Mon profil par défaut est un profil local, je n'ai donc pas besoin de scp ou de sshexec. J'ai donc ici utilisé les conditions, en définissant une variable d'un façon différente en fonction du profil, et ainsi appeler ensuite un tâche différente.

Pour le reste, c'est du classique, et du bien documenté sur le site de ant.

<target name="deploy" depends="compile_java">
  <filter token="WEBIP" value="${deploy.app.webip}" />
  <copy todir="${dist.tomcat.WEB-INF}" filtering="yes">
    <fileset dir="${src.conf}"/>
  </copy>
  <antcall target="war" />
  <echo message="Deploying ${basedir}/${war}/${name}-${version}.war on Tomcat : ${deploy.manager}.."/>
  <condition property="deployer.function" value="local" else="default">
    <equals arg1="${profil}" arg2="local" />
  </condition>
  <condition property="deploy.undeploy" value="yes" else="no">
    <istrue value="${undeploy}" />
  </condition>
  <antcall target="scp-${deployer.function}" />
  <antcall target="undeploy-${deploy.undeploy}" />
  <!-- (re)Deploy app -->
  <deploy url="${deploy.manager}"
            username="${deploy.manager.username}"
            password="${deploy.manager.password}"
            path="${deploy.app.path}"
            localWar="/tmp/${name}-${version}.war"
         />
  <!-- Reload the Context -->
  <reload url="${deploy.manager}"
            username="${deploy.manager.username}"
            password="${deploy.manager.password}"
            path="${deploy.app.path}" />
  <!-- Remove the temporary war file -->
  <antcall target="sshexec-${deployer.function}" />
</target>
 
<target name="scp-local">
  <echo>Local deployement, no need to to scp, just copy..</echo>
  <copy file="${war}/${name}-${version}.war" todir="/tmp/" />
</target>
 
<target name="scp-default">
  <scp file="${war}/${name}-${version}.war"
            todir="${deploy.username}:${deploy.password}@${deploy.host}:/tmp/"
        />
</target>
 
<target name="sshexec-local">
  <echo>Local deployement, no need to do sshexec</echo>
</target>
 
<target name="undeploy-yes">
  <undeploy url="${deploy.manager}"
            username="${deploy.manager.username}"
            password="${deploy.manager.password}"
            path="${deploy.app.path}"
        />
</target>
<target name="undeploy-no">
  <echo>No un-deploy</echo>
</target>
 
<target name="sshexec-default">
  <sshexec host="${deploy.host}"
   	            username="${deploy.username}"
    	            password="${deploy.password}"
    	            command="rm /tmp/${name}-${version}.war"/>
</target>

Usage

La procédure est censée être la plus simple possible, en admettant que le port de tomcat est ouvert, et que le manager de tomcat est actif. Il ne s'agit que d'une ligne de commande :

ant deploy

Le profil de déploiement peut également se spéficier. Par défaut, il s'agit du profil local, dont les propriétés sont disponible dans le fichiers local.properties.

ant -Dprofil=toto deploy

En spécifiant le profil toto, par exemple, ant va chercher les propriétés dans toto.properties et fait le déploiement selon ces propriétés.

Il est à noter qu'il faut forcément undeploy le context pour pouvoir le redéployer. Ant n'est pas très intelligent sur ce point (c'est là entre autre qu'on dit vive Maven), et se plantera en bon et due forme au moment du undeploy.. s'il n'a pas été déjà déployé. Pour cela, un petit booléen peu être passé en argument :

ant -Dprofil=ns -Dundeploy=false deploy

Sunday 20 April 2008

Tiny move

Si vous voyez ce billet, le déménagement s'est bien passé.. Faut juste que je retrouve un thème qui me plait.

# Comment
SRC_ENV="$HOME/sources/env"
 
echo -e "Adjust permission for bin files"
for file in `ls -B $SRC_ENV/bin`;
do
    chmod +x $SRC_ENV/bin/$file
done

Oups.. il semble y avoir qqs soucis avec le thèmes et/ou des plugins XD

- page 1 of 3