Publié le 23 Décembre 2011

Le problème du jour concerne les opérations arithmétiques en Java et plus particulièrement la division:

Commençons avec une question simple: Quel résultat imprime la ligne suivante:

System.out.println(1/4);

Facile pensez-vous, c'est 0.25. Et bien non tout faux: ça affiche 0.

Pourquoi ? Java ne sait pas faire une division aussi simple ? La JVM est buggée ?

Et bien non il faut juste lire la spec java car en fait la division est bien effectuée mais comme c'est une opération sur des int le résultat est également de type int, soit ici 0.

Pour avoir le résultat attendu il faut qu'au moins une des opérandes soit un float ou double, et donc le code devient:

System.out.println(1f/4); // f pour float

On tombe vite dans le piège (même quand on connaît le problème et surtout quand la formule est beaucoup plus complexe).

Voir les commentaires

Rédigé par Bliz

Publié dans #Java

Repost 0

Publié le 22 Décembre 2011

Je continue à jouer avec gnuplot et maintenant j'essaie de tracer des données en fonction du temps. 

Voilà mon fichier de données:

2011-12-01 399.95
2011-12-02 1217.50
2011-12-03 928.90
2011-12-04 956.95
2011-12-05 757.95
2011-12-06 782.95
2011-12-07 936.00
2011-12-08 938.50
2011-12-09 500.90
2011-12-10 1913.15
2011-12-11 963.00
2011-12-12 525.90
2011-12-13 1142.45
2011-12-14 430.95
2011-12-15 2158.00
2011-12-16 722.00
2011-12-17 996.00

Je veux tracer une valeur en fonction du temps.

Le problème c'est que gnuplot ne sait pas qu'il s'agit de date et donc il trace n'import quoi.

Et la solution alors ? Et bien il suffit de dire a gnuplot qu'il s'agit de date et de lui spécifier le format à utiliser. Ce qui ce fait de la manière suivante:

# gnuplot
gnuplot> set xdata time
gnuplot> set timefmt "%Y-%m-%d"
gnuplot> plot "mon_fichier.txt" using 1:2 with lines

On peut même modifier le format des dates afficher sur le graphe:

gnuplot> set format x "%d/%m" 

Voir les commentaires

Rédigé par Bliz

Publié dans #Gnuplot

Repost 0

Publié le 20 Décembre 2011

gnuplot est un outil sympa à utiliser en ligne de commande pour visualiser des données mais ce qui est tout aussi fort c'est qu'on peut l'utiliser depuis un script pour générer une image contenant le graphe.

Pour cela il faut entrer la liste des commandes gnuplot dans un fichier texte, qu'on appelera mon_graphe.conf:

set terminal png size 1200,800
set output "mon_graphe.png"
set grid
set xlabel "jour"
set ylabel "C.A. (euros)"
set title "C.A. journalier"
plot "mon_fichier.txt" using 1:2 with lines

Ensuite pour générer le fichier mon_graphe.png, on utilise la commande:

# cat mon_graphe.conf | gnuplot

Il est ensuite facile d'insérer cette commande dans un script shell.

Note: Ici le fichier "mon_fichier.txt" est le fichier contenant les données utilisées pour générer le graphe. C'est le même fichier que j'avais utilisé dans un article précédent.

Voir les commentaires

Rédigé par Bliz

Publié dans #Gnuplot

Repost 0

Publié le 19 Décembre 2011

Voilà un problème moins trivial que je le croyais! Je vous explique mon problème j'ai une table avec des enregistrements dont un des champs est une date et j'ai besoin d'effectuer une requête qui me donne la différence de temps entre 2 lignes (pas forcément consécutives). Vous me suivez ? non pas vraiment ...

Voilà à quoi ressemble ma table:

CREATE TABLE orders (
   id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
   dt DATETIME NOT NULL,
   customer_id INT(10) UNSIGNED NOT NULL,
   ....
   PRIMARY KEY(id)
);

J'ai besoin de calculer le temps écouler entre 2 commandes d'un clients. Dit comme ça, ça n'a pas l'air compliqué mais quand on commence à traduite ça en SQL ça fait mal!!

Comme il n'y a pas de lien direct entre les dates il va falloir faire une jointure de la table vers la table elle-même et ajouté une clause WHERE pour sélectionné la date de la commande précédente:

SELECT o.customer_id, po.id AS prev_id, o.id, po.dt AS prev_dt, o.dt, DATEDIFF( o.dt, po.dt ) AS diff_days
FROM orders o
JOIN orders po ON ( o.customer_id = po.customer_id ) 
WHERE po.id
IN (
   SELECT MAX( tmp.id ) 
   FROM orders tmp
   WHERE tmp.id < o.id
   AND tmp.customer_id = o.customer_id
); 

Voir les commentaires

Rédigé par Bliz

Publié dans #MySQL

Repost 0

Publié le 16 Décembre 2011

Curieusement je n'avais encore jamais utilisé gnuplot jusqu'à maintenant et j'ai été plutôt agréablement surpris par la facilité d'utilisation.

Tout d'abord il faut que le fichier de données soit à la mode csv (ou presque) - les données doivent être rangées par colonne séparées par des espaces (ou tabulation)

Comme par exemple ici:

1 399.95
2 1217.50
3 928.90
4 956.95
5 757.95
6 782.95
7 936.00
8 938.50
9 500.90
10 1913.95
11 963.00
12 525.90
13 1142.45
14 430.95
15 2158.00
16 722.00
17 996.00

ensuite pour lancer gnuplot il suffit de taper:

# gnuplot

ensuite pour générer un graphe:

gnuplot> plot "mon_fichier.txt" using 1:2 with lines

et une fenêtre apparaît avec le graphe!

Voilà un outil que je recommande pour visualiser rapidement des données.

Voir les commentaires

Rédigé par Bliz

Publié dans #Gnuplot

Repost 0

Publié le 14 Décembre 2011

La touche "imprime écran" permet de faire facilement une capture de l'affichage actuel. Cette touche effectue une copie de tout l'écran. On peut cependant limiter la capture à la fenêtre active en appuyant sur "Alt" + "Imprime écran".

Voilà une petite astuce qui peut éviter un peu de manipulation via Paint ou Gimp.

Voir les commentaires

Rédigé par Bliz

Repost 0

Publié le 9 Décembre 2011

J'ai essayé de changer les propriétés CSS de ce blog pour faire apparaître les blocs de code avec une couleur d'arrière-plan.

Le problème lorsque je spécifie une coleur d'arrière plan on dirait que les lignes du paragraphes sont surlignées avec la couleur que je voulais utilisée.

Moi je veux que tout le paragraphe apparaîsse comme un bloc avec une couleur de fond qui fasse tout le fond du paragraphe.

En fait il fallait préciser au CSS de traiter le paragraphe en mode "block" et non pas en mode "flow" (par défaut et qui donne l'effet de surlignage). Fallait juste le savoir.

Voir les commentaires

Rédigé par Bliz

Publié dans #CSS

Repost 0

Publié le 8 Décembre 2011

Suite à mon article sur l'exécution de commande à distance, j'ai rencontréun problème dans le cas où la commande distante ne se termine pas (par exemple pour démarrer une application genre serveur) et pourtant j'ai besoin de reprendre la main sur la machine locale.

Après avoir essayé de jouer avec les '&' et les 'nohup' sans succès, j'ai trouvé l'option -f de ssh qui permet de récupérer la main tout en plaçant la commande ssh en arrière plan:

# ssh -f remote_host "sleep 10"

me rend la main immediatement et si je fais regarde les process qui tourne:

# ps -ef | grep ssh
root     18947     1  0 12:12 ?        00:00:00 ssh -f remote_host sleep 10

puis il dispataît quand le sleep se termine sur la machine distante

Voir les commentaires

Rédigé par Bliz

Publié dans #SSH

Repost 0

Publié le 6 Décembre 2011

Les expressions régulières sont des outils très puissants pour analyser des chaînes de caractères.

En java elles sont très facilement utilisable pour parser une chaîne de caractères et en extraire des valeurs.

Dans cette exemple nous allons extraire les URLs des images d'une page HTML:

package com.over-blog.patatos.sample;

import java.util.regex.Matcher;
import java.util.regex.Pattern; 

public class RegExParsingSample{

   public static void main(String[] args){
      // On place directement le html dans une String mais on pourrait le charger à partir d'une URL
      String html = "<html><header><title>Parsing with Regular Expression</title></head><body>bla bla bla<img src=\"images/bliz.png\"/>bla bla bla <img src=\"images/patatos.png\"/></body></html>";
      // on cherche les caractères src=" puis on récupère tout ce qui n'est pas un "([^"]) juqu'au prochain "
      Matcher matcher = Pattern.compile("src=\"([^\"]*)\"").matcher(html);
      while(matcher.find()){
         System.out.println("image: "+matcher.group(1));
      }
   }

On obtient lors de l'éxecution:

image: images/bliz.png
image: images/patatos.png 

Il faut bien noter que les éléments que l'on veut récupérer (les groupes) doivent être placer entre parenthèses dans l'expression régulière. 

Voir les commentaires

Rédigé par Bliz

Publié dans #Java

Repost 0

Publié le 1 Décembre 2011

L'affichage d'un nombre peut vite devenir complexe si on commence à devoir gérer les arrondis, le nombre de chiffre après la virgule, ...

Heureusement en java il existe la classe java.text.DecimalFormat qui permet de convertir un nombre en String et vice versa.

Son utilisation se base sur un pattern qui représente le fomat à utiliser. Ainsi pour utiliser un nombre au format "monétaire" c'est à dire toujours 2 chiffres après la virgule on utilisera le pattern"#.00".

Le # rerpèsent un digit optionel (omis si pas nécessaire) alors que le 0 représente un digit qui sera toujour affiché. Dans notre cas on affichera 1.00 même si la valeur est 1.


Mais passons tout de suite à un petit exemple:

package com.over-blog.patatos.utils.exemples;

import java.text.DecimalFormat;

public class DecimalFormatExemple{

   public static void main(String[] args) throws Exception{

        DecimalFormat format = new DecimalFormat("#.00");
       
        // number to string
        System.out.println("$ : "+format.format(143.5));
       
        // string to number
        String montantTexte = "17.O0";
        int montant = format.parse(montantTexte).intValue();
        System.out.println("€ : "+montant);

   }


}

Ce qui donne lors de l'exécution :

$ : 143.50
€ : 17

Voir les commentaires

Rédigé par Bliz

Publié dans #Java

Repost 0