Tous les articles par florentdenis

L’intelligence artificielle, une révolution industrielle

C’est avant tout mon point de vue, j’expose ma vision de la recherche de l’intelligence artificielle d’aujourd’hui. Quand je pense à l’intelligence artificielle je ne pense pas à une machine qui ressemble à un humain, je pense à une machine capable de trouver des problèmes et de les résoudre elle-même.

Sources

Il y a de plus en plus d’articles qui parle de l’intelligence artificielle, j’ai vu sortir notamment une idée de Stephan Hawking sur BBC, et quelque chose que j’avais déjà vu sur la coopération.
On parle des progrès mais aussi des problèmes dangereux que ça peut apporter, sans faire de détoure toutes les personnes pessimistes pensent au soulèvement des machines pour prendre le contrôle total de notre société.

Ma vision

Je n’ai pas du tout cette vision, il n’y a aucun intérêt pour nous d’en arriver là, la mise en place d’un système aussi complexe fait intervenir beaucoup d’autres systèmes pour surveiller le bon fonctionnement de celui-ci. Non, nous n’allons pas effectuer autant de recherches et de développements pour faire artificiellement un être humain, nous sommes suffisamment nombreux sur terre pour ne pas avoir besoin d’encore plus d’humain.

Production

Justement en parlant de coût de production, il y a peu de temps j’ai vu une vidéo qui montre le montage complet d’un moteur pour voiture, on peut comprendre que tout peut être automatisé sauf une chose : la conception du moteur. C’est là que l’intelligence artificielle intervient. Elle permettra d’accélérer la recherche et la conception de nouvelle technologie et de les améliorer, comme si au lieu de passer 50 ans pour concevoir les moteurs de voiture qu’on a aujourd’hui, ça ne pendrait que quelques semaines.

Révolution industrielle

J’imagine déjà qu’on puisse trouver des solutions à moindre prix, très performant et à faible consommation en quelques temps, alors qu’il faudrait des années pour une équipe de chercheurs.

Le but derrière tout ça est d’améliorer encore plus la productivité, c’est une évolution non négligeable, et quoiqu’il arrive l’intelligence artificielle verra le jour et ne ressemblera pas à des androïdes.

Conclusion

Aujourd’hui ça avance tout doucement mais ça avance, on est loin encore d’avoir les performances d’un cerveau humain. L’intelligence artificielle sera donc supportée par un ordinateur quantique, et celui-ci est en recherche depuis les années 80.

L’intelligence artificielle sera une nouvelle révolution industrielle, c’est le Graal, et le premier qui y arrive sera couvert de moult richesse, elle pourra servir pour des travaux d’analyses, de prédictions, dans le jeux vidéos, le hacking (pas le cracking, ou le white-hat), la médecine, etc.

SQL ou No-SQL ? Pourquoi pas les deux ?

Il y a tellement de base de données qu’on se demande parfois laquelle choisir. Je pense à MySQL, MongoDB, Cassandra, JCR, Memcache, Redis, Oracle, Neo4j. En réalité ils en existent autant qu’ils existent de contraintes de persistance de données, ainsi que leurs forks. Pour répondre à la question SQL ou No-SQL ? pour moi c’est SQL avec du No-SQL.

Mysql

Certaines base de données relationnelles intègres des interfaces type no-sql, dans le cas de MySql il existe des extensions qui permet d’intéroger le memcache de mysql.
Je vous invite à regarder la conférence de Serge FREZEFOND au forumphp 2013.

 

MariaDB + Cassandra

MariaDB est un fork de MySQL.
Depuis la version 10.0 de MariaDB,  il est possible d’ajouter un plugin qui va permettre d’interroger Cassandra depuis MariaDB, tout en y fessant des jointures, ce qui n’est pas possible de faire dans une base de donnée comme Cassandra.

Commencer installer Cassandra sur votre serveur via leur tutoriel :
https://wiki.apache.org/cassandra/GettingStarted
Si vous installez Cassandra depuis les paquets Debian, vous aurez à votre disposition le browser cqlsh.
Ensuite installez le plugin sur MariaDB suivant la page Cassandra storage engine overview.

Une fois que tout est en place, vous pouvez voir votre plugin actif comme ceci :

MariaDB [(none)]> SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_VERSION, PLUGIN_MATURITY FROM information_schema.plugins WHERE PLUGIN_TYPE = "STORAGE ENGINE";
+--------------------+---------------+----------------+-----------------+
| PLUGIN_NAME        | PLUGIN_STATUS | PLUGIN_VERSION | PLUGIN_MATURITY |
+--------------------+---------------+----------------+-----------------+
| binlog             | ACTIVE        | 1.0            | Stable          |
| MEMORY             | ACTIVE        | 1.0            | Stable          |
| MyISAM             | ACTIVE        | 1.0            | Stable          |
| CSV                | ACTIVE        | 1.0            | Stable          |
| MRG_MyISAM         | ACTIVE        | 1.0            | Stable          |
| PERFORMANCE_SCHEMA | ACTIVE        | 0.1            | Gamma           |
| InnoDB             | ACTIVE        | 5.6            | Stable          |
| ARCHIVE            | ACTIVE        | 3.0            | Stable          |
| Aria               | ACTIVE        | 1.5            | Gamma           |
| FEDERATED          | ACTIVE        | 2.1            | Stable          |
| BLACKHOLE          | ACTIVE        | 1.0            | Stable          |
| partition          | ACTIVE        | 1.0            | Stable          |
| CASSANDRA          | ACTIVE        | 0.1            | Experimental    |
+--------------------+---------------+----------------+-----------------+

Maintenant connectons nous sur Cassandra via cqlsh, le but va être de créer la KEYSPACE mariadbtest2 et d’y ajouter des données qu’on va essayer de retrouver dans MariaDB.

➜ ~ cqlsh
 Connected to Test Cluster at localhost:9160.
 [cqlsh 2.2.0 | Cassandra 1.1.12 | CQL spec 2.0.0 | Thrift protocol 19.33.0]
 Use HELP for help.
 cqlsh> CREATE KEYSPACE mariadbtest2 WITH strategy_class = 'org.apache.cassandra.locator.SimpleStrategy' AND strategy_options:replication_factor='1';
 cqlsh> use mariadbtest2;
cqlsh:mariadbtest2> create columnfamily cf1 ( pk varchar primary key, data1 varchar, data2 bigint);
cqlsh:mariadbtest2> insert into cf1 (pk, data1, data2) values ('rowkey12', 'data1-value3', 454);
cqlsh:mariadbtest2> insert into cf1 (pk, data1, data2) values ('rowkey10', 'data1-value', 123456);
cqlsh:mariadbtest2> insert into cf1 (pk, data1, data2) values ('rowkey11', 'data1-value2', 34543);
cqlsh:mariadbtest2> select * from cf1;
pk        | data1        | data2
----------+--------------+--------
rowkey12  | data1-value3 | 454
rowkey10  | data1-value  | 123456
rowkey11  | data1-value2 | 34543

On viens de créer nos 3 valeurs dans Cassandra et maintenant nous allons nous connecter à MariaDB pour voir comment cela ce présente de son côté.

Attention : Il faut indiquer à MariaDB la connexion entre votre base de donnée et Cassandra via la création de la table avec les propriétés :

  • engine=cassandra
  • thrift_host=’localhost’
  • keyspace=’mariadbtest2′
➜ ~ mysql -u root -p
MariaDB [(none)]> use test;
MariaDB [test]> create table t1 (
-> pk varchar(36) primary key,
-> data1 varchar(60),
-> data2 bigint
-> ) engine=cassandra thrift_host='localhost' keyspace='mariadbtest2' column_family='cf1';
MariaDB [test]> select * from t1;
+----------+--------------+--------+
| pk       | data1        | data2  |
+----------+--------------+--------+
| rowkey12 | data1-value3 | 454    |
| rowkey10 | data1-value  | 123456 |
| rowkey11 | data1-value2 | 34543  |
+----------+--------------+--------+

À présent vous avez relié votre base de données SQL avec une base de données No-SQL, pour les personnes qui n’ont pas besoin de faire des relations de données entre des tables relationnelles et de la BIG DATA n’auront pas d’intérêt de faire tout cela.

Je n’ai pas eu l’occasion d’expérimenté ça avec une grosse quantité de donnée pour Cassandra et plusieurs jointures depuis MariaDB. Par contre j’ai trouvé un slideshare qui peut vous aider :
http://fr.slideshare.net/planetcassandra/5-colin-charles

(Bonus) Est-ce possible sans driver/plugin ?

Ce genre de chose peut-être également fait depuis votre application, il suffirait d’avoir un identifiant partagé entre plusieurs bases de données et via une requête on récupère une série d’ID qu’on exécute sur les autres bases de données.

Ce que je veux dire c’est qu’il est possible d’avoir une solution qui s’approche de ce qu’on vient de voir depuis votre application PHP, grâce à une librairie que j’ai écris :
https://github.com/pokap/pool-dbm

Cette librairie permet de faire des relations entre différente base de données (supporté par doctrine), grâce à un ID partagé et un mapping master & slave.

Injection de dépendances

Aujourd’hui, il est indispensable de passer sur l’injection de dépendances pour des projets durables. L’importance est de faciliter les dépendances entre vos classes.

Définition

Wikipédia est toujours une bonne référence et explique bien ce qu’est l’injection de dépendances fr.wikipedia.org/wiki/Injection_de_dépendances.

Quasiment chaque langage de programmation a son injection de dépendances. Ce n’est pas un outil compliqué car il n’est pas nécessaire d’avoir une librairie pré-compilée pour faire ce travail : vous pouvez le faire directement dans le langage.

Dépendance ?

Votre code a souvent des dépendances vers d’autres classes, c’est bien normal. Cela dépend du langage mais je vais essayer de faire une synthèse.

class Foo {
    public function __construct() {
        $this->bar = new Bar();
    }
}

Vous pouvez voir une dépendance entre la classe Foo et Bar, sans injection. Il y a 2 types d’injections de dépendances pour moi, par le constructeur ou par un appel à une méthode.

class Foo {
    public function __construct(Bar $bar) {
        $this->bar = $bar;
    }
    // ou ..
    public function setBar(Bar $bar) {
        $this->bar = $bar
    }
}

Mais on peut aller encore plus loin car on peut créer une dépendance avec des interfaces, et c’est mieux ! Vous pouvez également le faire via une factory (plus rare) : cela crée plus de dépendances car votre classe sera dépendante de la factory et de ce qu’elle récupère de celle-ci. Dans du langage faiblement typé, vous devrez tester le return de la fonction create ou faire confiance à la classe Factory.

class Foo {
    public function __construct(BarFactory $factory) {
        $this->bar = $factory->create();
    }
    public function setBar(BarInterface $bar) {
        $this->bar = $bar;
    }
}

Injection ?

Les types d’injections de dépendances se complètent. Par exemple on peut faire un constructeur qui demande l’interface d’une factory. Dans le cas de la dépendance, il y a donc 2 façons d’injecter les classes.

En interne, c’est-à-dire directement dans la classe (très lié au premier cas de dépendance).

class Foo {
    public function __construct(BarInterface $bar) {
        $this->bar = $bar;
    }
}
 
$a = new Foo(new Bar());

En externe, ce que je préfère, c’est-à-dire via des fichiers de configuration (XML, YAML, etc.), comme on peut le voir dans Symfony via le service container. Pour information, Symfony est un framework PHP SOA.

Pourquoi autant de moyens pour l’injection de dépendances ?

Attention je n’ai pas dit qu’il y avait strictement que 2 façons d’avoir des dépendances et de les injecter.

En réalité, cela dépend des langages de programmation. Il pourrait y en avoir plus, par exemple via un objet de configuration, via des variables static, public, ou même directement de l’injecteur.
Par contre, on ne fait pas de méthode qui serait le seul point d’entrée aux dépendances (exemple : « injectionDependances(*instances) ») : même s’il y a des cas exceptionnels, cela ne rime à rien ! L’injection de dépendances est un design pattern. De toute façon, la méthode d’injection dépend du besoin métier et de ce que l’on veut obtenir.

Ce qu’il faut retenir, c’est que vous pouvez créer plusieurs objets d’une même classe qui pourront avoir une fonction métier tout à fait différente selon l’injection de dépendances, et ainsi préserver un projet entièrement homogène, configurable et extensible.

L’exemple PHP

PHP a plusieurs projets pour l’injection de dépendances dont 5 qui me viennent à l’esprit :

  • Pimple pimple.sensiolabs.org : simple et efficace qui a pour but d’être petit, rapide et suffisant.
  • Twittee github.com/fabpot/twittee : un injecteur de dépendances de moins de 140 caractères (mon préféré et plus drôle).
  • DependencyInjection github.com/symfony/DependencyInjection : composant Symfony très complet et puissant.
  • DI php-di.org : projet intégré dans Zend (mais non spécifique à celui-ci) qui a pour objectif d’unifier un peu toutes ces librairies. Il ne fait pas parti du FIG (Framework Interop Group).

Pour moi, l’injection de dépendances dans un projet est quelque chose de primordiale d’obligatoire : cela coûte seulement le temps d’écrire les ID de vos classes et évite de faire du Singleton partout dans votre projet (ce qui quelque soit le contexte, n’est pas négligeable).

Pour finir, il existe un tutoriel français pour expliquer, sur le tas, comment faire de l’injection de dépendances dans votre projet :
fr.openclassrooms.com/informatique/cours/introduction-a-l-injection-de-dependances-en-php

 

MongoDB, c’est quoi ? faire du no-sql ou sql ?

MongoDB est une base de données de type No-SQL. Avant d’entrer dans le détail, il serait intéressant de savoir ce que c’est le no-sql.

No-SQL

[fr] http://fr.wikipedia.org/wiki/NoSQL
[en] http://en.wikipedia.org/wiki/NoSQL
[en] http://www.mongodb.com/learn/nosql

Pour faire au plus simple, le No-SQL fait référence aux bases de données qui n’applique pas le modèle classique d’une base de données relationnelle.
Exemple dans MariaDB, les données sont structurées (par table) via un schéma défini. La différence est plus frappante si vous utilisez XtraDB pour ces propriétés ACID. Alors que sur MongoDB, il n’y a pas de schéma est vous sauvegardez des documents par collections.

No-SQL ou SQL ?

Attention je vous préviens dés maintenant, si vous comptez faire un site en NO-SQL vous allez sûrement vous planter, le NO-SQL reste un concept de base de données pour du spécifique. Pour votre projet, imaginez d’abord vos données dans une SGBD relationnelle, il n’y a rien de mieux que la cohérence d’information, ce que vous n’avez pas avec du NO-SQL.

MongoDB

MongoDB est un projet open-source très actif. Ces données sont enregistrées en BSON (du JSON qui permet de gérer plus de types de valeur). Cette SGBD à la chance d’avoir un grand nombre de driver pour des languages comme C, C++, Go, Java, JavaScript, Nodejs, PHP, Python, Ruby, Scala et plus encore.

Vous pouvez très bien utiliser un MongoDB en amont de votre base de données, pour effectuer des traitements rapide sur des éléments précis, faire de la statistique, etc.
MongoDB sera très bien aussi gérer vos sessions utilisateurs, ou faire du cache. Tout ce qui peut être stocké de façon isolé du reste de votre SGBD relationnelle pourrait ce sauvegarder en NO-SQL.

Le SlideShare si-dessous vous illustre mes propos :

http://fr.slideshare.net/FlorentDENIS/mongodb-ekino

Ce qu’il faut savoir

Il faut savoir que MongoDB utilise de la RAM pour les documents les plus demandés, pour des performances optimales il faut avoir autant de RAM que d’espace disque utilisé par MongoDB, voir le working set.
MongoDB allouera de l’espace de stockage à l’avance, au début 64Mo, puis 128Mo, ainsi de suite jusqu’à allouer par paquet de 2Go. Et MongoDB ne supprime pas physiquement ce que vous lui demandé de supprimer, vous devez compacter* votre collection pour supprimer l’inutilisé.
Comme pour un MySQL, MongoDB entretient un journal (vous pouvez squeezer ce journal pour écrire directement sur le disque via des options d’insertion de document). Il est recommandé de placer votre journal sur un autre disque que celui de votre BDD, pour limiter l’I/O.
MongoDB permet de faire du map-reduce sur vos collections, pour effectuer différents traitements ou calcule.
MongoDB tolère la partition* réseau et chaque client voir les mêmes données, ce qui est plutôt agréable. Vous pouvez (voir devez) faire du sharding et de la réplication de données.
MongoDB permet aussi de faire de la géolocalisation sphérique.

[en] http://learnmongo.com/posts/compacting-a-mongodb-collections/
[en] http://www.julianbrowne.com/article/viewer/brewers-cap-theorem
[en] http://blog.nahurst.com/visual-guide-to-nosql-systems
[fr] http://fr.wikipedia.org/wiki/Partition_(base_de_donn%C3%A9es)

Pratiquez

C’est un tour rapide de MongoDB, si vous désirez en s’avoir plus, je ne peux que vous encourager à pratiquer :) J’ai concience de vous avoir envoyez plein d’information d’un seul coup sans explication, mais je préfère montrer la surface et vous pourrez vous faire une idée par vous-même de certain point précis grâce à d’autre articles plus technique sur le web.
Si vous avez des remarques n’hésitez pas.