Publié le 31 Mai 2011

Depuis java 1.5 il est possible de définir une méthode avec un nombre variable de paramètres: les varargs.

Cette technique a été introduite notamment pour bénéficier d'une méthode printf().

 

Avant il fallait définir un tableau contenant tous les paramètres à passer à la méthode, puis passer le tableau comme argument à cette méthode.

 

Maintenant le tableau est générer directement par le compilateur ce qui simplifie les appels de fonctions.

Par contre dans le corps de la méthode il faut manipuler le tableau pour récupérer les paramètres.

 

public void printByLine(String... args){
   //le vararg "args" est ensuite disponible sour forme de tableau dans la méthode
   for(String arg:args){
      System.out.println(arg);
   }

}

 

Ainsi on peut appeler cette méthode ainsi:

 

printByLine("ligne0");

printByLine("ligne1", "ligne2", "ligne3", "ligne4", "ligne5");

 

Bref on peut mettre autant de paramètres qu'on veut. Cool, non ?

Voir les commentaires

Rédigé par Bliz

Publié dans #Java

Repost 0

Publié le 30 Mai 2011

Avec MySQL la valeur NULL est particulière et a parfois un comportement inattendu.

 

Par exemple si je prends un table avec un champ ayant des valeurs NULL.

 

Pour faire simple la table suivante:

 

CREATE TABLE noms(
   nom VARCHAR(45)
);

 

avec les données suivantes:

 

nom
Bliz

Patatos

NULL
NULL
Patatos

 

Maintenant comptons les lignes ayant pour nom  'Patatos':

 

SELECT count(*) FROM noms WHERE nom = 'Patatos';

 

On obtient 2. Jusque là tout va bien.

 

Maintenant comptons les autres lignes :

 

SELECT count(*) FROM noms WHERE nom <> 'Patatos';

 

Et là surprise on obtient 1 (et non 3)!!

 

Bien sûr il y a une explication:

MySQL écarte automatiquement les valeurs NULL avant de faire une comparaison.

 

Et c'est là qu'intervient la fonction COALESCE qui permet de remplacer NULL par une valeur donnée.

 

Pour reprendre la dernière requête:

 

SELECT count(*) FROM noms WHERE coalesce(nom, 'sans nom') <> 'Patatos';

 

Et là on obtient bien 3! Ouf!!

Voir les commentaires

Rédigé par Bliz

Publié dans #MySQL

Repost 0

Publié le 28 Mai 2011

Depuis 2 jours Skype plante après quelque secondes sous Ubuntu.

 

Quand je le lance depuis un terminal j'obtiens les erreurs suivantes:

 

/usr/lib/gtk-2.0/2.10.0/menuproxies/libappmenu.so: wrong ELF class: ELFCLASS64

(<unknown>:31662): Gtk-WARNING **: Failed to load type module: /usr/lib/gtk-2.0/2.10.0/menuproxies/libappmenu.so

/usr/lib/gtk-2.0/2.10.0/menuproxies/libappmenu.so: wrong ELF class: ELFCLASS64

(<unknown>:31662): Gtk-WARNING **: Failed to load type module: /usr/lib/gtk-2.0/2.10.0/menuproxies/libappmenu.so


(<unknown>:31662): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-ibus.so: wrong ELF class: ELFCLASS64

(<unknown>:31662): Gtk-WARNING **: Loading IM context type 'ibus' failed

(<unknown>:31662): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-ibus.so: wrong ELF class: ELFCLASS64

(<unknown>:31662): Gtk-WARNING **: Loading IM context type 'ibus' failed
/usr/lib/gtk-2.0/2.10.0/menuproxies/libappmenu.so: wrong ELF class: ELFCLASS64

(<unknown>:31662): Gtk-WARNING **: Failed to load type module: /usr/lib/gtk-2.0/2.10.0/menuproxies/libappmenu.so

/usr/lib/gtk-2.0/2.10.0/menuproxies/libappmenu.so: wrong ELF class: ELFCLASS64

(<unknown>:31662): Gtk-WARNING **: Failed to load type module: /usr/lib/gtk-2.0/2.10.0/menuproxies/libappmenu.so


(<unknown>:31662): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-ibus.so: wrong ELF class: ELFCLASS64

(<unknown>:31662): Gtk-WARNING **: Loading IM context type 'ibus' failed
Aborted

 

Après un petit tour sur le net, le problème vient du fichier ~/.Skype/shared.xml qui est, en quelque sorte, corrompu.

 

La solution:

Supprimer le fichier ~/.Skype/shared.xml et relancer skype. (Pas d'inquiétude ce fichier ne contient pas l'historique des conversations).

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux

Repost 0

Publié le 27 Mai 2011

Il est souvent intéressant de savoir quand une ligne a été mise à jour dans une base de données.

 

Une approche simple consiste à ajouter un champ 'update_time' à la table et à le mettre à jour dans chaque requête qui va modifier les données.

 

C'est une possibilité mais cela implique d'inclure cette mise à jour à chaque endroit de l'application qui va effectuer une mise à jour de la table.

 

C'est d'autant plus fastidieux que la table est mise à jour depuis plusieurs endroits (plus ou moins accessible).

 

Heueusement MySQL fournit un moyen de mettre à jour automatiquement un champ 'update_time' à chaque modification de ligne.

 

Pour se  faire il faut ajouter une clause ON UPDATE dans la déclaration du champ update_time. Ce qui peut se faire dans un CREATE TABLE lors de la création de la table ou ultérieurement avec un ALTER TABLE.

 

Par exemple pour une table contenant des coordonnées clients on pourra utiliser le CREATE TABLE suivant:

 

CREATE TABLE clients(
   nom VARCHAR(45) NOT NULL,
   prenom VARCHAR(45),
   adresse VARCHAR(100),
   ville VARCHAR(45),
   update_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

 

Maintenant, par exemple, si un client déménage on met à jour son adresse avec la requête suivante:

 

UPDATE clients SET adresse='ma nouvelle adresse' WHERE nom='dupont';

 

alors le champ update_time sera automatiquement mis à jour avec le timestamp au moment de l'exécution de la requête.

 

Magique, non ?

Voir les commentaires

Rédigé par Bliz

Publié dans #MySQL

Repost 0

Publié le 26 Mai 2011

Autant être clair dès le début, cette fonctionnalité n'est pas (encore) présente dans MySQL.

 

Mais heureusement avec une requête SQL bien sentie un peu obtenir un résultat similaire.

 

Je vais partir d'une table qui contient les mêmes données que dans mon article concernant les tableaux croisés dynamique sous Excel à savoir:

 

Table ventes

mois client montant
janvier M.A. 2045
janvier M.A. 123
janvier B.H. 1034
janvier N.S. 765
janvier C.G. 34
janvier E.B. 983
fevrier M.A. 678
fevrier

B.H.

1254
fevrier N.S. 98
fevrier C.G. 459
fevrier E.B. 2451
février S.R. 34
mars B.H. 763
mars C.G. 896
mars E.B. 1439
mars S.R. 2392
mars S.R. 25

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

et le but est d'arriver au même résultat que sous excel:

 

+--------+---------+---------+------+
| client | janvier | fevrier | mars |
+--------+---------+---------+------+
| B.H    |    1034 |    1254 |  763 |
| C.G    |      34 |     459 |  896 |
| E.B    |     983 |    2451 | 1439 |
| M.A    |    2168 |     678 |    0 |
| N.S    |     765 |      98 |    0 |
| S.R    |       0 |      34 | 2417 |
+--------+---------+---------+------+

 

et pour y arriver voici la requête magique:

 

SELECT
   client,
   SUM(IF(mois = 'janvier', montant, 0)) AS janvier,
   SUM(IF(mois = 'fevrier', montant, 0)) AS fevrier,
   SUM(IF(mois = 'mars', montant, 0)) AS mars
FROM ventes
GROUP BY client;

 

Et oui grâce aux instructions IF on compte les ventes par mois (ce qui nous donne les différentes colonnes) et le GROUP BY permet de compter par client, ce qui nous donne bien le même résultat que sous Excel.

Voir les commentaires

Rédigé par Bliz

Publié dans #MySQL

Repost 0

Publié le 25 Mai 2011

Le but d'un tableau croisé dynamique est de transformer des données linéaires comme ci-dessous:

 

donnees-tableau-croise-dynamique

 

en un tableau à double entrées (ou plus) comme ceci:

 

tableau-croise-dynamique

 

Sous Excel la réalisation d'un tableau (ou graphique) croisée dynamique est assez simple.

 

Il faut aller dans Insertion > Tableau croisé dynamique (ou graphique croisée dynamique - selon qu'on désire un tableau ou un graphe)

 

Après avoir choisi un emplacement on obtient le panneau d'option suivant:

 

option-tableau-croise-dynamique

 

Là c'est assez intuitif:

- on définit les colonnes en plaçant les mois dans la case 'étiquettes de colonnes' par simple glisser-déposer

- puis les lignes en plaçant les clients dans la case 'étiquettes de lignes'

- et enfin les mventes dans la case 'valeurs'

 

Et la on pourrait croire que c'est fini mais il faut bien préciser qu'on veut les sommes des ventes.

Il faut alors cliquer sur 'Nombre de Ventes' dans la case 'valeurs' et sélectionner 'Paramètres des champs de valeurs...' puis choisir 'Somme' dans la liste proposé.

 

Et là c'est bon on a bien la somme des ventes par client et par mois.

Voir les commentaires

Rédigé par Bliz

Publié dans #Office

Repost 0

Publié le 24 Mai 2011

Lors du développement d'application web, on doit souvent recharger la même page dans son navigateur.

Mais souvent le code a changé depuis le dernier affichage de la page et un simple refresh (F5) utilise le cache du navigateur qui correspond à une version antérieur de ce qu'on pense tester.

 

Heueusement la touche Ctrl vient à la rescousse. En effet Ctrl+F5 permet de recharger la page sans utiliser le cache: tout est donc rechargé depuis le serveur - ce qui en phase de dév signifie qu'on récupère bien la dernière version.

 

ça n'a l'air de rien comme ça mais j'ai déjà rencontré (assez souvent même) des problèmes liés à l'utilisation du cache qui entrainait des comportement étrange, notamment avec flash et GWT.

 

Et cerise sur le gâteau ce raccourci fonctionne aussi bien sous Firefox qu'Internet Explorer!

Voir les commentaires

Rédigé par Bliz

Publié dans #Php

Repost 0

Publié le 23 Mai 2011

Sous eclipse il y a un raccourci très pratique : ctrl+shift+X puis M.

 

Pour fonctionner il faut avoir le plugin m2eclipse installé et configuré le build maven du projet.

 

Pour cela:

- clic-droit sur le projet puis choisir Run As > Maven build ... (bien celui choisir qui se termine par '...')

- configurer le build en renseignant les Goals Maven

- cliquer sur Run ou Apply

 

Et voilà le raccourci pour lancer le build Maven fonctionne.

Voir les commentaires

Rédigé par Bliz

Publié dans #Eclipse

Repost 0

Publié le 20 Mai 2011

Aujourd'hui voici encore une astuce qui fonctionne en ligne de commande sous linux.

Elle concerne la commande sed (pour stream editor).

C'est une commande très puissante pour la recherche/remplacement de caractères mais ça syntaxe n'est pas vraiment intuitive.

 

Voici donc comment remplacer des caractères dans un fichier:

 

sed 's/<regexp>/<remplacement>/' <fichier>

 

Par exemple pour remplacer tous les caractères '$' par '€' il faut utiliser la commande:

 

sed 's/\$/€/' mon_fichier.txt > mon_fichier_en_euro.txt

 

Note: On utilise '\$' car $ est un caractère spécial dans les expressions régulières.

 

Si le fichier contient plusieurs '$' par ligne on remarque que seuls la première occurence de chaque ligne a été modifiée.

 

Pour modifier toutes les occurences il faut ajouter un 'g' après le dernier '/', ce qui donne;

 

sed 's/\$/€/g' mon_fichier.txt > mon_fichier_en_euro.txt

 

Petit bonus pour finir:

Jusqu'à présent je n'ai pas modifier le fichier original, j'ai simplement écrit le résultat dans un nouveau fichier.

 

Et bien sed permet de modifier directement le fichier original avec l'option -i:

 

sed -i 's/\$/€/g' mon_fichier.txt

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux

Repost 0

Publié le 19 Mai 2011

Pour compléter l'article précédent, voici une commande nettement plus puissante que cut: awk.

 

awk permet de sélectionner certaines colonnes (comme cut) mais permet nettement plus de choses:

 

On peut changer l'order des colonnes, changer les séparateurs (y compris utiliser différents séparateurs), insérer des caractères, faire des calculs à la volée, etc

 

Et encore cet article ne présente qu'une petite partie des capacités de awk.

 

Mais il y a une contre-partie, la syntaxe de la commande awk est également plus complexe.

Heueusement l'usage présenté ici reste assez simple.

 

Passons à la pratique:

 

Tout d'abord mon fichier csv a le format suivant:

nom,prénom,adresse,code postal, ville, achat du mois dernier, achat du mois en cours

 

En sortie je veux avoir le format suivant:

personne,adresse compléte, achat du mois en cours

 

Et voici la commande qui permet d'effectuer ceci

 

cat mes_donnees.csv | awk -F"," '{print $1 " " $2 "," $3 " " $4 " " $5 ","  $7}'

 

Alors quelques explication:

- l'option '-F' permet de spécifier le séparateur de champ

- avec la commande print on demande à awk d'afficher une ligne avec les champs lus en entrée.

- le $ permet de récupérer les champs ainsi $1 pour le nom, $2 pour le prénom, etc. Comme on ne veut pas les achats du mois dernier il n'y a pas de $6.

- il faut réécrire les séparateurs entre les champs. C'est plus lourd au niveau syntaxe mais ça permet également de combiner des champs. Ici on réunit nom et prénom dans un seul champ en affichant  un espace entre $1 et $2 (au lieu d'une virgule).

 

Pour finir une petite cerise sur le gâteau, awk permet également de calculer de nouveau champs à la volée.

 

Par exemple si je veux avoir le pourcentage d'augmentation des ventes par rapport au mois précedent:

 

cat mes_donnees.csv | awk -F"," '{print $1 " " $2 "," $3 " " $4 " " $5 ","  (($7-$6)*100/$6) "%"}'

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux

Repost 0