Rechercher dans ce blog

jeudi 15 avril 2010

Serialization Java

Petit exercice pour vérifier que la sérialization peut être un réel problème de sécurité:

import java.io.Serializable;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;

public class DemoSerialization {

    enum ROLE {
        DIRECTOR, EMPLOYEE;
    }

    private static final class Salary implements Serializable {

        private int salary;

        private static final long serialVersionUID = 1L;

        public Salary(ROLE role) {
            switch (role) {
                case DIRECTOR:
                    salary = 1000000;
                    break;
                case EMPLOYEE:
                    salary = 80000;
                    break;
                default:
                    salary = 0;
            }
        }

        public final int giveSalaryAmount() {
            return salary;
        }

    }


    public static void main(String[] args) throws java.io.IOException, java.lang.ClassNotFoundException {
        Salary salaryDirector = new Salary(ROLE.DIRECTOR);
        Salary salaryEmployee = new Salary(ROLE.EMPLOYEE);
        System.out.println("Payement: ");

        // 1


        System.out.println("- director will get " + salaryDirector.giveSalaryAmount());
        System.out.println("- employee will get " + salaryEmployee.giveSalaryAmount());
    }
}

Cette petite classe, bien que peu intéressante dans son contenu, va néanmoins afficher le salaire du directeur et le salaire de l'employé.
La classe est "sécurisée" par le constructeur, qui ne prend pas un salaire mais un type d'employé. La classe est finale, le salaire également.
Au point 1, on peut imaginer que salaryDirectory, salaryEmployee est sérialisé: Spring remoting, mise en session, etc... est-ce que ça pose un problème ?

ça peut poser un problème si la classe a subit des modifications et qu'un client n'a pas la même version, ou qu'un pirate vient s'integrer dans la connexion. Pour continuer l'exemple, insérons ceci au point (1), simulant un appel remote par exemple ou dans tous les cas une désérialization:

       byte[] bytesH = new byte[]{-84,-19,0,5,115,114,0,24,68,101,109,111,83,101,114,105,97,108,105,122,97,116,105,111,110,36,83,97,108,97,114,121,0,0,0,0,0,0,0,1,2,0,1,73,0,6,115,97,108,97,114,121,120,112,0,15,66,64};

        // Deserialization
        ByteArrayInputStream bais = new ByteArrayInputStream(bytesH);
        ObjectInputStream in = new ObjectInputStream(bais);
        salaryEmployee = (Salary)in.readObject();

Que se passe-t'il ? je connais un employé qui va recevoir beaucoup d'argent...
Ce petit exemple montre qu'il est important de définir un serialVersionUID différent pour chaque changement d'interface, ou de laisser la JVM le générer d'après la signature de la classe, des champs et méthodes. Mais plus jamais nous ne devrions tolérer de serialVersionUID=1l, généré par défaut, sous peine d'avoir un comportement étrange entre des versions différentes !

vendredi 19 mars 2010

IE sucks... getAttribute("class")

<table class="aClass" id="id1">...</table>

<script type="text/javascript">
    var node = document.getElementById("id1");
    alert(node.getAttribute("class"));
</script>


Ce code est plutôt simple. Pouvez-vous prévoir son résultat ?
Ok, sous Firefox, on a une alerte "aClass" qui apparaît, mais sous IE... l'alerte indique "null" !
Ce problème intervient sous IE6, IE7 et IE8 uniquement. Pourquoi ? ... demandez donc à Microsoft.
Comment résoudre ce cas ? la réponse tombe du ciel: utilisez .className !

alert(node.className);

... ceci fonctionne sous IE 6, 7, 8, Firefox, etc...

De la même manière, node.setAttribute("class", "aCssClass") ne fonctionne pas sous IE, il faut utiliser node.className="aCssClass".

Notez que sous IE, l'attribut "class" qui avait mystérieusement disparu a cédé sa place à un nouvel attribut "className" => getAttribute("className") fonctionne également.


Merci Micro de nous avoir fourni Internet Explorer, et un mal de crâne pour adapter nos codes à ce browser.

jeudi 11 mars 2010

Mise à jour de rom Android (Modaco 3.2)

Lassé d'être en Android 1.5 sur mon HTC Hero, je me décide enfin après 6 mois, à mettre à jour ma ROM. Je dispose d'une ROM Modaco 2.6 seulement, et je me dis qu'un upgrade ne peut faire de mal.
Je met les étapes grosso-modo que j'ai entreprises. ça n'est pas un tutorial, mais ça peut aider ou servir de checklist à une ré-installation.


A surfer sur les forums, je trouve que la dernière rom stable est la 3.0. Mais d'après d'autres forum, certaines fonctionalités ne fonctionnent pas. Je me décide finalement pour la dernière ROM à ce jour, soit la Modaco 3.2; pas beaucoup d'avis négatifs sur les forums. Je m'inscrit sur modaco.com et via le 'kitchen' dans un post, je génère une ROM 3.2 conforme à mes attentes.

L'étape suivante est le backup. J'utilise "backup for root users" qui ne fonctionne pas trop mal, excepté les icônes sur l'écran, et, semble-t'il, certaines applications payantes.

Soit:
1/ J'exécute mon backup sur mon tél.

2/ Je démarre en mode recovery et j'effectue un backup global sur ma carte sd, puis je redémarrer le tél normalement
adb shell reboot bootloader
./fastboot boot recovery/Hero/cm-hero-recovery.img
nandroid backup
nandroid reboot
---



(Le programme fastboot est téléchargeable sur le site de HTC)

3/ Copie du backup sdcard
usb mount on hero (click on device)
cp /media/disk-1/nandroid/HT97JL900958/CBDMRS12-20100307-1829 . -R
---

4/ Copie de la rom
cp 3.2-update-hero-modacocustomcustomrom-signed-MD5-d767e7335a4bb6ef022e7d3082f28bb7.zip /media/disk-1/update.zip
---
5/ installation de la rom (reboot en recovery, wipe=delete, install rom)
adb shell reboot bootloader
./fastboot boot recovery/Hero/cm-hero-recovery.img
wipe
apply sdcard:update
reboot
---


6/ Installation de la radio
usb mount on hero
cp update-hero-radio-63.18.55.06EU_6.35.06.18-signed.zip /media/disk-1/update.zip
---

7/ Installation de la radio (depuis le recovery)
adb shell reboot bootloader
./fastboot boot recovery/Hero/cm-hero-recovery.img
apply sdcard:update
reboot
---

... et après un reboot, j'ai un système tout neuf.
Je constate malgré tout quelques lenteurs pour le système d'affichage des fenêtres, mais un jeu est un peu plus rapide.
Nouveau browser, nouvelles fonctionnalités. Dans l'ensemble peu de gain avec cette mise à jour, d'autant que la Modaco 3.2 est un android 1.5 ???
J'avoue avoir du mal à suivre Modaco sur les forums, et la réponse doit être dans les 150 pages liées à cette version. Trop pour moi.
Ma prochaine upgrade sera certainement pour passer en android 2.1, mais pour ceci il faut attendre...

Au final, le gain le plus remarquable entre Modaco 2.6 et 3.2 est la reconnaissance vocale...

Chatroulette

Chatroulette... qui ne connaît pas le phénomène ?
On affiche une page web, puis un click sur un bouton nous met en contact avec un inconnu. Peut-être votre voisin, peut-être une personne du bout du monde. Peut-être un pervers, un homme, une femme.

Sur la page en lien, vous pouvez voir un article sur Chatroulette et surtout une vidéo intéressante qui démystifie le phénomène. Le post référencie également le site http://www.chatroulettemap.com/, qui permet d'afficher sur une carte google la localisation des utilisateurs de chatroulette ainsi qu'une copie d'écran de la personne qui a été connectée. Est-ce que votre voisin figure sur la carte ? ou... vous ?

samedi 30 janvier 2010

Attention aux jeux

Ce jeune allemand devient fou à force de jouer... est-ce possible ?

Vidéo à voir ici:
http://www.dailymotion.com/video/x479pd_allemand-enerve-devant-son-pc-vosf_fun

... puis lire l'explication ici =>
http://fr.wikipedia.org/wiki/The_angry_German_kid

et enfin les parodies ici =>
http://www.dailymotion.com/video/x6xjya_le-francais-fou-devant-son-ordinate_fun
http://www.youtube.com/watch?v=x-YcKSdmr0M&feature=rec-LGOUT-exp_fresh+div-1r-1-HM

jeudi 28 janvier 2010

Affichage de logs http en continu

Parfois, pour suivre ce qui se passe en production, j'ai besoin d'afficher un log qui se raffraichit en temps réel, ou presque, sur l'écran.
Le problème est que je n'ai aucun accès ssh sur la machine de production, mais uniquement un accès http sur le fichier de log.
Le petit script ci-dessous résoud le problème; il va chercher tous les 10 secondes le log sur le serveur, et en affiche les 10 dernières lignes...

_________________________
tail --lines=10 -f srv.log &

while :
do
    wget --quiet --continue --no-proxy http://logsrv/app/pr/srv.log
    sleep 10
done
_________________________

Libre à l'utilisateur de faire un grep dessus... ;-)

mardi 19 janvier 2010

Survol Google Earth

Si vous êtes comme moi et aimez faire des DVD de vacances avec plein de photos, vous vous dites certainement que rajouter un survol Google Earth du lieu de vos vacances serait du plus bel effet... non ?

Il existe plusieurs méthodes: bien sûr, on peut acheter Google Earth Pro, mais je crois que la version est 400$, et pour un privé c'est un peu cher ! La première version de Google Earth était autour de 80$, donc plus abordable...

On peut aussi faire un zoom à la main ou cliquer sur des waypoints sauvés, et capturer le tout avec un outil de capture vidéo comme Fraps (Windows) ou xvidcap (linux). Pour cette solution, une astuce consiste à partir du point le plus zoomé et ouvrir le point le plus éloigné, à vitesse lente, puis d'inverser le sens de lecture de la vidéo.

Une troisième solution est celle que je vais décrire ici; elle consiste à enregistrer une "visite" dans Google Earth, puis de la rejouer en enregistrant l'écran avec Fraps ou xvidcap.

Pour ce faire, on effectuer un click-droit dans la zone "Lieux" et choisir "ajouter"-"visite". Une boîte d'outil s'ajout en bas à gauche de la vue Google Earth. On clique sur "enregistrer", et on commence la visite, soit à la main soit par des "repères", et on valide en recliquant dans la boîte d'outil. On peut alors rejouer la visite autant de fois que nécessaire.

Pour que la vidéo soit fluide, il convient de définir la taille du cache au maximum (dans les préférences), puis de jouer plusieurs fois la vidéo (pour remplir le cache).

Pour enregistrer la vidéo, on ouvre Fraps ou xvidcap, puis on débute l'enregistrement. Dans Google Earth, on rejoue la "visite", et enfin, on sauve la vidéo générée.

Notons qu'on peut encore couper la vidéo avec un outil d'édition vidéo comme VirtualDub.

Pour une visite plus fluide, on peut exporter le kml de la "visite", supprimer les délais (wait), et le ré-importer dans Google Earth.

Voilà; faites-nous part de vos vidéos !

vendredi 8 janvier 2010

Datasources: Pertes de connection

Un problème récurant que je vois dans les applications WEB est la perte de connexion à la base de données. Une solution pour détecter les fuites, utilisée dans mes projets, est de fournir un contrôleur WEB qui, en fonction de paramètres, indique l'état des datasources. C'est utile en dev, mais surtout en prod, lorsqu'on a une fuite qui ne se produit qu'en prod, et que l'on souhaite voir l'état des datasources, mais que l'on n'a pas d'accès JMX ou wlst.

En pratique, j'ai un contrôleur Spring dans lequel j'injecte mes datasources.
L'étape suivante est de récupérer le vrai objet Datasource:

   public static BasicDataSource getBasicDataSource(DataSource dataSource) {
        Object obj = dataSource;

        // Try to get proxied instance
        Method method = ReflectionUtils.findMethod(dataSource.getClass(),
                "getTargetSource");
        if (method != null) {
            obj = ReflectionUtils.invokeMethod(method, dataSource);
        }

        // Try to get proxied instance
        if (obj instanceof JndiObjectTargetSource) {
            JndiObjectTargetSource source = (JndiObjectTargetSource) obj;
            obj = source.getTarget();
        }

        if (obj instanceof BasicDataSource) {
            BasicDataSource bds = (BasicDataSource) obj;
            return bds;
        }
        return null;
    }

   
Ensuite, j'écrit les paramètres dans la réponse HTTP, au format JSON:


Cette solution permet d'afficher le nombre de connexions actives, et le format JSON permet de le parser par un script, par exemple pour l'integrer dans Nagios ou autre système d'alerte.

Pour chercher des connection leaks, je recommande l'utilisation de l'excellent FindBugs.

jeudi 7 janvier 2010

Book pre-review: Career 2.0: Take Control Of Your Life

Suite à la lecture de "Ship it" (voir précédant blog), je me suis penché sur le travail de Jared Richardson et j'ai découvert son nouveau livre: "Career 2.0: Take Control of Your Life". Ce livre est destiné à un public de développeurs, mais également applicables à tout le monde.
D'après les reviews, ce livre propose des recettes afin de se définir des objectifs, de s'y tenir, et finalement de progresser dans nos choix de carrière comme dans la vie. Il prend la métaphore d'un conducteur qui rentre dans sa voiture; s'il ne sais pas où il va, même si il a une bonne voiture, il n'arrivera jamais à son but.
Dans son livre, il parle d'outils comme le wiki ou les mindmaps, propose des échanges d'informations comme le lunch-n-learn, conférences, reviews, et suggère d'apprendre chaque jour, par exemple en suivant un tutorial par jour.
Son livre a d'excellents feedbacks dans les forums, et sera à coup sûr dans la liste de mes prochaines lectures...

"Career 2.0: Take Control Of Your Life"
Jared Richardson

Book review: "Ship it !", A practical guide to successful software projects

"Ship it!" est un livre destiné aux développeurs qui souhaitent améliorer ce qui se passe dans leur projet. Ce livre très bien réalisé explique par des situations simples comment y remédier, par exemple il parle de best-practices que tout bon développeur devrait appliquer: utiliser un système de build, l'intégrer dans un système d'integration continue, utiliser un système de contrôle de version comme SVN...
Les situations de ce livre sont variées: que faire quand un développeur prétend que "ça marche chez lui", ou s'il ne veut pas développer de tests unitaires, ou que faire si vous avez reçu de votre supérieur un projet non testé et qui ne marche pas...
Le livre parle également de ce qui peut se passer dans l'équipe du projet pour améliorer la communication, la vue d'ensemble: daily meeting, publication d'informations, deadlines claires et affichées pour tous, désigner un lead technique...
Ce livre est définitivement un "Must read" pour tous les développeurs.

Références:
"Ship it!" A practical guide to successful software projects,
Jared Richardson, William Gwaltney Jr.
Collection "The Pragmatic Programmers",
ISBN 0-9745140-4-7

Hello, blogger world

Bienvenue dans mon nouveau blog. Celui-ci sera consacré à partager mon expérience, mes découvertes, mes reflexions dans les domaines usuelles qui me cotoyent: informatique, balades, musique... Un blog c'est l'occasion de partager mais également de recevoir des informations sur les entrées du blog, donc n'hésitez pas à commenter les entrées pour réagir ou simplement dire si vous avez aimé ou pas....