vendredi 16 septembre 2011

Deviner la variable JAVA_HOME en bash

Lors de l'écriture de l'un de mes scripts, j'ai du deviner la variable JAVA_HOME. j'ai donc écrit une fonction en bash que je vous livre et qui pourra sans doute vous aider

#!/bin/bash
function guess_java_home(){
        for i in  `readlink -f \` which java\`` 
do 
        JAVA_HOME=${i/bin\/java/}
        echo "JAVA_HOME=${JAVA_HOME}"
done
}

dimanche 28 novembre 2010

EasyMock en environnement multithread

Lorsque vous voulez 'mocker' un objet et que ce dernier sera appelé par plusieurs threads, vous aurez le message suivant "Un-thread-safe mock called from multiple threads".

Par exemple :

@test
public void MyTest(){
    List mockList = EasyMock.createMock(List.class);
    EasyMock.expect(mockList.add(EasyMock.anyObject())).times(NUMBER_OF_THREAD);
    EasyMock.replay(mockList);
                
    MyThread[] rateThread= new MyThread[NUMBER_OF_THREAD];
    for(int i=0;i<NUMBER_OF_THREAD;i++){
        rateThread[i]= new MyThread(){
           @Override     
               doit(){
                   mockList.add("foo");
               }
       };
     rateThread[i].start();
            
    }
}

Il vous faut alors ajouter EasyMock.makeThreadSafe(mockList, true);. avant le replay(mockList)

jeudi 21 octobre 2010

Les génériques java et EasyMock

Parfois nous devons exécuter un traitement et si le résultat est null nous voulons renvoyer un résultat par défaut. par exemple une liste vide. cela permet d'éviter les NullPointerExceptions si nous parcourons la liste. Exemple :

List<Contact> contacts = getContacts();
for (Contact contact : contacts){
      contact.setActive(true);
}

Si getContacts() renvoie null le code renverra une NullPointerException. il est possible avec les génériques Java de le faire d'une manière élégante :

 public static <T> T notNull(T test, T defaultvalue){
    return t == null ? test : defaultValue;
  }

On peut alors écrire :

List<Contact> contacts = notNull(getContacts(),new ArrayList<Contact>);

Ce code n'est pas révolutionnaire mais il montre à quel point les génériques de de Java peuvent être utiles. C'est d'ailleurs de cette manière que EasyMock fonctionne. Lorsque vous écrivez

Myclass mock = EasyMock.createMock(MyClass.class);
EasyMock.expect(mock.function()).andReturn(value);

Le type de value est déterminé en générique Java par le retour de function() :

 public <O> O expect(O t) {
        return t;
    }

mercredi 13 octobre 2010

Hibernate : différence entre get() et load()

Si vous êtes un utilisateur d'Hibernate, que ce soit avec Spring ou pas, vous êtes vous déjà posé la question de savoir quelles sont les différences entre session.load() et session.get(). Comprendre les différences permet souvent d'optimiser les accès à la base de données.

Lire la suite...

mercredi 6 octobre 2010

Gérer les sessions Hibernate sans transaction

Comme vous le savez déjà peut être, les sessions Hibernate sont très fortement couplées aux transactions : Hibernate ouvre et ferme les sessions au début et à la fin d'une transaction. Lors du développement d'une librairie (DAO), Je me suis posé la question "est il possible de ne pas utiliser un contexte transactionnel pour gérer les sessions ?". En effet lors de mes tests qui sont transactionnels, tout se passait bien mais lorsque j'intégrais mon code dans un contexte non transactionnel et que je tentais de récupérer des associations liées à une entité, j'avais des lazyInitializationException car les sessions était fermées. j'avais alors plusieurs solutions :

  • Utiliser le filtre Spring Opensessioninviewfilter, mais cela rend ma librairie non portable car cela ne fonctionnera que dans un contexte web
  • Faire des méthodes ad'hoc pour récupérer l'entité ou l'entité avec ses associations chargées (eager), mais au détriment d'un code moins lisible et où il est facile de ne pas utiliser la bonne méthode
  • Charger les associations directement (par configuration) avec FetchType=Eager. pas assez performant !
  • Utiliser les profiles de fectching
  • Faire une gestion des session par thread.

Je vous propose de voir comment j'ai implémenté la dernière solution

Lire la suite...

jeudi 12 août 2010

Autocomplétion dans l'interpréteur interactif Python

Je vous propose une petite astuce pour activer l'autocomplétion ainsi qu'un historique des commandes tapées dans l'interpréteur Python. Python 2.0 minimum est requis

#!/usr/bin/env python
# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it, e.g. "export PYTHONSTARTUP=/max/home/itamar/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.

import rlcompleter
import readline
readline.parse_and_bind("tab: complete")
import os
histfile = os.path.join(os.environ["HOME"], ".pyhist")
try:
    readline.read_history_file(histfile)
except IOError:
    pass
import atexit
atexit.register(readline.write_history_file, histfile)
del histfile, readline, rlcompleter
  1. Sauvegarder le code ci dessus dans un fichier : ~/.pystartup
  2. Définissez une variable d'environnement pointant vers ce fichier dans le fichier bashrc : (~/.bashrc) :
export PYTHONSTARTUP=/home/user/.pystartup  

David

jeudi 10 juin 2010

Le cloud computing

Le cloud computing est un concept ou les applications sont exécutées par une puissance de calcul dont on ne gère plus l'infrastructure sous-jacente, on parle alors de puissance de calcul ou de stockage à la demande. Par analogie on peut comparer le cloud computing à la consommation électrique : on fait varier la production en fonction de la demande.

Lire la suite...

mercredi 9 juin 2010

10 minutes pour comprendre...NoSQL

Lorsque l'on parle de sites à fort trafic et de bases de données, on n'entend rarement parler de bases de données relationnelles. En effet, garantir la consistance des données coute chère en temps et est souvent incompatible avec les performances.

Puisque le modèle relationnel ne semble pas adapté dans des environnement nécessitant de grosses architectures et que les propriétés ACID des bases ne permettent généralement pas de passer à l'échelle, un nouveau mouvement (encore un ;)) est née de l'initiative des architectes de cloud computing et des sites communautaire comme Facebook, Amazon et Linkin : le NoSQL, (aka : Not Only SQL). Ce billet tente de faire le tour d'horizon des différents types de bases NoSQL, les différentes solutions disponibles sur le marché et dans quels cas les utiliser.

Lire la suite...

mercredi 19 mai 2010

Les différents modèles économiques de l'open source

Souvent lorsque je parle de Gisgraphy, la question qui m'est posée est "quelles sont tes motivations" et "est-ce que tu gagnes de l'argent avec ce projet". Après leur avoir expliquer que le projet est open source et libre. La réaction est quasi toujours la même : "tu n'a pas peur que quelqu'un te pique le projet ? et comment peut on gagner de l'argent alors que tout est gratuit ?". J'ai donc décidé de faire ce billet pour expliquer mes motivations ainsi que les différentes façons de gagner de l'argent avec des projets open source et libres. autant vous le dire tout de suite : je perds de l'argent avec Gisgraphy, mais mon but n'est pas forcément d'en gagner (même si j'aimerais ne pas être de ma poche ;) )

Lire la suite...

jeudi 25 mars 2010

Automatiser les interactions avec des scripts shell ou bash

Peut être avez vous déjà eu besoin de simuler des réponses à des scripts shell. Par exemple lorsque vous avez un script qui demande une confirmation, un mot de passe ou tout autre intervention humaine, et que vous désirez tester le comportement du script. il existe un outil assez pratique pour le faire qui se nomme expect. Il permet d'automatiser les interactions avec des applications non-GUI (aka : graphiques). plusieurs versions sont disponibles expect-tcl8.3 ou expectk.

Lire la suite...

lundi 1 mars 2010

Détecter et corriger les fuites mémoire java

Ceux qui ont déjà développé en C, puis en Java auront probablement apprécié la gestion de la mémoire par la JVM. En effet, Java masque la complexité de la gestion de la mémoire aux développeurs. Cette tache est déléguée au garbage Collector. Cependant même si cette gestion est dite 'automatique', cela ne permet pas de faire n'importe quoi. Que ce soit en C, Java, ou un autre langage, la mémoire est une ressource limitée ! En java lorsque la JVM n'a plus assez de mémoire pour s'exécuter, elle génère une Erreur java.lang.OutOfMemoryError.

Plusieurs cas sont alors possible :

  • Soit vous n'avez pas alloué assez de mémoire à la JVM
  • Soit votre code a ce qu'on appelle un fuite mémoire

Si vous êtes dans le premier cas, les choses se résolvent assez facilement : il vous suffit d'allouer plus de mémoire grâce aux paramètres -Xmx, -Xms et -XX:PermSize (ou de modifier le code pour qu'il gaspille moins de mémoire). Dans le deuxième cas vous allez devoir trouver où se situe la fuite mémoire. Si vous avez utilisé des logiciels pour vous y aider, vous avez peut être été perdu par toutes les possibilités qu'ils offrent et par la profusion d'informations qu'il fournissent.

Le but de ce billet est d'expliquer comment détecter et corriger les fuites mémoires avec Eclipse Memory Analyser Tool un outil gratuit et très utile qui aide vraiment à trouver les fuites mémoires. Nous allons voir comment extraire les informations pertinentes, les comprendre, et trouver les responsables des fuites mémoire en ayant une approche pragmatique. Je vous propose de nous appuyer sur du code simple (disponible en fichier attaché à ce billet) générant une fuite mémoire.

Lire la suite...

samedi 27 février 2010

Nouveau look aux idées larges !

Le blog à désormais un nouveau look. oh... pas très très différent. Je suis juste partie du thème précédent et j'ai changé le style pour l'adapter aux styles des billets : c'est-à-dire des articles techniques.

En effet en regardant les statistiques des résolutions d'écran des utilisateurs, J'ai remarqué que personne n'était en 800*600, alors que le thème était optimisé pour une résolution 800*600. J'ai donc augmenté la largeur de la colonne centrale en diminuant les marges de chaque coté, attribué plus de place à la colonne de contenu, et diminué la colonne avec les rubriques, qui me semblait moins importantes que le contenu. A mon sens, le texte est beaucoup plus lisible. Pour les zone de code, j'ai également opté pour une couleur jaune, plus sympathique que le gris. Faites moi part de vos impressions, et des éventuels problèmes rencontrés.

jeudi 4 février 2010

Tester du code en ligne

Certains connaissent peut être pastebin qui permet d'envoyer du code à quelqu'un (ou d'un PC à l'autre ;) ) en générant une shortURL. Il existe des sites qui vont plus loin en permettant de tester du code directement en ligne : http://codepad.org/. il suffit de copier / coller votre code, et le site vous le compile et vous l'interprète. c'est le cas de codepad

codepad

Il supporte les langages suivants :

  • C
  • C++
  • D
  • Haskell
  • Lua
  • OCaml
  • PHP
  • Perl
  • Plain Text
  • Python
  • Ruby
  • Scheme
  • Tcl

Vous pouvez mettre votre code "privé", ce qui est pratique, car j'ai déjà retrouvé du code, que je ne voulais pas partager publiquement, indexé par Google, après l'avoir envoyé via pastebin)

Dans la même lignée, il existe des sites plus spécialisés pour tester les interactions HTML<=>Javascript : http://jsbin.com/. Son utilisation est triviale : vous avez le code javascript à gauche et le code HTML à droite.

jsbin

Le site va beaucoup plus loin que pastebin, d'une part, car il est spécialisé dans un langage, mais aussi parce qu' il offre la possibilité :

  • De sauvegarder votre code.
  • D'inclure des librairies connues, comme Prototype, Jquery, Mootools, Dojo et de choisir parmi différentes versions
  • De générer une short URL de votre code (exemple : http://jsbin.com/ilomu3)
  • De modifier un code existant en cliquant sur ''Edit using JS Bin" en haut à droite (j'avoue c'est pas flagrant :) ).
  • De gérer plusieurs versions d'un même code

L'avantage est qu'il permet de tester du code avant de mettre à jour un librairie (exemple : passer de Prototype 1.6.03 à 1.6.1.0), de vous faire la main sur des librairies, ou de partager du code entre collègues.

lundi 1 février 2010

iPad nano

Pour faire suite à mon post Stratégie d'Apple vs stratégie Google, je vous propose une image qui m'a fait bien rire

ipadnano

Sinon, je vous conseille la lecture de ce billet sur l'ipad et son effet d'annonce manqué

mardi 26 janvier 2010

Tester le javascript : JSUnit, JSmock, Jstester (partie 2)

Après le billet consacré à JsUnit et celui qui expliquait comment mocker une requête Ajax, nous allons maintenant voir comment mocker en javascript. Pour cela je vous propose une courte présentation de JsMock. Les exemples de code sont en annexe de ce billet.

Lire la suite...

lundi 18 janvier 2010

Configurer et utiliser Google bot comme outil de tests

Lorsque l'on parle de Google bot, on pense souvent à "référencement", mais il existe une autre utilisation : les tests. Je ne parle pas de tests fonctionnels ou unitaires mais de tests pour améliorer la qualité de votre site, comme les tests de liens morts, de pages indisponibles, d'erreurs HTTP etc.

Il y a quelques semaines, je postais plusieurs billets sur comment gérer un serveur de download :

Mais cette configuration peut poser des problèmes pour les bots des moteurs de recherches. C'est pourquoi je voudrais expliquer comment mieux configurer les serveurs pour faciliter le travail des bots.

Lire la suite...

vendredi 8 janvier 2010

Tester le javascript : JSUnit, JSmock, Jstester (partie 1)

Beaucoup de développeurs Java sont familiers avec Junit, EasyMock,... ces librairies qui permettent de tester du code Java afin de rendre les programmes plus robustes. Javascript dispose également de frameworks équivalents. Avec l'apparition du Web 2.0, le Javascript et l'Ajax sont de plus en plus présents dans nos applications (j'avais d'ailleurs poster un billet sur comment mocker une requête Ajax,il y a quelques mois) et représente une part non négligeable de code.

Si vous utilisez GWT, qui permet d'écrire à partir de code écrit en Java, de générer une application en HTML / javascript, vous n'avez pas de problème pour tester votre code, puisque Junit suffit. En revanche, si vous avez du code javascript à tester, il existe des librairies qui permettent de simplifier les tests. Je vous propose de voir comment tester du Javascript au moyen de ces 3 frameworks :

  • JsUnit : Qui fournit des mécanismes d'assertions et d'exécutions de tests.
  • JsMock : Permet de simuler des comportements pour des objets Javascript,tout comme EasyMock le fait
  • JsTester : Permet d'executer du code Javascript en java grâce à Rhino.

les exemples de code sont disponibles en annexe de ce billet

Lire la suite...

lundi 4 janvier 2010

Google goggle

Il y a de cela quelques temps, Google lançait image labeler afin d'améliorer la recherche d'images Google. Tout laisse à penser que ce service a bien fonctionné, car Google expérimente Google goggle, un service disponible à partir d'android 1.6+, et qui permet de prendre une photo ou une vidéo et Google détectera de quoi il s'agit et lancer une recherche à partir de ce qu'il a détecté. Le geotagging devient quasi obsolète.

Le nom n'est pas choisi au hasard, au départ Google aurait du s'appeler Goggle, en référence au nombre gogol de Edward Kasner, mais une erreur de saisie a fait que Google s'appelle Google et non Goggle. c'est donc un moyen d'utiliser son nom initial.

Lire la suite...

Stratégie d'Apple vs stratégie Google

Après la folie commerciale de fin d'année je voudrais bloguer sur les différentes stratégies des sociétés dites "innovantes". je sais dors et déjà que je vais me faire des ennemis et que cette article ne fera pas l'unanimité, mais peu importe, ce post trouvera aussi des personnes allant dans le même sens que moi :)

C'est demain que sort le téléphone de Google : le Nexus One. Ceux qui me connaissent savent que je suis un fervent défenseur de Google. Ce n'est pas que j'aime tout ce qu'ils font (je n'aime pas chrome, par exemple), mais je trouve que leurs produits tapent souvent juste et fort. Et si certains sont frileux d'utiliser des applications et services d'une firme, il est vrai, un peu "big brother", on saluera tout de même leur stratégie qui leur a permis d'être le moteur de recherche utilisé par 90% des internautes et de sortir des produits innovant comme, Google Maps et Google documents, GWT, etc.

Je m'étonne encore de leur modèle économique basé sur la publicité. Pour mémoire, ce même modèle a causé, entre autre, la chute de la bulle internet. De très grosses sociétés (e.g : AOL) ont revu leur business modèle, en passant la publicité de "source de revenus" à "complément d'activité" ;). La stratégie de Google est de sortir des produits les plus complets possible, en sachant très bien ce qu'il amélioreront à la prochaine version, mais en visant un niveau de base déjà très élevé pour un effet "WHAOOOUU". Je voudrais (entre autre) comparer la différence de stratégie d'Apple et de Google pour leur téléphone pour montrer comment Apple est vraiment une société reine dans le marketing :

Lire la suite...

mercredi 23 décembre 2009

Différence entre un hard link et un lien symbolique

Lorsque j'ai voulu faire un système de sauvegarde pour les données de mon serveur, j'ai voulu créer un dossier par date, mais je me suis vite rendu compte que cela allait prendre beaucoup de place. alors j'ai utilisé un hard link pour faire une sauvegarde incrémentale.

Lire la suite...

- page 1 de 3