@matn

Mon bloc note perso sur les systèmes UNIX & GNU/Linux, le développement et... la photo.

Aller au contenu | Aller au menu | Aller à la recherche

17fév.

Fabric

Je viens de découvrir Fabric, un très bon outil de déploiement écrit en python.

Il existe un package dans les repository ubuntu mais celui-ci correspond à une (très) ancienne version de fabric, le mieux est de l'installer avec easy_install:

aptitude install python-setuptools
easy_install fabric

Vous trouverez ici quelques exemple de script fabric.

09fév.

Python: obtenir le hostname de sa machine

Petit bout de code bien pratique pour obtenir son hostname:

import socket
print socket.gethostbyaddr(socket.gethostname())   
résultat:
('test.toto.com', ['toto'], ['ip'])
donc un simple:
socket.gethostbyaddr(socket.gethostname())[0]
devrait le faire...

09fév.

Python: connexion à une base de données Postgresql avec psycopg2

Simple et efficace:

import sys

try:
    import psycopg2
except:
    print "psycopg2 n'est pas installe: apt-get install python-psycopg2"
    sys.exit()

database="dbname"
user="username"
password="password"
host="hostname"

requete="select * from matable"

try:
    conn = psycopg2.connect("dbname=%s user=%s host=%s" % (database,user,host));
    cur = conn.cursor()
    cur.execute(requete)
    rows=cur.fetchall()
    for value in rows:
        print value
except psycopg2.OperationalError:
    print "erreur de connexion a la base de donnees"
    sys.exit(1)
except:
    print "erreur lors de l'execution de la requete"
    sys.exit(1)

Pour redhat, le package psycopg2 est disponible dans le repository EPEL:

  • rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
  • yum install python-psycopg2

Vous trouverez ici les spec de la Database API Python.

20janv.

Subversion: retour à une version précédente d'un fichier

Pour passer de la révision 351 à 12, exemple:

svn merge --dry-run -r 351:12 log4j.xml
svn merge -r 351:12 log4j.xml
svn commit -m "retour a la revision 12"

Pour connaitre le diff entre les deux révisions:

svn diff -r 351:12 log4j.xml

03nov.

Postgresql: requêtes sur une base de données distante avec db_link

dblink est un module qui permet de se connecter à d'autres bases de données PostgreSQL™ depuis une session de base de données.

Installation des contrib-postgresql

Afin de pouvoir utiliser db_link in faut installer les "contrib" postgresql. Pour cela:
apt-get install postgresql-contrib-8.3
ou
cd ~/sources/postgresql-8.2.3/contrib/dblink
make
make install

Ajout des fonctions dblink à la base de données

su postgres
psql -d testgis -f /opt/pgsql/share/contrib/dblink.sql

Création d'une connexion à la base de données distante

SELECT * from dblink_connect('connexion_autre_base','hostaddr=10.1.1.1 port=5432 dbname=autre_base user=test password=test');

Exécution d'une requête

SELECT * FROM dblink('connexion_autre_base','SELECT id,userid,homedir FROM users',true) AS foo(id int,userid text,homedir text) ORDER BY id;

Fermeture de la connexion

SELECT * from dblink_disconnect('connexion_autre_base');

01nov.

Support de Groovy & Grails sur AppEngine


Guillaume Laforge à propos du support Groovy/Grails sur AppEngine.

13oct.

"Passeport pour UNIX et C"

UNIX et C Je viens de terminer la lecture du bouquin "Passeport pour UNIX et C" et j'ai trouvé vraiment pas mal. Ce bouquin m'a permis de faire la poussière sur les quelques connaissances C acquises au cours de mes études et d'apprendre pas mal de nouvelles choses ;-) A noter que même si le bouquin est clairement orienté dev, la première partie (10 premiers chapitres) me parait intéressante pour les Sysadmins en herbe. Est abordé dans cette partie: les systèmes de fichiers, les processus (avec leurs états, l'ordonnancement... ), le scripts shell et les commandes UNIX standards. Bref, que du bon!

26juil.

Python en 10 minutes

"Learn Python in 10 minutes", c'est le titre (aguicheur?) de ce billet publié par Poromenos. Plutôt adapté au développeur lambda souhaitant passer à Python, ce petit tutoriel de quelques ligne m'a bien aidé lorsque je me suis lancé. L'essentiel est dit et le tout est accompagné de très bons exemples de code. Que demander de plus? Une version française peut-être?
Bon, je me suis lancé dans la traduction pendant ces vacances et voici le résultat. Dites-moi ce que vous en pensez ;-)

"Learn Python in 10 minutes" en français . Le source LaTeX est disponible ici.

Ce document est publié sous licence Creative Commons Attribution-Share Alike 3.0.

09déc.

map VIM pour python

Pour exécuter le script python en cours d'édition avec la touche de fonction F5, ajouter au fichier vimrc:

map <F5> :!python %<CR>

15nov.

Les Collections Java

L'interface List
Méthodes utiles pour les List: size, isEmpty, add, remove, set, get.
Éléments ordonnés par leurs index. Les List peuvent contenir des doublons. Voici trois types d'implémentations de l'interface List:

  • - ArrayList: Un tableau pouvant s'agrandir. L'accès aux éléments par leur index est performant. A utiliser si on a besoin de rapidité pour les itérations. A éviter dans le cas d'insertion ou d'effacement d'éléments.
  • - Vector: Similaire à une ArrayList. Le Vector est synchronisé et peut être utilisé par plusieurs processus sans aucun risques. Utiliser de préférence une ArrayList plutôt qu'un Vector car le fait d'être synchronisé a un impact sur les performances. De plus, cette classe est plutôt ancienne et sa compatibilitée pas toujours assurée.
  • - LinkedList: Les éléments sont ordonnés par la position de leur index. Similaire a une ArrayList excepté que les les éléments sont liés les uns aux autres. Garder a l'esprit que l'itération d'une LinkedList se fait plus lentement que dans une ArrayList. A utiliser pour ses performances lors de l'insertion ou l'effacement d'éléments.



L'interface Set
Méthodes utiles pour les Set: add, remove, contains, size.
Pas de doublons, la méthode equals() se charge de déterminer si un objet est déjà présent dans le Set.

  • - HashSet: Ensemble d'éléments uniques non ordonnés et non triés. L'itération d'un HashSet ne suivra pas de règle spécifique.
  • - LinkedHashSet: version ordonnée du HashSet. A utiliser si l'ordre d'itération est important. L'itération se fera en suivant l'ordre d'ajout des éléments.
  • - TreeSet: Le éléments sont triés en fonction de leur ordre naturel. Le choix de l'ordre de tri se fait lors de la création de TreeSet.



L'interface Map
Crée un ensemble clé/valeur (tableau associatif).

  • - HashMap: Map non trié, non ordonné. Convient dans la majorité des cas. A utiliser si l'ordre d'itération n'est pas important.
  • - Hashtable: HashMap synchronisée. Un Hashtable n'autorise pas les valeurs "null" (contrairement à une HashMap).
  • - LinkedHashMap: Similaire au LinkedHashSet, ordonne les éléments selon leur ordre d'ajout.
  • - TreeMap: Les éléments sont triés en fonction de leur ordre naturel. Il est possible de définir l'ordre de tri.

08oct.

Raccourcis clavier Eclipse pour Mac

Ctrl + Espace: autocompletion
Pomme + T: affiche l'arborescence d'héritage de la classe courante
Pomme + O: affiche les attributs et méthodes de la classe courante
Pomme + D: efface la ligne courante
Pomme + Shift + P: passer d'une accolade à une autre
Pomme + Shift + O: organiser les imports
Pomme + Shift + R: Recherche un fichier dans le workspace
Pomme + Shift + F: Réorganiser le format de présentation (Merci Leo!)

22mai

BeanShell

J'ai découvert BeanShell ya pas longtemps, un peu par hasard, et je me demande comment j'ai pu faire "avant" tellement cet outil est incroyable. Beanshell c'est quoi? C'est un interpréteur de code source JAVA. Concrètement ça permet exécuter un bout de code JAVA à la volée. Et ça c'est vraiment super pratique (hop, en ligne de commande par ex).
Voici la marche à suivre pour tester la bête:
- télécharger le jar de beanshell ici.
- copier ce fichier dans le répertoire: $JAVA_HOME/jre/lib/ext
- test ultime:

shell# java bsh.Interpreter
BeanShell 2.0b4 - by Pat Niemeyer (pat@pat.net)
bsh % System.out.println("test");
test
bsh %

ou bien,

echo "System.out.println(System.out.println("test"));" | java bsh.Interpreter

Pour les sysadmin l'interêt va être de pouvoir visualiser rapidement des variables Java, ex:
System.out.println(System.getProperty(\"file.encoding\"));

Ce n'est bien sûr qu'un tout petit exemple des capacités de l'outil ;-)

17mar.

Script Ant "minimal"

Quelques variables:

<property name="sourcedir" value="${basedir}/src"/>
<property name="targetdir" value="${basedir}/bin"/>
<property name="librarydir" value="${basedir}/lib"/>
<property name="action" value="list"/>


Il faut utiliser toutes les librairies .jar du répertoire "lib" dans le classpath:

<path id="libraries">
   <fileset dir="${librarydir}">
       <include name="*.jar"/>
   </fileset>
</path>


fileset: permet de définir un ensemble de fichiers.


Première "cible", on fait le ménage dans le répertoire "bin":

<target name="clean">
   <delete dir="${targetdir}"/>
   <mkdir dir="${targetdir}"/>
</target>


Copie dans le répertoire "bin" de tous les fichiers autres que ".java" (ex: fichiers de configuration et de mapping hibernate...):

<target name="copy-resources">
   <copy todir="${targetdir}">
       <fileset dir="${sourcedir}">
           <exclude name="**/*.java"/>
       </fileset>
   </copy>
</target>


On lance la compilation:

<target name="compile" depends="clean, copy-resources">
   <javac srcdir="${sourcedir}" destdir="${targetdir}" 
       classpathref="libraries"/>
</target>


On lance le programme compilé en y passant un paramètre:

<target name="run" depends="compile">
   <java fork="true" classname="org.events.EventManager" 
       classpathref="libraries">
       <classpath path="${targetdir}"/>
       <arg value="${action}"/>
   </java>
</target>


fork: permet l'exécution de la tâche dans une autre VM.
classpathref: le classpath à utiliser.
classname: la classe java à exécuter.
arg: argument à passer en ligne de commande lors de l'exécution.

15mar.

Nick Heudecker à propos de Wicket

Voici une une interessante interview de Nick Heudecker (hibernate) à propos du framework Wicket.

13mar.

BOUML, la boîte à outil UML "light" pour le développeur

reverse
Intéressant ce petit logiciel développé par Bruno Pagès. BOUML est une suite d'outils UML 2 libres dont un modeleur, vous permettant de spécifier et générer du code C++, Java, Idl, Php et Python. J'ai essayé de lancer l'opération inverse, a savoir l'analyse d'un ensemble de classes java (un driver JDBC MySQL, le premier truc qui m'est tombé sous la main) afin de générer un XPI importable dans ArgoUML. Mais rien a faire, ArgoUML me crie dessus lors de l'import, visiblement le format du XPI ne lui convient pas :-( Si vous avez une idée...

03mar.

Adoption des technologies & marché de l'emploi

Le nombre d'emploi associés à une technologie est généralement un bon indicateur quant à l'adoption de celle-ci par les entreprises. C'est ce qu'explique Rod Johnson dans ce très bon billet. Exemple concret à l'aide du site jobtrends.

et un petit dernier pour la route:

28août

Bash ou pas Bash?

Bash est l'outil par excellence de l'administrateur système UNIX. Cependant comme tout langage, il a ses limites, et il est important de les connaître avant de se lancer dans le code. Voici donc une liste des utilisations pour lesquelles bash n'est PAS des plus adapté:

  • les tâches qui nécessitent beaucoup de ressources (tri, hash...)
  • calculs mathématiques
  • portabilité vers d'autres environnements que UNIX
  • applications complexes ou de la programmation structurée est nécessaire (gestion des types de variables, fonctions, prototypes...)
  • applications critiques
  • besoin en sécurité important
  • le projet contient des sous-composants ayant des dépendances.
  • des opérations sur des fichiers nécessaire
  • l'utilisation des tableaux multi-dimensions est nécessaires
  • besoin de structures de données (listes, arbres...)
  • générer des graphiques, ou gérer des interfaces
  • accès direct au matériel
  • gestion de ports/sockets
  • besoin d'utiliser des librairies ou du code externe
  • besoin de créer des application non "open-source"

source: Advanced Bash Scripting Guide

06août

Notes - J2EE