lundi 27 août 2012

Les nombres non signés en Java

Voici la liste des types primitifs en Java

TypeSignificationTaille (en octets)Plage de valeurs acceptées
charCaractère Unicode2'\u0000' → '\uffff' (0 à 65535)
byteEntier très court1-128 → +127
shortEntier court2-32 768 → +32 767
intEntier4-231≈-2,147×109 → +231-1≈2,147×109
longEntier long8-263≈-9,223×1018 → +263-1≈9,223×1018
floatNombre réel simple4±2-149≈1.4×10-45 → ±2128-2104≈3.4×1038
doubleNombre réel double8±2-1074≈4,9×10-324 → ±21024-2971≈1,8×10308
booleanValeur logique (booléen)1true (vrai), ou false (faux)

Ce que l'on constate, c'est qu'il n'y a que des nombres non signé.
Si vous lisez un fichier binaire et que vous récupérer un octet (byte), naturellement, vous vous attendez à un nombre non signé.

Mais, voilà, Java ne vois pas les choses de la sorte.
Alors comment avoir la valeur d'un byte non signé ?
L'astuce est plutôt simple quoique déconcertante :
final DataInputStream file = ...
int byte0 = file.readByte() & 0xff ;
En appliquant un masque 0xff et en le mettant dans un int, on force Java à ne pas interpréter le contenu du byte.
Exemple, si le byte = -127, le signe disparait et la valeur voulue (255) est récupérée.

jeudi 23 août 2012

Analyser le trafic réseau depuis l'IDE Eclipse

Lorsqu'une personne développe des WebService ou qu'elle y fait appel, il peut être intéressant de "voir" le flux SOAP pour ensuite, par exemple, l'utiliser via SOAPUI.

Si vous n'êtes pas un habitué de Wireshark, vous serez certainement séduit par une possibilité d'Eclipse.

L'idée est simple : ouvrir un port sur lequel le client se connecte et tout ce qu'il envoit est redirigé vers le serveur.
Et réciproquement.

Une fois Eclipse lancé, allez dans le menu Window > Show View > Other.
Dans la boite de dialogue, entrez "TCP".


Dans le rectangle blanc, en haut, click droit "Properties".

Dans la nouvelle fenêtre, cliquez sur "Add".

Le "Local monitoring port" correspond au port d'écoute, sur lequel le client va se connecter.
La zone "Monitor" correspond au server vers lequel rediriger.

Vous pouvez choisir de démarrer ce port avec le lancement d'Eclipse (Start monitor automatically).

Il n'y a plus qu'à lancer votre serveur, puis votre client et admirer les requêtes apparaitre.

mardi 21 août 2012

Rechercher un élément récurcivement dans l'arbre DOM

Pour le fun, aujourd'hui, voici un code qui recherche un input à partir d'une balise.
La recherche se fait dans la balise pour dans les parents, jusqu'à arriver au document lui même (root.parentNode == null).
function chercherInput(nom, root) {
    // Remonte jusqu'a trouve l'input
    var allRows = root.getElementsByTagName('input') ;
    var item = null ;

    while ((root != null) && (item == null)) {
        for (var i = 0; i < allRows.length; i++) {
            if (allRows[i].name.match(nom) != null) {
                item = allRows[i] ;
                break ;
            }
        }

        root = root.parentNode ;
        allRows = root.getElementsByTagName('input') ;
    }

    return item ;  
}

function selectNumber(root) {
    var item = chercherInput('^toto\\[[0-9]+\\]\\.numero$', root) ;

    if (item != null) {
        item.value = 'coucou' ;
    }
}
Code HTML :
<div onclick="selectNumber(this)">Cliquez moi !</div>

vendredi 17 août 2012

Tuer une session utilisateur Oracle

SELECT s.username, s.machine, s.osuser, s.sid, s.serial#
  FROM v$session s, v$process p, sys.v_$sess_io si WHERE
  s.paddr = p.addr(+) AND
  si.sid(+) = s.sid AND
  s.type='USER' AND
  s.username='toto';
 
ALTER system KILL session 'session-id,session-serial'
Merci à Drazzib pour l'astuce.

mardi 14 août 2012

Connaitre le contexte applicatif d'un EAR

Rien de très technique, juste une petite astuce que j'ai indiqué à un débutant.
Celui-ci cherchait quelle URL mettre dans son navigateur pour appeler un WAR se trouvant dans un EAR.
Dans l'EAR, il y a un répertoire META-INF. Dedans, le fichier application.xml décrit le contexte de chaque module, donc l'URL du WAR.

jeudi 9 août 2012

Format de date dans un flux SOAP

Aujourd'hui, une personne cherchait via SOAPUI, a faire un appel à un WebService.
Un des paramètres d'entrée est une date.
Mais la personne ignorait le format pour une date en SOAP.

Tout d'abord, rappelons que le format de date/heure dans un flux SOAP se base sur le standard ISO 8601, sans toutefois supporter le format de base CCYYMMDDThhmmss.

Il faut se reporter au chapitre 4.5 de la norme ISO 8601 :
[-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]
Le Z signifie Zulu time (Z time) soit UTC.
Sinon, il est possible de spécifier le décalage horaire avec + ou -

Voici des exemples :
2001-10-26T21:32:52

// Heure Paris
2001-10-26T21:32:52+02:00

// UTC
2001-10-26T19:32:52Z

// Sans décalage mais pas UTC
2001-10-26T19:32:52+00:00

-2001-10-26T21:32:52

// Avec milliseconde
2001-10-26T21:32:52.12679

lundi 6 août 2012

Activer le suivi de lien symbolique dans JBoss

L'astuce du jour, est une petite astuce qui peut être pratique si vous effectuez une migration (exemple JBoss 3.5 vers JBoss 4.3).
Lors d'une migration de JBoss en version majeur, bien souvent, il y a des paramètres "cachés" ou du moins qu'on a jamais l'habitude de modifier qui change.
C'est ce qui m'est arrivé chez un client.

En effet, le WAR déployé, contenait des liens symboliques (donc sous Unix). En JBoss 3 pas de problème, mais en JBoss 4, problème.

Et oui, dans deploy/jboss-web.deployer/context.xml, un paramètre devait être modifié :
<Context cookies="true" crossContext="true" allowLinking="true">

vendredi 3 août 2012

Lister les sessions utilisateurs avec Oracle

Pour lister les sessions utilisateurs, connecter vous en administrateur sur Oracle et exécuter la requête suivante :
s.username utilisateur oracle de connexion à rechercher.
SELECT * FROM v$session s, v$process p, sys.v_$sess_io si WHERE
  s.paddr = p.addr(+) AND si.sid(+) = s.sid AND
  s.type='USER' AND
  s.username='toto'
ou
SELECT * FROM v$session s, v$process p, sys.v_$sess_io si WHERE
  s.paddr = p.addr(+) AND
  si.sid(+) = s.sid AND
  s.type='USER';
Merci à Drazzib pour l'astuce.