Mac App Store

Si vous lisez ce blog, vous savez sans doute qu’Apple a annoncé mardi la disponibilité prochaine d’un Mac App Store, qui permettra d’acheter, de télécharger et d’installer automatiquement les logiciels sur son Mac. J’ai l’intention de rendre PortraiMatic disponible par ce canal (qui — ne nous méprenons pas — va vite devenir incontournable), mais qui n’est pas sans poser de questions.

Ma première question est la part qu’Apple prélèvera sur les transactions. La boutique équivalente pour iOS prélève 30% de commission: c’est élevé, comparé à mon système de paiement actuel, basé sur Kagi, qui prélève environ 15% (et qui est déjà cher). Je serais obligé d’augmenter le prix du logiciel, ma marge étant déjà peu élevée.

Ma seconde question est si le magasin, à l’instar de son homologue sous iOS, permettra les achats ”in-app” (à l’intérieur de l’application). Ceci pourrait ouvrir de nouvelles perspectives commerciales.

Ma dernière question, qui n’en est pas une, est qu’il faudrait que je maintienne deux versions:

  • la version pour l’App Store
  • la version actuelle avec son écran d’accueil pour prévenir que le logiciel n’est pas enregistré, et son débridage par code.

ou alors, si je pouvais faire toutes mes ventes par l’App Store:

  • la version pour l’App Store
  • une version de démonstration

Cette deuxième solution offre l’avantage de la simplicité, mais pose un autre problème: PortraiMatic est compatible avec Mac OS 10.5. Devrais-je abandonner cette compatibilité ? Nous devrions y voir plus clair lors du lancement de la boutique en décembre.

Résultats de BeMyApp octobre 2010

BabySit

J’ai participé ce week-end au deuxième BeMyApp, dont le principe est — rappelons-le — de développer une application mobile en un week-end. Une trentaine de projets furent présentés, et six retenus. Voici les résultats:

Le podium

Première place: Study+

Application à destination des étudiants pour relever ses notes et organiser son emploi du temps.

Deuxième place: HotStop

Le jeu du cache-cache adapté à l’iPhone: il faut trouver une personne ou un objet (géolocalisé), l’iPhone indiquant si vous êtes ”chaud” ou ”froid”.

Troisième place: BabySit by Yooppies

Boîte à outils pour les parents: trouver une baby-sitter à proximité, faire des achats groupés, avoir des réductions sur des sorties avec les enfants.

Les projets qui n’ont pas été récompensés

Aidez-moi

Une assistance aux personnes dépendantes: permet de suivre leurs déplacements et prévenir les proches si elles s’éloignent trop du domicile ou si elles sont tombées.

Better accent

Améliorer son accent dans les langues étrangère en s’enregistrant et en comparant avec une phrase de référence.

Mais T où ?

Une application “pour nous les filles”: permet de marquer l’emplacement de points d’intérêts (où on se trouve, une petite robe sympa, où on a garé la voiture, etc.) et de l’envoyer à ses amies par SMS ou e-mail.

Pour ma part, j’ai participé au projet BabySit. Je suis un peu déçu qu’Aidez-moi n’ait pas décroché une meilleure place: l’équipe a vraiment travaillé très dur pour pondre une appli iPhone et un web-service. Le projet n’a pas de business-modèle, le but étant de céder gratuitement l’application, ce qui explique sans doute le classement (il s’agissait d’un des critères d’évaluation).

Bravo à toutes les équipes qui ont toutes réussi à produire une application fonctionnelle en deux jours.

Présentation sur les bitmaps

EffetsBitmap

Comme je l’indiquais sur ce blog, j’ai fait, le jeudi 14 octobre, une présentation sur l’utilisation des Bitmaps avec Core Graphics.

Les graphismes bitmaps sont omni-présents: l’écran lui-même est une bitmap, les formats d’images les plus courants sont bitmaps (jpeg, png, gif, tiff…) et toutes les images issues des appareils photo numériques et des scanners, ainsi que les images de synthèse sont des bitmaps. Cette présentation est découpée en trois parties:

  • la première explique l’organisation en mémoire d’une bitmap, ce qui va permettre de connaître l’adresse d’un pixel de la bitmap d’après ses coordonnées.
  • la seconde expose la création, avec Core Graphics, d’une bitmap vierge, et comment écrire dans la bitmap pour générer des images.
  • la troisième montre comment appliquer des effets sur une bitmap qu’on a chargé: désaturation de l’image, bruit monochromatique, et matrices de convolution (effets de flou, accentuation, détection de contours, bas-relief…)

Tous le contenu de cette présentation s’applique aussi bien à Mac OS qu’à iOS; en particulier, elle n’expose pas l’utilisation de Core Image. Vous trouverez les diapos de la présentation, ainsi que les programmes d’exemple qui l’accompagnent sur cette page. Faites tourner.

Cocoa Heads Paris — Session d’octobre

La prochaine séance de Cocoa Heads Paris se tiendra ce jeudi (14 octobre) à 19h00. Comme d’habitude désormais, les locaux sont ceux de l’IESA multimédia, 5 rue des Augustins, Paris IIème.

Guillaume Cerquant commencera la séance par une présentation sur la distribution automatique d’applications. J’interviendrai ensuite pour une longue présentation sur l’utilisation des graphismes bitmaps: génération et effets. Certains vont peut-être se lasser de m’entendre presque à chaque fois (mais la dernière fois, ce sont les gens de BeMyApp qui ont insisté). Promis, cette fois-ci ce sera assez technique, et sur un sujet que je maîtrise totalement. À jeudi !

Traduction d’une appli Cocoa

Lorsque l’on propose son application dans plusieurs langues, comme c’est mon cas pour PortraiMatic, la traduction (terme que je préfère au vilain anglicisme “localisation”) est plus complexe que ce qu’Apple laisse entendre. En gros, trois aspects doivent être gérés:

  • Ne pas utiliser de chaînes de caractères ”en dur”.
  • Il faut les écrire dans un fichier .strings et les charger avec une fonction ou méthode adéquate (NSLocalizedString() ou -NSBundle localizedStringForKey:value:table).
  • Adapter la saisie et la présentation des nombres, monnaies et dates (NSNumberFormatters et compagnie)
  • Traduire les fenêtres, vues et boites de dialogue, habituellement contenus dans des .xib.

Comme nous allons le voir, ce dernier aspect est délicat.

Solution 1: Traduire les XIB à la mano

Apple propose un concept simple: le bundle de l’application contient un dossier par langue (french.lproj, english.lproj, deutsch.lproj, etc.) qui contient les éléments d’interface utilisateur spécifiques à cette langue. Pour traduire un XIB anglais en français, il suffit donc de copier le .xib de english.lproj dans french.lproj et de le traduire. Cette manière fonctionne bien… la première fois.

Imaginons que vous vouliez ajouter une case à cocher dans votre logiciel:

  • vous ajoutez la case dans le xib anglais
  • vous créez ses connexions (outlets, actions et bindings)
  • et vous refaites le même boulot pour le xib français !

En dehors des risques d’erreur sur les connexions, qui ne peuvent être détectées qu’à l’exécution, c’est un travail rébarbatif, à tel point qu’il vaut mieux repartir des xib anglais et tout retraduire. C’est ce que je faisais jusqu’à récemment.

Un autre problème est que si vous voulez faire traduire le logiciel, vous ne pouvez pas demander au traducteur d’utiliser Interface Builder pour modifier le xib lui-même. Non seulement, c’est compliqué, mais il risque de casser quelque chose. Vous devez lui fournir un simple fichier texte, ce qui nous amène à la…

Solution 2: Extraire les chaînes

C’est la solution que j’utilise actuellement pour PortraiMatic. Je me suis inspiré de la technique exposée par Philippe Casgrain:

1) un outil en ligne de commande, ibtool, extrait les chaînes de caractères du xib anglais et les écrit dans un fichier .strings.

Voici un extrait du fichier .strings produit:

2) le traducteur traduit le fichier .strings

3) ibtool recompose le xib français en remplaçant les chaînes traduites:

Philippe Casgrain propose d’extraire les chaînes à chaque build (en ajoutant une ”Script Build Phase” à la ”Target” sous XCode). C’est une bonne idée car votre logiciel de gestion de version va vous alerter d’une modification des fichiers .strings, qu’il faudra renvoyer au traducteur.

Par contre, il suggère aussi de recomposer les XIB traduits à chaque build: je ne le fais pas, car le build s’en trouve allongé, alors que ça n’agit que quand le fichier .strings vient d’être traduit.

Cette technique a l’avantage d’être simple à mettre en œuvre, mais pose encore deux problèmes:

  • les objets de l’IHM ne sont pas redimensionnés; or on sait que l’Anglais est souvent plus concis que le Français ou l’Allemand. Il faut donc prévoir de la marge dans les dimensions lors de l’élaboration des XIB anglais. Ce n’est pas toujours esthétique: il reste deux ou trois boutons que je redimensionne à chaque livraison.
  • les XIB sont volumineux, et l’application prend de l’embonpoint à chaque langue ajoutée. C’est particulièrement pénalisant pour une appli iPhone.

Solution 3: Traduire au chargement du NIB

Cette solution a été exposée par Axel Péju, l’auteur de Squirrel (et accessoirement gagnant d’un Apple Design Awards pour la version Mac), lors de sa présentation au dernier Cocoa Heads parisien. L’idée est simple: il suffit de mettre toutes les chaînes de caractères qui apparaissent à l’écran dans des fichiers .strings. Quand on charge un NIB, on remplace alors le texte de chaque objet par le code.Pour redimensionner les objets, on appelle leur méthode -sizeToFit pour que leur taille s’adapte au texte affiché.

Cette technique résout tous les problèmes exposés précedemment: il n’y a plus qu’un seul XIB, et les chaînes peuvent être fournies directement aux traducteurs. Elle possède aussi un avantage: le traducteur peut essayer lui-même l’application traduite: il n’a qu’à glisser les fichiers .strings traduits dans le dossier .lproj qui correspond à sa langue.

Ceci dit, le travail est important, puisqu’un objet contrôleur doit posséder des outlets vers tous les objets qui affichent du texte, même si ce sont de simple libellés, et faire les appels correspondant.

Solution 4: Traduire (automatiquement) au chargement du NIB

Voici une solution à laquelle j’avais pensé; Guillaume Cerquant m’a dit qu’il l’utilisait. L’idée est que chaque élément d’IHM du XIB à traduire a son titre qui commence par un astérisque (par exemple). Lors du chargement du XIB, on parcourt la hiérarchie des vues en entier: si le titre de la vue commence par “*”, on va chercher le titre dans un fichier .strings et on remplace le titre. Il me semble que cette technique est un bon compromis: à la fois assez légère à mettre en œuvre, tout en conservant les qualités de la solution 3.

Kagi: Bienvenue au XXè siècle

  • Il faut attendre un mois pour être payé.
  • Ils envoient un chèque en dollars. Par défaut, l’ordre du chèque est le gérant, pas la société.
  • Le compte est en dollars: il faut refaire les calculs de TVA !
  • L’interface du site date du siècle dernier: peu d’options mais laborieux.
  • Pas de liste des dernier paiements, il faut faire une recherche. Il faut rechercher le nom exact.
  • La boutique en ligne est moche, et dans un français approximatif.

Box e-commerce La Poste

Je me suis rendu la semaine dernière au salon du e-commerce à Paris, Porte de Versailles. J’étais accompagné d’un ami qui veut monter un site de vente de luminaires. Voilà des mois qu’il recherche une plateforme de vente correcte et dans ses moyens. Jusqu’alors, on lui a proposé soit d’installer la boutique en ligne pour 4000 €, ou des forfaits à 200 € par mois. La seconde offre inclut l’hébergement, mais on comprend vite qu’on va être pieds et poings liés.

Pendant le salon, nous avons peu assister à la présentation de l’offre de la Poste, de la Box e-commerce. Je dois dire que mon impression est très positive:

  • les options de personnalisation du site sont nombreuses
    Une vingtaine de thèmes sont proposés, mais il est aussi possible de personnaliser la disposition, les couleurs et les images des pages. La Poste peut aussi vous mettre en relation avec un sous-traitant qui créera votre charte graphique.
  • l’ergonomie est très correcte
  • Rien n’est parfait, mais il n’y a pas trop de bizarreries, et l’organisation est claire.
  • l’assistance téléphonique est gratuite
  • Il me semble que c’est un gros point fort.
  • le prix est imbattable: 39,90 € / mois

On peut se demander que vient faire la Poste dans le secteur de l’e-commerce; en fait c’est très malin de leur part. Tout est fait dans leur offre pour que vous privilégiez leurs services ! Par exemple, l’intégration avec Colissimo est très poussée. Quand on sait que le volume du courrier a tendance à baisser, mais que jamais autant de colis n’ont été livrés, c’est le moment pour la Poste de s’installer sur le marché avant que les concurrents étrangers viennent prendre leur part du gâteau.

Vous pouvez vous faire votre propre opinion en essayant la plateforme de vente gratuitement pendant un mois. Je crois que mon ami a enfin trouvé l’offre qu’il recherchait.

iOS et les comptes utilisateurs

Un élément de iOS qui semble faire bondir nombre de développeurs est l’absence de comptes utilisateurs. Évidemment, iOS est un Unix BSD comme l’est Mac OS X, les comptes au sens Unix y existent donc bien, simplement l’utilisateur n’y a pas accès: il n’existe qu’un seul compte, lancé au démarrage. Tout le propos de mes homologues est que si un téléphone mobile est un objet personnel, il n’en n’est pas de même pour l’iPad, qui peut être partagé par toute la famille (cette affirmation est déjà à prouver). Chaque utilisateur devrait donc disposer de son propre espace personnel, privé et ajusté à son goût. Ils pensent donc qu’à terme les comptes utilisateurs seront intégrés à iOS. Je n’y crois pas un instant.

Je comprends tout à fait l’intérêt des comptes utilisateurs; sur mon Mac se trouvent trois comptes. Je travaille au quotidien sur un compte non-administrateur, pour deux raisons:

  • pour des questions de sécurité
  • parce que les utilisateurs de mes logiciels ne sont pas forcément administrateurs de leur machine. Je dois m’assurer du bon fonctionnement de mes logiciels dans cette circonstance.
  • Par ailleurs, ma compagne dispose de son propre compte, ce qui m’évite qu’elle m’impose son fond d’écran avec des poneys !

Si je n’y crois pas, c’est parce que je constate que le grand public n’à que faire de plusieurs comptes. Cette affirmation est étayée par mon expérience personnelle, en rendant visite à mes amis non-spécialistes de l’informatique, dont la machine se ”logge” automatiquement sur le compte par défaut. Une autre preuve est que j’ai inclus dans PortraiMatic la possibilité de déplacer la galerie des portraits. Mon intention était de permettre le partage de la galerie entre plusieurs comptes utilisateurs. Or, je n’ai jamais reçu de plaintes de clients à son propos. Vous pouvez penser que l’utilisation de cette fonction est limpide et qu’elle marche impeccablement… Je reste persuadé qu’elle n’est quasiment pas utilisée, les utilisateurs n’ayant qu’un seul compte.

Mais si je ne crois vraiment pas que les comptes utilisateurs arriveront sous iOS, c’est à cause de la philosophie d’Apple: ils ont déjà décidé que les utilisateurs n’avaient pas accès au système de fichier pour des questions de simplicité. Avoir plusieurs comptes utilisateurs crée des problèmes au quotidien. Par exemple, chez moi, les bibliothèques iPhoto et iTunes sont placées dans le compte Partagé pour que ma compagne puisse y accéder. Il faut donc régler les autorisations Unix. C’est déjà rébarbatif pour un programmeur qui sait jouer du ”chmod”, mais pour un utilisateur moyen, c’est un obstacle. Malgré tous les avantages des comptes utilisateurs, ils créent des difficultés dans l’utilisation.

Ne projetons pas nos désirs d’informaticiens sur l’utilisateur moyen: il ne veut pas savoir comment marche la machine. Même s’il devra changer régulièrement la photo de fond d’écran.

XCode 3.2.4 et documentation Mac

J’ai mis à jour XCode hier et la documentation pour le Mac (Mac Doc Set), n’apparaissait plus dans la liste des docs disponibles. Seule était présente celle du SDK iPhone 4.1. En fait, il faut aller voir dans la rubrique Documentation des Préférences, où on peut demander le rapatriement de la doc. Pour suivre l’avancement du téléchargement, affichez la fenêtre Activity du menu Window.

Désaturation

L’interface utilisateur du nouvel iTunes 10 fait beaucoup parler d’elle. Parmi les points les plus discutables, est le passage de toutes les icônes au noir et blanc: que ce soit dans la colonne de gauche ou même dans les Préférences. Ce n’est pas seulement d’un goût douteux: c’est une erreur de design. Voici mes arguments.

La couleur est un élément de design. On utilise la couleur pour faire ressortir un bouton par rapport au fond d’une page. Un autre exemple commun est le vert pour indiquer la confirmation et le rouge pour indiquer une suppression; c’est même devenu une convention, qu’il faut suivre !

Le daltonisme est une anomalie relativement répandue, aux alentours de 7% des hommes et 0,4% des femmes (je suis moi-même légèrement daltonien). De fait, un design ne peut pas reposer uniquement sur la couleur. Un exemple qui me vient à l’esprit est celui d’un logiciel de téléchargement que j’utilisais autrefois. Les fichiers en cours de téléchargement étaient listés dans un tableau. Lorsqu’un téléchargement était terminé, la ligne contenant le nom du fichier passait du gris au vert. L’erreur de design commise n’était pas tant d’utiliser la couleur, mais que la couleur fusse la ”seule” distinction. La correction de cette erreur reste simple, il suffit d’ajouter une icône ou un texte. À vrai dire, il existe plusieurs formes de daltonisme et plusieurs degrés, si bien que de nombreux daltoniens peuvent tout de même percevoir une différence.

Par ailleurs, 97% des utilisateurs voient correctement les couleurs: elles leurs apportent de l’information. La couleur permet ainsi de distinguer plus facilement les éléments.

Pour revenir à iTunes, j’étais habitué à ce que l’icône de la liste des musique soit bleue, que celles des listes de lecture soient vertes et que celle des podcasts soit violette. Ces couleurs me permettaient de localiser plus rapidement la rubrique. Le passage au noir et blanc rend la localisation plus lente. C’est en cela qu’il s’agit d’une erreur de design.