« Le site web, le blog et les projets de Stéphane Klein »
stephane-klein.info est le site web d'un développeur passionné par les Logiciels Libres, les méthodologies (agiles…), la programmation en Python… mais aussi la politique, l'histoire, la philosophie…
Le site stephane-klein.info est visible sur
tout type de navigateur. Il est possible d'accéder parfaitement à toutes les
informations du site (sauf les commentaires) même avec un navigateur du type
Lynx ou
Links.
Il est conseillé d'utiliser un navigateur récent et conforme aux standards pour
consulter le site avec la totalité de son design (voir un screenshot du site…).
Cela fait quelques jours que je me pose la question suivante : « Est-ce que Node.js ne va
pas devenir une technologie incontournable / majeur dans les 2 ans qui viennent ? »
Le contexte
Je suis un développeur Python depuis de nombreuses années. J'aime ses librairies, j'aime ses outils,
j'aime sa communauté.
J'aime tellement sa syntaxe que quand je vois la syntaxe d'autres langages, j'ai une réaction
quelque peu épidermique à la lecture du code.
Avec le temps, l'habitude de la syntaxe Python minimaliste proche d'un pseudo code rend difficile
la possibilité d'apprécier un autre langage. Je ne sais pas si c'est positif ou négatif,
je me pose simplement la question. Enfin ceci est un autre sujet.
Cependant, mon regard se tourne de plus en plus vers Node.js... je n'ai pas
franchi le pas, je n'ai rien développé en Node.js… mais je me demande si je ne passe pas à
coté de quelque chose d'important.
Les forces de Node.js
Bien que Node.js date seulement de 2009 :
il a déjà un bon système de package : Node Package Manager que la grande
majorité de la communauté semble utiliser
il a déjà une très forte communauté, de très nombreuses librairies,
exemple : plein de librairie classées,
déjà plus de 9000 packages sur npm
tous les développeurs web (front-end) connaissent le langage, il est très populaire.
Par conséquent, pour passer à Node.js il n'y a pas le frein d'apprendre un nouveau langage comme ça
serait le cas avec l'utilisation d'un framework web basé sur Ruby ou Python. Je pense que dans
les mois qui viennent, de nombreux développeurs PHP vont passer à Node.js… surtout ceux qui
regardaient ailleurs mais qui ne souhaitent pas apprendre un nouveau langage.
la possibilité de partager du code (librairies communes…) entre la partie client et serveur peut
être intéressant. La question se pose de plus en plus étant donnée qu'on est de plus en plus amené
à effectuer beaucoup de traitement coté client (exemple avec Backbone.js).
Dernièrement, dans tous mes projets de développement web, j'ai utilisé un moteur de template
coté client en plus du moteur de template coté serveur.
Je dois gérer de plus en plus souvent une couche modèle coté client. Des vues coté client…
Cela fait donc plein d'éléments en doubles, utilisés
une fois sur le serveur, une fois sur le client. Donc deux technologies à maîtriser.
Ces derniers jours, la visualisation du screencast du framework javascript Meteor
m'a mis la puce à l'oreille.
Autre exemple, il est possible d'utiliser la même API Canvas coté client et
coté serveur (avec node-canvas).
Node.js semble être très rapide, ça tient très bien la monté en charge.
La vitesse de l'interpréteur Javascript est en constante progression V8 (JavaScript engine)
Faiblesses de Node.js
Je ne sais pas si mes remarques sont exactes, je n'ai aucune expérience en Node.js.
Exemple dans la partie Bad Use Cases
du guide Felix's Node.js Convincing the boss guide il
est indiqué que les framework
Node.js sont moins matures que ce que l'on peut trouver en Ruby, Python et Php (bon pour ce dernier
j'ai des doutes, je pense que la communauté Node.js est déjà plus mature, plus structurée que
la communauté Php… enfin bon…).
Je n'ai pas trouvé d'outil comme Whoosh en Javascript
(c'est un moteur de recherche léger). J'ai tout de même trouvé Node-xapian
Je ne sais pas si il est encore tôt pour passer à Node.js mais si la communauté continue à être
aussi dynamique que ces 2 dernières années… alors les pièces manquantes seront bientôt créées.
Quand je vois cette liste, je me pose sérieusement la question : est-ce que Javascript est le langage incontournable
de ces 10 prochaines années ? Certes il est déjà incontournable dans le navigateur, mais pour le reste ?
Édition 5 mai 2012 :
j'ai publié ce billet sur LinuxFR, j'ai reçu 90 commentaires…
j'ai publié ce billet sur la mailing list de l'Afpy, j'ai reçu 25 commentaires… malheureusement les archives de cette liste n'est pas publique
J'ai plus ou moins suivi le contenu de la documentation…
Dans la vidéo j'ai fait quelques erreurs d'expression alors soyez indulgents… ce n'est pas facile de faire un
screencast valide du premier coup.
Je vous conseille de visualiser la vidéo en mode 720p afin de bien pouvoir lire le contenu de la console.
Après la réalisation du screencast je me suis rendu compte que j'aurais dû agrandir la taille des polices.
Je viens de commencer à utiliser Selenium pour tester des formulaires, divers
pages de listes de données… dans une application métier.
Mes objectifs :
tester l'ajout de nouvelles entités (1)
les données sont injectées dans un formulaire d'une page html
une page de résultat est utilisées pour vérifier que les données ont bien
été enregistré (ça peut être une page d'édition)
tester la modification d'une entités (2)
les données sont injectées dans un formulaire d'une page html
une page de résultat est utilisées pour vérifier que les données ont bien
été enregistré (ça peut être une page d'édition)
tester la validité d'une page de liste (3)
tester la validité des résultats d'un moteur de recherche (4)
Pour le moment je me suis concentré uniquement sur les points 1 et 2.
Première méthode (à l'arrache)
J'ai commencé par réaliser des fonctions du type :
login()
add_customer(data)
edit_customer(data)
check_customer(data)
add_customer(data)
edit_customer(data)
check_customer(data)
…
Les fonctions de type "add" et "edit" prennent en paramètre des données à injecter dans des pages.
Les fonctions de type "add" correspondent aux pages d'ajout d'entités, les fonctions de
type "edit" correspondent aux pages de modification d'entités.
Ensuite j'ai des fonctions "check", là aussi je passe en paramètre des données qui seront
utilisées comme valeur de vérification face à des pages de résultats ou pages d'éditions (une
page d'édition contient déjà des données, le but ici est de vérifier leurs validitées).
Dans mes fonctions ("add", "check"…) j'ai une boucle qui parcourt la structure de données
et utilise les fonctions suivantes soit pour injecter des données, soit pour tester la validité
des données.
def inject_value(driver, name, value):
element = driver.find_element_by_id(name)
if element.tag_name == 'input':
if element.get_attribute("type") == "checkbox":
if element.is_enabled() != value:
element.click()
else:
element.clear()
element.send_keys(value)
elif element.tag_name == 'select':
option_element = element.find_element_by_xpath(".//option[@value='%s']" % value)
option_element.click()
elif element.tag_name == 'textarea':
element.clear()
element.send_keys(value)
def check_value(driver, name, value):
element = driver.find_element_by_id(name)
if element.tag_name == 'input':
if element.get_attribute("type") == "checkbox":
return element.is_enabled() == value
else:
return element.get_attribute("value") == value
elif element.tag_name == 'select':
return element.get_attribute("value") == value
elif element.tag_name == 'textarea':
return element.text == value
Pour le moment, cela fonctionne correctement mais je trouve mon code fastidieux pour plusieurs
raisons :
j'aimerais pouvoir définir des valeurs par défaut pour les formulaires
j'aimerais pouvoir choisir d'autres types de "selecteur", pour le moment je fais des
recherches uniquement par ID
j'aimerais pouvoir facilement indiquer le type de champ, car pour le moment je fais de
l'auto détection… mais cela ne sera pas toujours faisable
Ce que j'aimerais avoir
À noter que ce code n'est pas complet… c'est un brouillon.
from sealchemy import Form, TextField, SelectField, BooleanField
...
class AddCustomer(Form):
__submit__ = Submit(name="_same")
reference = TextField(default=u"C1345")
type_user = SelectField(default=u"external")
firstname = TextField(required=True)
lastname = TextField(required=True)
activated = BooleanField(default=True)
comment = TextAreaField(default=u"")
def go_to_page(self):
self.driver.get("/customers/add/")
class EditCustomer(Form):
__submit__ = Submit(name="_same")
reference = TextField(default=u"C1345")
type_user = SelectField(default=u"external")
firstname = TextField(required=True)
lastname = TextField(required=True)
activated = BooleanField(default=True)
comment = TextAreaField(default=u"")
def go_to_page(self, id):
self.driver.get("/customers/%s/" % id)
def go_to_last_inserted(self):
"""Va sur la page du dernier client qui a été ajouté"""
...
Cela ressemble beaucoup à l'API de wtforms que j'utilise
dans mon projet. Cela ressemble aussi à FormAlchemy que
j'aime aussi.
__submit__ permet d'indiquer le champ à utiliser par la commande submit.
Note : je n'utilise pas une seule classe pour faire mes traitements "add" et "edit" car
les formulaires d'ajouts et d'édition sont en pratique souvent différents.
L'interface de la classe de type Form :
class IForm(zope.interface.Interface):
def inject():
"""Cette méthode injecte les données vers le formulaire HTML"""
def submit():
"""Cette méthode lance le submit du formulaire"""
def inject_and_submit():
"""Exécute inject et ensuite submit"""
def check():
"""Cette méthode retourne True si les données correspondent aux
données présentes dans le formulaire HTML"""
def clear():
"""Réinitialise la valeur de tous les champs de l'instance avec
les valeurs par défauts"""
def populate(values):
"""Affecte des valeurs aux champs de l'objet."""
Quelles sont les motivations qui m'ont poussé à réaliser cette page ?
je trouve intéressant de savoir quels sont les outils que X ou Y utilise au
quotidien… on y découvre souvent des choses intéressantes (donc n'hésitez pas à réaliser
ce type de page). Un site qui a le même esprit est « Ils utilisent ça ».
il arrive que l'on me demande quelle librairie j'ai choisi pour réaliser telle ou telle tâche
parfois, je ne sais plus quelle librairie javascript j'ai choisi pour réaliser une tâche, dans ce
cas cette page me sert de "pense-bête"
Depuis 3 semaines, j'utilise de plus en plus régulièrement virtualenvwrapper.
Cet outil est vraiment très pratique. Un petit résumé rapide d'utilisation (mais
je vous conseille fortement de lire la documentation pour en savoir plus sur
les divers fonctionnalités de l'outil, comment l'installer…) :
Je crée le dossier qui contiendra mon projet :
$ mkdir ~/projets/mon_projet/
Je crée un nouvel environement qui porte le même nom que mon projet :
À noter que les commandes fournies par virtualenvwrapper supportent pour la plupart l'auto complétion,
par exemple workon <tab> affiche les environements disponibles sur votre système.
Consultez la documentation de virtualenvwrapper pour en savoir plus.
Mozilla Sync
Depuis que je suis passé à Firefox 4,
j'utilise Firefox Sync pour centraliser mes bookmarks.
Avant cela, j'utilisais avec plaisir delicious mais
l'extension delicious pour Firefox 4 n'est pas disponible.
En tout les cas, Firefox Sync fonctionne vraiment très
bien, c'est très facile à configurer, c'est totalement transparent à l'usage… un très beau travail,
réalisé entre autre par Tarek Ziade pour la partie serveur (codé en Python).
+--------+--------+--------+----------------+
| | | | |
| bloc 1 | bloc 2 | bloc 3 | du vide |
| | | | |
+--------+--------+--------+----------------+
|
v
étendre les blocs 2 et 3
|
v
+--------+-----------------+----------------+
| | | |
| bloc 1 | bloc 2 | bloc 3 |
| | | |
+--------+-----------------+----------------+
Pour en savoir plus sur les fonctionnalités de jquery.expandBox plugin, comment l'utiliser, où le télécharger…
je vous conseille de vous rendre sur la page du projet….
Il y a 8 mois, au moment où j'ai réalisé ce plugin, j'ai cherché si ce type de plugin existait déjà.
Je n'ai rien trouvé (j'ai peut être mal cherché).
La fonctionnalité « The flexible box model » de
la norme CSS 3 permet d'étendre des blocs d'une manière plus élégante que le plugin jquery.expandBox mais
cette fonctionnalité n'est pas encore disponible pour tous les navigateurs.
J'espère que la documentation est compréhensible et que ce plugin vous sera utile.
Si vous avez des remarques, suggestions… n'hésitez pas à m'envoyer un mail à stephane@harobed.org