LiveCode iOS Paris

L’équipe de BeMyApp, décidément pleine d’idées, m’a proposé un nouveau concept, celui de réaliser une application devant un public. Le premier LiveCode iOS se tiendra donc le jeudi 26 juillet 2012 à 19h30 à Paris.

J’y écrirai un jeu pour iPhone avec les technologies Cocoa Touch classiques, et les contraintes suivantes:

  • une heure de développement au maximum
  • le jeu devra être jouable
  • le jeu devra avoir un intérêt

Venez voir si le challenge pourra être tenu ! L’interaction avec le public est essentielle. Informations et inscriptions

Correction: l’événement se tiendra le 26 juillet, et non le 23 comme je l’avais tout d’abord annoncé.

App Store: facture et TVA

Si comme moi, vous exercez un activité dans une structure qui perçoit la TVA, et qu’il vous arrive de faire des achats sur les App Store iOS ou Mac OS, vous avez sans doute constaté que les factures envoyées par Apple n’indiquent pas le montant de la TVA et que vous ne pouvez donc pas la récupérer. Il vous faut réclamer une facture indiquant la TVA à iTunes SàRL. Voici la démarche pour le Mac App Store:

  • Rendez vous sur http://www.apple.com/fr/support/itunes/contact/
  • Cliquez le bouton ”Assistance iTunes via Express Lane” * Vous verrez un affichage à trois colonnes. Sélectionnez Apps et logiciels > Apps Mac > Mac App Store, puis Achats, facturation et remboursement.
  • Dans la rubrique Description du problème, sélectionnez Facturation du compte Mac App Store. Saisissez la version de Mac OS X, le nom de l’application et son numéro de commande (que vous trouverez sur la première facture).
  • Vous devez vous connecter à votre compte iTunes.
  • Enfin, un cadre vous permet de donner des informations complémentaires. Expliquez que vous voulez une facture indiquant le montant de la TVA et donnez le numéro de TVA de votre société. Vous recevrez un double de la facture dans les 48 heures en général. Voilà une longue démarche, et on peut hésiter à la faire pour de faibles montants. iTunes doit clairement changer quelque chose, pour que nous arrêtions de perdre notre temps avec leurs factures qui devraient indiquer la TVA par défaut. Pour protester, c’est par ici que ça se passe. Mais à vrai dire, je pense que la seule manière de les faire changer de position est de réclamer systématiquement une facture pour que leurs équipes perdent leur temps.

Mise à jour le 13/07/2012: les rubriques d’Express Lane ont changé d’intitulés.

CERoundProgressView

J’ai développé une classe qui affiche une progression à l’instar de UIProgressView; la grosse différence étant que l’affichage est circulaire plutôt que linéaire. CERoundProgressView.

L’objet se veut graphiquement simple et sera habituellement utilisé en conjonction avec d’autres vues. Cependant, la progression est animée et le proxy UIAppearance est géré.

Calcul de distance et réflexion sur notre métier

Lors de l’une de mes dernières formations pour Mediabox, j’ai posé une question qui me paraissait bien anodine: “Comment calcule-t-on la distance entre deux points” ? Je fus bien étonné qu’aucun de mes élèves ne sache répondre.

Les deux points sont placés dans un repère cartésien et leurs coordonnées sont connues. J’ai commencé par dessiner deux points aux tableau. En complétant le dessin, et en faisant de ces deux points des sommets d’un triangle rectangle, cela donne:

Distance2Points

Une fois la figure tracée, une réponse me fut enfin donnée: “Il faut utiliser le théorème de Pythagore”. Exact.

Le calcul

La figure montre clairement que la distance est l’hypoténuse du triangle. D’après la réciproque du théorème de Pythagore:

distance = √(largeur^2 + hauteur^2)

Nous obtenons les largeurs et hauteurs par les coordonnées des points:

largeur = abs(p1.x – p2.x) hauteur = abs(p1.y – p2.y)

Il faut utiliser la fonction valeur absolue abs() parce que p2.x peut très bien être supérieur à p1.x. De même pour les y. Cependant, comme le carré d’un nombre réel est forcément positif, le code fera l’économie de l’appel à cette fonction abs().

Implémentation du calcul de distance

Passons donc au code en langage C:

Quelques remarques sur l’implémentation:

  • on utilise la fonction sqrtf() et non sqrt() pour le calcul de racine carrée. Les fonctions mathématiques de math.h travaillent normalement sur des doubles et non des floats. Les fonctions adaptées aux floats, comme sqrtf() sont plus rapides.
  • on n’utilise surtout pas powf(largeur, 2), pour élever la largeur au carré. Une simple multiplication est très rapide comparée à un appel de fonction, encore plus comparée à cette fonction powf().

Réflexion sur notre métier

En fait, si j’en suis à vous donner ces explications, c’est parce qu’une fois la réponse donnée à mes élèves, l’un d’eux m’a dit: “À quoi bon savoir comment calculer une distance, je vais trouver la fonction toute faite sur le net en deux minutes”. Il me semble que l’argument que je lui ai donné à ce moment était mauvais, à savoir qu’il était important d’avoir une culture générale de l’informatique.

En y réfléchissant, j’ai commencé à programmer à une époque où Internet n’existait pas. Même les rares livres d’informatique ne donnaient pas forcément ce genre d’informations. À l’époque, je n’avais d’autres choix que me creuser la tête ou poser des questions à un prof de math ou de physique, voire parler avec d’autres programmeurs amateurs. L’avantage est que j’ai des connaissances variées, et que je peux revenir aux bases si besoin. Avec suffisamment de temps, peu de choses me paraissent infaisable. L’inconvénient est que j’ai tendance à réinventer la roue: plutôt qu’adopter une bibliothèque toute faite trouvée sur le net, je vais souvent préférer la programmer moi-même; elle sera ainsi plus flexible et plus adaptée à mes besoins, mais l’écrire va me prendre du temps.

Finalement, j’ai tout de même trouvé un bon argument. Voici un cas typique: on clique à la souris, et il faut sélectionner le point le plus proche. Pour ce faire, un algorithme simple consiste à calculer la distance entre tous les points du diagramme et les coordonnées du clic. Or, utiliser la fonction ci-dessus est lent. Une bien meilleure méthode est de comparer non pas les distances, mais les carrés des distances. On élimine ainsi l’appel à la fonction sqrt(), et on gagne énormément de temps! Mon argument est que si on utilise du code sans vraiment le comprendre, alors on n’en connait pas non plus les limites, et on ne peut pas l’adapter à ses besoins.

Bogue sur la rotation

En faisant une démonstration de TeleLineo, je me suis rendu compte d’un bogue:

BogueVertical

Eh oui, j’ai oublié de gérer la rotation, ou plutôt de refuser la position verticale. L’application démarre bien en orientation horizontale, et c’est pour cela que je ne me suis pas rendu compte du problème. De fait, je viens de rejeter l’executable pour qu’il ne soit pas contrôlé par Apple. Je vais corriger rapidement le problème et re-soumettre dans la foulée.

19h34

C’est bon pour l’analyse statique et pour Instruments. Ça ne m’étonne guère puisque j’ai activé ARC ! J’ai créé rapidement une image de lancement, en effaçant les titres et les molettes. Il me reste à signer l’application et écrire une présentation pour l’App Store.

19h15

Le dialogue qui affiche les infos sur l’appli est terminé:

LineoInfo

J’ai aussi fait une icône assez moche (oui, je sais, c’est le principal critère pour télécharger une appli, mais je n’ai juste pas le temps):

AppIcon320

Pour finir, je vais lancer un petit coup d’Instruments et d’analyse statique sous Xcode. Aurai-je le temps de proposer l’appli à Apple avant 20 h ?