Categories
Non classé

Piratage sur le MAS

À peine le Mac App Store fut il lancé que des pirates annoncèrent triomphalement voir réussi à cracker de nombreuses applications, dont un célèbre jeu sous iOS, dorénavant disponible sur Mac. Contrairement à ce qu’on a pu lire sur trop de sites, la sécurité du MAS n’a pas été déjouée; il s’agit d’une incompétence des développeurs.

Voici ce que doit faire une application à son lancement, ”au minimum”:

  1. vérifier que le reçu (“receipt”) de l’application qui se trouve dans _MASReceipt est présent
  2. vérifier qu’il a été signé par Apple
  3. vérifier que le CFBundleIdentifier du fichier Info.plist correspond bien à l’application.
  4. Pour pouvoir comparer, il faut stocker cet identifiant dans le code de l’appli
  5. vérifier le numéro de version
  6. vérifier que le GUID (n° d’identification de l’ordinateur) correspond à celui du reçu.

D’après la procédure de piratage qu’on m’a transmise, ces applications n’effectuent vraisemblablement pas la 3e vérification. Sachant que ces consignes ont été données par Apple depuis des mois, je ne peux m’empêcher de penser que cet “oubli” est volontaire. Il s’agit probablement d’une manière de faire parler de ces logiciels, selon la maxime de Richard Branson: “parlez de moi. En bien ou en mal, mais parlez de moi”.

Categories
Non classé

Mac App Store: désinstallation simplifiée

Installer une application sous Mac OS ”Classic” (c’est à dire jusqu’à sa version 9 incluse) n’était pas très facile: il fallait lancer un installateur qui décompressait et copiait ses fichiers un peu n’importe où sur votre disque dur. En dehors du fait que chaque installateur semblait différent, ils avaient tendance à placer beaucoup de fichiers indésirables tels que des alias sur le bureau ou la barre de lancement (ceux qui pratiquent Windows connaissent bien cette situation).

Mac OS 10.0 apporta une nette amélioration: depuis, il suffit d’ouvrir une image disque qui monte sur le bureau; on y trouve une application qu’il ne reste plus qu’à glisser sur le disque dur. Les installateurs restent nécessaires pour les applications qui modifient le système d’exploitation et n’ont donc pas totalement disparu, mais au moins l’installateur est toujours celui d’Apple. Quoi que vous en pensiez, ce système est encore très perfectible.

Installation

Sachez que beaucoup d’utilisateurs ne savent pas installer une application. Il est nécessaire de mettre une image en fond de l’image disque qui dise “Pour installer l’application glissez-là dans le dossier Application ou tout autre dossier”. Quand une application est traduite dans plus de trois langues cette solution n’est plus envisageable, il faut alors dessiner une flèche ou un symbole similaire.

ImageDisqueFirefox

Même avec ces indications, je me rends compte (au téléphone, avec les clients au bout du fil), que certains utilisateurs lancent PortraiMatic depuis l’image disque. Aussi certaines applications détectent cette situation et affichent un message. Pour finir, notez que l’utilisateur a accès à au moins deux dossier Applications: celui qui est commun à tout le monde (Disque dur/Applications) et le sien (~/Applications). Or, il faut un mot de passe administrateur pour écrire dans le premier…

Désinstallation

Jeter une application à la corbeille ne la désinstalle pas totalement. Sur les forums, on peut voir beaucoup de messages d’utilisateurs qui ne comprennent pas pourquoi leur problème n’est pas réglé alors qu’ils ont désintallé puis réinstallé l’application. En effet, certains fichiers restent présents sur la machine, notamment les fichiers de Préférences et le dossier Bibliothèque/Application Support.

Sous iOS

Sous iOS, l’utilisateur n’a pas accès au système de fichiers. Ceci rend complexe l’échange de fichiers entre les applications et avec d’autres machines, mais procure des avantages énormes: il n’y a plus besoin de ranger ses fichiers, et désinstaller une application retire tous les fichiers qui lui sont rattachés, documents inclus.

Concrètement, sous le capot, iOS utilise un système de fichiers classique (sans doute HFS+ ou UFS). Les applications n’ont le droit que d’écrire dans leur ”bac à sable”, un répertoire qui leur est réservé, et dans les fichiers de préférences. Quand on désinstalle une application, le système d’exploitation n’a donc plus qu’à supprimer le répertoire associé.

Mac App Store

La volonté d’Apple avec le Mac App Store est de reproduire sous Mac OS ce fonctionnement. Ainsi, les emplacements dans lesquels peut écrire l’application sont délimités. Toute application qui écrit ailleurs (sans intervention explicite de l’utilisateur) sera donc rejetée par les validateurs d’Apple. Certes, cela limite le Mac App Store à certains types d’applications plutôt grand public, mais admettez que cette solution est convaincante par sa simplicité.

Categories
Non classé

Trop de courrier

Il y a quelques mois, j’ai acheté une imprimante multi-fonction Canon chez Staples/JPG. J’ai effectué cet achat chez eux parce qu’il s’agissait de l’un des rares commerçants à vendre ce modèle et que leur offre d’extension de garantie était bien adaptée. À vrai dire, je ne fus que moyennement satisfait par la transaction, puisque j’ai attendu la machine près de deux mois; toutefois le suivi fut nickel.

Depuis, Staples m’envoie un courrier quasiment toutes les semaines! Qu’il s’agisse d’un catalogue, d’une participation à un concours, d’une lettre d’information, il finira à la poubelle sans avoir été lu. Je m’interroge fortement sur l’opportunité de tels envois. D’abord par le coût: rien que l’affranchissement doit coûter 25 € par an (50 envois à 0,50 €), auxquels s’ajoutent les frais d’impression. Sachant que la majorité des sociétés n’emploie aucun salarié, le budget moyen en fournitures de bureau ne peut tout de même pas s’établir à des milliers d’euros, si ? Ensuite, ces envois opiniâtres s’apparentent à du harcèlement. Ceci me fera franchement hésiter à commander de nouveau chez Staples, de peur que mon ”abonnement” soit reconduit une année de plus.

Categories
Non classé

Les applications Mac sont elles trop chères ?

À l’annonce du Mac App Store, j’ai pu lire ici et là qu’il s’agissait d’une bonne nouvelle, “les logiciels Mac étant trop chers” (sic). Voici l’avis partial d’un développeur Mac sur la question.

Le prix des applis va-t-il baisser ?

Sachez qu’à ce sujet, les discussions entre développeurs vont bon train sur le forum d’Apple. Un consensus semble pourtant se dégager: que l’application soit vendue au même prix sur l’App Store que sur le site de l’éditeur. C’est à dire que l’éditeur rogne déjà sur sa marge, à cause de la ponction de 30% des gains par Apple. L’App Store iOS est passé par là, et a démontré que l’intuition naïve de vendre à prix plancher en espérant se rattraper sur le volume n’avait fait le succès que de peu d’élus. Pourtant, certains croient encore vendre leurs applis ”sans marketing” du fait de leur seule présence sur l’App Store. L’expérience App Store iOS a totalement démonté cette théorie: il est inconcevable de vouloir vendre une appli iOS aujourd’hui sans avoir un bon plan marketing derrière, avec un site web dédié et de l’affiliation à tout va. Ceci dit, le prix moyen d’une application Mac va baisser: nul doute que nous allons assister à la naissance de nombreux ”crapwares” — ces logiciels aussi mal conçus qu’inutiles, qui pullulent au sein de l’App Store iOS. Même si Apple a durcit ses règles de validation sur cette plateforme.

Le prix d’une appli d’après ses coûts de développement

Fixer le prix d’une application est difficile; d’ailleurs, il existe même des livres qui y sont consacrés. La première approche est de se dire que le coût de développement doit être couvert par les ventes. Ainsi, si vous mettez quatre mois à développer un logiciel, que vous vous payez 2000 € par mois (ce qui coûte réellement autour de 4000 € à la société), et que vous vous attendez à 1000 ventes, le juste prix serait de 4000 € x 4 mois / 1000 ventes = 16 € HT. Evidemment, ce n’est pas aussi simple. Déjà parce que tous les développeurs n’ont pas la même productivité, et surtout parce qu’évaluer le volume de ventes est impossible avant de lancer le produit. Si quelqu’un connaît une méthode d’évaluation valide, qu’il m’en fasse profiter, j’écrirai un bouquin et deviendrai riche.

Ensuite, parce que les logiciels ne se vendent pas tout seuls: j’ai fait moi-même l’erreur de le croire au départ. Votre logiciel aura beau être génial, il faut faire du marketing, sinon il passera inaperçu. Je consacre aujourd’hui un tiers de mon temps à cette activité. Si vous suivez toujours le raisonnement sur le prix de vente, il faudrait donc vendre le logiciel un tiers plus cher, soit 21 € HT.

Le bon prix

Le calcul du paragraphe précédent n’a aucun sens parce qu’il fait abstraction de la première règle du marketing:

Le bon prix est celui que le client est prêt à payer.

En y réfléchissant, cette règle est très logique: le client se fiche du temps passé à programmer l’appli. Il a un besoin (rationnel ou non) à satisfaire. Si le prix ne lui paraît pas déraisonnable, il achètera. De fait, la réflexion doit porter sur la découverte de ce prix raisonnable, pour lequel nombre de paramètres entrent en jeu: les prix de la concurrence, la qualité perçue, les moyens du public visé, etc.

Prenons le problème par l’autre sens: la culture du store iOS est de vendre à prix plancher: à quatre euros, une application paraît déjà chère! De fait, une stratégie adoptée avec succès par certains est de consacrer le minimum de temps au développement et de miser sur le marketing.

En conclusion, on en revient au problème du coût de développement: le prix actuel des logiciels Mac permet la réalisation de logiciels ambitieux en termes de qualité et de fonctionnalité. En ce sens, la baisse des prix ne serait pas forcément une bonne nouvelle pour les utilisateurs.

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.