2013/05/03

NoSQL et MongoDB

Formation par F.-Nicola

MongoDB est une base de données NoSQL populaire orienté-document utilisant le langage JSON (BSON si compressé).

Voici un court tutoriel sur cette outil.  Pour expérimenter, nous utiliserons une console texte de MongoDB (similaire à SQLPlus).  Vous devez d’abord installer MongoDB sur votre système d’exploitation.  Par la suite, vous avez le choix.  Vous pouvez utiliser une base de donnée MongoDB local sur votre poste ou une base de données dans un nuage sur le site https://mongolab.com  Sur ce site, vous vous créez un compte et vous créez ensuite une base de données « SandBox » (ce qui veut dire « test »).
Dans votre console, vous allez vous connecter à votre base de données à distance par une commande similaire à la suivante:
mongo ds1234567.mongolab.com:61747/monMongoDB -u  utilisateur -p motdepasse
L’exemple utilisé pour ce tutoriel est celui du « cas projet ».

Créer une base de données

MongoDB est un système de gestion de base de données NoSQL de type document.  Les documents sont regroupés sous forme de collection qui sont regroupées dans des bases de données.
Nous allons créer une base de données appelée db et une collection projet0 qui contiendra les données de la base de données du projet 0 que vous connaissez.  Voir les documents sur LEA.
 
Pour vérifier la présence des bases de données, on peut taper (mais il faut avoir les droits):
show dbs

Pour choisir une base de données (et la créer), on tape:

use db;

Pour savoir quelle base de données nous utilisons, on tape:

db;

Créer et insérer dans une collection

Les données dans une base de données MongoDB sont regroupés par collection.  Pour consulter les collections déjà présentes, on peut taper:
show collections;
Nous allons utiliser une première collection appelé projet0.  Pour la créer, nous allons insérer un premier document.  Par exemple, on affecte 1 « objet » Javascript à 1 variable appelée employe1.
employe1 = { nom : "Gagnon",
prenom : "Michel" };
On insère ces objets dans la collection comme suit:
db.projet0.insert( employe1 )
On peut constater le contenu de notre collection en exécutant:
projet0.find()
En exécutant, vous constaterez que des clés artificielles uniques ont été ajoutées accessibles par l’objet « _id » qui sont des objets spéciaux de MongoDB.  On peut générer ces clés uniques par la fonction ObjectId().

Suivant les explications sur le site d’aide de MongoDB à propos de la création, voici comment créer un premier enregistrement de type employé et le lier à un premier département créé appelé Recherche & développement.

Mais avant cela, nous devrions détruire le document créé précédemment à partir de la variable employe1 puisqu’il est incomplet Pour ce faire, nous exécutons:

db.projet0.remove({ nom : "Gagnon",
prenom : "Michel" }, 1)

Pour en savoir plus sur la suppression de documents, consultez la page suivante.

Voici maintenant comment insérer un premier département et un premier employé pour ce département.

id_departement = "RD";

departement1 = {
_id: id_departement_RD,
nom_departement : id_departement_RD,
nom_complet: "Recherche et développement",
telephone: "418-567-8901"};

db.projet0.insert(departement1);

Pour créer notre employé pour ce département, on écrit par exemple:

db.projet0.insert(
{
no_employe: 1,
nas: "123456789",
nom: "Gagnon",
prenom: "Michel",
sexe: "M",
date_naissance: new Date('Jun 07, 1954'),
date_embauche: new Date('Jun 07, 1999'),
fonction: "programmeur",
salaire: 50000,
id_departement: id_departement_RD
}
)

Remarquez que les objets date sont créés à l’aide d’une fonction Date.

Pour en savoir plus sur la création et la mise à jour dans MongoDB, consultez la page suivante.

Séquences

Il est possible de créer des séquences en créant d’abord un document de départ.  Voici un exemple pour une séquence pour un numéro d’employé:

db.compteurs.insert(
{
_id: "employe_id",
seq: 0
}
)

Par la suite, on définit une fonction générale de type « Nextval » comme suit:

function getNextSequence(name) {
var ret = db.compteurs.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true
}
);

return ret.seq;
}

On peut alors utiliser cette fonction comme séquence comme suit:

db.projet0.insert(
{
no_employe: getNextSequence("employe_id"),
nas: "123456789",
nom: "Gagnon",
prenom: "Michel",
sexe: "M",
date_naissance: new Date('Jun 07, 1954'),
date_embauche: new Date('Jun 07, 1999'),
fonction: "programmeur",
salaire: 50000,
id_departement: id_departement_RD
}
)

Pour en savoir plus sur les séquences, voir ici.

Exercice 1

Servez-vous du fichier SQL du projet 0 (fourni sur LEA) pour créer le même ensemble de données sous MongoDB.  Créez-vous un fichier contenant l’ensemble des définitions JSON de création des données.  Utilisez la fonction copier/coller de votre fichier vers un interpréteur MongoDB.  Vous pouvez mettre l’ensemble des données dans la collection projet0 ou bien vous pouvez créer plusieurs collections (une pour chaque table SQL).

Chercher des documents

Pour la suite de ce texte, nous supposons que vous avez créer l’ensemble des données du projet 0.
Pour obtenir la liste des documents installés, vous tapez:
db.projet0.find();

Pour obtenir un document en particulier, on peut écrire:

db.projet0.find({ nom: "Gagnon"});
Pour filtrer, on peut utiliser des opérateurs (plus grand):
db.projet0.find({ salaire: {'$gt': 40000});

Compter et grouper des résultats

Il est possible de compter le nombre de documents dans une collection comme par exemple:
db.projet0.count();

On peut « grouper » et obtenir les valeurs distinctes dans une collection.  Par exemple, on tape la commande suivante:

db.projet0.distinct("prenom");
On obtient la liste des prénoms sans répétition.
De façon plus complexe, il est possible de grouper des résultats de façon équivalente à un GROUP BY.  Par exemple, pour compter le nombre d’employés par profession (attribut « fonction »), on écrit ceci:
db.projet0.group(
{
key: {'fonction': true},
initial: {total: 0},
reduce: function(doc, prev) { prev.total += 1}
});
Le document passé en paramètre à la fonction group contient 3 sous-documents.  Il y a le nom de l’attribut de regroupement (paramètre du GROUP BY).  Il y a le nom de la variable de décompte (total).  Le 3ième paramètre est une fonction Javascript qui prend en paramètre le document « employe » et le document du décompte (contenant l’attribut « total »).
On peut modifier le regroupement pour calculer le total du salaire par profession comme suit:
db.projet0.group(
{
key: {'fonction': true},
initial: {salaire_total: 0},
reduce: function(doc, prev) { prev.salaire_total += doc.salaire }
});

Exercice 2

Trouvez le moyen d’obtenir le nombre d’employés par nom de département.

Pour en savoir plus les techniques de regroupement dans MongoDB, lire le texte disponible ici.

Introduction au Map/reduce

La technique de programme map/reduce a été développé par Google.  Elle est souvent utilisé dans le monde NoSQL.  L’idée est simple.  La fonction « map » est appliquée sur chaque document.  Et la fonction « reduce » rassemble les résultats de façon successible jusqu’au résultat total.
Dans le cas du projet 0, imaginons que nous voudrions obtenir le nombre de documents pour chaque projet (voir le modèle MRD).
Pour ce faire, nous avons besoin d’une fonction qui appliqué à chaque document.  Cette fonction s’appelle un « map ».
var map = function() {
emit(this.nom_client, {documents: 1});
};

 

On doit aussi définir la fonction reduce qui récoltera les résultats

var reduce = function(key, values) {
var somme = 0;
values.forEach(function(doc) {
somme += 1;
});

return {documents: somme};
};

On démarre le calcul comme suit:

var op = db.projet0.mapReduce(map, reduce, {out: "m_resultats"});

Pour obtenir le résultat, on doit lister les résultats comme suit:

db[op.result].find();

Exercice 3

Appliquez la technique map/reduce pour calculer le nombre de projets par client.

 

Pour en savoir sur la technique map/reduce sous MongoDB, consultez ce texte.

 

2012/07/02

WebCamp Québec 2012 – Freaks

Conférence par F.-Nicola

Le 17 mai 2012 à l’ENAP, il y a eu la 4ième édition du WebCamp de Québec.  C’était ma première expérience de ce type de rencontre plus ou moins formelle de mini-conférences sur le thème du Web.  Il y avait 3 salles du niveau général, niveau intermédiaire (geeks) et niveau expert (freaks).  Je me suis concentré que sur la salle des freaks.

La matin, en première partie, on a abordé des problèmes de gestion de contrôle des versions.  Voici quelques affirmations que j’ai retenues:

  • Git est le grand « gagnant » de la guerre du contrôle des versions (contre SVN principalement).
  • Gitstack est un serveur Git pour Windows.
  • Tortoise HG est un client Git pour Windows.
  • Il existe un module de comparaison d’images.
  • Git n’est pas un outil de gestion documentaire.

Par la suite, le sujet du déploiement « idéal » a été longuement discuté.  Je n’y connais pas beaucoup dans ce domaine mais je reconnais que c’est un sujet important parce que la structure de déploiement est importante pour un bon développement (pour éviter les interruptions de service et permettre les retours en arrière).  Dans les discussions, on mentionne le lien entre Git et les notions de déploiement.  On a discuté du schéma « classique » qu’on retrouve ici.  On a discuté de l’interaction (au sens large) des différentes branches du développement comme feature, develop, hotfix, release et master.

Par la suite, il a été question d’hébergement du code comme github.com qui était intéressant pour les développeurs.  Il a été mentionné que les gestionnaires sont souvent craintifs à l’utilisation pour des questions de droits d’auteur ou de vol d’information.

L’outil Fabric pour le déploiement du code sur des serveurs SSH.   Capistrano  est un autre outil de déploiement Web installé sur un serveur (long à configurer sur un serveur mais on gagne du temps à long terme) et gère le transfert vers d’autres serveurs Web.  Capistrano peut être utilisé en collaboration avec Github.  Cssh a aussi été mentionné.

Par la suite, l’outil de gestion de métriques Sonar a aussi été abordé.  Il y a des comparaisons à faire avec PHP Codesniffer qui est un outil d’inspection des standards de programmation PHP.  Pour Java, on retrouve aussi l’outil PMD qui semble intéressant.

Le développement mobile a été discuté du point de vue du déploiement.  Les gens d’expérience dans ce domaine ont exposé leur expérience en expliquant que la mécanique du déploiement n’est pas bien avancé et que rien n’est automatisé même sous la plate-forme Android.  Certains frameworks ont été mentionnés comme Appcelerator avec Titanium (pour Javascript) et PhoneGap pour le développement HTML5.

Après la pause en après-midi, la question du contrôle des versions pour les bases de données a été une bonne discussion.  Le « versioning DB » n’est pas évident parce qu’il n’y a pas de solution évidente.  Les développeurs en Ruby on Rails ont parlé de leur expérience.  Étant donné que la création, la mise à jour et la suppression des tables et des données se fait par programmation sous Rails, il est possible d’utiliser le contrôle des versions du code pour la base de données.  Cela fonctionne très bien apparemment.   Une personne a mentionné qu’il existe un outil Oracle pour le contrôle des versions sous Oracle.

Ensuite, il a été question du nouveau « buzz word » dans l’entreprise: dev ops.  Ce terme ne désigne pas un conseiller en architecture organique mais un titre de responsable de la qualité sans avoir les pouvoirs décisionnels, position plutôt embêtante.  C’est un poste entre développeur et administrateur système.

Le sujet suivant a été les technologies NoSQL.  Il y a mention du théorème du CAP d’Eric Brewer qui indique que tout système distribué (comme les SGBD NoSQL le sont souvent) peut répondre aux 3 contraintes suivantes: cohérence (les mêmes données au même moment), haute disponibilité (en cas de panne, les données restent accessibles)  et tolérance au partitionnement.  Les SGBD Cassandra (Facebook, Twitter), MongoDB, BigTable (Google) et CouchDB.  Oracle est plutôt critique et c’est un effet de mode.

Il y a eu quelques discussions sur les méthodes Agile.  Un intervenant a mentionné son expérience de la méthode Kanban qui a dit simple à suivre.  Il la recommande.

En après-midi, une assez longue discussion sur Javascript a pris une bonne part.  Il a été question des engins Javascript existant comme Spydermonkey, V8, etc.  Les librairies de type Backbone.js, Underscore.js, Ext.js et Prototype.js ont été mentionnées.  Le nouveau langage de programmation Dart développé par Google qui génère du Javascript qui se veut un possible remplaçant au kit de développement Web GWT.  OPA, le nouveau langage de programmation de développement d’applications distribuées est inspiré de Javascript.  C’est un projet prometteur.  Le nouveau protocole expérimental de Google SPDY a été mentionné.  Le but est d’augmenter la rapidité et la sécurité des transferts pour Chrome et Firefox.

En dernière partie de la journée, les langages de programmation applicatifs ont été comparés.  On a discuté des langages PHP, Ruby on Rails, Python et Erlang/Haskell.  Malheureusement, j’ai perdu mes notes pour cette partie mais un concensus est ressorti sur quelques éléments:

  • PHP est un langage limité en terme de gestion des processus légers mais il est simple et facilite la programmation Web.
  • Le développement de PHP semble plafonner.  La sortie de PHP 6 est retardée et n’apporte pas grand chose de vraiment motivant.
  • Les frameworks et CMS sous PHP sont matures et donc, à ne pas négliger malgré la ‘vieillesse’ de PHP.
  • Les langages alternatifs comme Ruby on Rails/Python sont intéressants mais ne se démarquent pas.
  • Il y a un certain intérêt à faciliter le développement en Javascript ou vers Javascript (conversion).  Il a été question de JQuery qui augmente en taille.
  • Le protocole HTTP est analysé pour l’optimiser (Google SPDY).

Voilà ce que j’ai retenu de cette rencontre très intéressante.

2012/04/08

Formation Drupal pour développeurs de Evolving Web.

Formation par F.-Nicola

Le vendredi 30 mars, à Montréal, j’ai suivi une formation Drupal pour développeurs chez Evolving Web.  C’était une formation très intéressante qui couvrait globalement tous les aspects de la programmation Drupal, c’est-à-dire, l’architecture de Drupal et l’extension de Drupal par module.  Étant donné que la formation ne durait qu’une journée, il y a des notions qui n’ont été que sommairement présentés mais certains sujets et exercices ont été réalisées plus en profondeur avec grand plaisir.  Voici les thèmes présentés par l’équipe de Evolving Web:

  1. Introduction rapide à Drupal (notions de nodes, content types, fields, revisions, taxonomy, menus, roles, permissions, blocks, themes et modules)
  2. Architecture de Drupal (entity types, bundles, entities, custom fields, widgets, views, features)
  3. Programmation (Drush, standards de programmation, Devel, modules de service, abstraction de BD, cache, test unitaire, renderable arrays, multisite)
  4. Système de hook (callbacks, hook_init, hook_node, hook_menu, hook_block, )
  5. Meilleures pratiques Drupal (documentation, debug, devel module,
  6. Construire un module Drupal (toutes les étapes ont été présentées)
  7. Travailler avec les noeuds, les menus et les blocs.
  8. API des formulaires
Les formateurs nous ont offerts un compte chez http://aws.amazon.com avec Drupal 7 installé.  Tous les exercices étaient réalisés sur cette installation.  C’était une bonne idée!

Evolving Web est un compagnie dynamique qui développe des applications avec Drupal.  En particulier, elle a développé le site http://drupalsun.com/ qui est un aggrégateur RSS de http://drupal.org/planet avec affichage extensible pour affichage mobile et de type tablette.

 

2011/07/09

OStatus est un standard de réseau social temps réel distribué

Conférence par F.-Nicola

Le 7 juillet 2011, j’ai assisté à la conférence de Evan Prodromou à la conférence PHP Québec de Montréal qui a présenté le protocole ouvert OStatus qui se veut un standard de réseau social temps réel distribué.  La présentation était clair et intéressante.  M. Prodromou a bien montré les éléments qui constituent un réseau social étape par étape.  Ce protocole ouvert est soutenu par Google indirectement. L’idée de ce protocole est d’offrir des fils de publication (feeds) de contenu à des lecteurs (qui sont membres ou non du réseau social).  Le flux de contenu est soutenu par la fonctionnalité PuSH (PubSubHubbub) des fils de publication.  L’identification des lecteurs se fait par la structure Personal Web Discovery Webfinger.  Il a plusieurs notions fondamentales liées à ce protocole comme les montées de saumon (« salmon slap »), les « followers » de flux de contenu, les « likes » de contenu par les lecteurs et « shares » de contenu entre lecteurs (comme dans Facebook).  Le but de ce protocole est d’offrir les bases nécessaires pour équiper une application à la communication dans un réseau social (« OStatus-enable an application »).  Tout ça est très prometteur.

Quelques efforts de rédaction

Divers par F.-Nicola

J’ai décidé de reprendre en main mon carnet Web que j’avais laissé à l’abandon depuis 2007. Dans les prochaines semaines (et mois), je vais m’appliquer à l’alimenter de réflexion sur mes activités et sur des notions techniques.

2007/07/16

Guide d’accompagnement Open Calc pour Méthodes quantitatives

Pédagogie par F.-Nicola

Jean-Yves Gaudet, enseignant du Cégep Marie-Victorin, donnait depuis plusieurs années le premier cours de Méthodes Quantitatives. Il avait développé un guide d’accompagnement très détaillés de consignes pour le traitement statistique des données d’un échantillon en utilisant le logiciel Microsoft Excel.

Jean-Yves Gaudet m’a donné la permission de ‘traduire’ son guide d’accompagnement pour le logiciel Open Calc Open Calc est le concurrent le plus sérieux et le plus connu de Microsoft Excel. De plus, le fonctionnement de Open Calc ressemble beaucoup à celui de Microsoft Excel. J’ai voulu prouver que Open Calc contient toutes les fonctions et outils permettant le traitement statistique des données d’un échantillon comme on le fait traditionnellement sous Microsoft Excel.
Le défi a été relevé. Le guide d’accompagnement Open Calc couvre entièrement le guide pour Microsoft Excel de Jean-Yves Gaudet. Et plus, il est plus simple et plus complet que la version pour Microsoft Excel. Ce guide est sous licence Creative Commons permettant à tous d’en avoir une copie (en format PDF), de l’utiliser, de le distribuer et même, de le modifier à son goût (à condition de respecter la licence Creative Commons). La version modifiable Open Writer (ODT) est disponible sur demande par courriel à fnd[a]techorange.ca.

2006/07/26

Moodle

Classes virtuelles par F.-Nicola

J’utilise le logiciel libre Moodle depuis plus de 3 ans. Moodle est une plateforme d’apprentissage en ligne (ou e-learning en anglais) servant aux professeurs à communiquer avec leurs étudiants dans leurs classes via le Web. Cet outil fonctionne entièrement à l’aide d’un fureteur de manière conviviale au collège ou à l’extérieur. Moodle est comparable au système bien connu WebCT utilisé dans plusieurs universités ou plus récemment à la plateforme Decclic utilisé par certains collèges au Québec. Moodle a un grand avantage sur les plateformes d’apprentissage en ligne commerciales comme WebCT: le coût d’implantation et d’utilisation! Contrairement à ceux-ci, Moodle est un logiciel libre. Il est donc gratuit et sans publicité. Il est supporté par une grande communauté de bénévoles (autour de 5000 individus). Moodle est installé sur 12 000 sites dans 140 pays. Il est traduit dans 60 langues différentes. Au Québec, au niveau collégial, Moodle est officiellement utilisé par les Collèges de l’Outaouais, de Rosemont et de Jonquière.

Moodle gère ce qu’on appelle des classes virtuelles. Ce sont des espaces de contenu et de communication auquel des groupes d’étudiants sont inscrits. Voici les principales caractéristiques d’une classe virtuelle gérée par Moodle:

1. Présentation du contenu via une page Web accessible qu’aux étudiants inscrits.

2. Inscription des étudiants via un formulaire sur le Web et un code secret fourni en classe par le professeurs.

3. Gestion automatique des adresses courriels et mots de passe des étudiants.

4. Gestion en ligne des ressources de contenu (texte, images, fichiers, sons/vidéos, etc.)

5. Forums de discussion des professeurs et des étudiants. Envoi automatique par courriel des messages sur ces forums à tous les étudiants s’ils le veulent.

6. Plusieurs modules clés en main: Devoirs, Chat, Sondage, Glossaires, Journal, Étiquettes, Leçons, Wiki, Blogues, Tests, Prises de rendez-vous, Podcast (baladodiffusion), Présences en cours, etc.

7. Module de création de tests d’évaluation. Les tests se présentent sous forme de formulaires que les étudiants peuvent répondre suivant des contraintes précises. Les questions créées avec ce module ont la possibilité d’être mutualisées et réutilisées dans différents contextes d’épreuve ce qui est un des points forts de cette plateforme.

8. Module de prise de rendez-vous des périodes de disponibilités dans la semaine. Les professeurs inscrivent leurs périodes de disponibilité. Les étudiants peuvent inscrire leur présence à une ou plusieurs des périodes indiquées. Les professeurs sont alors informés des présences aux disponibilités.

9. Module de gestion des présences en cours. Les professeurs peuvent inscrire les présences ou absences des étudiants pour chaque période de cours.

10. Statistiques des activités des classes virtuelles permettant de superviser les efforts d’apprentissage de chaque étudiant.

11. Communication avec les étudiants en groupe ou individuellement. Des courriels sont envoyés aux individus concernés.

12. Filtres de rédaction du contenu permettant d’intégrer facilement des fichiers multimédias ou des expressions mathématiques dans les textes de contenu.

13. Gestion complexe d’un calendrier des activités et des évaluations.

14. Documentation française complète des fonctionnalités du système.

Cet outil est particulièrement pratique pour les classes gérés par plusieurs professeurs facilitant la communication entre tous. Aussi, très pratique pour les stages.

2006/07/16

Merci Tikiwiki!

CMS par F.-Nicola

Après 5 ans d’utilisation de Tikiwiki pour le site principal de Technologie Orange, j’ai décidé de changer. Je passe à WordPress.

Tikiwiki m’a fourni un très bon service pendant tout ce temps, je lui en suis reconnaissant. Tikiwiki est un excellent système que je recommande. Sa principale fonction est le système de pagination de type Wiki.
Je passe à WordPress qui est plus simple et prend moins de place sur mon serveur d’hébergement. Avec Tikiwiki, je n’utilisais pas vraiment toutes ses fonctionnalités. Je me suis rendu compte avec le temps qu’une publication de type portfolio pouvait suffir à mes besoins.
Encore merci à Tikiwiki!