McGivrer's Home http://mcgivrer.fr life of french web developer posterous.com Thu, 26 Jan 2012 15:07:00 -0800 Box.com en davfs sur Ubuntu ! http://mcgivrer.fr/boxcom-en-wevdav-sur-ubuntu http://mcgivrer.fr/boxcom-en-wevdav-sur-ubuntu

Connaissez vous le  site www.box.com qui propose du stockage en ligne gratuit à hauteur de 5Go ?

Si non, courrez vous créer un compte pour stocker tous les fichiers qui vous sont vitaux.

Donc, un fois votre compte en main, vous allez pouvoir le monter comme un disque local sous linux avec les informations suivantes !

Tout d'abord,  commençezs par installer l'outil magique qui va permettre d'accèder au repertoire DAV distant sur box.com

  #> sudo apt-get install davfs2

Maintenant, créez un répertoire box.com dans votre répertoire personnel:

  #> mkdir ~/box.com

Ensuite, éditez le fichier fstab décrivant les volumes monté au démarrage (vos disques connus de linux):

  #> sudo gedit /etc/fstab

Et ajouter la ligne ci-dessous:

  https://www.box.com/dav /home/frederic/box.com davfs rw,user,noauto 0 0

Ensuite, créons l'espace de stockage de nom / password pour le nouveau point de montage DAV.

Créez un répertoire .davfs2 dans votre $HOME

  #> mkdir  ~/.davfs2
  #> cp /etc/davfs2/davfs2.conf ~/.davfs2
  #> sudo cp /etc/davfs2/secrets ~/.davfs2
  #> sudo chown $USER ~/.davfs2/secrets

Et éditez le fichier ~/.davfs2/secrets  pour ajouter une ligne de la forme:

  https://www.box.com/dav    [box.username]    [box.password]

Maintenant la commande magique:

  #> mount ~/box.com

Et voila, vous avez accès à vos fichiers présents sur votre compte box.com !

Pour démonter le lecteur box.com, simple:

  #> umount ~/box.com

Encore plus fort, sous Nautilus, une nouvelle entrée de volume est disponible, un seul click sur l'icone et le lecteur est monté.  Un click sur le petit bouton de démontage, à droite et le lecteur est démonté.

Nautilus-drive-box-com
Note:

Si comme moi, vous êtes confrontés à l'impossibilité de monter un volume DAVFS en tant que simple utilisateur (non root) vous devez passer la commande suivante:


  #> sudo chmod u+s /sbin/mount.davfs 

facile, non ?

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Thu, 19 Jan 2012 15:23:00 -0800 Play! sample blog http://mcgivrer.fr/sample-code-about-playframework-for-yammer-gr http://mcgivrer.fr/sample-code-about-playframework-for-yammer-gr

play-blog-sample.zip Download this file

 

Play!framework.

A small sample code

Install play framework into your prefered path on your account and modify your system path to add the play installation directory:


And then, unzip the demo in your prefered path, just "cd" in and then, to run demo :
#> cd play-blog-sample
#> play dependencies
#> play run
if you want to edit project with eclipse
#> play eclipsify
and import the resulting project into a brand new Eclipse workspace.
 

Note:
Before running eclipse, don't forget to copy jar files from 
play-1.2.4/support/eclipse 
to the eclipse/dropins directory.

If you want to consult play documentation run this play app as discribed as before, and click on the

And if you are a tester:
#> play test
and click http://localhost:9000/@tests


Have fun !

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Thu, 22 Dec 2011 11:14:00 -0800 Test Driven Development tutorial http://mcgivrer.fr/test-driven-development-tutorial http://mcgivrer.fr/test-driven-development-tutorial

In a next post, I will write a brand new tutorial about the TDD agile method on development process.

Listingsid_148_0711_rdn_tb_gif
image from:http://reddevnews.com/articles/2007/11/01/testdriven-development-tdd.aspx

Stay tuned !

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Tue, 20 Dec 2011 16:59:19 -0800 Agile technology to serve project management ! http://mcgivrer.fr/agile-technology-to-serve-project-management http://mcgivrer.fr/agile-technology-to-serve-project-management
Please, let me show you our new i-BrownPaper, this is the art of our activities now.

Brown-paper-modified

Thanks to agile process to perform projects and activities management.

McG.

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Tue, 20 Dec 2011 16:06:00 -0800 X360, RIP... http://mcgivrer.fr/x360-rip http://mcgivrer.fr/x360-rip

While I am trying to rescue my good old console, It did not survive more than 45 minutes to the last heat treatment. Dear Microsoft Console, rest in peace !

Xbox360-burn-19052011-002_014f000000062995

illustration from :http://www.xboxgen.fr/noire-surchauffe-playstation-3-80-60-fat-rockstar-games-sony-firmware-actualite-14059.html

Dear Santa Claus, please, could you bring me a brand new one like in the following pack ?

Xbox-pack-forza3-crysis2-small

illustration from : http://www.trouvetaxbox.com/index/bundles/id/9

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Tue, 08 Nov 2011 08:28:50 -0800 X360, second chance ! http://mcgivrer.fr/x360-second-chance http://mcgivrer.fr/x360-second-chance Again, my X360 crash down and refuse running any games without a double LED ring error...

So , using a heat gn, I re'warm  Console Circuit for a second round.

Hope that IC will survive to this treatment.

Lucky, or not lucky ?

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Mon, 26 Sep 2011 09:06:00 -0700 Last games ? http://mcgivrer.fr/last-games http://mcgivrer.fr/last-games

Et Hop, quelques nouveaux jeux en tests sur nos consoles

Collages

Intro

Ainsi, Côté Wii, on trouvera My Fitness Coach et Just Dance 2, côté X360, on trouvera NFS Hot Pursuit, Enslaved, Mafia 2 et enfin Dungeon Siege 3.

A part une petite faiblesse du côté de "My Fitness Coach", tous sont de très bon jeux !

Quelques Notes

Wii-my_fitness_coach-cover

My Fitness Coach / Wii

Un habillage graphique pauvre, mais un fond plein de bonne volonté, sans doute le moins bon des 6 jeux présentés ici.

Le nombreux mouvements disponibles font honneur au joueur prompt à progresser.

12/20

Wii-just_dance_2-cover

Just Dance 2 / Wii

Le jeu s'annonce comme la parfaite évolution de son prédécesseur. J'ai l'impression que les développeurs ont pris note des remarques des joueurs !

En effet, les graphismes sont incroyablement améliorés, tout en gardant l'esprit de la série, mais en refondant l'habillage de façon intelligente.

16/20

X360-dungeon_siege_3-cover

Dungeon Siege 3 / X360

Le successeur pour moi de "Dark Alliance" sur PS2. Ce jeu est incroyablement sympa à deux en simultané. Parfois un peu dur, il faut s'accrocher pour refaire certains passages plusieurs fois et arriver a battre ces satanées bestioles...
Graphiquement à la hauteur de ce que l'on peut attendre de ce genre de jeu. Certes, nous sommes à des lieux d'un "Gears of War 3", mais on s'éclate largement sur ce jeu.

16/20

X360-enslaved-cover

Enslaved, Odyssey to the west / X360

Un bon jeu d'arcade/action à la Namco, comme ils savent si bien les faire ! On en redemande. Graphiquement très élaboré et proposant un vrai monde, la découverte de nouveau lieu est toujours un plaisir visuel. Il est peut-être un peu trop linéaire, mais c'est le genre qui veux cela. Le duo "Gros-Bras-Musclés" / "Top-modèle-super-intelligente" marche plutôt bien. Le fait de pouvoir donner quelques ordres de bases à Trip (la fille, donc) donne un dimension supplémentaire au jeu.

17/20

X360-mafia_2-cover

Mafia II / X360

Pour moi, Mafia 2 est le successeur de GTA4. Tout est là pour faire revivre cette ambiance particulière de l'après guerre en Amérique. La bande son n'est pas en reste non plus, car on retrouve les grands standards de cette époque.
L'immersion est d'autant plus réussie que les graphismes sont somptueux et les acteurs numérique, car je pense qu'on peut parler de cela, sont incroyables de réalisme. A voir donc !

18/20


X360-need_for_speed_hot_pursui

NFS Hot Pursuit / X360

Le retour ENFIN de Need For Speed. Non, pas les jeux underground, Most wanted, World ou autre Undercover et Shift, mais celui de l'origine, celui qui est une course poursuite "police contre méchant", comme en 1994, lors de la sortie de The Need For Speed sur Playstation (la psone, pas la 2, ni la 3 :)
Bref que du bonheur de (re)jouer à ce jeu, qui a profiter des bénéfices de la technologie pour faire un grand ravalement de façade :)

17/20


Conclusion

Voila, Fin des micro-tests pour aujourd'hui. Mais noter ma légère préférence :) pour les jeux X360 de cette fournée.

Bon jeu !

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Sat, 03 Sep 2011 07:23:00 -0700 X360: Fixed with a heatgun ! http://mcgivrer.fr/x360-fixed-with-a-heatgun http://mcgivrer.fr/x360-fixed-with-a-heatgun
For a few monthes now, I was forbiden to play with my X360 because of RedRing sort of ! Yes, not the red ring of the death, but a similar failure: overheat !  2 red led were lighted.
X360-and-a-heatgun
So, thank to Internet and 'the' fantastic search engine, I have discovered this web site: www.ifixeit.com.

And about the X360 Microsoft console, there is a pletor of "tutorials" and "how tos" to maintain your favorite console in a normal running condition !

 

Thanks to this one; http://www.ifixit.com/Guide/Reflowing-Xbox-360-Motherboard/5845/1, I was able to solve my Xbox issue, with a ... Heat Gun !

So now, I am able to play with my 2 last games, bought just before the big fail:

jaquette-need-for-speed-hot-pursuit-xbox-360-cover-avant-p.jpgjaquette-enslaved-odyssey-to-the-west-xbox-360-cover-avant-p.jpg

Great !

And thanks to Florian for his HeatGun !

5 minutes under the toaster tool, and my X360 run for a second life, rebirth from their ashes, like a the Phoenix !

Ok, ok...  I am a little bit over optimistic. but from a 3 minutes play run before fixing, The console is running for more than 30 minutes without any hiccup.

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Wed, 24 Aug 2011 02:54:51 -0700 An interesting feature for Gmail : the preview panel http://mcgivrer.fr/an-interesting-feature-for-gmail-the-preview http://mcgivrer.fr/an-interesting-feature-for-gmail-the-preview An interesting feature has been added to the Gmail Labs: a useful preview panel, wich can be disposed as you want:
First go to the preferences in google mail account : 

click the gear on right side :

Capture4

then in preferences, click on "Labs" (here "Labos because UI is in french"):

Capture3

then choose the Preview Panel :

Capture2

and activate it by clicking the "Activate" radio button.

And finaly , discover the new fetaure just added:

Capture1

Done !

Thanks to Google labs ;)

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Sat, 06 Aug 2011 14:20:00 -0700 Lost all partition structure on external drive !!! http://mcgivrer.fr/lost-all-partitipon-structure-on-external-dri http://mcgivrer.fr/lost-all-partitipon-structure-on-external-dri

Help, please help me !

Wrong manipulation of usb wire drive me to unplug accidentally my external hard drive. So the bad news is the partition table has been altered and I am unable to reactivate (recreate) the right partition's table. Anybody can help me to find the right tool to restore such table ? Thanks in advance.

McG

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Sat, 06 Aug 2011 00:19:56 -0700 Mathys a 4 ans !!! http://mcgivrer.fr/mathys-a-4-ans http://mcgivrer.fr/mathys-a-4-ans
Dsc00013

Et voila, mon bonhomme fete ses 4ans ! Et ce avec force Lego Miners et Lego Atlantis... Punaise, qu'ils grandissent vite ces enfants :)

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Tue, 26 Jul 2011 14:31:00 -0700 Linux + python + some dependencies = Web Browser ! http://mcgivrer.fr/linux-python-some-dependencies-web-browser http://mcgivrer.fr/linux-python-some-dependencies-web-browser

It's amazing to see what you are able to create with a small piece of code and a Great UI designer like Glade (for gnome).

Please, go, see and test the following video :

Have Fun and Code Now !

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Sat, 16 Jul 2011 02:02:00 -0700 Tobi, is not a dog, but a Functional Test framework ! http://mcgivrer.fr/tobi-is-not-a-dog-but-a-functional-test-frame http://mcgivrer.fr/tobi-is-not-a-dog-but-a-functional-test-frame
Tobi ! Get' there !
No, I am not calling back my smart dog, but trying to integrate Tobi (a functional testing framework) into a beautiful web site.
THat's the fact, Tobi is a javascript API with a Human Language Oriented methods to test some web interface.
If you want to test some Login Form, you will be able to write something like this:
var tobi = require('tobi') , 
    app = require('./my/app') , 
    browser = tobi.createBrowser(app); 
browser.get('/login', function(res, $){ 
    $('form') 
      .fill({ username: 'tj', password: 'tobi' }) 
      .submit(function(res, $){ 
        res.should.have.status(200); 
        res.should.have.header('Content-Length'); 
        res.should.have.header('Content-Type', 'text/html; charset=utf-8'); 
        $('ul.messages').should.have.one('li', 'Successfully authenticated'); 
        browser.get('/login', function(res, $){ 
            res.should.have.status(200); 
            // We are finished testing, close the server app.close(); 
            $('ul.messages').should.have.one('li', 'Already authenticated'); 
        }); 
    }); 
});
With this smart javascript, you will be able to test login form with a 'tobi' password for a 'tj' user. and then detect if the authentication run ok or fail. And the descripted scenario is also testing the "Already authentified" process from this "/login" form.
Ready to test other things ?  go and visit this web site : https://github.com/LearnBoost/tobi
note:
This framework was discoverdI had just discovered this framework exploring the BrowserId.org feature from Mozilla !

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Fri, 15 Jul 2011 08:49:34 -0700 X360 out of order ! http://mcgivrer.fr/x360-out-of-order http://mcgivrer.fr/x360-out-of-order Et voila, ce qui devait finir par arriver est arrivé !  Ma console Xbox 360 datant de juin 2008 a rendu l'âme.

Enfin, pas vraiment, mais plutot partiellement:  seulement 2 / 4 des voyants rouge s'affichent après environ 3 minutes de jeu...
J'ai suivi les tutoriaux sur internet, conseillant le démontage et le changement de la pate thermique, l'ajout de petits radiateurs sur les composants de RAMs, mais rien n'y a fait.

Le meilleur résultat obtenu a été 45 minutes de fonctionnement normal sous NFS... et Paf : Red Light !

Donc, je crains que je n'ai plus qu'à prendre mon mal en patience d'ici à ce que j'ai à nouveau les moyens d'acheter une nouvelle X360 noire.

885370127195_1

Snifff....

Heureusement, j'ai une Wii sur laquelle nous nous éclatons, ma femme, mes enfants et moi-même !  :)

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Fri, 24 Jun 2011 06:35:08 -0700 Play!framework: embedded H2 database and Web interface http://mcgivrer.fr/playframework-embedded-h2-database-and-web-in http://mcgivrer.fr/playframework-embedded-h2-database-and-web-in
Working with the Java Play! framework for some months now, I've just (sic!) discovered the Web database interface on H2 throught the url http://localhost:9000/@db

A first page will ask you to configure the database connection:

Capture1

fig. 1 - Connection management page on embedded H2 database

And the you are able to query as you want any table from the H2 database:

Capture2

fig. 2 - Browse interface on "mydatabase" instance

Have fun (again) with Play!framework .

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Mon, 06 Jun 2011 03:37:10 -0700 Un dictionnaire en français dans Eclipse pour la correction automatique http://mcgivrer.fr/un-dictionnaire-en-francais-dans-eclipse-pour http://mcgivrer.fr/un-dictionnaire-en-francais-dans-eclipse-pour
Depuis très longtemps, j'utilise Eclipse quasiment tous les jours dans mon travail. Et une fonctionnalité m'exaspérait particulièrement sur ce super IDE, la correction orthographique en temps réelle en français, non qu'elle soit mal faite, mais simplement qu'elle n'existe pas nativement lors de l'installation du package fourni par Eclipse.org.

User Define Dictionary

Il y a quelques semaines, j'ai découvert la solution passant par le dictionnaire personnel, permettant l'import d'un fichier de mots qui va bien, sous Windows on peut importer un fichier de mots mis à disposition gracieusement par des gens sympas (dans ce post d'un forum developpez.com).

Sous Linux, voir ce post qui explique comment procéder pour générer un fichier à jour grâce à aspell.

Dans la fenêtre des préférences utilisateurs, voilà ce que l'on trouvera à la rubrique General -> Editors -> Text Editors -> Spelling

Capture1

figure 1 - Préférences de la correction orthographique en français

Il faut renseigner le "User defined dictionary" avec le fichier préalablement téléchargé via la post sus-cité.

Capture3

figure 2 - fichier de mots en français.

Pensez à modifier l'encodage dans les éditeurs :

Capture4

figure 3 - UTF-8 comme encodage par défaut, cela peut toujours servir !

Cliquer sur OK, et voilà, fini les mots en français soulignés en rouge dans les éditeurs de texte :)

Je me suis par la suite posé la question "comment passer Eclipse en français ?" une vraie solution existe !

BABEL

C'est un projet hébergé par Eclipse.org ici : http://www.eclipse.org/babel/

un petit tour par Download permettra la solution ultime de l'installation d'une série de plugins linguistiques depuis le site d'update Eclipse qui correspond à votre version d'Eclipse (3.6 - Helios pour ma part) !

Non seulement, vous aurez une correction orthographique en français mais aussi toutes l'interface en français !  (ce qui est particulièrement déroutant !)

Si vous souhaiter conserver l'interface en anglais, mais tout en gardant le dico en français, c'est toujours possible, grâce à la commande magique:

c:\> eclipse.exe -nl en

et hop, vous basculer Eclipse en anglais au démarrage.

Allez, hop, tous à vos clavier !

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Tue, 24 May 2011 15:58:00 -0700 Basics of the Play! commands http://mcgivrer.fr/basics-of-the-play-commands http://mcgivrer.fr/basics-of-the-play-commands

New Play! App

Create a new Play site:

 
c:\> play new MySite 
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
~ The new application will be created in /home/frederic/Projects/Java/play/MySite
~ What is the application name? [MySite]
~
~ OK, the application is created.
~ Start it with : play run MySite
~ Have fun!

 

Dependencies

see here for more information http://www.playframework.org/documentation/1.2.1/dependency
Edit dependencies with the dependencies.yml file:

 
requires:
    - play ->[1.2, )
    - play -> crud -> [1.1, )
    - play -> secure -> [1.1, )


and launch following command to retrieve these dependencies/ modeles from repositories.

c:\> play dependencies
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
~ Resolving dependencies using /home/frederic/Projects/Java/play/MySite/conf/dependencies.yml,
~
~
~ Some dynamic revisions have been resolved as following,
~
~    play->play [1.2,) will use version 1.2.1
~
~ Installing resolved dependencies,
~
~     modules/crud -> /home/frederic/Tools/java/tools/play-1.2.1/modules/crud
~     modules/secure -> /home/frederic/Tools/java/tools/play-1.2.1/modules/secure
~
~ Done!
~

Edit !

What you will find in your favorite code editor :

Application

figure 1 - A new Play! app just created

 

 

You can install a gedit plugin to integrate the Zen Coding features. Just got to the following github repo :


https://github.com/mikecrittenden/zen-coding-gedit

 

Just download the proposed zip file and unzip it into the .gnome2/gedit/plugins folder.
Restart gedit if it's already running.

you will get the plugin ready to use.

But with some more tricky operation, you will be able to work with Eclipse or NetBeans in really easy way:

Eclipse

c:\> cd MySite
c:\> play eclipsify
 
 
And then import the existing project into Eclipse, and new files appear in the project directory:
Slection_011
 

figure 2 - "Eclipsifyed" Play! project

 

Then, import the project into a brand new workspace and follow these steps:

1. import from Project explorer contextual menu :

Menu_015
figure 2.1 - Eclipse "Import..." menu

2. Choose "Existing projects into workspace"

Import_016

figure 2.2 - The "Existing Projects into Workspace" wizard
3. Browse to your project path and semect the detected Eclipse Project:

Import_017
figure 2.3 - Detected project into browsed directory.

And click the "Finich" Button to discover you fresh imported project into your current workspace:

Java_-_mysite-app-controllers-
figure 2.4 - Play! project importer into Eclipse, ready at work !

NetBeans
As easy as for Eclipse, you just have to use the magic command:
 
c:\>cd MySite
c:\> play netbeansify
 
 
And then, the directory structure is modified as shown bellow:

Slection_012

figure 3 - "NetBeansify'ed" Play! project

 

 

Run , start and stop

Run a play app:
 
c:\> play run
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
~ Ctrl+C to stop
~
Listening for transport dt_socket at address: 8000
23:52:32,877 INFO  ~ Starting /home/frederic/Projects/Java/play/MySite
23:52:32,915 INFO  ~ Module secure is available (/home/frederic/Tools/java/tools/play-1.2.1/modules/secure)
23:52:32,915 INFO  ~ Module crud is available (/home/frederic/Tools/java/tools/play-1.2.1/modules/crud)
23:52:34,026 WARN  ~ You're running Play! in DEV mode
23:52:34,267 INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...

 
Or you can use the other command to not lock current terminal:
 
C:\> play start
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
~ OK, /home/frederic/Projects/Java/play/MySite is started
~ output is redirected to /home/frederic/Projects/Java/play/MySite/logs/system.out
~ pid is 19948
~

 
you can note the pid value, here 19948 (in case of manual kill action ?  :)
And then you will be able to stop this play server with a :
 
c:\> play stop
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
~ OK, /home/frederic/Projects/Java/play/MySite is stopped
~

Browse

And then, open you favorite (sic) browser and ask for the http://localhost:9000/ url:

Your_application_is_ready_-_mo

figure 4 - Browser on a new Play! running project

 

Play help ?

At any time,you are able to run the famous help command:
 
c:\> play help
 
And the you will be free as bird to parse excellent documentation provided by the play distributed archive.
 
sample:
 
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
~ For all commands, if the application is not specified, the current directory is used
~ Use 'play help cmd' to get more help on a specific command
~
~ Core commands:
~ ~~~~~~~~~~~~~~
~ auto-test       Automatically run all application tests
~ build-module    Build and package a module
~ check           Check for a release newer than the current one
~ classpath       Display the computed classpath
~ clean           Delete temporary files (including the bytecode cache)
~ crud:override   Override a view
~ dependencies    Resolve and retrieve project dependencies
~ eclipsify       Create all Eclipse configuration files
~ evolutions      Run the evolution check
~ evolutions:applyAutomatically apply pending evolutions
~ evolutions:markAppliedMark pending evolutions as manually applied
~ evolutions:resolveResolve partially applied evolution
~ help            Display help on a specific command
~ id              Define the framework ID
~ idealize        Create all IntelliJ Idea configuration files
~ install         Install a module
~ javadoc         Generate your application Javadoc
~ list-modules    List modules available from the central modules repository
~ modules         Display the computed modules list
~ netbeansify     Create all NetBeans configuration files
~ new             Create a new application
~ new-module      Create a module
~ out             Follow logs/system.out file
~ pid             Show the PID of the running application
~ precompile      Precompile all Java sources and templates to speed up application start-up
~ restart         Restart the running application
~ run             Run the application in the current shell
~ secret          Generate a new secret key
~ secure:         Show help for the secure module
~ secure:override Override the CSS, login or layout
~ start           Start the application in the background
~ status          Display the running application's status
~ stop            Stop the running application
~ test            Run the application in test mode in the current shell
~ war             Export the application as a standalone WAR archive
~
~ Also refer to documentation at http://www.playframework.org/documentation

 
for more information, please, refer to the official web site : http://www.playframework.org/documentation/1.2.1/home

Or if you already have a running Play! project, just try to open the http://localhost:9000/@documentation
Play_manual_-_documentation_-_

figure 5 - At any time, just display the provided help


Test
Play! integrate also a Test running mode to be able to execute JUnit tests and UI test through defined test cases. To run play developpement server into such a mode, just
 input following line int to a Terminal (or Command DOS/Session on Windows):

C:\> play test

Then open your browser on the http://localhost:9000/@tests and the following page will be displayed:

Play_-_tests_runner_-_mozilla_
figure 6 - Test mode for Play! server

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Mon, 23 May 2011 00:31:00 -0700 Next Step in coder tooling ? http://mcgivrer.fr/next-step-in-coder-tooling http://mcgivrer.fr/next-step-in-coder-tooling

Why not using an intuitive language to explain to other language what to do ?  This is the basic idea for the "Zen Coding" tool !

Zen

Just write some simple hieroglyph like line bellow, and execute the "zen coding transformation":

#page>div.logo+ul#navigation>li*5>a

The you will get :

<div id="page">
        
        <ul id="navigation">
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
        </ul>
</div>

Cool tool, no ?

have a try in your favorite code editor !

you can also discover Zen Coding power through the following video:

Zen Coding v0.5 from Sergey Chikuyonok on Vimeo.

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Wed, 11 May 2011 16:37:00 -0700 Play!framework - tutorial - Customisation de la page d'accueil (2.4) http://mcgivrer.fr/playframework-tutorial-customisation-de-la-pa http://mcgivrer.fr/playframework-tutorial-customisation-de-la-pa

Extrait du chapitre 2.4 du livre que je suis en train d'écrire sur le Play!framework. Le but de ce livre est la découverte de l'utilisation du framework Play! au travers d'un exemple de site web communautaire de partage de liste de jeux video.

 

 affichage de la liste de jeux

Comme prévu, nous souhaitons créer notre propre page d’accueil (sinon, où est l’intérêt ? :)

Aussi, voici ce que nous souhaitons obtenir en première étape: l’affichage de la fiche d’un jeu vidéo:

figure 2.4.1 - Fiche d'une jeu vid&eacute;o
figure 2.4.1 – Fiche d’un jeu vidéo

Ce qui se traduit côté code “HTML/Groovy” par les lignes suivantes dans le fichier app/view/Application/index.html:

#{extends 'main.html' /}
  <div id="games" class="games">
    <h1>&{'home.games.title'}</h1>
    #{if games}
      #{list items:games, as:'game'}
        #{set title:'Home / '+game.platform+'/'+game.title /}
        <div class="game" id="game_${game.id}">
                        <div class="title">
                    <span>#${game.id}.</span>
                    ${game.platform}/${game.title}
                        </div>
           <div class="side">
            #{if game.cover}
            <div class="cover">
              <img src="public/images/games/${game.platform}/${game.title}/cover/${game.cover}.resized"
                title="${game.platform}/${game.title}" width="60"/>
            </div>
            #{/if}
            <div class="tags">
            </div>
          </div>
          <div class="info">
            #{if game.description}
            <div class="label">&{'home.games.game.description'}</div>
            <div class="bloc">${game.description}</div>
            #{/if}
            #{if game.testContent}
            <div class="label">&{'home.games.game.test'}</div>
            <div class="bloc">${game.testContent}</div>
            #{/if}
          </div>
        </div>
      #{/list}
    #{/if}
    #{else}
      <p>&{'home.games.noitems'}</p>
    #{/else}
  </div>

listing 2.4.1 – Template index.html pour l’affichage de la liste des jeux

les notations

On distingue plusieurs notations utiles qui vont permettre le rendu de plusieurs types d’informations issues de différentes sources:

  • &{} permet l’affichage de messages issus des fichier "messages.[langue]", exemple: &{'home.games.title'},
  • ${} permet l’affichage de variables d’entités,
  • #{} permet les tests de structures et boucles.

Les méthodes intéressantes sont:

  • #{if}#{/if} délimite une condition,
  • #{else}#{/else} délimite le cas échéant de la condition,
  • #{list items:[liste], as:'[item]'} permet de parcourir une liste [liste] avec comme index l’objet [item]. il est alors possible de référencer chaque occurense dans la liste par “[item].attribut”, où attribut est un attribut valorisé de l’occurence.

Par exemple, la génération d’une liste de prénoms d’utilisateurs:

<ul>
        #{list:users, as: 'user'}
        <li>@user.firstname.</li>
        #{/list}
    </ul>

listing 2.4.2 – Exemple de boucle pour l’affichage d’une liste

Référons nous à la documentation présente sur le site de Play! pour découvrir toutes les subtilités de Groovy, qui est le langage utilisé ici.

note: si nous n’avons pas accès à internet pendant le dévelopement, pour une raison quelconque, nous pouvons accèder à tout moment à la documentation de Play! en démarrant le serveur play intégrer (commande play start@) dans un projet vierge (par exemple) et en appelant l’urlhttp://localhost:9000/@documentation.

template des pages

Notons l’importance de #{extends main.html /} qui permet à notre page d’hériter de la mise en page de notre site située dansapp/view/main.html.

Pour le moment, cette page se résume à :

<!DOCTYPE html>
    <html>
        <head>
            <title>#{get 'title' /}</title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">
            #{get 'moreStyles' /}
            <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
            <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script>
            #{get 'moreScripts' /}
        </head>
        <body>
            #{doLayout /}
        </body>
    </html>

listing 2.4.3 – Template de base des page : main.html

Nous constatons l’utlisation du doctype HTML5. Nous ferons abstraction des nombreuses déclarations de début de fichier pour nous concentrer sur celles qui méritent toute notre attention:

#{doLayout /}

C’est via cette simple balise que toutes les pages héritant de main.html (#{extends 'main.html'}) verront ici leur contenu inséré.

Modifions maintenant l’aspect globale de notre site en personnalisant le template app/views/main.html :

Ajoutons la zone de titre (header) et la zone de pied de page (footer):

<!DOCTYPE html>  
  <html>
      <head>
          <title>#{get 'title' /}</title>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
          <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">
          #{get 'moreStyles' /}
          <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
          <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script>
          #{get 'moreScripts' /}
      </head>
      <body>
        <header>
          <h1>&{'site.title'}</h1>
          <h2>&{'site.subtitle'}</h2>
          <nav class="menu">
            <ul>
          #{if !user}
              <li>&{'home.actions.login'}
                          </li>
          #{/if}
          #{if user}
              <li>&{'home.actions.logout'}
                          </li>
          #{/if}
            </ul>
          </nav>
        </header>
        <section id="content">
            #{doLayout /}
          <div class="clear"></div>
        </section>
        <footer>
          <p>&{'site.footer.label'} - &{'site.footer.credits', "http://www.famfamfam.com/lab/icons/silk/"}</p>
        </footer>
      </body>
  </html>

listing 2.4.4 – refonte de main.html pour intégrer entête, menu et pied de page

Nous notons dans la ligne :

<link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">

qui charge la feuille de styles pour notre site, le chemin vers la feuille de styles est calculée par le tag @{’/public/stylesheets/main.css’}.

Mais regardons de plus près la commande #{get 'moreStyles' /}. Celle permettra dans tout sous-template d’ajouter la définition d’une feuille de styles supplémentaire, sans avoir a la référencer systématiqement dans le template de la page.

...
        #{set 'moreStyles'}
        <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/xxx.css'}" />
        #{/set}
...

listing 2.4.5 – Ajout d’un style dans un sous template qui sera généré dans le main.html

Il existe également le #{get 'moreScripts'}, procédant de la même manière pour les fichiers javascript.

note: Notons le copyright en fin de page relatif aux icônes que nous avons embarqué dans nos pages, icônes qui proviennet dewww.famfamfam.com.

Découpage du modèle de page

Nous allons diviser notre page de la manière suivante:

HTML
    HEADER
      NAV "menu"
    SECTION "content"
    FOOTER
  • Le header est l’entête de page, contenant titre, sous-tire, et nav, le menu de navigation,
  • La Section “content” contient (sic!!) les données à afficher, ici les fiches des différents jeux vidéo,
  • le Footer est le pied de page, contenant le information traditionnelle de copyright et autres informations utiles (Il est utilisé depuis peu également comme sources d’information pour les fils RSS par exemple).

figure 2.4.2 - Page d'accueil personnalis&eacute;e
figure 2.4.2 – Page d’accueil personnalisée

Fonction de filtrage et de recherche sur la liste des jeux

Filtrage par platforme

Ajoutons maintenant, en plus de la liste de jeux, un moyen de filtrer celle-ci par un type de plateforme. Pour cela, nous devons récupérer une liste des valeurs distinctes du champs platform dans l’entité Game.

MODIFICATION DU CONTRÔLEUR

le contrôleur Application doit être modifier pour ajouter une liste de plateformes dans les objets mis à disposition du render. Aussi, nous devons modifier la méthode index() comme ci-dessous:

static void index(){
    ...
    List<Game> platforms = Game.find(
        "select distinct g.platform "+
        "from Game g "+
        "order by g.platform").fetch();
    ...
    render(games,platforms);
  }

listing 2.4.6 – Ajout de la liste des plateforme de jeux a dessein de filtrage de la liste des jeux

TAG #{PLATFORMS /}

Intégrons une nouvelle notion: les tags ! Grâce à ce nouvelle élement, nous allons pouvoir éviter les répétitions de code dans les templates. Nous souhaitons afficher dans nos page la liste des platformes. Pour cela, créons un nouveau fichier app/views/tags/platforms.html:

#{if _userConnected}
        #{if _items}
                <h2>&{'home.platforms.title'}</h2>
                <ul>
                    <li>
                            
                                    &{'home.platforms.filter.showAll'}
                    </li>
                #{list items:_items, as:'platform'}
                    <li>
                            
                                    ${platform}
                    </li>
                #{/list}
                </ul>
        #{/if}
#{/if}

listing 2.4.7 – Affichage de la liste des plateformes de jeux

Ensuite, dans le template de page index.html, nous référencerons ce nouveau tag dont la notation est la suivante:

#{platforms items:platforms, userConnected:user}

TAG #{GAMES /}

Nous allons en profiter également pour créer un tag pour la liste des jeux, qui nous sera utile dans le paragraphe suivant, concernant la recherche par nom, le fichier du tag sera :app/views/tags/games.html.

#{if _userConnected}
        #{if _items}
        <h2>&{'home.games.title', _userConnected?.username}</h2>
            #{list items:_items, as:'game'}
                #{set title:'Home / ' + filterPlatform /}                
                <div class="game" id="game_${game.id}">
                    <div class="title">
                            <span>#${game.id}.</span> 
                                    ${game.title}
                    </div>
                    <div class="side">
                        #{if game.cover}
                        <div class="cover">
                            
                                    &{'game.details.cover.alt', game.title, game.platform}
                        </div>
                        #{/if}
                        <div class="tags">
                        </div>
                    </div>
                    <div class="info">
                        <span class="platform">
                                ${game.platform}
                        </span>
                        #{if game.description}
                        <div class="bloc">${game.description}</div>
                        #{/if}
                    </div>
                </div>
            #{/list}
        #{/if}
        #{else}
            <p>&{'home.games.noitems'}</p>
        #{/else}
#{/if}
#{else}
        <p>&{'home.anonymous.welcome.message',"Register/create","Goto to Register form"}</p>
#{/else}

listing 2.4.8 – Tag #{games/} présentant la liste des jeux

note: Nous nous proposerons d’enrichir notre liste de jeux avec l’utilisation de Jquery lightbox, un plugin permettant l’affichage modal des images des couvertures des jeux dans un prochain chapître.

TEMPLATE INDEX.HTML

Ainsi, dans le template app/views/Application/index.html nous intégrons les deux nouveaux tags; la liste des platformes #{platforms /} et la liste des jeux #{games /} :

#{extends 'main.html' /}
        <section id="platforms" class="platforms">
                #{platforms items:platforms, userConnected:user /}
        </section>
        <section id="games" class="games">
                #{games items:games, userConnected:user/}
        </section>

listing 2.4.9 – Intégration de nos nouveaux tags #{platforms/} et #{games/}

Ce qui nous donnera dans notre navigateur:

figure 2.4.3 - Int&eacute;gration de la liste des plateformes dans la page d'accueil
figure 2.4.3 – Intégration de la liste des platformes dans la page d’accueil

Recherche par un nom (title) de jeu

Nous souhaitons pouvoir proposer une recherche sur le nom d’un jeu afin de retrouver rapidement la fiche d’un jeu. Nous allons donc réaliser un filtrage sur le titre du jeu (Game.title).

Pour cela, ajoutons un champs de recherche. Editons le fichier du tag app/views/tags/platforms.html pour ajouter un tag input de type texte portant le nom search, au tout début de la section platforms :

#{if _userConnected}
                <section id="searchForm">
                        <label for="search">&{'home.search.label'}</label><br />
                        <input type="text" name="search" id="search" size="25" maxlength="40"/>
                        <script type="text/javascript">
                        $("#search").keyup(function(event) { // retour simple
                                if(event.keyCode==13){
                                        $.post('@{Application.filterByGameTitle()}',
                                                        {search: $("#search").val()}, 
                                                        function(data){
                                                                $('#games').html(data);
                                                        }
                                        );
                                }
                        });
                        </script>
                </section>
                #{if _items}
                        ...
                #{/if}
        #{/if}

listing 2.4.10 – champs search dans la section searchForm

Ainsi, la recherche est poussée via JQuery et son composant $.post(). Ceci évite un rechargement complet de la page en ciblant uniquement la zone de la liste des jeux.

Modifions le controleur Application et ajoutons la méthode filterByGameTitle() comme ci-dessous pour réaliser le traitement de recherche:

/**
         * Recherche dans la liste de jeux de l'utilisateur connecté des jeux
         * contenant la chaîne <code>search</code> dans le titre du jeu. Se base
         * également sur la plateforme sélectionnée et sur l'utilisateur connecté.
         * 
         * @param search
         *            nom ou partie du nom de jeu à rechercher
         */
        public static void filterByGameTitle(String search) {
                renderArgs.put("search", search);
                // récupération de l'utilisateur connecté
                User user = (User) renderArgs.get("user");
                // recupération de la plateforme (si présente)
                //String platform = (String) renderArgs.get("filterPlatform");
                // Constitution de la liste des plateformes distinctes
                List<Game> platforms = Game.find(
                                "select distinct g.platform from Game g order by g.platform")
                                .fetch();
                // recherche des jeux correspondant à game.title=%search% et
                // game.platform=platefom
                List<Game> games = Game.find(
                                "select g from Game g " + "where lower(g.title) like ? "
                                                + "and g.author=? " + "and g.publish=true "
                                                + "order by g.platform, g.title ",
                                "%" + search.toLowerCase() + "%", user).fetch();
                // rendu de la page
                renderTemplate("Application/search.html", games, user, platforms);
        }

listing 2.4.11 – recherche de jeux correspondant à la saisie du champs search

Ainsi, il nous faut créer un template pour le rendu du résultat de la recherche: ce sera app/views/Application/search.html

#{games games:games, user:user /}

listing 2.4.12 – template d’affichage du resultat de recherche: search.html

Simple non ?

Nous obtenons alors le rendu suivant dans notre navigateur:

figure 2.4.4 - Recherche par titre et filtre sur les plateformes
figure 2.4.4 – Recherche par titre et filtre sur les plateformes

 

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme
Wed, 11 May 2011 16:34:00 -0700 Play!framework - Création d'un tag (9.1) http://mcgivrer.fr/playframework-creation-dun-tag-91 http://mcgivrer.fr/playframework-creation-dun-tag-91

Extrait du chapitre 9.1 du livre que je suis en train d'écrire sur le Play!framework. Le but de ce livre est la découverte de l'utilisation du framework Play! au travers d'un exemple de site web communautaire de partage de liste de jeux video.

 

Qui n’a pas pester contre la recopie de nombreuse fois d’une même portion de code HTML dans une page, destiné au rendu d’un objet ?
Avec la possibilité de créer des tags aussi facilement qu’on écrit une vue dans Play !, il serait réellement dommage de passer à côté.

Définition

Le tag un simple fichier HTML dans le répertoire views/tags. Le nom du fichier va fixer le nom du tag: view/tags/mytag.html donnera accès au tag « mytag ».

mon tag

Appel

L’appel à notre tag se fera via la balise #{mytag /}
Dans notre page HTML :

<p>Mon tag de rendu</p>
 #{mytag /}

Passage de paramètres

Si nous souhaitons passer des paramètres pour obtenir un rendu dynamique, dans le fichier de définition du tag, il suffit d’ajouter les balises de votre choix, préfixées d’un caractère _(souligné, ou underscore pour les anglophones) :

mon tag avec un paramètre : _parameter

L’appel à ce tag sera :

<p>Mon tag de rendu</p>
 #{mytag parameter :'premier paramètre' /}

Si nous souhaitons passer un objet en paramètre, par exemple un objet User, la définition du tag sera app/views/tags/userdetails.html :

<div class='userdetails'>
        <h1>Utilisateur</h1>
        <ul>
                <li><strong>nickname :</strong> _user.username</li>
                <li><strong>prénom :</strong> _user.firstname</li>
                <li><strong>nom :</strong> _user.lastname</li>
                <li><strong>mail :</strong> _user.email</li>
        </ul>
</div>

et l’appel à ce tag devient : (apps/views/Application/userdetails.html)

<p>Utilisateur connecté :</p>
#{userdetails user:connectedUser /}

où connectedUser est un objet de type User, représentant l’utilisateur connecté. Et ci-dessous découvrons le rendu obtenu :

figure 9.1.1 &ndash; Tag pr&eacute;sentant les d&eacute;tails d'un utilisateur
figure 9.1.1 – Tag présentant les détails d’un utilisateur!

 

 

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/708616/avatar-gtalk.jpg http://posterous.com/users/cBuL38qtI Frédéric Delorme McGivrer Frédéric Delorme