Désactiver les NSLog en release

Le NSLog est l’outil de base dans le développement et le déboguage d’application Cocoa (donc Cocoa Touch). Seulement, l’utilisation de NSLog n’est pas si anodine qu’elle peut paraître … Le fait d’envoyer une chaine de caractère à la sortie console consomme des ressources.

Certes, c’est peu de choses, mais quand un NSLog est inclus dans une boucle, se déclenche à chaque touchesMoved: (par exemple), il commence à ralentir très sérieusement le fonctionnement de l’application. Sans compter qu’une fois l’application distribuée, il est possible pour l’utilisateur final de lire ce qui se trouve dans les logs … Ce qui n’est pas forcement voulu pour le développeur.

L’idée serait donc, quand on est en configuration de compilation « release », de désactiver (automatiquement les NSLog). Continue reading

Le retour du canard sous Mac OS X

Il y a quelques temps maintenant, j’ai fais l’acquisition d’un Mac (même si j’ai un Mac professionnel depuis pas mal de temps). Et bizarrement l’une des choses inutiles mais indispensables que j’attendais, c’était le fameux son de canard en guise d’alerte. Concrètement, on a le droit à un « coin » à chaque alerte de l’OS.

Après avoir cherché quelque peu, je m’aperçois avec effroi que ce son n’est tout simplement pas présent sous Léopard. En poussant un peu mes recherches, je me rends compte que c’est le cas depuis Mac OS X 10.0 (comme quoi ma précédente expérience Mac OS non-pro remontait à loin !).

Après quelques recherches (non, je n’abandonne pas, même pour de telles futilités), j’ai trouvé comment combler ce manque. Il suffit de télécharger l’archive ci-jointe (qui contient les sons système depuis System 6 jusqu’à Mac OS 9). Ensuite, il faut mettre les fichiers .aiff dans /Bibliothèque/Sounds/. Si le dossier Sounds n’existe pas, créez le.

image-5

Après avoir redémarré votre machine, rendez vous dans les Préférences systèmes puis Sons puis Effets sonores. Vous pourrez maintenant choisir le son qui vous plait. Ici, c’est bien évidement le canard !

image-6

Iphonelite3: Une nouvelle librairie SQLite pour iPhone

Je viens de découvrir aujourd’hui une nouvelle librairie permettant de simplifier l’utilisation de SQLite3 sur iPhone: Iphonelite3. L’idée global du projet est de ne pas avoir à coder une seule ligne de SQL dans son application. Il s’agit tout bêtement de faire de la persistance d’objet. Là où le concept est intéressant, c’est qu’il ne se base pas sur des objets héritant d’une quelconque implémentation de serialisation.

Non, l’idée est plus axée « hibernate » (que l’on trouve avec Java). Vous passez votre objet au gestionnaire de base de données et il s’occupe de tout le reste. Je ne vais pas continuer à faire l’article de Iphonelite3, son auteur le fait très bien sur son blog dédié. Notez que le projet est, pour le moment, en phase alpha et ne doit donc pas être utilisé en phase de production. Mais c’est à regarder avec attention.

Au passage, je rappellerais ce qui se fait sur ce segment en ce moment. Il y a les projets FMDB (que j’utilise dans deux de mes projets), SQLitePersistentObjects (que je n’ai pas pu utiliser dans mon dernier projet car il gère mal les NSMutableDictionary) et EntropyDB.

Une UITableView triée par ordre alphabétique

L’UITableView est un outil idéal pour afficher une certaine quantité de données à l’utilisateur. Seulement voilà, quand cette quantité de données devient grande, il peut être intéressant de permettre à l’utilisateur d’accéder rapidement à l’information qu’il souhaite.

Une des solutions est d’utiliser le tri par ordre alphabétique. C’est l’idéal pour l’affichage de contacts (par exemple). On peut même aller plus loin. Pourquoi simplement se limiter à un tri par ordre alphabétique ? Pourquoi ne pas proposer une catégorisation des entrées en prenant en compte la première lettre de la propriété qui nous intéresse. C’est ce que nous allons voir dans ce billet. Au final, nous arriverons à ce résultat:

alphabeticaltableviewfinalscreen
Continue reading

Supprimer les services VMWare au démarrage

Avez-vous déjà regardé un peu comment fonctionnait VMWare ? Ce n’est pas une simple application banale. Lors de son installation, elle opère des changements assez profonds dans le système hôte. Les plus connues sont l’ajout de nouvelles interfaces réseau et surtout de nouveau services !

Il peut paraitre un peu trop contraignant d’avoir plusieurs services qui tournent constamment (9 mesurés sur un VMWare Workstation 6.5 sous Ubuntu[1] sans que VMWare soit « lancé »). Sans compter que dans certaines configurations réseau, les interfaces vmnet* (et leurs DHCP) peuvent poser problème.

Voilà pourquoi il peut être intéressant de désactiver le lancement automatique des services au démarrage de Linux. Le souci, c’est que si on procède ainsi, on ne peut plus lancer VMWare (puisque ses services ne tournent pas). Il est possible, cependant, de mettre en place un parade. La voici:
Continue reading

Rediriger les liens mailto: vers Gmail sous Linux

Aujourd’hui, les webmails sont devenus assez performants. A tel point qu’on commence à abandonner les clients mails lourds au profit des webmails. Gmail est un exemple en la matière. Seulement voilà, cet usage peut être « problématique » quand on clique sur une adresse mail (dans une page Web).

En effet, quand le système d’exploitation détecte un lien mailto:, il tente de lancer le client mail par défaut et lui passe les informations du lien en paramètre. L’idéal serait qu’il appelle directement le navigateur internet en lançant la page de Gmail qui va bien. Voilà comment faire sous Ubuntu:
Continue reading

Créer une UITableViewCell personnalisée à partir d’Interface Builder: exemple complet

Il y a peu, j’exposais ma solution pour Créer une UITableViewCell personnalisée à partir d’Interface Builder. Suite au commentaire de Bruno Da Silva, je vous laisse une version complètement fonctionnelle de l’implémentation de cette méthode.

Il s’agit d’une TableView qui va chercher les dernières photos Flickr avec pour tag « xmas ». Pourquoi donner un exemple aussi compliqué ? Tout simplement parce que je n’ai vraiment pas le temps de faire un exemple complet en ce moment et je voulais publier un exemple rapidement. J’ai donc récupéré rapidement un exemple de code que j’ai fais en interne pour le boulot.

La partie de code qui va chercher les images sur FlickR n’est pas de moi. L’auteur n’ayant pas laissé d’informations le concernant dans le code, je ne pourrais plus vous dire qui c’est (et ça me désole vraiment).

Voici l’archive contenant le projet Xcode complet (toute l’intelligence concernant la méthode pour l’UITableViewCell se trouve dans MyTableViewController.m à la méthode - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath): télécharger MyTableViewDemo.zip.

Des raccourcis clavier en ligne de commande pour gagner du temps

C’est un fait: quand on sait l’utiliser correctement, la ligne de commande est bien souvent plus simple et plus rapide sous Linux que l’interface graphique. Une fois maîtrisée, il n’y a plus qu’un seul objectif: aller toujours plus vite.

Dans cette optique, il existe des raccourcis claviers qui peuvent s’avérer très utiles. Je vous présente ceux que j’utilise, ils ont étés testés en console sous Ubuntu mais sont normalement valable pour tout ce qui repose sur un noyau Linux (voire peut être même *BSD).

  • CTRL+A: Pour déplacer le curseur en début de ligne
  • CTRL+U: Supprime tout ce qui se trouve entre le curseur et le début de la ligne
  • CTRL+W: Supprime le mot qui se trouve à gauche du curseur
  • CTRL+E: Pour déplacer le curseur en fin de ligne
  • CTRL+K: Supprime tout ce qui se trouve entre le curseur et la fin de la ligne
  • CTRL+L: Efface le contenu de la console courante
  • CTRL+P / CTRL+N: Se déplace dans l’historique des commandes comme les flèches du haut et du bas. Utile dans le cas où ces dernières ne sont pas nappées correctement …
  • CTRL+R: Permets d’effectuer une recherche textuelle dans l’historique des commandes saisies

Bien évidement, c’est loin d’être une liste exhaustive. Il ne s’agit que des raccourcis clavier que j’utilise personnellement et qui ne concernent que le gain de temps. On ne parle pas ici de la gestion des processus ou autre touches magiques …

Réduire la hauteur d’une UITableView

Prenons un cas simple: on a une UIView qui contient une simple UITableView (avec le UITableViewController qui va bien) ainsi qu’une UIToolBar en bas. On se retrouve avec un léger problème: la UITableView ne se redimensionne pas automatiquement en hauteur. Ainsi, les derniers éléments se retrouvent « cachés » par la barre. Voici un exemple fait à la va-vite avec Interface Builder (la UIToolBar a été volontairement mise en transparence pour illustrer le problème):

uitableviewsizeproblem

Le souci, c’est qu’il n’est pas possible de préciser dans le code la taille d’une UITableView. Après avoir essayé plusieurs solutions (dont certaines était plutôt farfelue), j’en ai retenu une. C’est celle qui m’a semblé la plus propre, simple et efficace.
Continue reading

Cache Safari de l’iPhone: pas très éfficace …

Il y a quelques jours, Éric Daspet (de Performance web) parlait de l’iPhone et de sa gestion du cache Web (sous Safari) dans un billet nommé « Encore sur le cache de l’iPhone ». Voici un extrait de celui-ci:

Encore il y a peu nous parlions d’un cache HTTP limité à 25ko par composant sur l’iPhone, 500ko au total. On parle de la taille une fois la ressource décompressée (sans gzip donc). 25ko c’est peu, la plupart des sites ont un composant qui dépasse cette taille. 500ko ce n’est pas beaucoup mieux, naviguez sur un ou deux sites et le cache aura complètement oublié vos précédentes visites. Pire, des bibliothèques javascript comme jquery dépassent les 25ko et donc ne passeront jamais dans le cache.

La bonne nouvelle c’est que cette limite est désormais dépassée. Une présentation de Nicole Sullivan indique que la limite des 25ko a disparue, et que la taille globale du cache a été doublée.

Oui mais voilà, la situation n’est pas si idyllique que ça … Dans son billet, il invite à faire quelques tests sur les différentes plateformes (iPhone et iPod Touch tous firmware confondus). Je viens de finir mes tests sur iPhone 3G dernier firmware (2.2) et voici le résultat:

  • Aucune mise en cache pour la page HTML en elle-même (même si les en-têtes HTTP le demandent explicitement). Et ce, peu importe la taille du fichier HTML.
  • Concernant la mise en cache des éléments joints (dans le cas présent: une image), ça passe jusqu’à 220Ko (une fois cette limite dépassée, le mécanisme de cache ne s’applique plus).
  • Aucune différence de comportement n’a été remarquée que l’on soit en WiFi ou bien en 3G.

Avouons le, le comportement de Safari iPhone est assez étonnant pour un développeur Web. Mais pour un développeur mobile, ça semble assez normal. Rappelez-vous que Safari iPhone peut avoir simultanément 9 « onglets » ouverts. Rajoutons aussi que Safari est une application qui peut être momentanément interrompue, puis relancée par l’utilisateur. On se retrouve donc avec des problématiques de gestion mémoires bien plus fines que dans le cas d’un développement Web « lourd ». Pour finir, rappelons (encore) que l’iPhone est un appareil mobile, donc avec une quantité limitée de mémoire …