Quelques impressions sur l'iPhone

Ça fait bientôt deux semaines que j'ai mon iPhone 3GS 16Go tout neuf ^^ Il remplace mon vieux téléphone LG qui, s'il a un design pas trop moche, est quand même assez pourri par ailleurs (et surtout, la batterie est plus morte que vive...).

Alors que dire sur cet iPhone ? Pas mal de choses !

Déjà, premier point : taper un SMS avec un iPhone, comparé à taper un SMS sur un clavier douze touches, c'est juste environ soixante douze mille fois plus agréable :smile: C'est évidemment pas aussi pratique qu'avec un clavier d'ordinateur mais franchement, c'est top. J'avais très peu tapé de texte sur mon iPod Touch (pas trop de raison, je m'en servais essentiellement pour jouer et écouter de la musique) mais là dès les premiers SMS j'ai pris la pleine mesure de l'avantage d'avoir un clavier à plus de douze touches ! Puis accessoirement, voir les SMS en mode conversation, c'est plus sympa, vive l'écran de taille raisonnable qui peut afficher un peu plus de choses ^^

Ensuite, pouvoir passer deux appels et avoir toujours largement de la batterie, c'est un vrai bonheur \o/ Mais bon, ça c'est juste par rapport à la la batterie moribonde de mon précédent téléphone :D

Autre point : j'avais lu que les derniers modèles d'iPhone et iPod Touch étaient muni d'un revêtement spécial qui réduisait les traces de doigts... ben là clairement, c'était pas une blague ! Sur mon iPod, les traces sont largement visibles, sur l'iPhone elles sont quasi-inexistantes. Espérons que ça dure et que le revêtement en question ne s'use pas à vitesse grand V, ce serait décevant...

Puis reste l'appareil photo qui est tout à fait honorable pour un téléphone :)

Sinon, pas grand-chose d'autre à en dire, si ce n'est qu'Universal Mobile fait chier à ne fournir que le 3G 8Go en renouvèlement... Du coup j'ai dû changer de numéro...

À part ça, bah j'avais déjà expérimenté une bonne partie des fonctionnalités avec mon iPod, donc pas de grosses surprises là dessus, c'est juste plus utilisable avec une connexion 3G qu'en étant limité aux réseaux WiFi ! Bref, je regrette pas mon achat, même si ça m'a couté un peu cher, je pense que l'abonnement sera plus rentabilisé avec la connexion internet qu'il ne l'était avant avec juste des communications téléphoniques ^^


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: