samedi 18 juin 2011

#Backbone.js: petit tutorial

L'intervention de  David Heinemeier Hansson à la Railsconf 2011 de Baltimore   évoquait un nouveau phénomène: l'apparition des MVC coté client. Ces MVC sont forcement en javascript, seul langage supporté par les navigateurs. Parmi les noms de MVC javascript, backbone.js est celui le plus cité.


Je me suis plongé pendant quelques jours sur la document de backbone , en particulier sur l'exemple de TODO List réalisé  par Jérôme Gravel-Niquet.

Reuven Lerner, éditorialiste  de la revue Linux Journal (US) a consacré deux series d'article sur le sujet (juin num 206 et juillet: num 207).
On   trouve ici et là  d'autres articles.



Conclusion : j'ai failli me noyer.



Les principes sont pourtant assez simples: La notion de modèle  recouvre l'accès aux données. Ces données sont récupérées par l'appel d'une URL  du serveur applicatif. La partie vue correspond à la partie visuelle: la portion de HTML.
La partie controleur est responsable de la gestion des 'routes'. Dans les applications massivement en AJAX, l'utilisateur voit plusieurs pages mais reste physiquement sur une page. Aussi le  developpeur peut utiliser les fragments d'url (/#monFragment) pour différentier artificiellement les pages pour la gestion des signets. Ce système fait appel aux 'routes' du controleur.

La partie controleur est réduite au minimum dans les petites applications javascript.

En revanche, le dialogue entre les couches est à  prendre en charge par le développeur. A ce dialogue s'ajoute les interractions avec jquery. Au final l'investissement initial n'est pas neutre.

La couche modèle.
Backbone propose une structure pour  définir et manipuler  des éléments  unitaires ou des collections d'élément.


Exemple :
    masuite.bind("add", function(v) {
    alert("Ahoy " + v.get("valeur") + "!");
    }); 
   var a= new UnElement({valeur:1});    
    var b= new UnElement({valeur:2});
    masuite.add(a);
    masuite.add(b,{silent:true});
 
Je commence par définir une fonction qui se déclenchera lors de chaque ajout d'un élément à une collection. L'option 'silent'  bloque la remontée de l'évènement.

La collection est la colonne vertébrale de votre application. L'utilisation de la librairie : underscore.js ajoute une vingtaine de méthodes supplémentaires dont le each , le tri, la comparaison entre deux états. La couche modèle est responsable des échanges de donnée avec le serveur.


La couche vue.

Il y aura en principe autant de vue que de portion d'affichage. Dans mon exemple, j'ai deux vues, une pour afficher l'élément unitaire de la suite, l'autre pour les informations relatives  à la suite de nombre (la collection).
Tout changement dans le modèle sera repercuté dans la vue.

Comment brancher le modèle à sa vue ? : les avis divergent. Doit on réferencer la vue dans le modèle , ou l'inverse ou les deux à la fois ?.
J'ai suivi l'exemple du TODOS liste.


Cela donne le code suivant:
 




Le html est très simple:


A chaque ajout d'un élément dans la collection toutes les vues se mettent à jour:


Cette application n'a pas besoin d'un vrai controleur.
Par comparaison j'ai réalisé cette application sans backbone.js , juste avec jquery.




La comparaison est sans appel : c'est plus compliqué et long à faire avec backbone.js. Mais en ajoutant des deux cotés des nouvelles fonctions, très vite je me suis rendu compte que l'ajout est plus simple à réaliser avec backbone.js.
Attention à l'ordre d'insertion des librairies javascript : jquery, underscore,backbone,mon_script.  
Les sources sont sur github.


vendredi 3 juin 2011

Livre en francais sur #postgresql

C'est rare et il faut donc en profiter.
L'éditeur est Pearson , l'auteur Gegory Smith.
Le lien est ici.
Le sujet du livre est axé sur la performance. La performance au sens large du terme, aussi une partie de l'ouvrage est consacré aux systèmes de fichier.


Le Sommaire



  • PostgreSQL et ses versions
  • Matériel pour la base de données
  • Tests de performance du matériel
  • Configuration des disques
  • La mémoire comme cache pour la base de données
  • Configuration du serveur
  • Maintenance
  • Tests de performance des bases de données
  • Index
  • Optimisation des requêtes
  • Activité et statistiques de la base de données
  • Supervision et tendances
  • Pool de connexions et cache de données
  • Montée en charge avec la réplication
  • Partition des données
  • Éviter les problèmes courants

La table des matières détaillée ici en PDF.

samedi 28 mai 2011

La présentation lumineuse de DHH #rails #javascript

Lors de la Railsconf 2011 à Baltimore, David Heinemeier Hansson créateur de Ruby on Rails à fait une présentation remarquable .

S'il ne fallait retenir qu'une diapo  ce serait celle ci :

Je l'ai modifié pour illustrer le propos :




mymvc 
Il y a une pléthore de langages pour la partie serveur, Mais IL Y EN A QU'UN qui est universel sur le client (navigateur) c'est le javascript.

Aussi , ergoter  sur les avantages de tel ou tel langage n'a plus vraiment de sens car du coté client : il n'y que javascript.
Rails au lieu de  chercher à s'approprier  du coté serveur le javascript, met le framework au  service du développeur javascript. Pour cela Rails dans la version 3.1 proposera par défaut coffeeScript
 Ce DSL permet d'écrire facilement du javascript, il génère du javascript. 

L'autre ajout est SaSS : c'est l'équivalent de coffeeScript pour le CSS.

Enfin cerise sur le gateau, un utilitaire permettra de rassembler tous vos petits morceaux de javascript, css , images pour ne faire qu'un seul fichier compressé.
C'est Sprockets qui se charge de tout ca.

Donc, au lieu que la partie javascipt , css soit cachée sous le tapis, dans Rails, elle est mise en avant au service de : jquery


Ruby on Rails ne veut pas dominer le monde comme les autres framework, il ne cherche qu'a le rendre plus facile pour nous, pauvres développeurs.

La version 3.1 de rails s'annonce comme un tournant historique.C'était  déja le cas pour la version 3.0 avec la fusion réussie avec Merb.

Rails est un outil pour simplifier le travail du développeur, ce n'est pas un boulet à trainer.
Comment voyez vous votre framework :

Comme ca ? :un outil à votre service 


Ou est ce  vous qui êtes à son service ? :dans une machine infernale

samedi 21 mai 2011

#Rails plugin Activeadmin.


Le plugin Activeadmin pour Ruby on Rails (ROR) vient enrichir l'offre d'interface d'administration pour Rails.
A l'inverse de django sur Python, rails ne propose pas nativement une interface d'administration de ses ressources. Cette position vient constat très simple: chaque entité a sa propre gestion des utilisateurs et des roles. Faire un outil natif qui convienne à tous est un peu illusoire. 
La statégie innovante d'activeadmin est d'utiliser  un véritable DSL (Domain specific language). Lien ici vers formtastic.
 

mercredi 18 mai 2011

API #REST faciles avec GRAPE en #ruby

La partie la plus fastidieuse dans le développement d'un module est la mise en place de l'interface.

Le gem GRAPE prend en charge pour vous toute cette partie interface. Il fournit a votre module une interface REST. Grace à un DSL (Domain Specific language) aussi simple que Sinatra, la déclaration des URL dévient un jeu d'enfant.

ex :
    get :home_timeline do
      authenticate!
      current_user.home_timeline
    end

    get '/show/:id' do
      Tweet.find(params[:id])
    end

(source complet ici)
Grape est capable de définir des espaces de nommage et des numéros de version.Grape repose en grande partie sur RACK.

Pour un de mes modules, j'avais utilisé sinatra pour la partie REST et cela donnait :


(avec  Sinatra)
get '/delete_row' do
  dbconfig= YAML::load(File.open('database.yml'))
  schema= Nosql.new(dbconfig)
  schema.delete_row
"{\"reponse\":\"ok\"}"
 end 
GRAPE prend à sa charge la partie formatage de la réponse en JSON 

 Un article en francais ici.

lundi 16 mai 2011

firebug : un ami qui vous veut du bien #javascript

Firebug possède une série d'option très pratique comme par exemple le 'profiler'. Ce dernier permet de mesurer le temps d'exécution de chaque fonction javascript.
Voici une copie d'écran.
Le profiler.
L'utilisation est assez simple:
  • Aller sur le site concerné.
  • Activer firebug (F12) 
  • Vérifier que l'option 'script' de firebug est active.(volet script) 
  • Puis aller dans l'onglet 'console' 
  • Commencer l'opération de profilage en cliquant sur le bouton profile.
  • Naviguer sur la page.
  • Arrêter le profilage en cliquant à nouveau sur le bouton profile. 

Les informations s'affichent dans la fenêtre firebug. Il est possible d’insérer des demandes de profilage dans le code source. (voir lien)

Les autres outils livrés avec firebug.

Les informations de log. En plus du simple console.log(), javascript propose des niveaux de log.
Il est possible d'avoir un affichage différencié en fonction du niveau de log. Celui ci va de debug à error.
Si une des méthodes de console.NIVEAU() est appelée avec un objet en paramètre, un lien hypertexte pointera sur la ligne et l'objet.
Aussi, il est préférable d'écrire console.niveau("ceci est mon message",object) au  lieu d'écrire ("ceci est mon message de log"+object)

  • console.debug(object[, object, ...])
  • console.info(object[, object, ...])
  • console.warn(object[, object, ...])
  • console.error(object[, object, ...])  

Les timers.
Firebug vous donne la possibilité d’insérer des  timers pour mesurer des temps exécution sur des portions de code. 
console.time(nom_timer) ;       //pour démarrer le chronomètre
console.timeEnd(nom_timer);  //pour arrêter le chronomètre

La trace d'un appel de fonction.
En insérant  un console.trace()au sein d'une fonction, la console affichera tous les appels de fonctions avec les paramètres.


Les assertions.
L'ajout de console.assert(condition,objet)  permet de lever une exception  si la condition est fausse. 
Il est donc possible de créer des tests de non régression en javascript     

En conclusion.

Firebug reste avant tout un vrai  débugger. Avec des possibilités d'exécution pas à pas, d'examen des variables ou encore la pose de point d'arrêt.

samedi 14 mai 2011

Cours 102 : les fonctions en javascript

En javascript tout est objet. Il existe certains types de base en javascript comme les Strings, les Dates. Une fonction est aussi un type de base comme un autre. Une fonction est un objet. On put assigner une fonction à une variable.

Ci-dessous des exemples de fonction:
Une fonctino peut etre anonyme , nommée, autoexecutée.
Enfin une fonction peut etre utilisée comme constructeur.




L'exécution donnera :

 node essaifunc.js
je passe par appel de fonc1
je passe par appel de fonc via la varible  b
je passe par appel d une fonction anonyme via la varible  c
je passe
je passe anom
fonction constructeur MyClass
je trouve:nom
 
Pour qu'une fonction soit autoexecutée , sa définition doit se terminer par (); ou (arg);
Ce type de fonction est utile pour lancer des actions dès la déclaration de la fonction (exemple à partir de son chargement dans un navigateur).

Une fonction se rapproche un peu de la notion de méthode dans des langages à base de classe. Mais il y plus de ressemblance avec la notion de bloc en tant que paramètre en Ruby.
 
Une fonction en javascript  accepte m'importe quel nombre de parametre.

 En cas d'absence d'un parametre , il sera assigné à la valeur indéfinie , mais la fonction ne levera pas d'exception.
Les parametres passées en plus sont disponibles dans un tableau arguments.