Libellés

dimanche 23 janvier 2011

Template (Layout) en HTML / Javscript avec AngularJS

Récemment j'ai découvert sur DZone un nouveau framework MVC javascript. Et je me suis dit que c'était l'occasion de tester.

Mon idée était de faire quelque chose de très simple, par exemple un système de layout.

Je crée un layout HTML contenant :
  - le titre de mon site
  - un menu
  - un emplacement pour le contenu

Et pour chaque contenu, je crée un nouveau fichier HTML.

Ainsi, les éléments statiques de mon site (menu, titre, ...) ne seront écrit qu'à un seul endroit. Mon site sera donc plus facile à maintenir.

Il me faut également un contrôleur (route mapping), qui, en fonction de l'URL choisira le bon contenu.plate

Voici le résulat final en HTML + angularJS

<!DOCTYPE HTML>
<html xmlns:ng="http://angularjs.org">
    <head>
        <script type="text/javascript"
        src="http://angularjs.org/ng/js/angular-debug.js" ng:autobind></script>
    </head>
    <body>
        <script>
            angular.service('myApplication', function($route){
                $route.when("",          {template:'./pages/toto.html'});
                $route.when("/titi", {template:'./pages/titi.html'});
            }, {inject:['$route']});
        </script>

        <h1>Your App Chrome</h1>
        [ <a href="#">Welcome</a> | <a href="#/titi">Settings</a> ]
        <hr/>
    <ng:include src="$route.current.template" scope="$route.current.scope"></ng:include>
</body>
</html>


Et les deux pages utilisant ce layout (je ne me suis pas foulé pour le contenu :-p )
cat pages/titi.html                       
TITI TITI TITI
cat pages/toto.html                       
TOTO


Et pour info, voici la structure des fichiers
tree
.
|-- pages
|   |-- titi.html
|   `-- toto.html
`-- template.html


toto.html est défini comme la page par défaut.
titi.html est accessible via /template.html#/titi 







Si on décortique angularJS, on se rend compte qu'il y a principalement deux fonctions utilisées : 
  - la fonction route pour faire le lien entre l'URL et le contenu
  - et la balise  pour injecter le contenu dans le document HTML.





Pour tester, vous devrez utiliser un serveur web, c'est à dire via une url du type http://localhost:port/xxxxx






Si vous testez directement a partir des fichiers, c'est à dire avec une URI du type file:///home/romain/Bureau/site/template.html ,le système de layout ne marchera pas. (XMLHttpRequest cannot load file:///home/romain/Bureau/site/pages/toto.html. Origin null is not allowed by Access-Control-Allow-Origin.




Mais bon pour utiliser très facilement un serveur web, il suffit d'ouvrir un shell et de saisir : 


cd /home/romain/Bureau/site
python -m SimpleHTTPServer  



Puis ensuite de se rendre sur : http://localhost:8000/template.html


Source : http://www.pinoytech.org/question/4208530/xmlhttprequest-origin-null-is-not-allowed-access-control-access-allow-for-file

lundi 17 janvier 2011

Selenium 2 Webdriver rajouter des plugins à firefox

Selenium est un projet open source qui permet de contrôler des navigateurs (Firefox, IE, Chrome, ...).
Par exemple on peut lui dire :
  - tu ouvres l'url : http://google.fr
  - tu saisies le texte : 'bla bla' dans le champs de recherche
  - tu cliques sur le boutons 'Rechercher'
  - tu attends le chargement de la page
  - puis tu vérifies la présence d'un texte.

Actuellement Selenium et Webdriver de google sont en train de fusionner pour donner naissance à Selenium2. Actuellement nous sommes à la première version beta.

Selenium2 propose pas mal d'améliorations par rapport à Selenium 1. De tête je peux citer :
   - le support des navigateurs Iphone, Android
   - un meilleur support des navigateurs Chrome, Firefox et IE
   - la possibilité de simuler un navigateur avec HTML Unit (toujours plus rapide que de lancer un Firefox)
   - et également la possibilité de rajouter des plugins et de configurer facilement le navigateur ( about: config sous Firefox)

Voici un exemple issue d'un projet open source qui rajoute à firefox le plugin firebug et qui désactive le cache de firefox.


private static FirefoxProfile tweakProfile(FirefoxProfile profile) 
{
  try {
/* Load Firebug plugin */
  profile.addExtension(FirefoxProfile.class, "/firebug-1.5.4.xpi");
  /* Disable the cache of Firefox */
  profile.setPreference("browser.cache.disk.enable", false);
  profile.setPreference("browser.cache.memory.enable", false);
  profile.setPreference("browser.cache.offline.enable", false);
  profile.setPreference("network.http.use-cache", false);
} catch (IOException e) {
throw new RuntimeException("Could not load required extensions,
something is wrong", e);
}
return profile;
}
Voir les sources : HTML to HAR
La commande ci dessous permet de rajouter des plugins à Firefox :
profile.addExtension(FirefoxProfile.class, "/firebug-1.5.4.xpi"); 


Et cette commande là permet de modifier les préférences de firefox (équivalent à un about:config ) : 
profile.setPreference("browser.cache.disk.enable", false);

Parser JSON en JAVA et en toute simplicité

Bonjour, bonsoir

Pendant quelques temps j'ai cherché à générer et à parser des fichiers JSON.

J'ai utilisé http://www.json.org/java/ qui est très simple d'utilisation mais pas très pratique.
Puis un jour je suis tombé sur un parser HAR (qui est au format JSON) qui était codé tout simplement.
Il utilisait la librairie Jackson JSON Parser : http://wiki.fasterxml.com/JacksonInFiveMinutes

Avec Jackon, il suffit de créer un objet java (POJO) et lui dire de remplir cet objet à l'aide d'un fichier JSON (ou d'un String)

Je vous laisse découvrir la complexité de la chose :)




import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.codehaus.jackson.map.ObjectMapper;
public class HarParser {
    private static ObjectMapper mapper = new ObjectMapper();
    /**
* Parse a JSON HAR
*
* @param har a JSON String
* @return the HarLog representation
* @throws IOException if file not found
*/
    public static Har parseHAR(String har) throws IOException {
        Har value = mapper.readValue(har, Har.class);
        return value;
    }
}

https://github.com/Filirom1/browsermob-proxy/blob/master/src/main/java/com/browsermob/core/har/HarParser.java


Voici le fichier JSON à parser :
https://github.com/Filirom1/browsermob-proxy/blob/master/src/test/resources/ysearch.har


Et voici le test unitaire associé :


    @Test
    public void browser() {
        String fileName = this.getClass().getResource("/ysearch.har").getFile();
        try {
            Har har = HarParser.parseHarFromFile(new File(fileName));
            HarLog ysearch = har.getLog();
            String harBrowser = ysearch.getBrowser().getName();
            assertEquals("browser name", "Firefox", harBrowser);
        } catch (Exception ex) {
            fail("Exception occurs "+ex.getMessage());
        }
    }

lundi 3 janvier 2011

Un repository maven gratuit avec github

GitHub permet de créer des repository maven très facilement, ce qui peut être très pratique pour réutiliser ses propres projets perso.

La technique pour créer un repository maven consiste à :


Créer un nouveau projet github, qui ne sera utilisé que pour le repo maven


Si vous n'avez jamais utiliser github je vous conseille de suivre le guide officiel : 
http://help.github.com/


Dans ce repository créer les dossiers snapshots et releases
mkdir snapshots
mkdir releases
Inclure dans le pom.xml la section distributionManagement
Modifier le pom.xml du prijet que l'on souhaite distribuer via le repository maven.

    <distributionManagement>
        <repository>
            <id>repo</id>
            <url>https://Filirom1@github.com/Filirom1/filirom1-mvn-repo.git/raw/master/releases</url>
        </repository>
        <snapshotRepository>
            <id>snapshot-repo</id>
            <url>https://Filirom1@github.com/Filirom1/filirom1-mvn-repo.git/raw/master/snapshots</url>
        </snapshotRepository>
    </distributionManagement>

Faire un deploy
Déployer ce projet dans le repository maven
mvn -DaltDeploymentRepository=repo::default::file:../filirom1-mvn-repo/releases clean install source:jar javadoc:jar deploy   

Attention il faut utiliser le chemin relatif. ~/filirom1-mvn-repo/releases ne fonctionne pas.



Utiliser le repository
Voici un exemple :

<dependencies>
    ....
    <dependency>
        <groupId>org.html2har</groupId>
        <artifactId>html2har</artifactId>
        <version>1.0.0</version>
    </dependency>
    ....
</dependencies>

<repositories>
    <repository>
        <id>filirom1-repo</id>
        <url>https://Filirom1@github.com/Filirom1/filirom1-mvn-repo/raw/master/releases</url>
    </repository>
</repositories>

https://github.com/Filirom1/browsermob-page-perf/blob/master/README.md