PHP SocialShare 0.2.1 released

I’ve just published a new version of PHP SocialShare, a library allowing to retrieve server-side webpages’ number of shares and share link from social networks.

This release fixes a bug that was breaking the Google support when the number of shares if greater than 1K and use the brand new phpspec 2.0 stable release as spec system.

PHP SocialShare is available on GitHub and installable trough the awesome Composer.

The SocialShare library

Le profiling commercial, kézako

Courte réponse à une question posée par un collègue développeur à la suite d’une discussion sur le bienfondé de l’utilisation des CDN externes.

Question qui revient régulièrement : le profiling commercial, qu’est-ce que c’est ?

C’est le fait de collecter un grand nombre de données sur les internautes et d’établir sur eux un profil qui servira à leur envoyer de la publicité ciblée. C’est une spécialité de Google, Facebook et compagnie.

Le problème des CDN “gratuits” (et surtout ceux de Google, même si ils s’en défendent) ainsi que des systèmes de stats (et de toute resource venant d’un domaine externe comme les boutons Facebook, Pinterest…) c’est que qu’ils permettent aux boîtes qui contrôlent le serveur externe de savoir que t’es allé sur tel site, que t’as visité tel page, et donc d’enrichir ton profil commercial.

C’est impossible à détecter côté client car même si tu bloques les cookies, il est possible d’utiliser des heuristiques assez performantes pour identifier de manière fiable un internaute. En gros le système de Google détermine qu’une connexion avec la même IP, le même navigateur, les mêmes plugins… correspond à une personne unique et lui génère une empreinte. Ensuite c’est assez simple de savoir que la dite personne (via son empreinte) a visité le site A chargeant sont jQuery via Google Hosted Libraries, le site B qui utilise Google Analytics et le site C qui a un bouton “+1”), on enrichi son profil commercial, et quand il arrive sur le site D qui balance du AdWords, on sait qu’il aime la bière et les frites donc on essaie de lui vendre une place pour un match de Lens.

C’est plus ou moins comme ça que fonctionne Criteo mais aussi et surtout Adwords et les pubs de “pages” Facebook.

Google change encore de favicon

Pour la deuxième fois en moins d’un an, le plus populaire des moteurs de recherche change de favicon. Cette fois-ci elle est très coloré et Google à publié un petit making of de sa conception.

Favicon de Google

Si c’est encore l’ancienne qui s’affiche rendez-vous sur http://www.google.fr/favicon.ico et tapez Ctrl + r.

Faire fonctionner Google Notifier pour Mac en mode sécurisé

Peut-être utilisez-vous Google Notifier pour OS X ? Cet un utilitaire permet d’avertir en temps réel lors de la réception d’un messages sur Gmail, de rappeler les rendez-vous Calendar et d’intégrer ces services au système d’Apple.

Le problème, c’est que par défaut il fait transiter vos identifiants en clair sur le réseau. Si vous vous connectez à un réseau sans fil partagé tel que le réseau Wi-Fi de votre université ou d’une gare, c’est le vol de compte assuré.

Heureusement, une option cachée permet de forcer l’utilisation d’une connexion sécurisée via HTTPS, pour l’activer déployer le menu déroulant en cliquant sur l’icône de Google Notifier, appuyez simultanément sur commande (Pomme) et option (alt) puis sélectionnez l’entrée Preferences....

Dans la fenêtre qui apparait entrez SecureAlways pour Key et 1 pour Value.

Cliquez sur Set pour valider et fermez la fenêtre. C’est fait !

Que vous utilisiez un Mac ou non, c’est toujours une bonne idée de vous connecter à Gmail via https://gmail.com afin de ne pas vous faire voler vos mots de passe. Pour éviter les dangereux oublis il existe une option intitulée Toujours utiliser le protocole https activable depuis les paramètres de l’application web.

Astuce originalement trouvée par Highplace.

feedproxy.google.com semble remplacer feeds.feedburner.com

Depuis fait quelques temps déjà que FeedBurner, l’outil de statistique et d’optimisation de flux RSS coqueluche des blogueurs, a été racheté par Google.

FeedBurner

Aujourd’hui, l’assimilation du service par le géant des moteurs de recherches va plus loin : la célèbre url feeds.feedburner.com laisse progressivement sa place à feedproxy.google.com.

Exemple sur le flux RSS de Techcrunch : http://feeds.feedburner.com/francaistechcrunch
Personnellement, je préférais l’URL sous la forme feeds.feedburner.com qui donnait moins impression d’une allégeance à Google (d’accord, c’était juste une impression). Peut-être est-ce l’occasion de reprendre (un peu) le contrôle de vos données et d’utiliser vos propres URLs pour les flux FeedBurner ?

Google indexe les sites en Flash : un coup d’épée dans l’eau

La nouvelle a fait le tour du web. Google indexe désormais les sites en Flash, ou plutôt le contenu textuel présent dans les fichiers SWF. L’annonce d’Adobe précise que le plus populaire des moteurs de recherche sera bientôt suivi de Yahoo!.

Est-ce l’avènement des sites à interface riche réalisés en Flash / Flex, la fin des techniques hybrides comme celle présentée ici même ? Malheureusement non.

Google précise que son robot est incapable d’indexer les fichiers SWF chargés avec Javascript, or nombre de sites Flash modernes utilisent le script SWF Object qui permet une bonne gestion de l’absence du plugin d’Adobe. Pire le contenu chargé dynamiquement par l’appel de fichiers XML, ce qui est le cas de tous les sites d’une taille respectable (boutiques en ligne, CMS, …), ne sera pas non plus pris en compte directement (les fichiers XML pourront être indexés séparément).

De plus, le format Flash souffre de limitations intrinsèques qui nuisent à la l’extraction de données pertinentes :

  • Alors que les balises sémantiques du HTML (<h1>, <h2>, <strong>, <p>, …) permettent de structurer l’information et de rendre les données intelligible aux programmes informatiques, seul du texte brut peut être extrait des fichiers Flash ce qui nuira fortement à leur positionnement.
  • Sans hacks tel que l’utilisation de SWF Address, il n’est pas possible d’accéder à une “page” précise à l’intérieur d’un fichier Flash. Prenons le cas d’une boutique en ligne réalisée en Flex proposant à la vente quelques milliers d’articles et d’un internaute recherchant un sac bleu. Un fichier Flash se présentant sous la forme d’un bloc à un seul point d’entrée, l’internaute effectuant sa recherche ne pourra accèder qu’à la page d’acceuil du site. Il devra ensuite parcourir l’ensemble des menus et sous-menus pour arriver la fiche du dit sac bleu, perdant ainsi tout l’intérêt d’utiliser un moteur de recherche plutôt qu’un quelquonque annuaire. Mmême l’utilisation de SWF Address ne résoudrait pas ce problème car il utilise Javascript, langage actuellement non interprété par les robots du géant de la recherche comme vu plus haut.

Cette annonce, grand coup marketing pour Adobe, se révèle pourtant relativement désuette. L’indéxation des fichiers Flash par Google est à rapprocher de celui des documents Word ou PDF. Ils ne resteront que des réponses annexes, des résultats complémentaires, et ne risquent pas d’atteindre les premières pages des mots-clefs convoités.

Google héberge gratuitement vos applications web !

Google a annoncé ce matin la disponibilité de App Engine. App Engine c’est à la fois un framework web Python et une solution d’hébergement “scalable” sur l’infrastructure de Google. L’offre de base est gratuite, propose 500 Mo d’espace disque et assez de bande passante comme de temps CPU pour un site à 5 millions de pages vues par mois.

Logo de Google App Engine

Le SDK est libre et gratuitement téléchargeable, il semble basé sur Django. Comme toujours chez Google, la documentation est claire et complète, et une importante logithèque est déjà disponible.

Cerise sur le gâteau, 10 000 développeurs ont pus obtenir gratuitement un compte fonctionnel dès ce matin. Comme lors du lancement de Gmail, Google fait monter le buzz en nous promet une nouvelle vague de comptes prochainement !

FeedBurner avec votre nom de domaine !

Peut-être utilisez vous FeedBurner pour gérer les flux RSS de votre blog. Savez-vous qu’il est possible d’utiliser votre propre nom de domaine avec les fils générés par ce service ?

Logo de FeedBurner

L’objectif est de faire s’abonner vos lecteurs à vos flux RSS via une adresse du type http://rss.monsite.com plutôt que http://feeds.feedburner.com/.

Pourquoi ça ?

  • Pour conserver l’identité de votre blog : ce que l’on regarde en premier pour déterminer l’origine d’un article c’est le nom de domaine qui lui est associé
  • Pour ne pas être dépendant d’un service externe et pouvoir arrêter de l’utiliser sans perdre d’audience
  • De faire bénéficier du Page Rank assigné aux contenu de vos flux à votre domaine plutôt qu’à feedburner.com

Comment faire ?

Dans l’interface de gestion de votre nom de domaine ou sur votre serveur DNS créez un alias (type CNAME) nommé “rss.monsite.com” qui pointe vers “feeds.feedburner.com.“. Si vous éditez manuellement la configuration de votre serveur DNS, l’entrée doit ressembler à :

rss IN CNAME feeds.feedburner.com.

N’oubliez pas le point final qui indique que l’on fait référence à un chemin absolu. Après avoir attendu que les caches DNS se vident, tentez de vous connecter à votre flux en remplaçant feeds.feedburner.com par rss.monsite.com. Pour mon blog ça donne http://rss.dunglas.fr/. Si ça fonctionne, la partie DNS est opérationnel.

Il faut maintenant activer le service dans FeedBurner. Connectez-vous sur feedburner.com et rendez-vous dans My Account puis dans MyBrand, entrez le nom de domaine que vous avez choisi pour vos flux et validez. Voilà, c’est terminé !

Si vous utilisez WordPress et son plugin FeedBurner de Steve Smith, rendez-vous simplement dans Options -> FeedBurner et remplacez les adresses en feeds.feedburner.com par celle que l’on vient de créer !

Happy Burning !

Un lecteur de flux RSS pour Android : la base de données intégrée

Après avoir réalisé notre tout premier programme avec Google Android, nous allons nous lancer dans la réalisation d’un projet un peu plus complexe : un lecteur de flux RSS.

Capture d’écran du lecteur de flux RSS

Ce sommaire lecteur de flux permettra juste de s’abonner, se désabonner et d’afficher des flux RSS. Vous pouvez récupérer l’archive incluant sources et binaires si vous souhaitez tester tout de suite le programme.

Présentation de SQLite

La plate-forme Android intègre le système de base de données relationnelle embarquée SQLite. SQLite est un mini SGBD ne nécessitant que peu de ressources, qui offre la possiblité de gérer facilement des bases de données de taille restreinte.

Comme son nom l’indique, SQLite s’utilise par le biais de requêtes SQL. Il est très bien intégré à Android, ce dernier propose un grand nombre de routines qui nous permettront d’interagir très simplement avec les données (par exemple, pour les afficher à l’écran). Nous l’utiliserons dans notre programme pour gérer la liste des flux RSS auxquels l’on est abonné.

Shéma de la base de donnée

Nous utiliserons un shéma assez simple pour notre base de donnée. Elle ne se constituera que deux trois colonnes :

_id url visit

Le champ _id est un nombre entier qui représente l’identifiant de chaque lien, il sera la clef primaire de notre table. Attention son nom est une convention Android / SQLite, veillez toujours à avoir une clef primaire nommée ainsi dans vos tables. Dans le cas contraire vous ne pourrez pas utiliser simplement les curseurs plus tard ! Ce champ est complètement géré par SQLite. Il s’occupera de l’incrémenter automatiquement et de veiller à sa cohérence.

Le champ url de type text contiendra l’adresse du flux RSS.

Le champ visit, qui n’a aucune utilisé dans l’état actuel du programme, pourrait servir à compter le nombre de chargement des flux RSS afin de les classer par ordre d’assiduité par la suite.

La classe Database

Nous allons placer tout ce qui a trait à la base de données dans une classe nommée Database. Après avoir créer un nouveau projet dans Eclipse, créez donc cette classe. Nous utiliserons deux variables qui portent sur tout la classe :

db permet d’agir sur la base de donnée tandis que rss représente le contexte, notre classe principale (nommée RSSreader). La variable rss nous permet d’utiliser les fonctions openDatabase et createDatabase fournies par la plate-forme.

Le constructeur ce contente d’instancier la variable rss et de lancer la procédure d’ouverture de la base de données.

Cette procédure appelle la méthode fournie par Android openDatabase qui nous permettra d’interagir avec la base de donnée depuis la variable db. Si la base de données n’existe pas, on appelle la procédure qui la créera.

La procédure de création de la base de donnée :

La base de donnée est ici privée (MODE_PRIVATE), c’est à dire que seul notre programme pourra y accèder. La création en elle-même revient à envoyer une requête SQL classique de création de table. Nous créons donc notre base de donnée nommée rssreader puis nous insérons un flux d’exemple (celui de ce blog) en appelant la procédure add.

La base de donnée correspond en fait à un fichier texte rangé dans le répertoire /data/data/votre.package/databases/. Pour vous y connecter lancez la commande adb shell dans un terminal. Vous voici avec un shell au sein du système Android (celui de l’émulateur dans notre cas). Il s’agit en fait de BusyBox tournant au-dessus d’un noyau Linux. Pour utilisez la base de donnée en mode shell lancez sqlite3 /data/data/net.lapinblanc.android.rssreader/databases/rssreader. N’oubliez pas les points virgules terminaux à vos requêtes vous les exécuter !

La procédure add prend en paramètre une url et l’ajoute à la base de donnée :

Ici aussi, le code est limpide, il s’agit de simples requêtes SQL comme si l’on agissait sur serveur de base de données classique.

Voyons maintenant comment supprimer un flux de la base de donnée :

Dernière méthode, certainement la plus intéressante, celle qui renvoi la liste des flux dans la base de données :

Elle retourne un curseur, c’est ce curseur qui nous permettra plus tard de placer les flux dans une liste déroulante. Le tableau de chaines de caractères selectionArgs, ici vide, permet de spécifier des critères de sélection, formatés à la manière d’une clause WHERE dans une requête SQL. Le tableau columns permet d’indiquer quels colonnes nous souhaitons sélectionner, à la manière d’un SELECT en SQL. N’oubliez de sélectionner la colonne _id quelque soit votre requête. Sans elle l’utilisation ultérieur des curseurs sera beaucoup plus difficile.

Nous avons maintenant une base de donnée fonctionnelle et très légère sous Android. Dans le prochain article nous verrons comment créer une interface graphique pour gérer ces données.

Note : Merci à Infernal Quark d’avoir corrigé l’affreuse faille par injection SQL que j’avais laissé trainé…

Premier programme avec Android

Le kit de développement de Google Android désormais installé, commençons à coder ! L’objectif de cet article est de découvrir les bases de la programmation et de l’exécution de programmes pour Android. Il nécessite de maitriser la programmation en Java et de connaitre les rudiments du fonctionnement d’Eclipse.

Plugin Android pour Eclipse

Lançons Eclipse et créons un nouveau projet Android. Nous le nommerons Hello. Le package, dont le nom respectera les conventions Java, sera pour notre example net.lapinblanc.android.hello. Hello sera également l’Activity Name. L’Activity Name est simplement le nom de la classe principale du programme qui dérivera de la classe Activity d’Android. C’est simplement une classe exécutable. Application Name est le nom de votre application telle qu’elle apparaitra pour l’utilisateur.

Interface graphique par programmation

Modifions maintenant notre programme pour lui faire afficher un texte de bienvenue. Il est nécessaire de créer une interface simpliste afin d’afficher quelque chose. Modifions la classe autogérée Hello pour qu’elle ressemble à ceci :

Android propose un grand nombre de “widgets”. Vous pourrez très simplement utiliser les classiques boutons, listes déroulantes, mais aussi des horloges, des sélecteurs de date et même des galerie photos et des afficheurs de vidéo !

Notre programme écrit, lançons-le depuis l’émulateur fourni. Il faudra créer une nouvelle configuration Eclipse. Cliquez sur la flèche verte et choisissez Open Run Dialog. Choisissez comme type Android Application, nommez votre application, indiquez le package et le même nom de projet que vous avez entrez un peu plus haut. C’est parti, l’émulateur doit se lancer et afficher notre magnifique programme.

Interface graphique par fichier XML

Nous avons créé notre sommaire interface graphique entièrement dans le code source Java. Une approche plus moderne, popularisée par Glade, est de décrire l’interface graphique dans un fichier XML. Ce dernier sera lu par le programme et l’interface graphique sera automatiquement générée en conséquence. Il devient ainsi beaucoup plus facile de modifier et de faire évoluer une interface graphique déjà existante.

Android offre cette fonctionnalité par défaut.

Notre Hello World est cette fois-ci déjà généré par Eclipse !
Restaurons la classe par défaut :

Intéressons nous au fichier res/layout/main.xml, c’est dans celui-ci qu’est décrit notre interface. C’est l’attribut text de la balise TextView qui permet de spécifier ce qui sera affiché à l’écran.

Bonjour Android !

Il existe plusieurs type de layouts, ils permettent d’agencer les objets à l’écran comme bon vous semble. Les principaux sont le LinearLayout, qui affiche les éléments de manière horizontale ou verticale, le RelativeLayout qui permet de placer les élements les uns par rapport aux autres (la boite de texte doit être à droite du bouton OK et en-dessous du label de bienvenu…), le TabularLayout qui agence les éléments de manière tabulaire ou encore le FrameLayout qui permet d’afficher plusieurs layouts au sein d’un seul. Pour de plus amples informations, référez-vous au tableau récapitulatif des différents layouts. Il est assez explicite.

Le fichier R.java, qu’il ne faut pas modifier, gère les liens entre le code source Java et le fichier XML de description d’interface.

Amusez-vous à modifier le fichier XML puis cliquez sur Run pour voir le résultat. Dans le prochain article nous attaquerons les choses sérieuses : nous commencerons enfin la réalisation de notre lecteur de flux RSS pour Android avec la partie base de donnée intégrée !