Hum, hum…

9 décembre 2009

Ça fait un bout de temps que j’ai un peu laissé ce blog à l’abandon pour diverses raisons… dont un déménagement et le re-passage du permis de conduire (que cette fois j’ai eu \o/ après 3 ans il était temps !).

Dans l’intervalle les statistiques Google Analytics du site on chuté assez rapidement (environ de moitié). Rien d’étonnant : quand y a rien de nouveau, pourquoi revenir ?

Bref, je vais essayer de retrouver un rythme un peu plus rapide et régulier dans les semaines à venir. D’autant que je viens de commander mon iPhone, donc je devrais bien trouver quelques trucs à dire !

  • Print this article!
  • Turn this article into a PDF!
  • E-mail this story to a friend!
  • Facebook
  • Twitter
  • del.icio.us
  • Digg
  • Google Bookmarks
  • BlogMemes Fr
  • Wikio FR
  • Netvibes

Langue par défaut de Google…

8 septembre 2009

Il y a quelques temps, pour tester la fonctionnalité Wonder wheel de Google, j’avais dû switcher sur google.com. Le hic c’est qu’après ça, une recherche dans la barre de recherche me renvoyait systématiquement sur google.com et non google.fr.

Cela venait du fait qu’un cookie est posé sur le navigateur avec la langue par défaut à utiliser. Il s’agit du cookie “PREF” pour le domaine google.com et précisément de la portion “LD=en” qui est en cause. Supprimer ce cookie règle le problème.

Apparemment c’est bien google.com qui est interrogé par la recherche et qui redirige ensuite sur google.fr, mais ce que je ne saisis pas c’est pourquoi aller sur google.com depuis google.fr met à jour le cookie dans un sens alors que faire l’inverse ne le fait pas…

  • Print this article!
  • Turn this article into a PDF!
  • E-mail this story to a friend!
  • Facebook
  • Twitter
  • del.icio.us
  • Digg
  • Google Bookmarks
  • BlogMemes Fr
  • Wikio FR
  • Netvibes

Petit bench sur la recherche dans un tableau PHP

1 août 2009
Préambule…

Hier, j’avais à parcourir un tableau d’objets (pouvant avoir potentiellement des centaines voire exceptionnellement milliers d’entrée) pour rechercher si l’identifiant de l’un d’eux se trouvait dans un second tableau. J’avais commencé par utiliser pour ça la fonction in_array() à chaque itération pour voir si l’identifiant de l’objet était présent ou non dans le second tableau.

En voyant cela, un collègue m’a fait remarquer que ce serait peut-être plus performant de construire un tableau dont les clés sont les valeurs du second tableau (via array_flip()) pour pouvoir utiliser isset() au lieu de in_array() et voici les résultats obtenus :

Structure du bench

Le bench consiste à rechercher 100 000 fois la même valeur dans le tableau array('11345', '7437', '7329', '45494', '7894311', 'sdfsdg', 'qsqsdcirt', 'd787 sdfs df'), avec trois méthodes différentes :

  • in_array()
  • array_flip() suivi de isset()
  • array_flip() suivi de array_key_exists()

Le test est effectué avec deux valeurs différentes : d’abord avec la première valeur du tableau (cas théoriquement le plus favorable puisqu’on arrête la recherche une fois la valeur trouvée) puis avec une valeur qui n’est pas dans le tableau (cas théoriquement le plus défavorable puisqu’on est obligé de parcourir tout le tableau). Le résultat en conditions réelles sera donc compris dans cette fourchette.

Cas in_array()

Code exécuté :

for ($i = 0; $i < 100000; $i++)
{
   in_array($value, $values);
}

Cas favorable ($value = '11345') : ~0.33 secondes
Cas défavorable ($value = 'uottuyi') : ~0.52 secondes

Cas isset()

Code exécuté :

$keys = array_flip($values);
for ($i = 0; $i < 100000; $i++)
{
   isset($keys[$value]);
}

Cas favorable ($value = '11345') : ~0.12 secondes
Cas défavorable ($value = 'uottuyi') : ~0.09 secondes

Cas array_key_exists()

Code exécuté :

$keys = array_flip($values);
for ($i = 0; $i < 100000; $i++)
{
   array_key_exists($value, $keys);
}

Cas favorable ($value = '11345') : ~0.27secondes
Cas défavorable ($value = 'uottuyi') : ~0.24 secondes

Et pour de plus petites quantités ?

Les grands volumes c’est bien mais qu’est-ce que ça donne quand on a peu d’itérations ?

Un test à 5 itérations au lieu de 100 000 donne environ le même résultat pour les trois méthodes : avec ~6E-05 secondes pour les méthodes 1 et 3 et ~5E-05 pour la méthode 2.

Tandis qu’un test sur une unique itération donne la première méthode gagnante avec ~4E-05 secondes contre ~5E-05 pour les deux autres (à ce niveau c’est le array_flip pour transformer les valeurs en clés qui coute cher).

Conclusion

À moins d’avoir toujours très peu d’itérations (moins de 5), la méthode passant par array_flip() puis isset() est d’assez loin la meilleure (environ quatre fois plus rapide sur des grands nombres et pas plus lente sur des petits).

En passant, on remarque aussi qu’avec cette méthode, rechercher une valeur qui n’existe pas dans le tableau est plus rapide que de rechercher la première valeur du tableau, même si je ne vois pas forcément trop pourquoi :pense:

  • Print this article!
  • Turn this article into a PDF!
  • E-mail this story to a friend!
  • Facebook
  • Twitter
  • del.icio.us
  • Digg
  • Google Bookmarks
  • BlogMemes Fr
  • Wikio FR
  • Netvibes

Quelques extensions pour Firefox #3

19 juillet 2009
OpenTabs

Une petite extension développée par l’un de mes collègues et qui ne fait qu’une seule chose mais le fait bien : elle ajoute un bouton permettant de modifier d’un seul clic l’ouverture des onglets en passant d’une ouverture en arrière-plan à une ouverture en avant-plan, et vice versa. C’est pas grand chose mais dans certains cas c’est bien pratique ^^

Regular Expressions Tester

Cette extension clairement réservée aux développeurs permet d’écrire une expression rationnelle et de tester en temps réel son application sur une chaine. C’est carrément pratique, en particulier quand on doit débuguer une expression écrite par quelqu’un d’autre et qui, forcément, est totalement incompréhensible \o/

Regular Expressions Tester

Dragdropupload

Encore une petite extension qui n’a l’air de rien comme ça mais que je trouve bien pratique ! Elle permet de renseigner un champ de formulaire de type fichier directement en “droppant” le fichier dedans plutôt qu’en étant obligé de saisir sont chemin d’accès ou de le rechercher dans l’arborescence (alors que dans certains cas on a déjà fait cette recherche préalablement dans l’explorateur windows).

  • Print this article!
  • Turn this article into a PDF!
  • E-mail this story to a friend!
  • Facebook
  • Twitter
  • del.icio.us
  • Digg
  • Google Bookmarks
  • BlogMemes Fr
  • Wikio FR
  • Netvibes

Quelques trucs sur Mac OS #1

19 juillet 2009
Comment saisir certains caractères ?

Certains caractères sont bien compliqués à saisir sur un mac et notamment pas forcément visibles sur le clavier (de mon macbook pro en tous cas, pour les autres j’en sais rien). Or quand on fait de développement, c’est caractères sont très souvent utiles :

  • ~ (la tilde) : alt+N
  • { (l’accolade ouvrante) : alt+(
  • } (l’accolade fermante) : alt+)
  • [ (le crochet ouvrante) : alt+shift+(
  • ] (le crochet fermante) : alt+shift+)
  • \ (le backslash ou antislash) : alt+shift+/
  • | (la barre) : alt+shift+L
Faire une capture d’écran

Je ne sais pas si par hasard les iMac ont une touche équivalente à “Impr. ecran” qu’on trouve sur PC mais en tout cas ce n’est pas le cas du MacBook pro. Leopard permet de capturer soit tout l’écran (cmd + maj + 3), soit une sélection (cmd + maj + 4), soit une fenêtre (cmd + maj + 4 puis espace). Dans tous les cas la capture sera automatiquement enregistré en PNG sur le bureau.

Forcer l’éjection du CD depuis un terminal

Après insertion, mon CD n’apparaissait pas dans l’interface (ni dans iTunes, ni dans le finder). Une courte recherche sur Google m’a sorti une panoplie de solutions possibles, la plus simple (et qui a marché dans mon cas) était de forcer l’éjection depuis le terminal via la commande drutil eject.

  • Print this article!
  • Turn this article into a PDF!
  • E-mail this story to a friend!
  • Facebook
  • Twitter
  • del.icio.us
  • Digg
  • Google Bookmarks
  • BlogMemes Fr
  • Wikio FR
  • Netvibes