Categories
Non classé

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.

Categories
Non classé

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.

Categories
Non classé

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.

Categories
Non classé

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 !

Categories
Non classé

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.

ibtool --export-strings-file English/MainMenu.strings ../English.lproj/MainMenu.xib

Voici un extrait du fichier .strings produit:

/* Class = "NSMenuItem"; title = "About PortraiMatic"; ObjectID = "58"; */ "58.title" = "About PortraiMatic"; /* Class = "NSMenu"; title = "File"; ObjectID = "81"; */ "81.title" = "File";

2) le traducteur traduit le fichier .strings

/* Class = "NSMenuItem"; title = "About PortraiMatic"; ObjectID = "58"; */ "58.title" = "À propos de PortraiMatic"; /* Class = "NSMenu"; title = "File"; ObjectID = "81"; */ "81.title" = "Fichier";

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

ibtool --import-strings-file French/MainMenu.strings --write ../French.lproj/MainMenu.xib ../English.lproj/MainMenu.xib

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.

Categories
Non classé

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.