Une belle histoire, de jolis dessins et des personnage attachants. Je vous recommande chaudement cette petite perle sortie l'année dernière.

  • Le Chant de la Mer

    Le Chant de la Mer est un film de Tomm Moore avec David Rawle, Fionnula Flanagan. Synopsis : Ben et Maïna vivent avec leur père tout en haut d'un phare sur une petite

    AlloCiné

Pour un amoureux du rock-progressif comme moi cet album live est une vrais petite merveille :)

  • ARENA - Breakfast In Biarritz (2001)

    Breakfast In Biarritz is a music live recording by ARENA (Neo-Prog/Progressive Rock) released in 2001 on cd, lp / vinyl and/or cassette. This page includes Breakfast In Biarritz's : cover picture, songs / tracks list, members/musicians and line-up, different releases details, free MP3 download (stream), buy online links: ebay and amazon, ratings and detailled reviews by our experts, collaborators and members.

    Progarchives.com

Je suis français, j'ai ma carte d'identité française, comme 66 millions de compatriotes. Je suis allé voter aux municipales, aux européennes, aux présidentielles. À chaque fois j'ai tenté de réfléchir au meilleur parti, à la meilleure personne qui pourrait porter mes idées.

En bon citoyen j'ai fait ce que mes parents, mes professeurs, m'ont toujours dit de faire : aller voter.

Je n'ai jamais voté pour le même parti, pour une liste divers gauche pendant les municipales, écologistes et pirates pour les européennes, centre pour les présidentielles, puis droite pour le second tours. À chaque fois je l'ai fait en choisissant ce que le candidat me semblait proposer de mieux pour ma ville, mon pays, mon Europe.

J'ai vu des lois liberticides votées sous la présidence de Nicolas Sarkozy, j'ai vu le scandale Snowden éclater au grand jour, j'ai vu ma patrie ne pas réagir, j'ai lu des articles expliquant qu'au contraire elle signait des gros contrats avec quelques petites dictatures ici et là pour leurs permettre de surveiller leurs populations.

Puis j'ai vu mon gouvernement parler de radicalisation, désigner un ennemie de la patrie là bas, loin hors de nos frontière. J'ai entendu que des français partaient les rejoindre, qu'ils se "radicalisaient" sur Internet. Mon Internet. Celui que j'utilise quotidiennement, qui m'informe, qui me permet de débattre, qui me permet de m'exprimer, de me passer de la télévision (que je ne regarde plus depuis plus de 4 ans maintenant) et d'avoir, enfin, des informations hétéroclites, contradictoires… mais que je peux confronter, commenter, partager. Cet Internet qui m'a aidé à comprendre la dure réalité, celle qui n'est pas enseigné dans les livres, celle que je n'ai pas eu dans mes études, ni à la télévision.

Cet Internet, humain, universel et neutre je le défends.

J'ai vu mon gouvernement ne pas comprendre son fonctionnement puis j'ai vu arriver la loi Hadopi, absurde et un grain dangereuse car obligeant d'appliquer une surveillance globale sur la population puis de détecter automatiquement si une personne est entrain de télécharger une œuvre illicite.

Par la suite j'ai vu arriver sous mon sapin, en 2014, une loi autorisant mon gouvernement à bloquer, sans juge, n'importe quel site web sous couvert que celui-ci ferait l’apologie du terrorisme. J'ai suivit les horreurs perpétrées à Charlie Hebdo. Je ne suis pas descendu dans la rue car la liberté je la défend quotidiennement. Je n'ai pas vu les français réagir face à leur gouvernement mais au contraire le supporter dans son action.

Puis suite aux attentas, j'ai pris peur, non pas face aux terroristes, non. J'ai pris peur face à mon propre gouvernement. Puis j'ai vu que je ne n'était pas le seul.

Aujourd'hui j'ai vu mon gouvernement censurer plusieurs sites, de façon arbitraire et toujours sans décision de justice et renforcer les pouvoirs de ses services de renseignement.

Je ne vois toujours pas les gens de ma patrie réagir.

Pour les prochaines élections je vais peut être voter pour un extrême, surement le Front National, non pas pour leurs idées, bien au contraire, mais je veux que cela cesse. Je veux que le pire arrive le plus rapidement possible (voir la vidéo de Fabrice Epelboin à ce sujet) et que nous passions à autre chose. Seul un traitement de choc pourra nous faire revenir à la réalité.

Je suis français, et aujourd'hui, j'ai mal à ma liberté.

Bonjour tout le monde, voilà quelques longues semaines que je n'ai pas donné de nouvelles du projet Movim. N'ayez pas peur les corrections arrivent progressivement et déjà plein de fonctionnalités sont prêtes pour la version 0.9. Il y a eu :

  • De nombreuses corrections concernant la mise en page et le comportement du chat et des chatrooms
  • L'ajout d'un aperçu des articles sur l'actualité
  • La possibilité de changer le mot de passe et de supprimer le compte () ainsi que toutes les informations liées
  • La possibilité d'effectuer des actions de maintenance sur le serveur XMPP, directement depuis Movim (très utile pour les administrateurs) via l'implémentation de la .
  • Des nouveaux avatars qui s'intègrent mieux à la nouvelle interface
  • La publication de billets avec un lien en pièce jointe
  • La possibilité de supprimer le billet publié
  • Une nouvelle page d’accueil qui sera amenée à évoluer dans les prochaines semaines
  • La réintégration du "blog" dans la nouvelle interface
  • Des corrections et optimisations relatives à la gestion des WebSockets
  • Les emojis font également leurs apparition :stuck_out_tongue_winking_eye:
  • Et plein de petites corrections relatives à l'interface

Une feuille de route va être posée bientôt pour fixer les fonctionnalités qui seront implémentées pour la 0.9. Il reste principalement à :

  • Intégrer le chiffrement OTR dans le chat (cette fonctionnalité m'a été énormément demandée donc je compte la passer en priorité)
  • Réintégrer proprement les groupes dans l'interface
  • Repenser la page d'acceuil du projet pour la rendre plus "acceuillante" et ergonomique

Autour du projet je suis très heureux de voir que la communauté s'agrandie de plus en plus et que nous allons bientôt avoir 4000 inscrits sur le pod officiel. Je souhaiterais également prendre du temps pour travailler sur la communication du projet a déjà été mise à jour ainsi que .

Voilà voilà, n'hésitez pas à donner votre avis sur le salon de discussion et sur , il faut que je regarde comment je peux remettre les commentaires sur la nouvelle interface.

Une vidéo impressionnante trouvée sur Internet. Ça donne le vertige :smiley:

  • Survol de Paris La Défense avec un drone

    Survol de Paris La Défense avec un drone à de 200 mètres au dessus du sol parisien. Il s'agit du plus grand quartier d'affaires d'Europe filmée depuis un drone hexacopter équipé d'une caméra GoPro 3 black et piloté à distance en FPV, c'est à dire avec un retour streaming vidéo. Une belle vidéo réalisée par serveurperso qui nous fait découvrir les plus hautes tours du quartier de La Défense à Paris.

    Dailymotion

Le dernier album de Björk est une vraie petite merveille. Son style musical n'a pas pris une ride ! Jetez vous dessus :D

  • Björk – Vulnicura

    Björk – Vulnicura (Stonemilker, Lionsong et plus). 9 titres (41:43). Vulnicura est sorti 1 mars 2015. Björk is a mononym of Björk Guðmundsdóttir (b. 21 Nov 1965), an Icelandic singer-songwriter, composer, music producer and occasional actress, whose work includes eight solo albums and two film soundtracks. She is known for including elements of rock, jazz, electronic, classical, industrial, ethereal wave and trip-hop music in her work. Her voice has also been acclaimed for its distinctive qualities. In 2010, she won the Polar Music Prize in recognition of her "deeply personal music and lyrics, her precise arrangements and her unique voice." Découvrez de la musique, des concerts, des vidéos et des images grâce au catalogue online Last.fm.

    Last.fm

Après avoir présenté Puppet et quelques particularités concernant sa configuration nous allons maintenant déployer automatiquement une instance de Wordpress, en premier lieu sur nos serveurs de test puis nous déploierons en production en suivant la méthode présentée dans le précédent article.

Installation des modules Puppet

Pour cette configuration nous nous baserons sur trois modules fournis depuis les dépôts Puppet, deux officiels et un non-officiel (Wordpress).

puppet module install puppetlabs-mysql
puppet module install puppetlabs-apache
puppet module install hunner-wordpress

Modification du fichier nodes.pp

L'intégralité des modifications se fera au sein du fichier nodes.pp. Comme expliqué dans le précédent article, deux types de serveurs sont ici déclarés, les serveurs web et ceux de base de données. Dans chacune des familles, deux environnements sont utilisés, celui de test et de production.

Configuration des serveurs Web

Tout d'abord le fichier de configuration

node 'web01-test', 'web01' inherits basenode {
    package { 'apache2': }
    package { 'php5': }
    package { 'libapache2-mod-php5': }
    package { 'php5-mysql': }
    include mysql::client
    class { 'wordpress':
        db_user      => 'wordpress_user',
        db_password  => 'secret_password',
        db_host      => 'mysql01-test',
        db_name      => 'wordpress_db',
        install_dir  => '/var/www/html/wordpress',
    }
}

Ici nous décidons d'installer l'ensemble des paquets nécessaires à l'utilisation de PHP sur le serveur Apache, cette configuration étant destinée à des machine Debian elle devra surement être adaptée aux autres distributions (RedHat…).

Le serveur web dialoguant à distance avec le serveur MySQL, il faut également charger le sous-module nécessaire.

Finalement nous configurons l'instance de Wordpress en lui donnant la configuration de notre base de donnée et le répertoire dans lequel celui-ci se trouvera.

Configuration des serveurs de base de données

La configuration de notre serveur MySQL se fait ici en 4 temps.

node 'mysql01-test', 'mysql01' inherits basenode {
   class { '::mysql::server':
       root_password    => 'strongpassword',
       override_options => {
           'mysqld' => {
               'max_connections' => '1024',
               'bind-address'    => '0.0.0.0',
           }
       },
       databases => {
           'wordpress_db' => {
               ensure  => 'present',
               charset => 'utf8',
           },
       },
       users => {
           'wordpress_user@%' => {
               ensure   => 'present',
               password_hash => '*E0A6057BDBD3D6A85C3B232B9EE04DBBBAD5E9BD'
           },
       },
       grants => {
           'wordpress_user@%/wordpress_db.*' => {
               ensure     => 'present',
               options    => ['GRANT'],
               privileges => ['SELECT', 'INSERT', 'UPDATE', 'DELETE'],
               table      => 'wordpress_db.*',
               user       => 'wordpress_user@%',
           },
       }
   }
}

La première partie du fichier s'occupe de la configuration générale du serveur avec la définition d'un mot de passe pour l'administrateur. La clef bind-adress permet d'autoriser tous les serveurs extérieurs à interroger notre serveur MySQL, il est conseillé de n'autoriser que le sous-domaine réseau où se situent vos machines.

Nous ordonnons par la suite la création de la base de donnée wordpress_db en UTF8. Puis nous déclarons l'utilisateur wordpress_user.

Afin de récupérer le hash utilisez un invite de commande MySQL

mysql> SELECT PASSWORD('secret_password');

Finalement nous utilisons la primitive SQL GRANT pour définir les bon droits sur l'utilisateur nouvellement créé. L'utilisation du pourcentage (%) permet d'autoriser les connexions depuis n'importe quel serveur externe.

Suite à l'application de ces configurations sur les serveurs respectifs vous devriez avoir accès au panneau d'installation de Wordpress sur votre serveur web.

Comme toute grande plateforme web qui se respecte, le réseau social Google+ possède une API publique. Tout développeur souhaitant ainsi puiser dans l'énorme base de données offerte par le géant américain de la recherche peut, suite à une authentification, avoir accès à une multitudes d'URLs offrants des informations aussi diverses que les profils des utilisateurs, leurs liens, leurs galeries photo mais aussi, plus simplement, de la liste des billets publiés sur le réseau. Vous pouvez retrouver toutes les informations relatives à l'API officielle à cette adresse.

jeu.png

L'utilisation de cette API se fait suivant de nombreuses contraintes. Tout d'abord une authentification OAuth est nécessaire pour que Google puisse connaitre qui interroge son API, récupère quelles données et dans quel volume. Le quota fixé lorsque vous n'êtes pas authentifié est également volontairement bas (10 000 requêtes/jour) pour vous forcer à renseigner vos informations, suite à ça il passe à 20 000 000 requêtes/jour.

Dans ce billet je ne m'étendrais pas particulièrement sur cette API officielle, mais prendrait plutôt un autre chemin en exploitant l'API interne du projet.

Architecture de fonctionnement du site

Avant de rentrer dans les détails, il est toujours bon de comprendre le fonctionnement général et de savoir comment les pages Google+ sont chargées au sein de votre navigateur. Depuis quelques années déjà Google a tendance à effectuer une partie des calculs de rendu des pages web grâce aux navigateurs des utilisateurs, la génération du HTML étant alors faite en Javascript et non plus coté serveur.

Pour parvenir à ses fins Google charge un ensemble de scripts ayant un rôle similaire au framework AngularJS (framework qui est aujourd'hui également porté par Google). Le navigateur de l'usager va alors interroger le serveur grâce à des requêtes de type Ajax (ou, de façon moins courante, via un WebSocket) afin de recevoir les informations brutes qui seront ensuite analysées par ces scripts. Ceux-ci vont finalement générer le HTML grâce à l'utilisation de modèles prédéfinis.

Ce qui va nous intéresser ici, c'est de comprendre quelles types d'informations sont échangées entre ce script et le serveur, dans notre cas ce sera entre une page d'un utilisateur Google+ et le serveur officiel de Google. La console de développement du navigateur nous permet d'avoir toutes ces informations très facilement.

googleplus.png

Interrogation du SocialGraph interne

Parmi la multitude de requêtes envoyées l'une d'entre elles nous permet de récupérer la liste de contacts du profile interrogé. Ce qui est intéressant ici c'est qu'en récupérant les informations par ce biais nous outrepassons totalement le système de vérification imposé par Google en nous faisant directement passer pour l'application officielle. Nous n'avons également plus de problème de quota. Mais ce qui est aussi bien plus intéressant c'est qu'une très grande partie des informations que nous récupérons par cette API interne ne sont pas directement disponibles par l'API officielle, même après une authentification OAuth. Prenons un petit exemple avec la récupération de la liste de contact d'un utilisateur.

Via l'API officielle, sans authentification

La documentation de l'API nous indique que nous devons interroger l'URL suivante pour avoir la liste des personnes visibles publiquement :

www.googleapis.com/plus/v1/people/<userid>/people/visible

Sans grand succès le serveur nous demande de nous authentifier.

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
 }
}

Via l'API officielle, avec authentification

Si nous nous authentifions, nous apprenons qu'une requête particulière devra être envoyée à l'utilisateur à qui nous souhaitons récupérer sa liste de contact. On comprend alors rapidement que ce type d'autorisation, au cas par cas, va rapidement être extrêmement limitante, malgré le quota de 2 millions de requêtes autorisées par jour.

Via l'API interne

L'analyse des journaux des requêtes faites par le navigateur sur les serveurs de Google+ nous apprend que la récupération de la liste de contact se fait via l'URL suivante.

plus.google.com/_/socialgraph/lookup/visible/?o=[null%2Cnull%2C"<userid>"]

En interrogeant directement cette URL dans votre navigateur celui-ci va vous retourner un fichier response.txt contenant des données ayant une curieuse syntaxe.

)]}'

[["tsg.lac",[]
,[[[,,"110661163553027975344"]
,[]
,["Faisan Mezico",,,,"4e52150f806a1","BmZtIH_2033lLnZhGF-","FI4QDHp402BdDJodFk-",1,"//lh6.googleusercontent.com/-tpAJoURnuw0/AAAAAAAAAAI/AAAAAAAAAFQ/TDfgcRNxObM/photo.jpg",,1,,,,,0,,[]
,,,0,,[]
,,,[]
,[]
,,4,0,,[]
,,[]
,,,,,[]
]
,[]
]
,[[,,"101912980608854649615"]
,[]
,["WebUpd8",,,,"50960cba225a9","KI3fJJRj8-F8","1FGKBHhGGmwZ",1,"//lh4.googleusercontent.com/--zW_IOVlngs/AAAAAAAAAAI/AAAAAAAAHzY/-HFDg2zIa1c/photo.jpg",,1,,,,,0,,[]
,[,"http://www.webupd8.org",,,7]
,,1,"Daily Ubuntu / Linux news and application reviews.",[]
,,,[]
,[]
,,3,0,,[]
,,[]
,,,,,[]
]
,[]

Cette syntaxe semble d'approcher curieusement du JSON, au format tableau avec quelques petits changements.

  • Les données commencent avec un )]}' qui semble être une séquence d'échappement, j'ai pris soin de retirer ces deux premières lignes
  • Une très grande partie des informations contenues dans les tableaux sont vides. Sur une chaine JSON valide ceux-ci doivent être mis à null, Google a sûrement pris soin de supprimer les quatre précieux caractères que composent le mot "null" pour gagner en volume lors du transfert des requêtes.

Avec quelques lignes de PHP nous pouvons très facilement reconstituer une chaîne JSON valide.

<?php 
function formatData($t) {
    $t = explode("\n", $t);
    array_shift($t);
    array_shift($t);
    $t = implode("\n", $t);

    $t = str_replace(',,', ',null,', $t);
    $t = str_replace(',,', ',null,', $t);
    $t = str_replace('[,', '[null,', $t);
    $t = str_replace(',]', ',null]', $t);
    $t = str_replace('[]', '[null]', $t);

    return json_decode($t);
}
?>

Une fois les informations passées à la moulinette nous avons enfin une structure sur laquelle travailler.

array (size=2)
 0 => 
   array (size=3)
     0 => string 'tsg.lac' (length=7)
     1 => 
       array (size=1)
         0 => null
     2 => 
       array (size=66)
         0 => 
           array (size=4)
             ...
         1 => 
           array (size=4)
             ...
         2 => 
           array (size=4)
             ...
         3 => 
           array (size=4)

Je n'ai pas réussit à trouver la signification de l'ensemble des valeurs null mais j'ai réussit à déduire certaines d'entre elles. Nous observons la liste des contacts dans la structure renvoyée (avec mon jeu de donnée le profile interrogé avait ici 66 contacts). En tâtonnant un peu j'ai réussit à récupérer l'identifiant unique, le nom, l'avatar et la description.

<?php
$contacts = $a[0][2];
$results = array();

foreach($contacts as $c) {
    array_push($results,
        array(
            'idfull' => $c[0][2],
            'name' => substr($c[2][0], 0, 63),
            'avatar' => 'http://'. $c[2][8],
            'description' => htmlentities($c[2][21])
        ));
}
?>

Voici le résultat.

array (size=66)
 0 => 
   array (size=4)
     'idfull' => string '110661163553027975344' (length=21)
     'name' => string 'Faisan Mezico' (length=13)
     'avatar' => string 'http:////lh6.googleusercontent.com/-tpAJoURnuw0/AAAAAAAAAAI/AAAAAAAAAFQ/TDfgcRNxObM/photo.jpg' (length=93)
     'description' => string '' (length=0)
 1 => 
   array (size=4)
     'idfull' => string '101912980608854649615' (length=21)
     'name' => string 'WebUpd8' (length=7)
     'avatar' => string 'http:////lh4.googleusercontent.com/--zW_IOVlngs/AAAAAAAAAAI/AAAAAAAAHzY/-HFDg2zIa1c/photo.jpg' (length=93)
     'description' => string 'Daily Ubuntu / Linux news and application reviews.' (length=50)
…

Comme vous pouvez le constater, en quelques lignes de code nous pouvons parfaitement récupérer des informations structurées et compréhensibles à partir de l'API interne du réseau Google+ et cela en outrepassant toutes les limites de quota et d'autorisation imposées par l'entreprise.

J'ai suite à ça complété le script en tentant d'explorer le "graphe" Google+ de façon automatique via un système de saut de profil en profil. J'ai très rapidement récupéré les identifiants et informations de millions de comptes sans que Google ne me dise la moindre chose :)

Le navigateur interroge de très nombreuses URLs lors du chargement d'un profil Google+ avec pour bon nombre d'entre elles des informations structurées de la même façon que notre liste de contact.

Petite précision tout de même, l'ensemble des informations que j'ai ici récupéré sont des informations initialement publiques, que vous pouvez parfaitement avoir en chargeant le profile de la personne depuis un navigateur quelconque. Pour accéder aux données privées des utilisateurs il n'y a pas d'autre moyens (pour le moment) que de passer par l'API officielle et de récupérer, au cas par cas, les données.

Amusez vous bien !