Zbar support on armv7 and upper

For one of my client project, I needed a QR code reader. I do know that Apple introduced such a reader on iOS 7, but I needed it to run on iOS 6 as well.

Two open-source librairies looked like serious candidates at first:

Zbar

zxing

zxing dropped support for the iOS platform recently. This leaves us with Zbar.

Zbar pre-compiled library does not support modern architectures

However, there is a problem with the Zbar library found in the SDK: it’s been compiled for the armv6, armv7 and i386 architectures only. Therefore, if your application supports more modern architectures like armv7s or arm64, it won’t link with the precompiled library.

Compiling from the source code

The solution is to compile Zbar yourself from the source code, which you can clone using Mercurial. You shall find explanations for Xcode 4 here, and Xcode 5 here.

However, there is an easier way. Someone had the great idea to clone the original Mercurial repository to github and also created a Podspec, so Zbar may be included in your project using Cocoapods.

In your Podfile, write:

and voilà! You might still need the documentation for the Zbar SDK.

UILocalizedIndexedCollation shows empty sections

A client wanted his app to show a list of contacts. He wanted each contacts whose name began with the same letter to be in the same section of a table view. However, he was not satisfied with the first version I coded, because empty sections would show. For instance, if there was no contact whose name began with a B, there would be an empty B section.

So, I went back to my code, and I came up with this result:

Capture d’écran 2013-11-18 à 11.29.20

My code only handles letters from A to Z, with no diacritics.  I was not aware of the UILocalizedIndexedCollation class at the time I programmed the first version, and when I discovered it, it seemed to present an interesting feature: it can handle other locales, in particular, Arabic or Asian alphabets.

For the second version, I thought it would be better using it, but I really wasted two hours:

Capture d’écran 2013-11-18 à 11.04.49

UILocalizedIndexedCollation uses a fixed list of indexes, so empty sessions are shown. Just like the first version I came up with. I thought Apple would have had produced a much better implementation.

By the way, Apple’s documentation is way too spare. NSHipster provides us with a good starting point to understand how to use this class.

dopop version 1

J’en avis déjà parlé ici et , mon application iPhone pour apprendre le solfège est disponible. Le mieux pour voir à quoi ça ressemble est d’aller voir le site officiel:

dopop.net

Pour l’instant, l’application ne comporte qu’un seul jeu, qui s’appelle « Quelle est cette note ? ». Les autres jeux arriveront au fur et à mesure, de même que les améliorations de l’existant. Pour l’instant, je me suis avant-tout attaché à faire un premier jeu jouable, intéressant et pédagogique.

Je vais partager les difficultés que j’ai eu lors du développement de cette première version de dopop.

 Sprite Kit

La première version était jouable en juin. Cependant, elle était basée sur l’animation de UIViews, et même si j’aurais pu en rester à cette solution, je lui trouvais plein de défauts:

  • le code était crade
  • les animations étaient parfois étranges, en particulier à cause des courbes Ease in-out de Core Animation.
  • il était difficile de faire des transitions d’écran, ou même d’ajouter des petits éléments marrants.

Ce que j’aurais pu faire était d’utiliser Cocos2D dès le départ, seulement, je n’aime pas cette bibliothèque dont les API sont mal fichues et l’intégration avec UIKit encore pire. Quand Apple a annoncé Sprite Kit à la WWDC, j’ai tout de suite essayé et j’ai été séduit.

Je ne regrette pas cette décision, même si elle a le défaut de limiter le jeu à iOS 7. Finalement, Sprite Kit a bien eu quelques bugs et quelques incohérences dans sa conception, mais tous mes radars furent corrigés pendant l’été, y compris ceux relatifs à Xcode 5.

Sprites et polices de caractères

Ceci m’a fait perdre beaucoup de temps. Je voulais utiliser un format vectoriel pour les notes et la portée. Mon idée était de créer une police de caractère pour cela. En pratique, dessiner les éléments dans Sketch fut rapide, par contre, il fallait utiliser un logiciel pour créer la fonte, et là c’est la cata. En gratuit, le moins pire est FontForge, mais il faut l’installer avec MacPorts, il fonctionne sous X11, et ça se voit.

Ensuite, je pouvais certes dessiner la portée avec la fonte, mais il y avait toujours des problèmes de taille ou d’alignement, d’un pixel ou un demi-pixel. Un beau jour, je me suis dit: « fini c’est conneries ! ». J’ai exporté mes graphismes en bitmap, je les ai mi dans le projet Xcode et je n’ai plus eu de problème.

La leçon apprise: les sprites, par définition, sont des bitmaps.

Niveaux

Une des difficultés quand on crée un jeu vidéo, est qu’il faut définir les niveaux. Pour ma part, j’ai créé un langage un peu spécial pour cela. Par exemple:

  • Les [ ] délimitent le niveau.
  • T=76 indique le tempo.
  • F3 G3 A3 B3 C4 sont des notes (une lettre qui donne le nom de la note, suivie de l’octave).
  • Enfin, %12 indique qu’il va falloir répéter aléatoirement ces notes 12 fois.

Ce système me permet de décrire précisément le niveau, tout en n’ayant pas à écrire toutes les notes (dans cet exemple il y a 5×12 = 60 notes).

La première difficulté fut de créer un parseur pour ce format. Je n’avais aucune expérience dans ce domaine. Au final, je m’en suis sorti avec des regex et une sorte de machine d’état.

La deuxième difficulté fut de doser la difficulté: les premières versions était quasiment injouables. Il a aussi fallu réduire la durée des niveaux. Vous verrez que le jeu est encore assez difficile, et que vous perdrez souvent: c’est normal. On gagne quand on sait les notes, or cela demande des répétitions pour mémoriser.

Son des notes

Là encore, une grosse perte de temps. Il est important dans le jeu que les notes soit dites. En effet, le but n’est pas que vous deveniez bon à taper sur le clavier à l’écran, mais vous mémorisiez les noms des notes.

Mon idée de départ était de m’enregistrer à chanter toutes les notes: do ré mi fa sol la si, mais aussi A B C D E F G, puisque le logiciel permet de changer de notation. Il fallait le faire pour toutes langues. Le résultat fut décevant. Franchement, c’était horrible, tous les testeurs me l’ont dit.

Une deuxième piste était de créer un synthétiseur vocal chantant. J’ai fait un peu de recherche, et même si ce que je voulais restait simple, j’ai vite compris que c’était un travail bien trop gros. Au final, la version actuelle est un compromis: j’ai utilisé le synthétiseur vocal introduit par Apple dans iOS 7, et je joue la note en même temps.

D’ailleurs, jouer la note n’a rien de simple. Je ne suis pas certain que ce soit la technique la plus facile, mais j’ai carrément créé un synthétiseur basé sur une AudioQueue. Le synthé sonne vraiment bien, c’est une grande fierté.

Organisation

C’est la première fois que j’écris un jeu vidéo. J’avais bien quelques idées sur la manière de faire, mais pas vraiment d’expérience. La difficulté fut donc de savoir comment organiser l’appli. Déjà, j’ai respecté le principe du MVC, avec succès. Ensuite, la conception a émergé progressivement, au fil des remaniements. Au final, ce n’est pas parfait, mais c’est assez modulaire, assez gérable.

Achats in-app

Étant dans le cas le plus simples (achats non-renouvelables), je pensais que ce serait vite réglé, en fait, ça m’a pris une semaine. Pour ceux qui n’en n’ont jamais faits, disons qu’il faut gérer la transaction, et surtout, présenter tout ça dans une interface utilisateur perso, Apple ne fournissant rien de standard.

Au final, le code n’est pas très lourd, mais il y a un tas de petits détails à régler. La doc d’Apple est répétitive et manque d’exemples (comment savoir si un achat a déjà été effectué ?).

Voilà, si vous avez des questions ou des commentaires, ils sont les bienvenus.

Reading Barcodes on iOS 7

iOS 7 introduced APIs to read bar codes using the camera. I could have easily overlooked it without this excellent post from doubleencore.

NSHipster provided sample code, but it missed some details to work. Here is a sample which does.

Sample code

Pitfalls

The issue I had with NSHipster’s sample code is the delegate method was not called at all. I quickly understood this was because the AVCaptureMetadataOutput must be configured to tell which metadata to recognise.

But, and this was not obvious to me, -[AVCaptureMetadataOuput setMetadataObjectTypes:] must be called after -[AVCaptureSession addOutput:]. Otherwise, the following message shows in the console:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVCaptureMetadataOutput setMetadataObjectTypes:] - unsupported type found.  Use -availableMetadataObjectTypes.'

I did try to look at the output of -availableMetadataObjectTypes, and it returns an empty array.

Therefore, -addOuput: must be called before setMetadataObjectTypes. In retrospect, it makes sense: the output object must know it is linked to a video session to know which metadata it may provide.

Une fenêtre qui change de view controller

Ce billet intéressera les programmeurs débutants sur le Mac. Je vais ici vous montrer comment passer d’un panneau à un autre, chacun défini dans son propre xib et géré par une sous-classe de NSViewController.

Capture d’écran 2013-09-16 à 10.09.24

Création du projet et mise en place de la toolbar

J’utilise Xcode 5. Commencez par créer un projet d’application pour Mac.

J’ajoute deux images de 32 x 32 pixels, qui serviront d’icônes pour la toolbar:

Square Circle

 

 

Xcode a créé un premier MainMenu.xib pour votre appli, comprenant une barre des menus et surtout une fenêtre.

Nous allons ajouter une NSToolbar à cette fenêtre. Pour cela, il suffit de glisser une toolbar depuis la rubrique Object Library (dans le coin inférieur droit de la fenêtre de Xcode) vers la fenêtre. La toolbar comporte déjà des icônes. Configurez-la pour qu’elle présente deux icônes en son centre:

Capture d’écran 2013-09-16 à 09.33.27

Pour cela, supprimez tous les NSToolbarItems présents,  glissez de nouveaux items, puis configurez-les.

Maintenant, tirez des actions allant de chaque icône vers l’AppDelegate.

 Création des panneaux

Chaque panneau sera géré par un view controller et sera contenu dans un xib.

Commencez par créer une sous-classe de NSViewController (que j’appelle CECustom0ViewController):

Capture d’écran 2013-09-16 à 09.42.16

Éditez CECustom0ViewController.xib. Ajoutez simplement une NSBox et fixez son titre pour savoir de quel xib il s’agit:

Capture d’écran 2013-09-16 à 09.43.50

Créez une deuxième sous-classe de NSViewController sur le même principe (CECustom1ViewController).

Passage d’un view controller à l’autre

Pour gérer le changement de view controller, je créé une classe CEViewControllerSwitcher, qui hérite de NSObject:

CEViewControllerSwitcher.h

CEViewControllerSwitcher.m

Liaison avec l’AppDelegate

CEAppDelegate.m

C’est terminé !

Voilà, ça fonctionne, on passe bien d’un View Controller à l’autre. Il s’agissait de la technique de base, je vous laisse régler l’autolayout des vues pour qu’elles remplissent bien la contentView de la fenêtre comme on le souhaite.

Le projet Xcode complet: ChangeVues

 

dopop

Je me suis lancé depuis quelques semaines dans un nouveau projet. Il s’agit d’une application iPhone qui regroupera plusieurs jeux en rapport avec l’apprentissage du solfège, mais réalisés comme des jeux d’arcade pour ne pas être ennuyeux.

Je vous laisse jeter un œil au site consacré au jeu: dopop.net.

Open Street Map: édition

Comme je vous le disais dans le billet d’introduction à OpenStreetMap, nous disposons aujourd’hui de nombreux outils pour éditer les plans. Aussi, il ne tient qu’à vous de commencer à compléter votre ville. Voyons trois de ces outils.

Il vous faudra un compte

Quel que soit l’outil choisi, il vous faudra créer un compte pour pouvoir éditer les cartes. S’agissant d’un outil collaboratif, vous comprendrez qu’il est nécessaire d’attribuer à chacun ses modifications, ne serait-ce que pour se prémunir des vandales. Vous disposerez également d’un historique de vos modifications et pourrez téléverser les traces GPS sur le site.

L’éditeur intégré à OpenStreetMap

Un tout nouvel éditeur intégré a fait son apparition. L’ancien outil était assez limité (il convenait pour renommer une rue, mais pas guère plus), et utilisait Flash, donc était inaccessible aux appareils mobiles.

Le nouvel éditeur propose les outils de base: ajout de points, de lignes et polygones, et balisage de ces éléments. Comme le fond de carte de Bing apparait pendant l’édition, nous disposons à présent d’un outil qui répond à la plupart des besoins.

Pour l’utiliser, rendez-vous sur la page d’accueil d’OpenStreetMap, et cliquez sur l’onglet Modifier. Un petit tutoriel est même présent pour vous expliquer les principes.

JOSM

Cet outil servira aux cartographes plus avertis. Par exemple, vous pourrez importer les données du cadastre français et changer le type de projection. Il est aussi utile si vous cartographiez massivement, puisqu’il dispose, par exemple, d’outils qui permettent d’importer des photos (pour noter comment s’appellent les rues ou les magasins), puis de synchroniser leur heure avec une trace GPS, ou un fichier audio.

Vous trouverez JOSM ici.  L’outil est écrit en Java, et est lourd. Par ailleurs, il est très mal adapté à la souris du Mac.

Pour finir, il y a un concept à comprendre: pour commencer l’édition, JOSM demande de délimiter une zone, qui ne doit pas être trop grande, de l’ordre de 3 x 3 km.  Il va ensuite charger tous les éléments (points, polygones…) qui se trouvent dans cette zone. On travaille alors hors-ligne, et c’est quand on a fini notre travail que JOSM vérifie qu’il n’y a pas d’incohérences, et qu’on peut enfin envoyer les données à OpenStreetMap.

Go Map!!

Pour finir, une application pour iPhone et surtout iPad, bien fichue et qui présente les outils essentiels. En pratique, travailler avec cette appli me semble plus lent qu’avec un ordinateur de bureau, mais la géolocalisation est bien pratique pour pouvoir éditer les cartes sur place.

Introduction à OpenStreetMap

Qu’est-ce que c’est ?

Pour commencer, mieux vaut vous rendre sur OpenStreetMap.org. Vous y verrez une carte.

Comme vous avez déjà certainement utilisé des services tels que Google Maps, Mappy ou Bing, vous pouvez vous demander ce que celui-ci a de différent: il est collaboratif. Ainsi, ce sont des gens comme vous et moi qui ont saisi les cartes. OSM est donc aux cartes ce que Wikipédia est aux encyclopédies.

Est-ce utilisable ?

Pour être honnête, je dirais que pas encore. Il faut bien comprendre qu’OSM se nourrit des informations saisies par des bénévoles, et donc certaines zones — en particulier denses et urbaines — sont bien renseignées, alors que d’autres ne font apparaître que les grands axes routiers et ferroviaires.

Le projet a démarré en 2004, et le travail accompli est formidable. Le mouvement devrait s’accélérer, parce que, vous le verrez dans les prochains articles, contribuer est aujourd’hui facile. Par ailleurs, de nouvelles sources de données sont apparues. Ainsi, l’ami Crosoft permet à OSM d’utiliser les photos satellites de Bing (j’ai cru comprendre qu’il faisait surtout cela pour ennuyer Google…) et nous pouvons depuis peu utiliser les données du cadastre français.

Pourquoi contribuer ?

J’ai pour ma part deux raisons de contribuer. La première est qu’il s’agit d’un acte citoyen. On a souvent besoin de cartes, que ce soit pour voyager, se rendre chez des amis, préparer un trajet professionnel ou une randonnée. Actuellement, ces données sont détenues par une poignée de sociétés ou d’organismes gouvernementaux qui limitent leur accès pour des raisons stratégiques ou financières.

La seconde raison est qu’il s’agit d’une source de richesse. Ces données libres ouvrent la voie à de nouvelles applications qui ne pourraient pas exister autrement, que ce soit parce que les données ne seraient pas accessibles, ou parce qu’elles seraient trop chères.

Je m’y suis mis il y a quelques jours

Je m’étais intéressé à OSM il y’a quelques années, mais il m’avait semblé qu’y contribuer était trop complexe. Par exemple, il fallait installer un logiciel sur son GPS de voiture pour connaître les routes existantes (créer des traces).

Aujourd’hui, avec le GPS d’un iPhone, on peut tracer sa route et l’envoyer facilement à un ordinateur. On peut aussi prendre des photos géolocalisées pour noter les endroits remarquables.

Nous verrons aussi dans les prochains articles que l’utilisation des outils logiciels est assez simple.

(Encore un article sur) le retrait de l’application Appgratis

Comme vous avez sans doute pu le lire à divers endroits, l’application Appgratis a été supprimée la semaine dernière par Apple.

Si, comme moi, vous ne connaissez ni l’application ni son site web, rappelons qu’il s’agit d’une application qui répertorie tous les jours des applications gratuites «sélectionnées». Comme l’application disposait d’une audience significative, elle avait la faculté d’influencer — de façon artificielle — sur le nombre de téléchargements d’une application et par conséquent sur son classement sur l’App Store. D’où son retrait.

Ce sont les événements qui ont suivi qui m’ont intéressés: une plainte publique de la part du dirigeant d’Appgratis, suivie de l’intervention de Fleur Pelerin, la ministre de l’Économie numérique.

L’affaire Coyotte

Cette affaire a éveillé en moi un parallèle avec une autre affaire: celle des avertisseurs de radars. Quand les radars automatiques ont été mis en place, le législateur a laissé la liberté de rendre publics leurs emplacements. L’idée dominante de la loi est qu’un radar a pour vocation de sécuriser une zone; ainsi, que les usagers de la route soient avertis de sa présence les incite à ralentir, et la sécurisation de la zone est assurée.

Peu après est apparu le célèbre Coyotte, un avertisseur de radars français qui embarquait une liste des radars. Je voudrais  faire une mise au point: quand on est chef d’entreprise, on rencontre des opportunités et on décide s’il est judicieux de les saisir ou non. Dans le cas de Coyotte, les dirigeants ont vu l’opportunité de créer un avertisseur de radars et savaient que le marché était juteux. D’un autre côté, ils savaient que la législation risquait de changer, mais ils ont quand même tenté leur chance, parce qu’ils espéraient profiter de la manne au moins quelques années.

Ce qui devait arriver, arriva. Sous la pression du ministère des finances des associations contre la violence routière, le gouvernement semblait enclin à interdire les avertisseurs de radars. Or, ce changement de position était prévu dès le départ par Coyotte, aussi avaient-ils déjà préparé leur défense, avec un argument simple: modifier la loi mettrait fin aux activités de Coyotte, aux emplois de ses salariés, des ses sous-traitants, et à l’activité indirecte générée.

Si un ministre avait vocation à se positionner sur des questions de société, un choix aurait été fait: soit interdire les avertisseurs de radars, pour renforcer la sécurité routière quitte à perdre quelques emplois, soit continuer à les autoriser, ne remettant pas en cause l’esprit initial de la loi et préférant la liberté individuelle. Mais un ministre a plutôt vocation à trouver un consensus mou.

Au final, il fut décidé de ne pas décider: les « avertisseurs de radars » sont devenus des « avertisseurs de zones de danger », zones qui incluraient les zones où se trouvent les radars, et une liste d’autres zones qui serait publiée, eh bien… un jour peut-être.

L’affaire Appgratis

Ce détour par l’affaire Coyotte m’amène à faire un parallèle avec Appgratis. Au départ, Appgratuites est un simple blog qui parle des nouvelles applications iPhones gratuites. L’audience devenant croissante, les éditeurs d’application sont devenus prêts à payer pour apparaître sur le blog. Voilà pour l’opportunité, que le dirigeant d’Appgratis a fort bien exploitée.

Mais, il savait forcément qu’il y avait un risque: comme cette forte audience modifie artificiellement les classements de l’App Store, Apple pouvait prendre la décision de retirer leur application pour rééquilibrer la situation.

Le jour où l’application est finalement retirée, Appgratis exécute son plan, forcément préparé depuis longtemps: faire le maximum de bruit. Soyons clairs, il est improbable qu’Apple revienne sur sa décision, et cette plainte publique ne la fera pas changer d’avis. Contrairement à un ministre, Apple se moque pas mal que quelques français perdent leur emploi, n’a pas à trouver de consensus, ni entreprendre des pourparlers. Par contre cette affaire permet de faire causer la presse et les blogs (comme le mien!) et faire découvrir Appgratis, qui va finalement proposer une autre solution technique pour présenter les  applications.

La question subsidiaire est: Que vient faire Fleur Pelerin dans cette histoire ? Eh bien, son boulot de ministre. Elle sait elle aussi qu’Apple ne va pas plier devant des menaces de porter plainte devant le commission européenne, mais elle ne veut pas être taxée d’inaction. Aussi lui faut-il défendre le gentil Appgratis de la méchante Apple. Au moins, si Appgratis venait à fermer boutique, elle aura fait ce qui était en son pouvoir.

 

 

Add git tracking to an existing Xcode project

When creating a new project on Xcode 4, you are given the opportunity to activate git versioning  for this project.

You might have not checked this option in the first place and wish to add git tracking to the project later. Here is how to do it:

1) Open a Terminal window and go to the Project’s directory (the one that contains the .xcodeproj).

2) Type

This adds git version control to the directory and creates a .git repository. The project is now under version control.

3) Some files which should not be versioned. git uses a .gitignore text file for that purpose which contains a list of files (you may use wildcard characters).

To edit .gitignore, you may create an empty file:

Then open it in your favourite text editor.

I think it should at least contain:

You may also add:

Because you do not want information specific to a user (e.g. the list of breakpoints) to be pushed to a remote git repository.

4) To track project files (in other words, add them to the “staging area”), type

5) Finally, commit these files