Bienvenue sur f4b1.com

Cette année 2016 risque de réserver beaucoup de surprises, revenez vite voir ce qu'il se passe ici !


Il y a quelques jours, je vous parlais de ArangoDB, une base de données NoSQL qui est très pratique à utiliser et notamment grâce au ArangoDB Query Language (AQL).Il est possible d'utiliser ArangoDB dans de nombreux contextes techniques via les drivers proposés qui sont disponibles dans les langages de programmation les plus courants.

Après avoir fait une petite présentation de ArangoDB et un petit tutoriel pour son installation sur la distribution Linux Ubuntu, nous allons maintenant voir comment utiliser cette base de données NoSQL et surtout interagir avec elle. La manipulation des données est un élément essentiel et justement sous ArangoDB cela est facilité avec le AQL qui se rapproche de ce qui se fait avec le langage de requêtes SQL, l'idée est la même mais la syntaxe est différente, évidemment.

Pour ce premier article concernant ArangoDB et surtout le langage l'AQL, je vais me concentrer sur les requêtes simples, nous verrons l'utilisation des filtres dans un prochain tutoriel pour cibler de façon précise les données sans passer par la clé par exemple. La même collection sera utilisé tout au long de ce tutoriel, il s'agit de tuto d’où l'utilisation des lignes "IN tuto".

Requête INSERT

Cette requête INSERT est la plus basique et c'est la première que nous allons utiliser pour ce tutoriel, elle permet d’insérer des données mail et name dans la collection tuto.

  1. INSERT { mail: 'email@ndd.com', name: 'fabien'} IN tuto

Requête UPDATE

Comme pour SQL, le UPDATE permet de mettre un enregistrement à jour par une nouvelle donnée plus fraiche. Pour trouver l’occurrence à mettre à jour et par souci de simplicité pour le moment, nous allons cibler une clé parmi notre collection, les data derrière cette clé seront alors mise à jour.

  1. UPDATE { _key : '3073189550309' }
  2. WITH { mail: 'newemail@ndd.com' }
  3. IN tuto
  4. RETURN { OLD: OLD, NEW: NEW }

Pour que ce soit plus explicite et c'est le cas pour les exemples de requêtes AQL suivantes, j'ai ajouté la ligne RETURN { old: OLD, new: NEW } qui permet de voir ce qui à changé via notre requête :

  1. [
  2. {
  3. "old": {
  4. "name": "fabien",
  5. "mail": "email@ndd.com",
  6. "_id": "tuto/3073189550309",
  7. "_rev": "3073189550309",
  8. "_key": "3073189550309"
  9. },
  10. "new": {
  11. "name": "fabien",
  12. "mail": "newemail@ndd.com",
  13. "_id": "tuto/3073189550309",
  14. "_rev": "3073192040677",
  15. "_key": "3073189550309"
  16. }
  17. }
  18. ]

Requête INSERT/UPSERT 

Cette requête produit quelque chose de similaire à un UPDATE basique, mais vous n'êtes pas obligé d'utiliser la clé du document pour mettre à jour votre donnée. C'est possible sans utiliser les filtres "FILTER" que nous verrons plus tard comme je l'ai dit précédemment.

Ceci est possible grâce au UPSERT qui va nous permettre d'aller cibler le bon document. Vous souvenez de notre premier INSERT tout à l'heure ?  Nous allons mettre à jour ce document avec la requête suivante et même ajouter un tableau dans le UPDATE. Attention, j'ai gardé les données précédentes, car sinon tout est écrasé par le UPDATE. En d'autres termes, si j'avais seulement renseigné le tableau, il n'y aura plus que lui après le UPDATE dans notre document.

  1. UPSERT { mail: 'email@ndd.com' }
  2. INSERT { }
  3. UPDATE { mail: 'email@ndd.com', name: 'fab1', arrayinfo: [{stringheader:'value15258'}]}
  4. IN tuto
  5. RETURN { OLD: OLD, NEW: NEW }

Le résultat est alors le suivant :

  1. [
  2. {
  3. "old": {
  4. "name": "fabien",
  5. "mail": "email@ndd.com",
  6. "_id": "tuto/3073129912549",
  7. "_rev": "3073129912549",
  8. "_key": "3073129912549"
  9. },
  10. "new": {
  11. "name": "fab1",
  12. "mail": "email@ndd.com",
  13. "arrayinfo": [
  14. {
  15. "stringheader": "value15258"
  16. }
  17. ],
  18. "_id": "tuto/3073129912549",
  19. "_rev": "3073131223269",
  20. "_key": "3073129912549"
  21. }
  22. }
  23. ]

Requête UPSERT avec l'utilisation de .OLD

Dans cet exemple, vous pouvez voir que l'on peut contourner le problème que nous avons rencontré avec le précédent UPDATE. En effet il fallait ajouter les anciennes données dans le UPDATE pour ne pas écraser le contenu de notre document. Il est possible de faire autrement en utilisant la fonctionnalité .OLD de ArangoDB qui va nous permettre de garder les anciennes données du document en plus d'ajouter les nouvelles.

  1. UPSERT { mail: 'email@ndd.com' }
  2. INSERT { }
  3. UPDATE { arrayinfo: PUSH(OLD.arrayinfo, 'monajout',TRUE) }
  4. IN tuto
  5. RETURN { OLD: OLD, NEW: NEW }

Ce qui nous donne ensuite :

  1. [
  2. {
  3. "old": {
  4. "name": "fab1",
  5. "mail": "email@ndd.com",
  6. "arrayinfo": [
  7. {
  8. "stringheader": "value15258"
  9. }
  10. ],
  11. "_id": "tuto/3073129912549",
  12. "_rev": "3073131223269",
  13. "_key": "3073129912549"
  14. },
  15. "new": {
  16. "name": "fab1",
  17. "mail": "email@ndd.com",
  18. "arrayinfo": [
  19. {
  20. "stringheader": "value15258"
  21. },
  22. "monajout"
  23. ],
  24. "_id": "tuto/3073129912549",
  25. "_rev": "3073135417573",
  26. "_key": "3073129912549"
  27. }
  28. }
  29. ]

Requête REPLACE

Cette requête ressemble un peu au UPDATE lorsque l'on reste dans des choses simples. Ici, UPDATE c'est uniquement pour remplacer du contenu dans un document et pas pour le mettre à jour avec des données en plus tout en gardant les anciennes. L'ancien contenu sera donc totalement remplacé par le nouveau en ciblant sur une clé d'un document par exemple.

  1. REPLACE { _key: "3073189550309" }
  2. WITH {
  3. name: "fab_replace",
  4. DATA: "bigdata"
  5. }
  6. IN tuto
  7. RETURN { OLD: OLD, NEW: NEW }

Cela renvoie le résultat suivant :

  1. [
  2. {
  3. "old": {
  4. "name": "fabien",
  5. "mail": "email@ndd.com",
  6. "_id": "tuto/3073189550309",
  7. "_rev": "3073189550309",
  8. "_key": "3073189550309"
  9. },
  10. "new": {
  11. "name": "fabien",
  12. "mail": "newemail@ndd.com",
  13. "_id": "tuto/3073189550309",
  14. "_rev": "3073192040677",
  15. "_key": "3073189550309"
  16. }
  17. }
  18. ]

Requête DELETE

Je termine cette petite introduction au AQL de ArangoDB avec le REMOVE qui va vous permettre de supprimer un document, voici un petit exemple en utilisant la clé d'un document dans la collection tuto. 

  1. REMOVE { _key:"3073189550309" }
  2. IN tuto

Dans ce tutoriel nous allons voir comment récupérer le contenu de votre boite mail à l'aide des fonctions IMAP de PHP qui sont destinées à cet usage. Gardez à l'esprit que pour les différents exemples que nous allons voir dans cet article, il s'agit d'une boite mail fourni fournie par OVH qui est disponible et livrée lorsque vous prenez un hébergement web de base par exemple.

Pour les autres fournisseurs d'adresses email tel que les gros géants du secteur comme Live / Hotmail, Gmail, Yahoo, un autre hébergeur web, ou encore avec le FAI tel que les @free.fr, @sfr.fr, @orange.fr c'est tout à fait possible aussi mais il faudra modifier la configuration par rapport aux exemples que je vous propose sur cet article comme les ports par exemple.

Nous verrons dans un futur article comment consulter le contenu d'un mail de votre boite de réception, comment supprimer un mail ou le marquer comme lu. De quoi récréer votre propre webmail minimaliste et ses bugs fait maison, la classe non ? Le script de départ et encore relativement minimaliste qui vous permet de lister les emails présents dans votre boite de réception est le suivant :

  1. <?php
  2. $server = '{ssl0.ovh.net:143}INBOX';
  3. $username = 'adresse@domaine.net';
  4. $password = 'mdp!';
  5. $mailbox = imap_open($server , $username, $password);
  6.  
  7. $mails = FALSE;
  8. if (FALSE === $mailbox) {
  9. $err = 'La connexion a échoué. Vérifiez vos paramètres!';
  10. } else {
  11. $info = imap_check($mailbox);
  12. if (FALSE !== $info) {
  13. // le nombre de messages affichés est entre 1 et 50
  14. // libre à vous de modifier ce paramètre
  15. $nbMessages = min(50, $info->Nmsgs);
  16. $mails = imap_fetch_overview($mailbox, '1:'.$nbMessages, 0);
  17. } else {
  18. $err = 'Impossible de lire le contenu de la boite mail';
  19. }
  20. }
  21.  
  22. if (FALSE === $mails) {
  23. echo $err;
  24. } else {
  25. $informationboite = 'La boite aux lettres contient '.$info->Nmsgs.' message(s) dont '.
  26. $info->Recent.' recent(s)';
  27. foreach ($mails as $mail) {
  28. echo 'Objet : ' . (iconv_mime_decode($mail->subject,0, "ISO-8859-1")) . ' Date de r;&eacutception : ' . $mail->date . '<br>';
  29. }
  30. }
  31. ?>

Dans cet exemple, quelques explications s'imposent sur les fonctions PHP utilisés et la configuration.

  1. $server = '{ssl0.ovh.net:143}INBOX';

Comme vous vous en doutez ces informations ne tombent pas du ciel et une petite analyse s'impose. Ainsi l'adresse ssl0.ovh.net correspond au serveur de réception des emails chez OVH et donc si vous passez par un autre prestataire, il faudra modifier cette valeur pour aller chercher les mails au bon endroit.

Ensuite, le "143" correspond au port du serveur entrant chez OVH avec le SSL qui n'est pas actif si on passe par ce port, sinon il s'agit de "993" pour avoir le SSL. Encore une fois, il faudra trouver cette information chez votre prestataire qui vous fournit votre adresse mail et sa boite de réception.

Enfin, la mention "INBOX" correspond à la boite par défaut où arrivent vos mails chez OVH, mais cette valeur peut changer si vous avez créé des sous-boites de réception (un dossier professionnel et personnel par exemple). Tout ça pour dire, dans de nombreux cas il s'agit de "INBOX" mais pas toujours alors faites attention à ce détail lorsque vous allez vouloir accéder aux mails de votre boite de réception.

Petite mention supplémentaire, j'ai utilisé la fonction PHP iconv_mime_decode car j'avais des soucis d'encodage de caractères dans ma page de test basique, cette fonction a résolu le problème dans mon cas mais cela dépend des contextes alors faites aussi attention à ce détail, mais de toute façon, vous devriez rapidement vous rendre compte du problème.

Depuis quelques années, le nombre d'acteurs proposant des bases de données NoSQL est de plus en plus important et l'offre s'est largement étoffée au point qu'il est même parfois difficile de choisir entre les différentes solutions. Alors qu'auparavant le choix était plutôt simple, et encore que pas tant que ça en vrai, entre MySQL, PostgreSQL, SQLite ou encore Oracle Database et SQL Server de Microsoft.

Mais ça c'était avant, ainsi comme je l'ai indiqué juste au-dessus, après le début des premières bases NoSQL "grand public", le nombre de solutions disponibles pour faire du NoSQL a tout simplement explosé ! Bien évidemment, elles ne proposent pas toutes les mêmes fonctionnalités et elles ont chacune des avantages et inconvénients selon ce que l'on veut en faire.

Il faudra donc bien choisir en fonction de ses besoins et dans certains cas ce sera très performant alors qu'à l'inverse dans d'autres cela ne sera pas du tout le cas. Mais ce n'est pas l'objet de cet article et ce sujet du choix en fonction des besoins concernant MySQL sera évoqué dans un autre billet.

Pourquoi utiliser ArangoDB ?

Il arrive parfois que MySQL montre certaines limites dans certains cas et il faut alors passer sur un autre système, avec du NoSQL par exemple. Ainsi ArangoDB est une base de données orientée multi-modèle et donc très flexible. Elle est capable d'utiliser les modèles: clé/valeur, documents et graphes, donc même en utilisant seulement ArangoDB. Il sera possible par exemple de faire du stockage en clé/valeur mais aussi en graph sans avoir besoin d'installer un autre système de base de données NoSQL ce qui est plutôt pratique et permet de rester dans le même environnement.

ArangoDB propose aussi un système de requêtes similaire à ce qui se fait avec le langage SQL que nous connaissons bien, il s'agit de l'AQL pour AQL (Arango Query Language) qui permet d’exécuter des requêtes pour interroger la base de données de façon relativement simple.

Autre point intéressant, ArangoDB propose nativement du partitionnement (sharding), cela permet d'avoir un système de réplication sur plusieurs machines, très pratique donc. Avec le partitionnement il sera possible de mettre en place un système maitre / esclave qui fonctionne avec des coordinateurs.

Peu importe le langage de programmation ou l’environnement technique / technologique que vous utilisez, il sera possible d'utiliser ArangoDB dans de très nombreux cas. En effet des drivers sont disponibles pour PHP, C# / .NET, JavaScript, Node.js, Java, Go, Python, Dart, Ruby et encore d'autres ! Ce n'est pas un point qui pourrait bloquer une éventuelle migration.

Enfin, il y une chose que j'ai beaucoup appréciée en commençant sous ArangoDB, c'est l'application web qui est fournie directement avec l'installation de la base de données NoSQL. Elle permet d'administrer et lire / modifier / supprimer les données de ses bases NoSQL sous ArangoDB, de consulter les statistiques de monitoring, d’exécuter des requêtes AQL, d'installer des services, et encore bien d'autres choses, c'est vraiment très pratique !

Les performances de ArangoDB

ArangoDB propose quelques benchmarks de performances entre leur base de données et PostgreSQL, MongoDB, Neo4j et OrientDB. Il s'agit de performances "brutes" et ce n'est pas forcément représentatif de la réalité, du moins pour les problématiques de chacun.

Installer ArangoDB sur un serveur Linux / Ubuntu

L'installation n'est pas très compliquée et il suffit de taper quelques lignes de commande et le tour est joué. Dans certains cas il faudra un peu de configuration supplémentaire mais rien de fou. Ici je vais me concentrer sur la distribution Linux Ubuntu car c'est ce qu'il y a de plus répandu, souvent c'est ce qui est proposé par les prestataires d'hébergement et sinon il est facile de monter une machine virtuelle sous cette distribution très courante.

Il est néanmoins possible d'installer la base de données NoSQL ArangoDB sous Windows, MacOSX, Debian, OpenSUSE, CentOS et RedHat mais je ne vais pas aborder l'installation d'ArangoDB sur ces systèmes d'exploitation. D'ailleurs, il est aussi possible d'installer ArangoDB via les instances Docker, Microsoft Azure ou encore Amazon Web Services (AWS).

Ainsi pour installer ArangoDB sous Linux il n'y a pas vraiment d'étapes compliquées, il faudra par contre faire attention à la version d'Ubuntu que vous utilisez car selon la version les lignes de commandes seront légèrement différentes.

Ubuntu 15.10 avec l'utilisateur root

  1. wget https://www.arangodb.com/repositories/arangodb2/xUbuntu_15.10/Release.key
  2. apt-key add - < Release.key
  3. echo 'deb https://www.arangodb.com/repositories/arangodb2/xUbuntu_15.10/ /' | sudo tee /etc/apt/sources.list.d/arangodb.list
  4. sudo apt-get install apt-transport-https
  5. sudo apt-get update
  6. sudo apt-get install arangodb=2.8.7

Ubuntu 15.04 avec l'utilisateur root

  1. wget https://www.arangodb.com/repositories/arangodb2/xUbuntu_15.04/Release.key
  2. apt-key add - < Release.key
  3. echo 'deb https://www.arangodb.com/repositories/arangodb2/xUbuntu_15.04/ /' | sudo tee /etc/apt/sources.list.d/arangodb.list
  4. sudo apt-get install apt-transport-https
  5. sudo apt-get update
  6. sudo apt-get install arangodb=2.8.7

Ubuntu 14.10 avec l'utilisateur root

  1. wget https://www.arangodb.com/repositories/arangodb2/xUbuntu_14.10/Release.key
  2. apt-key add - < Release.key
  3. echo 'deb https://www.arangodb.com/repositories/arangodb2/xUbuntu_14.10/ /' | sudo tee /etc/apt/sources.list.d/arangodb.list
  4. sudo apt-get install apt-transport-https
  5. sudo apt-get update
  6. sudo apt-get install arangodb=2.8.7

Ubuntu 14.04 avec l'utilisateur root

  1. wget https://www.arangodb.com/repositories/arangodb2/xUbuntu_14.04/Release.key
  2. apt-key add - < Release.key
  3. echo 'deb https://www.arangodb.com/repositories/arangodb2/xUbuntu_14.04/ /' | sudo tee /etc/apt/sources.list.d/arangodb.list
  4. sudo apt-get install apt-transport-https
  5. sudo apt-get update
  6. sudo apt-get install arangodb=2.8.7

Ubuntu 12.04 avec l'utilisateur root

  1. wget https://www.arangodb.com/repositories/arangodb2/xUbuntu_12.04/Release.key
  2. apt-key add - < Release.key
  3. echo 'deb https://www.arangodb.com/repositories/arangodb2/xUbuntu_12.04/ /' | sudo tee /etc/apt/sources.list.d/arangodb.list
  4. sudo apt-get install apt-transport-https
  5. sudo apt-get update
  6. sudo apt-get install arangodb=2.8.7

Lorsque l'on se lance dans le monde de la virtualisation, il arrive que l'on rencontre un problème qui est assez courant, mais s'il n'est pas résolu, vous ne pourrez pas lancer de machines virtuelle, ce qui est plutôt dommage il faut bien l'avouer.

Ainsi vous avez peut-être déjà rencontré l'erreur suivante au lancement de votre machine virtuelle sous VirtualBox par exemple :

VT-x/AMD-V hardware acceleration has been enabled, but is not operational. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.

Please ensure that you have enabled VT-x/AMD-V properly in the BIOS of your host computer.

Il serait dommage de s’arrêter en si bon chemin car le monde de la virtualisation est vraiment intéressant et surtout très pratique pour faire des tests par exemple ! Je m'en sers aussi beaucoup à titre personnel pour déployer des machines virtuelles avec un environnement de développement déjà tout prêt tel que la machine virtuelle Laravel Homestead.

Cela permet ainsi de gagner beaucoup de temps plutôt que d'installer toujours les mêmes logiciels de façon rébarbative. Mais ce n'est pas possible d'utiliser cette technologie si la virtualisation VT-x/AMD-V, il va donc falloir accéder au BIOS pour aller l'activer.  Pour rappel, le BIOS est la concaténation de Basic Input Output System et c'est lui qui est en charge d'amorcer le lancement de votre système d'exploitation.

Rassurez-vous il suffit de le faire une seule fois et même si vous formatez votre Windows ou que vous changez de système d'exploitation, la fonctionnalité restera active car c'est dépendant du BIOS.  À l'inverse si vous remettez votre BIOS avec ses réglages d'origine, il faudra réactiver l'option VT-x/AMD-V.

Vous attendez tous ce moment alors le voila, comment activer option VT-x/AMD-V depuis le BIOS de votre carte mère ? La technique n'est pas universelle et l'option ne sera pas forcément au même endroit selon le modèle ou la marque de votre carte mère. Il faudra donc surement fouiller un peu mais en général, l'activation de l'option VT-x/AMD-V se trouve dans la partie dédiée au processeur. Sur un de mes vieux Lenovo portable, cela se présente ainsi :

Mais chez les dernier Asus avec leur BIOS UEFI plus moderne, le le menu se présente alors ainsi :

Alors que sur un Dell par exemple c'est comme ceci :

Une fois cette fameuse option VT-x/AMD-V, redemandez votre ordinateur en enregistrant bien les modifications du BIOS, et normalement, VirtualBox ou un autre logiciel de virtualisation devrait fonctionner sans le moindre soucis à présent !

Il y a quelque temps je vous ai parlé de Vagrant mais sans rentrer plus que ça dans les détails. Aujourd'hui nous allons découvrir ensemble à quoi peut vraiment servir cet outil avec l'installation de la machine virtuelle Homestead qui est fournie et pré configurée par les équipes en charge du framework Laravel.

L'intérêt d'utiliser cette machine virtuelle, c'est que par rapport à un Linux vierge qui est censé accueillir votre projet, vous n'avez pas besoin d'installer PHP, MySQL, Apache ou Nginx ... Une fois que vous avez la machine virtuelle Homestead qui tourne sur votre ordinateur, elle est déjà prête à accueillir votre projet Laravel !

D'ailleurs vous pouvez très bien faire tourner des projets qui ne sont pas du Laravel, cela m'arrive et ça ne pose évidemment aucun problème. C'est beaucoup plus puissant qu'un simple Wamp Serveur car s'il vous manque quelque chose, vous faites l'installation dans Homestead et le tour est joué.

Tenter d'utiliser des techniques un peu exotiques ou un peu trop récentes sous Windows peut parfois vite tourner au casse-tête. Je ne tenterai plus de faire tourner le projet PHP sous Wamp (jusqu'ici ça peut encore aller) et de faire du NoSql le tout sous Windows, trop de prises de têtes pour rien ... Sous Linux on installe, en général ça se passe bien, et ça marche parce que cela est conçu pour fonctionner dans ce cadre à la base. J'en ai eu marre du bricolage sous Windows.

Mais vous n'êtes pas ici pour lire mes états d'âme et nous allons donc voir comment installer et faire tourner la machine virtuelle Homestead de Laravel sous Windows ! Dans un premier temps, il faut donc se procurer Vagrant ainsi que Virtual Box sur leurs sites officiels respectifs.

Après avoir installé Vagrant sur votre ordinateur, vous pouvez maintenant passer au clonage de la machine Homestead, pour cela rendez vous dans votre dossier utilisateur à l'adresse : C:\Users\votrenomutilisateur

Une fois que tout est bien installé, on ajoute la futur machine virtuelle dans VirtualBox sous forme de box, Vagrant va s'occuper de télécharger les fichiers nécessaires. Tapez la commande suivante :

  1. vagrant box add laravel/homestead

Ensuite nous passons au clonage dans votre dossier utilisateur (cd ~) de la dernière version de la machine virtuelle Homestead avec la commande suivante :

  1. git clone https://github.com/laravel/homestead.git Homestead

Placez vous dans ce dossier Homestead et lancez alors tout simplement la commande suivante qui va s'occuper d’initialiser la configuration :

  1. bash init.sh

N'oubliez pas de créer un dossier "Code" dans votre dossier utilisateur de Windows pour utiliser ces fichiers dans Homestead. Normalement tout les éléments nécessaires pour le bon fonctionnement de Homestead sont en place et pour voir si tout va bien il faut lancer les commandes dans l'ordre, bien évidemment toujours dans le dossier Homestead fraichement crée (cd Homestead) :

  1. varant init
  2. vagrant up
  3. vagrant up --provision

Si vous rencontrez l'erreur suivante, c'est qu'il vous manque une clé SSH ! N'hésitez pas à consulter cette page sur les clé SSH publique et privé sous Windows.

  1. (C:/Users/dev/Homestead/scripts/homestead.rb:106:in `read':
  2. No such file or directory @ rb_sysopen - C:/Users/dev/.ssh/id_rsa (Errno::ENOENT))

Vous pouvez aussi avoir le message suivant sous Virtual Box si la machine virtuelle Laravel Homestead refuse de démarrer :

VT-x/AMD-V hardware acceleration has been enabled, but is not operational. Please ensure that you have enabled VT-x/AMD-V properly in the BIOS of your host computer.

Comme le message l'indique, il faut alors activer l'option directement dans le BIOS. Dans un prochain article nous verrons la partie configuration mais pour voir si tout vas bien vous pouvez essayer de vous connecter à votre machine virtuelle Homestead, il suffit de finir par :

  1. vagrant ssh

Copyright © 2015 - 2016 | f4b1.com