Quelques jeux pour iPod Touch/iPhone #8

Rocket Bird

Rocket bird - icône

Un petit jeu excellent où il faut diriger (via l'accéléromètre) un petit oiseau qui file à toute vitesse grâce à la fusée fixée sur son dos. Éviter sapins, barrières, bottes de foins, vaches et maisons pour aller le plus loin possible. Le genre de jeu qu'on peut jouer en boucle sans s'arrêter :p

Les graphismes sont sympa quoiqu'un peu d'anti-aliasing ne ferait pas de mal. La musique par contre est sympa cinq minutes et vite lourde par la suite.

Rocket bird - 1 Rocket bird - 2

Sherk Kart (2€39)

J'ai profité d'une promo pour thanksgiving pour où il était à 0€79 pour l'acheter et je ne regrette pas mon achat : ce clone de Mario Kart est bien sympathique. Pas mal de circuits différents, des graphismes en 3D de bonne facture, une musique pas trop soulante, un mode multijoueurs, que demander de plus ?

Les contrôles sont simples : la voiture dirige via l'accéléromètre, on freine sur un bouton à gauche et on utilise les bonus et actions spéciales sur des boutons à droite.

Shrek Kart - 1 Shrek Kart - 2 Shrek Kart - 3

Pour ceux qui préfèrent tester avant d'acheter, une version démo est également disponible (je ne l'ai pas testée par contre, je ne sais pas ce qu'elle contient).

iDracula (2€39)

Lui aussi, je l'ai acheté lors d'une promo, mais ça fait nettement plus longtemps :p

Il s'agit là d'un brave jeu de massacre : vous êtes un chasseur de monstres et plein des bestioles vous foncent dessus : zombies, vampires, démons, etc. Par chance, ils ont le bon goût de laisser tomber plein d'armes, munitions et autres bonus en mourant... et de venir gentiment par ordre croissant de puissance (comme dans Dragon Ball Z, quoi, sauf que là ils sont plus nombreux \o/). Vous l'aurez compris, iDracula n'est pas le jeu qui vous fera gagner des neurones mais ça détend ^^

Le jeu propose trois décors et quatre modes de jeux différents pour varier un peu les massacres. Et les graphismes en 3D isométrique sont du coup moins aliasés que ce qu'on peut trouver habituelle en "vraie 3D" sur l'AppStore, ce qui n'est pas désagréable non plus ^^

iDracula -1 iDracula - 2 iDracula - 3

Là aussi, on peut tester avant d'acheter grâce à la version lite.


Hum, hum...

Ç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 !


Langue par défaut de Google...

Il y a quelque 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...


Petit bench sur la recherche dans un tableau PHP

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:


Quelques extensions pour Firefox #3

Cet article est marqué comme contenant des informations dépassées depuis le 21/10/2018.
Ces extensions n'existent plus depuis Firefox 57 et l'abandon de l'ancien système d'extensions.

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 son 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).