Friday, October 12, 2012

Patron : Fabrique abstraite (Abstract Factory)

Le patron fabrique abstraite est de type création.

Il se base sur la patron fabrique mais ajoute une couche d'abstraction de plus. Ce patron permet de regrouper des fabriques qui ont un theme commun sans spécifier les classes concretes.



Dans le code ci-dessous, voit qu'il y a 2 fabriques qui font plus ou moins la meme chose. Alors on les regroupe et on crée la classe AbstractFactoryGuerrier.
On peut constater que dans la classe Jeu, on ne spécifie jamais "new Katana()" car la responsabilité de créer un katana se trouve dans la fabrique.



Jeu.java
public class Jeu {

 public static void main(String[] args) {
  Jeu jeu = new Jeu();
  jeu.jouer();
 }
 
 public void jouer() {
  AbstractFactoryGuerrier factory = createFactory("Lancelot");
  preparerArme(factory);
  preparerArmure(factory);
  
  factory = createFactory("Musashi");
  preparerArme(factory);
  preparerArmure(factory);
 }
 
 // on cree la factory correspondante au "type" recu en parametre
 public AbstractFactoryGuerrier createFactory(String type) {
  System.out.println("\n   Factory pour " + type);
  
  if("Lancelot".equals(type))
   return new FactoryChevalier();
  else
   return new FactorySamourai();
 }
 
 // on prepare une arme (que ce soit une epee ou un katana)
 public void preparerArme(AbstractFactoryGuerrier factory) {
  Arme arme = factory.creerArme();
  arme.attaquer();
 }
 
 // on prepare une armure (que ce soit une cuirasse ou une yoroi)
 public void preparerArmure(AbstractFactoryGuerrier factory) {
  Armure armure = factory.creerArmure();
  armure.proteger();
 }
}
AbstractFactoryGuerrier.java
abstract class AbstractFactoryGuerrier {
 abstract Armure creerArmure();
 abstract Arme creerArme();
}
FactoryChevalier.java
public class FactoryChevalier extends AbstractFactoryGuerrier{
 Armure creerArmure() {
  return new Cuirasse();
 }

 Arme creerArme() {
  return new Epee();
 }
}
FactorySamourai.java
public class FactorySamourai extends AbstractFactoryGuerrier{
 Armure creerArmure() {
  return new Yoroi();
 }

 Arme creerArme() {
  return new Katana();
 }
}
Arme.java
abstract class Arme {
 abstract void attaquer();
}
Epee.java
public class Epee extends Arme{
 void attaquer() {
  System.out.println("Epee pour transperser les armures");
 }
}
Katana.java
public class Katana extends Arme{
 void attaquer() {
  System.out.println("Katana tranche un cheveu en deux");
 }
}
Armure.java
abstract class Armure {
 abstract void proteger();
}
Cuirasse.java
public class Cuirasse extends Armure{
 void proteger() {
  System.out.println("Cuirasse lourde mais protectrice");
 }
}
Yoroi.java
public class Yoroi extends Armure{
 void proteger() {
  System.out.println("Yoroi souple qui permet de se déplacer facilement");
 }
}


Et le résultat de l'éxecution:
Factory pour Lancelot
Epee pour transperser les armures
Cuirasse lourde mais protectrice 

Factory pour Musashi
Katana tranche un cheveu en deux
Yoroi souple qui permet de se déplacer facilement

Thursday, October 11, 2012

Patron : Prototype


Le patron prototype est de type création.
Il est utilisé lorsque la création d'un objet est complexe et consommatrice de temps. Pour cela, on crée juste une instance et on la clone.
Le fait de ne pas utiliser de "new Xxx()" et d'initialiser des propriétés fait gagner beaucoup de temps.

Admettons que nous sommes Saroumane et on veut construire une armée de monstres (orques et wargs) le plus rapidement possible pour combattre Sauron.
On peut faire naitre des orques ("Montre x = new Monstre()") mais cela prendrait beaucoup de temps, car on devra attendre qu'ils atteignent l'age adulte pour pouvoir se battre.
L'autre solution, et de prendre l'orque le plus fort et de le cloner! C'est beaucoup plus rapide!


Ici, la classe Monstre est une sous-classe de Cloneable et doit posséder une fonction "clone()".

Magicien.java
import java.util.ArrayList;
import java.util.Iterator;

public class Magicien {
 public static void main(String[] args) {
  Magicien saroumane = new Magicien();
  saroumane.construireArmee();
 }
 
 public Magicien() { }
 
 public void construireArmee() {
  Monstre orque = new Orque();
  orque.setName("Chef orque");
  Monstre warg = new Warg();
  orque.setName("Chef warg");
  
  Monstre monstreCloned;
  ArrayList armee = new ArrayList();
  
  // on va creer 10 soldats : 5 orques et 5 wargs
  for(int i = 0; i < 10; i++) {
   if(i%2 == 0) {
    monstreCloned = orque.clone();
    monstreCloned.setName("soldat orque " + i);
   } else {
    monstreCloned = warg.clone();
    monstreCloned.setName("soldat warg " + i);
   }
   
   armee.add(monstreCloned);
  }
  
  Iterator it =  armee.iterator();
  
  while(it.hasNext()){
   monstreCloned = it.next();
   System.out.println(monstreCloned.getName());
  }
 }
}
//ignorer les 3 balises ci-dessous
Monstre.java
public abstract class Monstre implements Cloneable{
 protected String name;
 
 public Monstre clone() {
  try {
   Monstre clone = (Monstre)super.clone();
   clone.name = this.name;
   return clone;
  } catch (CloneNotSupportedException e){
   return null;
  }
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }
}
Orque.java
public class Orque extends Monstre{ }

Warg.java
public class Warg extends Monstre{ }


Le résultat de l'execution est:

soldat orque 0
soldat warg 1
soldat orque 2
soldat warg 3
soldat orque 4
soldat warg 5
soldat orque 6
soldat warg 7
soldat orque 8
soldat warg 9

Et voila, maintenant Saroumane est prêt à partir en guerre!

Wednesday, October 10, 2012

Patron : Monteur (Builder)

Le patron monteur (builder en anglais) est de type création.

Ce patron à pour but de séparer la construction d'un objet complexe de sa representation. Ainsi le meme processus de création peut créer d'autres representations.

En gros, cela veut dire que la classe qui construit l'objet n'est pas la même que la classe qui utilise l'objet.
Voici le diagramme UML provenant de Wikipedia.

Voici le diagramme UML de l'exemple utilisé ci-dessous.


Ici on peut imaginer Asterix qui veut une potion magique. Alors il demande au druide Panoramix de lui préparer.
Asterix n'a aucune idée de la preparation de la potion magique.
Attention, car dans Asterix et le coup du menhir, Panoramix est devenu fou et il a créé une potion qui fait voler les gens.

Voici le code.

Jeu.java
public class Jeu {
 
 public static void main(String[] args) {
  Jeu jeu = new Jeu();
  jeu.jouer();
 }
 
 public Jeu() { }
 
 public void jouer() {
  Recette builderPotionMagique = new RecettePotionMagique();
  Druide panoramix = new Druide(builderPotionMagique);
  
  panoramix.preparerPotion();
  
  Potion potionMagique = panoramix.getPotion();
  System.out.print("Potion magique -> ");
  potionMagique.afficherListeIngredients();
  
  Recette builderPotionVolante = new RecettePotionVolante();
  Druide panoramixFou = new Druide(builderPotionVolante);
  // Asterix et le coup du menhir
  panoramixFou.preparerPotion();
  Potion potionVolante = panoramixFou.getPotion();
  System.out.print("Potion volante -> ");
  potionVolante.afficherListeIngredients();
 }
}
Druide.java
C'est cette classe qui contient les étapes de créations de l'objet Potion.
public class Druide {
 private Recette recette;
 
 public Druide(Recette recette) {
  this.recette = recette;
 }
 
 public Potion getPotion() {
  return recette.getPotion();
 }
 
 public void preparerPotion() {
  recette.ajouterHerbe();
  recette.ajouterHomard();
  recette.ajouterCarotte();
  recette.ajouterSel();
  recette.ajouterPoisson();
 }
}
Recette.java
public abstract class Recette {
 public abstract Potion getPotion();
 public abstract void ajouterHerbe();
 public abstract void ajouterHomard();
 public abstract void ajouterCarotte();
 public abstract void ajouterSel();
 public abstract void ajouterPoisson();
}
RecettePotionMagique.java
Cette classe contient les quantités exactes des ingrédients nécessaires pour faire une potion magique.
public class RecettePotionMagique extends Recette {
 private Potion potion;
 
 public RecettePotionMagique() {
  potion = new Potion();
 }
 
 public Potion getPotion() {
  return potion;
 }
 
 public void ajouterHerbe() {
  potion.setHerbe("3 brindilles");
 }

 public void ajouterHomard() {
  potion.setHomard("1 homard");
 }

 public void ajouterCarotte() {
  potion.setCarotte("2 carottes");
 }

 public void ajouterSel() {
  potion.setSel("3 pincés");
 }

 public void ajouterPoisson() {
  potion.setPoisson("1 poisson frais");
 }
}
RecettePotionVolante.java
public class RecettePotionVolante extends Recette {
 private Potion potion;
 
 public RecettePotionVolante() {
  potion = new Potion();
 }
 
 public Potion getPotion() {
  return potion;
 }
 
 public void ajouterHerbe() {
  potion.setHerbe("1 brindille");
 }

 public void ajouterHomard() {
  potion.setHomard("3 homard");
 }

 public void ajouterCarotte() {
  potion.setCarotte("4 carottes");
 }

 public void ajouterSel() {
  potion.setSel("1 pincés");
 }

 public void ajouterPoisson() {
  potion.setPoisson("2 poissons pas frais");
 }
}
Potion.java
Cette classe est le produit qui sera créé.
public class Potion {
 private String herbe;
 private String homard;
 private String carotte;
 private String sel;
 private String poisson;
 
 public void setHerbe(String herbe) {
  this.herbe = herbe;
 }
 public void setHomard(String homard) {
  this.homard = homard;
 }
 public void setCarotte(String carotte) {
  this.carotte = carotte;
 }
 public void setSel(String sel) {
  this.sel = sel;
 }
 public void setPoisson(String poisson) {
  this.poisson = poisson;
 }
 
 public void afficherListeIngredients() {
  System.out.println("Ingrédients: " + herbe + ", " + homard + ", " + carotte + ", " + sel + ", " + poisson);
 }
}

Ce qui sera affiché :

  • Potion magique -> Ingrédients: 3 brindilles, 1 homard, 2 carottes, 3 pincés, 1 poisson frais 
  • Potion volante -> Ingrédients: 1 brindille, 3 homard, 4 carottes, 1 pincés, 2 poissons pas frais


Imaginons maintenant qu'il existe une autre potion. Et bien il suffit d'ajouter une nouvelle recette.
Par exemple:
public class RecettePotionMiniature extends Recette { ... }


Et si on n'utilise pas le patron builder ?

Et bien les étapes de création de la potion magique seraient dans la class Jeu. La classe Jeu deviendrait longue et aurait trop de responsabilités. La classe Jeu serait plus difficile à maintenir.

Friday, October 5, 2012

Patron : Singleton


Singleton est un patron de programmation de type creation.

Il permet de s'assurer qu'il existe qu'une seule instance d'une classe.
Par exemple, dans une partie de jeu de role (Donjons et Dragons ou autre), il existe un seul maitre du jeu.
Alors si on tente de créer un programme, il serait intéressant de limiter le nombre de maitre de jeu à 1.

Les étapes:

  • créer un constructeur "private" car on ne veut pas de constructeur "public". Attention, quand on crée une classe en java sans constructeur, en fait il y en a un d'ajouter automatiquement qui est "public". Donc en créant notre constructeur "private", on override le constructeur "public"
  • créer une variable statique qui va detenir l'instance unique
  • créer une fonction qui retourne l'instance unique 



Jeu.java
public class Jeu {
 
 public static void main(String[] args) {
  Jeu jeu = new Jeu();
  jeu.jouer();
 }
 
 public Jeu() { }
 
 public void jouer() { 
  Singleton maitreDuJeu = Singleton.getInstance();
  
  System.out.println(maitreDuJeu.getCompteur());
  maitreDuJeu.setCompteur(23);
  System.out.println(maitreDuJeu.getCompteur());
  
  // Singleton autreMaitreDuJeu = new Singleton();
  // -> erreur de compilation car il n'y a
  //    pas de constructeur "public"
  
  Singleton autreMaitreDuJeu = Singleton.getInstance();
  // en fait c'est le meme objet (= meme instance)!
  System.out.println(autreMaitreDuJeu.getCompteur());
 }
}
Singleton.java
public class Singleton {

 private static final Singleton instanceUnique = new Singleton();
 private int compteur = 0;

 private Singleton() {
  // besoin d'avoir un constructeur
  // "private" pour empecher d'avoir
  // un constructeur "public"
 }

 public static Singleton getInstance() {
  return instanceUnique;
 }
 
 public int getCompteur() {
  return compteur;
 }

 public void setCompteur(int compteur) {
  this.compteur = compteur;
 }
 
}
Le résultat de ce programme sera:
0
23
23
L'objet autreMaitreDuJeu est le même que maitreDuJeu, donc c'est normal d'avoir 23 comme résultat.

Et sans l'utilisation du patron ?

Prenons le même code sans utiliser le patron Singleton et imaginons que 2 ans plus tard, quelqu'un doit le modifier.

 public void jouerSansPatronSingleton() {
//on utilise le constructeur publique
  Singleton maitreDuJeu = new Singleton();
  
  System.out.println(maitreDuJeu.getCompteur());
  maitreDuJeu.setCompteur(23);
  System.out.println(maitreDuJeu.getCompteur());
  
// 2 ans plus tard, quelqu'un ajoute ces lignes
// car il ne sait pas qu'il existe deja un objet
  Singleton autreMaitreDuJeu = new Singleton();
  System.out.println(autreMaitreDuJeu.getCompteur());
 }
Le résultat de ce programme sera:
0
23
0
Donc quand on veut s'assurer qu'il existe une seule instance d'une classe, le patron Singleton est très utile.

Patron : Fabrique (factory)

Le patron Fabrique (Factory en anglais) est un patron de type conception.

Ce patron contient une classe qui fait appel à une fabrique pour créer des objets sans connaitre la classe exacte de ces objets. Pour déterminer la classe exacte, un paramètre est passé lors de l'appel.



Description des classes :

  • Fabrique : la fabrique en charge de créer les objets selon le paramètre recu 
  • Race : classe abstraite 
  • Humain, Orc, Elf : classes fille de Race 
  • Jeu : classe principale qui ne se preocupe pas de quel type de race sont les objets qu'elle manipule 



Dans l'exemple ci-dessous, la classe Jeu fait appel à la classe Fabrique. La classe Jeu ne connais pas les sous-classes de Race.
La responsabilité de créer le bon objet est laissé à la classe Fabrique. Cela fait moins de ligne de code pour la classe Jeu.

Une fois les objets personnagePrincipal, ennemi et ami crées, la classe Jeu traite ces objets comme des objets de type Race.


Jeu.java
public class Jeu {
 
 public static void main(String[] args) {
  Jeu jeu = new Jeu();
  jeu.jouer();
 }
 
 public Jeu() { }
  public void jouer() {
  Fabrique fabrique = new Fabrique();
  
  Race personnagePrincipal = fabrique.getRace("humain");
  action(personnagePrincipal);
  
  Race ennemi = fabrique.getRace("orc");
  action(ennemi);
  
  Race ami = fabrique.getRace("elf");
  action(ami);
 }
 public void action(Race joueur) {
  //on ne se préocupe pas si "joueur" 
  //est un humain ou un orc ou un elf
  joueur.parler();
 }
}
Race.java
public abstract class Race {
  abstract void parler();
}
Humain.java
public class Humain extends Race{
 public Humain() {}
 
 public void parler() {
  System.out.println("Je suis un humain!");
 }
}
Orc.java
public class Orc extends Race{
 public Orc() {}
 
 public void parler() {
  System.out.println("Grrrrrr");
 }
}
Elf.java
public class Elf extends Race{
 public Elf() {}
 
 public void parler() {
  System.out.println("Je suis un elf!");
 }
}
Fabrique.java
public class Fabrique {
 public Fabrique() { }
 
 public Race getRace(String type) {
  Race race;
  
  // ...
  // par exemple: doit faire des trucs 
  // compliqués ici avant la creation d'objet 
  // (verification, initialisation, etc.)
  // ...
  
  if ("humain".equals(type))
   race = new Humain();
  else if ("orc".equals(type))
   race = new Orc();
  else if ("elf".equals(type))
   race = new Elf();
  else
   race = null;
  
  return race;
 }
}



Et sans la Fabrique...

L'exemple est très simple, donc ce n'est pas évident de prouver que sans l'utilisation de ce patron, le code devient plus complexe. Mais je vais essayer.
Voici maintenant le meme code sans la fabrique.
public class NoFactory {

 /**
  * @param args
  */
 public static void main(String[] args) {
  NoFactory noFactory = new NoFactory();
  noFactory.start();
 }
 public NoFactory() { }
 
 public void start() {
  
  // ...
  // par exemple: doit faire des trucs 
  // compliqués ici avant la creation d'objet 
  // (verification, initialisation, etc.)
  // ...
  
  Race personnagePrincipal = new Humain();
  action(personnagePrincipal);
  
  Race ennemi = new Orc();
  action(ennemi);
  
  Elf ami = new Elf();
  action(ami);
 }
 
 public void action(Race joueur) {
  // on ne se préocupe pas si "joueur" 
  // est un humain ou un orc ou un elf
  joueur.parler();
 }
}
Deux choses :

  1. la classe NoFactory doit maintenant s'occuper de faire des trucs compliqués (exemple: verifications, initialisation,etc.) avant la creation des objets 
  2. la classe NoFactory doit connaitre le type exacte des objets. 


J'ai certainement fait des fautes ou écrit des choses pas clair, donc n'hésitez pas laisser un commentaire. Lien Wikipedia : Fabrique

Thursday, May 24, 2012

Rails NoMethodError on calling Module

So I had to create a module and call one of the function from a controller.

After looking on Google I could find this post on RailsForum.
Basically, you have to do that:
in lib/something/task.rb
module Task
  def my_method
    "hello there"
  end
end
In the application controller
class EnrolmentController < ApplicationController
  include Task

  def index
    my_method
  end
end
Please note the difference, my module is in "lib/something/Task.rb".  The file is not at the root of lib.

Problem
Why I still have "NoMethodError"?

Solution
Pretty easy, you have 2 steps to do. First you need to add this in config/application.rb
config.autoload_paths += Dir["#{config.root}/lib/**/"]

But if you still try it, it's not working... Well, in fact you have to restart your server! When you add a directory and files in config folder, you have to restart your server (same for the translation file)
And that's it!

Friday, April 13, 2012

Rails 3 Facebook Ajax picture

My rails 3 website shows a list of friends, and you can click on "next" to see the 10 next friends.
I'm using this :

    

Problem : I can load dynamically and see my next friends but not their  facebook profile pictures. Why?

Solution : In fact, you just need to "refresh" (re-parse) the element.
Do not use FBML because it will be deprecated soon.
Instead, use FB.XFBML.parse();

For example, in my action (who has been called by using :remote => true), it returns a ".js.erb" file.
In this .js.erb file, I append my friends, and at the end I just do FB.XFBML.parse(XX), where XX is the name of the section that I want to "refresh"/"re-parse".

and that's it !

rails 3 and jquery tabs

Recently, I'm working on a Ruby on rails website and I wanted to display some tabs.
Now, Rails 3 uses jquery, fine so let's search "jquery tabs" on Google, and I could find Jquery UI.
Oh and there is a "tab" widget. Perfect!
How to insert tabs in my website? Ok,  let's check on Google! I could find many websites saying that I should download the javascript files from the website and include them like that :
<%= javascript_include_tag "jquery_min.js ....
So I did it, but it didn't work...

Problem: how to use this widget ?

Solution : in fact, you don't need to download any javascript files! You just need a CSS file!
Here is more details:
Be sure to have : gem 'jquery-rails' in your Gemfile.
In application.js,  you need this :
//= require jquery
//= require jquery_ujs
(with these 2 lines above, you're importing Jquery, that's why you don't need to download any extra javascript files!)

Then, try to find a "jquery.ui.tabs.css". You can find it on the Jquery UI website.
Here is one ugly css for example (in case you can't find it):
.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative;  top: 1px; margin: 0 .2em 1px 0; padding: 0; white-space: nowrap; }
.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { border: medium solid Orange;margin-bottom: 0; padding-bottom: 1px; }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; border: medium solid Orange;}
.ui-tabs .ui-tabs-hide { display: none !important; }

In application.css.scss add this : @import "jquery.ui.tabs";

And now copy/paste the example code from Jquery UI Tabs page, and that's it !

Sorry, I should write more clearly with more details, but I don't have time now!

Saturday, February 18, 2012

Delete mkv file from windows

I had a mkv file that I wanted to delete. So I opened the explorater, go to the folder, right click on the file and Delete. But then I have the error (something like that) : you can't delete this file because another process is using it.

Well, but I'm sure no other process is using it !

Problem 
How to delete mkv files ?

Solution
Well, I found this solution on Internet and it's easy. In fact, "explorer.exe" is using the mkv file.

Open a command prompt window (click here for more info).
Go to the folder where the mkv file is (keep the prompt open, we will use it later!). You can use the command "cd myVideos" for example. (click here for more info).

Open the Task Manager by pressing : ctrl + alt +  suppr. (other possibilities)
Choose "start task manager"
Open the "processes" tab
Select "explorer.exe" (be sure sure to select "explorer.exe" !!)
Click on "end process". Your icons and task bar will disapear, but that's ok. (don't close the task manager we will need it later).

Go to the prompt again and delete the file (del video.mkv).

Go to the task manager
Open the "application" tab
Click on "New Task...".
Enter "explorer.exe" (without double quotes!) and click "OK". Then your icons and task bar will appear !

And that's it

Wednesday, February 1, 2012

web2py plugin_wiki tag

In my website, I want the user to be able to add tags to a picture. I'm happy because I can see that there is a plugin in web2py to do that.
Have look here: web2py Plugin but, it said that the plugin tag is kind of deprecated and we have to use the plugin_wiki.
Attention: some of the plugins listed here are old (in particular jqgrid, comments, tagging, modal, dropdow, attachments, latex, flash video and deprecated). Newer versions have been incorporated into plugin_wiki.
So I watched the video explaining how to use the plugin_wiki. But I don't want to create pages using the plugin_wiki, I just want to add tags!

Problem 
How to just add tags to my view file without using the wiki interface ?

Solution 
In fact it's really easy. In the view file just add this : {{=plugin_wiki.widget('tags',table='thumbnail',record_id=thumbnail.id)}}

thumbnail is the name of my table.
thumbnail.id is the id column (as you can guess)

Then, if you want to modify the behaviors you can modify the plugin_wiki controller : controllers/plugin_wiki.py, there is an action for each plugin, so you'll find an action called "tags".
And you can modify the "view" of a tag : view/plugin_wiki/tags.html

That's it !

Saturday, January 21, 2012

Web2py - remove the "delete" check box

In web2py, the form displayed  to update form containing an input file is like this :
name + input text + "browse" button + [file + delete check box]

Problem : how can I remove this "delete" check box ? Because the image is required. If I check the value is not null, it returns false, because the value is empty.

Solution : it's really easy. In your file db.py just add: requires=IS_NOT_EMPTY
Field('data', 'upload',requires=IS_NOT_EMPTY())

And that's it !