JRebel m2e connector

By , 08/02/2013

Le connecteur m2e de JRebel ne s’installe plus à partir du marketplace eclipse. Pour l’installer il faut passer par la mise à jour manuelle. Dans les menus de l’IDE : Help -> Install New software…

Le site d’update est : http://update.zeroturnaround.com/update-site. Le plugin à installer : JRebel m2eclipse.

JSF Charts : graphiques avec JSF

By , 31/01/2013

Cela fait longtemps que je souhaite consacrer un article sur les graphiques en JSF. Après avoir essayé plusieurs solutions je n’ai été convaincu par aucune librairie. Il me semble que la plus intéressante est la solution proposée par PrimeFaces. Ce que je n’aime pas dans cette approche c’est d’utiliser les classes spécifiques de la librairie JSF pour décrire les séries et non des collections simples. De plus, je ne trouve pas les graphiques très dynamiques. En tout cas pas à la hauteur des librairies Javascripts ou Flex qui existent actuellement.

Deux librairies Javascipts me semblent très performantes d’un point de vue utilisateur et développeur :

  • amCharts :
    • graphiques dynamiques, diversifiés, professionnels
    • licence gratuite
  • Highchart :
    • graphiques dynamiques, diversifiés, professionnels
    • approche déclarative des graphiques
    • licence nécessaire selon le type d’utilisation

C’est l’approche déclarative des graphiques qui m’a convaincue de la fiabilité d’une librairie JSF basée sur Hightchart. On retrouve le même principe déclaratif dans les interfaces xhtml proposées par JSF. Je me suis donc lancé dans la création de cette librairie qui est un wrapper JSF de Highchart : jsfcharts. La demo ce trouve hébergée ici : http://showcase-jsfcharts.rhcloud.com/home.jsf.

Mon objectif : proposer une solution efficace à développer, agréable à utiliser et compatible avec plusieurs systèmes (PC, mobile, multi-navigateurs). C’est à dire :

  • Rapide : peu de lignes à coder
  • Simple :
    • objets simples sans préparation
    • Utilisation transparente de la librairie

Au final, créer un graphique dynamique en JSF est presque aussi simple que créer un tableau (h:dataTable). Par exemple, pour le graphique ci-dessous, il faut écrire ce fichier xhtml et cette classe java :

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:jsfcharts="http://everythingiswrong.org/jsfcharts"
   template="/WEB-INF/templates/default.xhtml">
   <ui:define name="content">
       <jsfcharts:chart id="test" marginRight="130" marginBottom="25">
          <jsfcharts:title text="Monthly Average Temperature" />
          <jsfcharts:subtitle text="Source: WorldClimate.com" />
          <jsfcharts:xAxis categories="#{chartBean.abscisse}" />
          <jsfcharts:yAxis>
          <jsfcharts:title text="Temperature (˚C)" />
          </jsfcharts:yAxis>
          <jsfcharts:legend layout="vertical" align="right" verticalAlign="top" x="-10" y="100" borderWidth="0"/>
          <jsfcharts:tooltip valueSuffix="˚C" />
          <jsfcharts:series>
              <jsfcharts:serie label="Tokyo" value="#{chartBean.tokyo}" />
              <jsfcharts:serie label="New York" value="#{chartBean.newYork}" />
              <jsfcharts:serie label="Berlin" value="#{chartBean.berlin}" />
              <jsfcharts:serie label="London" value="#{chartBean.london}" />
          </jsfcharts:series>
       </jsfcharts:chart>
...
</ui:composition>
package org.everythingiswrong.jsf.jsfchartsdemo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.inject.Model;

@Model
public class ChartBean {

   private Double[] tokyo;
   private Double[] newYork;
   private Double[] berlin;
   private Double[] london;
   private List<String> abscisse;

   // Getter, Setter  ...

   @PostConstruct
   public void initialize() {
      tokyo = new Double[] {7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6};
      newYork = new Double[] {-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5};
      berlin = new Double[] {-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0};
      london = new Double[] {3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8};
      abscisse = Arrays.asList(new String[] {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"});
   }
}

Pour aller plus loin, je vous invite à visiter le projet github de JSFCharts : https://github.com/yanLanglois/jsfcharts.

Oracle : Noms des objets sensibles à la casse

By , 11/01/2013

Par défaut Oracle enregistre tous les noms des objets en majuscule sauf s’ils ont été créés avec des guillemets. Dans ce cas le nom de l’objet est sensible à la casse. Par exemple :

SQL> create table "bob" (a number);

Table created.

SQL> select * from bob;
select * from bob
              *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select * from "bob";

no rows selected

Attention ! Certains logiciels SQL (SQLDevlopper par exemple) créent toutes leurs requêtes avec des guillemets lorsque l’on demande des actions (insertions, modifications, créations, etc.) sur les bases de données via les menus contextuels.

Sources :

Oracle : Supprimer toutes les tables d’un schéma

By , 14/12/2012

Voici un petit script PLSQL pour supprimer toutes les tables d’un schéma d’une base de données Oracle. Il s’agit de créer un curseur implicite sur la liste des tables de l’utilisateur sans prendre en compte les tables de la corbeille. Puis de boucler sur cette liste afin d’exécuter la commande de suppression de chaque table sans oublier toutes ses contraintes :

BEGIN
    FOR c IN (SELECT object_name,
                     object_type
              FROM user_objects
              WHERE object_type IN ('TABLE') AND object_name NOT LIKE '%$%') LOOP
        EXECUTE IMMEDIATE 'DROP '
                             || c.object_type || ' "'
                             || c.object_name || '" CASCADE CONSTRAINTS';
    END LOOP;
END;

Ce script peut être adapté pour supprimer d’autres types d’objet comme des vues. Pour cela, modifier TABLE en VIEW.

CentOs : iptables activé par défaut

By , 20/11/2012

Après avoir installé une distribution CentOs 6 dans une machine virtuelle (virtualbox), je me suis rendu compte que je n’arrivais pas à accéder aux services de la machine virtualisée depuis la machine hôte.

Après plusieurs essais sur la configuration du réseaux dans les menus de virtualbox, je me rends à l’évidence : je ne comprends pas ce qu’il se passe… J’ai bien enregistré le mode d’accès au réseau en tant que “accès par pont”. Grâce à cela la machine hôte et la machine virtualisée se retrouvent bien sur le même réseau avec une adresse IP différente l’une de l’autre.

Enfin, je regarde si CentOs n’intègre pas par défaut un firewall. Là : surprise, en effet, la commande iptables -L me renvoie des règles avec des lignes préfixées par le mot REJECTED… Ni une ni deux, je lance la commande service iptables status pour vérifier que le service en question fonctionne, suivit de la commande service iptables stop pour l’arrêter.

Depuis, plus de problème pour me connecter sur les services de la machine virtualisée à partir de la machine hôte…

CentOs : Installer GNOME

By , 20/10/2012

Pour installer GNOME sur une distribution CentOs 6 avec yum :

yum grouplist
yum groupinstall basic-desktop desktop-platform x11 fonts
yum groupinstall "X Window System" "GNOME Desktop Environment"

Modifier le fichier de configuration /etc/inittab pour que GNOME se lance au démarrage :

La ligne id:3:initdefault: devient id:5:initdefault:

startx ou init 6 pour redémarrer la machine

CSS: Center horizontalement

By , 01/10/2012

Pour centrer horizontalement une box en CSS, il faut utiliser la propriété margin :

center {
       border : 1px dashed black;
       margin : 0 auto;
       width : 50%;
}

Par exemple :

Voici un élément div centré horizontalement.

Configuration : FoxyProxy et I2P

By , 29/09/2012

Voici une configuration de FoxyProxy qui fonctionne bien pour naviguer sur I2P :

  • Adresse du proxy : 127.0.0.1
  • Port du proxy : 4444
  • Proxy SOCKS : décoché
  • Motif de l’URL : *.i2p/*
    • URL autorisées/exclues : Liste blanche
    • Format du motif : Jokers

JBoss 7 : Datasources dans un WAR

By , 28/09/2012

Avec JBoss 7, il est possible de déclarer une datasource JNDI dans une archive WAR. Pour cela, il faut déposer un fichier ma-datasource-ds.xml dans le répertoire WEB-INF avec la déclaration de la source de données. Par exemple :

<?xml version="1.0" encoding="UTF-8"?>

<datasources xmlns="http://www.jboss.org/ironjacamar/schema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.jboss.org/ironjacamar/schema http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd">
   <!-- The datasource is bound into JNDI at this location. We reference
      this in META-INF/persistence.xml -->
   <datasource jndi-name="java:jboss/datasources/maDS"
          pool-name="mysqlds"
          enabled="true"
          use-java-context="true">
      <connection-url>jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=UTF-8</connection-url>
      <driver>mysql</driver>
      <security>
         <user-name>root</user-name>
         <password>123456</password>
      </security>
   </datasource>
</datasources>

La valeur de l’élément driver, est le nom du driver installé sur le serveur. Pour l’installer, il est possible de copier le jar dans le répertoire de déploiement du serveur (cp mysql.jar <as7>/standalone/deployments).

Sources : https://community.jboss.org/thread/204245, https://community.jboss.org/wiki/DataSourceConfigurationInAS7, https://github.com/abstractj/as-quickstarts/blob/40f8cae2ce9388151e1a07f743df74e59c7848bc/kitchensink-html5-mobile/src/test/resources/arquillian-ds.xml

Oracle : Connaitre la taille d’une table en Mo

By , 07/09/2012

Pour connaître la taille utile d’une table d’une base de données oracle il faut se baser sur le nombre de blocs de la table et le multiplier par la taille d’un bloc. La taille utile est la taille exacte de la table. Cela ne prendre pas en compte les blocs vides occupés par la table qui proviendraient d’une fragmentation de la base de données.

    select
        user_tables.table_name,
        user_tablespaces.tablespace_name,
        user_tablespaces.block_size,
        user_tables.blocks,
        user_tablespaces.block_size * user_tables.blocks / 1024 / 1024
            as "Taille Mb"
    from user_tables, user_tablespaces
    where
        user_tables.tablespace_name = user_tablespaces.tablespace_name
    order by "Taille Mb" desc

OfficeFolders theme by Themocracy