Category Archives: Développement

Déployer un site web avec git

Il y a peu, j’ai lancé julien-quere.fr, une simple page web pour me présenter rapidement. Devoir passer par FTP à chaque fois que je voulais redéployer la page ne me plaisait pas. Du coup, j’ai cherché une solution de déploiement git. Le besoin est très simple: quand je fais un git push en direction d’un dépôt Bitbucket, je souhaite que mon serveur web soit mis à jour par une copie de ce dépôt.

L’environnement technique est classique: côté serveur web c’est un Apache 2 avec PHP 5. Ce qui suit devrait fonctionner avec d’autres configurations, mais il faudra prévoir quelques adaptations. Il faut aussi un accès SSH sur le serveur web. Au niveau du dépôt git: il suffit qu’il soit capable de faire un appel HTTP lors du hook post-push (ce qui est le cas de n’importe quel GitHub, Bitbucket, Gitlab, …). La mécanique est assez simple:

  • Quand je pousse du contenu sur le dépôt distant, ce dernier exécute un hook,
  • Ce hook appelle un script PHP qui se trouve sur le serveur web (NB: dans le cas d’autres configurations, à base de ruby par exemple, il suffit de refaire ce script (qui est très simple),
  • Le script fait un @git pull@ qui lance le déploiement git.

Ci-après: la procédure pour mettre ce système en place (notez que ce billet est très largement inspiré du travail de David King).

Continue reading

Astuce: Copier sur le Mac, coller sur le simulateur iOS

Il y a quelques jours, j’ai découvert une astuce toute simple qui me fait maintenant gagner beaucoup de temps: comment faire un copier / coller entre OS X et le simulateur iOS.

Il suffit juste de faire ⌘:+⇧ +v

L’astuce paraît évidente (c’est même dans le menu edit). Mais après avoir fait le tour des mes confrères, beaucoup ne connaissaient pas. Maintenant, vous savez.

Par contre, il est dommage que ça ne fonctionne pas dans l’autre sens …

Signature et distribution sur iOS: la fin de la prise de tête

Certificat, identité, clef privée, provisionning” … Pour beaucoup, ces mots sont synonymes de prise de tête quand il s’agit d’envoyer son application sur un appareil iOS ou sur l’AppStore. Mais en fait, le processus est plutôt simple quand on connaît le fonctionnement de chacun des éléments et leur enchaînement.

Lors d’une session aux Cocoaheads rennais, j’ai eu l’occasion de faire une présentation sur ces problématiques. Dans la vidéo, je présente les différents composants de cette chaîne de signature. Ensuite, je montre comment signer, puis distribuer son application. Le tout est clôturé par quelques trucs & astuces et une démonstration du processus. Bref, il s’agit d’un tutorial complet sur le sujet.

Xcode: un code propre à tout instant avec Uncrustify

Dans ma présentation aux Cocoaheads “Bien coder pour iOS, j’évoquais l’importance d’avoir des règles de développement (alias Coding guidelines) et de les respecter. L’idée est de définir comment le code doit être écrit. Comme je le dis dans la présentation, l’important, ce n’est pas tellement les règles, c’est le fait d’en avoir … et de s’y tenir. Et c’est très souvent ce dernier point qui pose problème. Quand on est seul à développer sur un projet, ce n’est déjà pas facile. Alors, dans le cadre d’une équipe …

Pourquoi ne respectons nous pas les règles ?

Les causes sont multiples:

  • L’incompréhension: ce cas apparaît fréquemment sur des projets en équipe. C’est le fameux Pourquoi on m’embête avec ça ? Ça marche très bien sans règles. Une seule solution: la pédagogie.
  • Le désaccord avec les règles: des règles de développement ont été établies, mais certaines personnes ne sont pas en phases avec ces règles. C’est pour cela qu’il faut faire en sorte, dès la définition des règles, que leur légitimité ne puisse être contestée.
  • L’inattention et/ou les (mauvaises) habitudes: il peut être difficile, surtout au début, de porter constamment son attention sur la routine que l’on développe, sur la façon dont on la conçoit, mais aussi sur la man!ère de mettre en forme le code. C’est cette mise en forme qui est le plus souvent négligée. C’est compréhensible: une fois compilé on ne voit (presque) pas la différence. Là, on a de la chance: il existe des solutions logicielles à ce problème …

Uncrustify: mon nouveau meilleur ami

J’ai longtemps cherché un outil qui permettait de vérifier automatiquement la mise en forme du code source. Voire, dans le meilleur des cas, remettre en forme le code source. Le tout, compatible avec XCode 4 et l’Objective-C. Il y a un an, je me suis re-penché sur le problème, et j’ai trouvé une solution: Uncrustify.

Continue reading

Bien coder pour iOS …

Il y a un an1, je suis intervenu aux Cocoaheads rennais avec un sujet assez transverse: Bien coder pour iOS. L’idée de cette présentation était de donner une série de conseils pour pouvoir faire des projets iOS de qualité.

Je commence par quelques règles de développement, puis j’aborde la gestion des ressources limitées, de la mémoire, les crashs et ralentissement et, pour finir, la nécessité d’analyser … Je vous laisse avec le screencast de cette présentation suivi des slides:

Nib2objc: Ou comment convertir un nib en code Objectif-C

L’utilisation d’Interface Builder s’avère très pratique pour les développeurs Cocoa Touch. C’est vrais que c’est génial de pouvoir créer ses interfaces en mode WYSIWYG. Oui mais voilà, cela peut poser quelques problèmes. Outre les cas où l’utilisation du code est nécessaire (pour atteindre la granularité voulue), on peut vouloir renoncer à l’utilisation des nibs pour des raisons de performance.

En effet, dans certains cas l’utilisation des nibs pose de sérieux problèmes de performance. On se retrouve ainsi avec un dur choix: soit on choisit la simplicité (et on utilise Interface Builder), soit on écrit ses interfaces directement dans le code et on gagne en performance. Dans certains cas, l’impact de l’utilisation des nibs sur la performance est quasi nul. La question ne se pose donc pas. Mais parfois, ce n’est pas le cas.
Continue reading

Comparer deux NSDate

Il est souvent utile de comparer deux NSDate dans le temps. Il s’agit de savoir si une date est antérieure ou postérieure à une autre. Le mécanisme offert par Apple pour les comparaisons de NSDate n’est pas des plus pratiques. Il faut utiliser la méthode compare:(NSDate*)date qui retourne un objet de type NSComparisonResult.

Cette méthode est une méthode standard de Foundation. Elle permet, grâce à des résultats de comparaison standardisés d’effectuer un tri sur des objets de façon générique. Oui, mais Apple ne prévoit pas de méthodes un peu plus haut niveau pour les simples comparaisons de dates. Voilà pourquoi j’ai écrit rapidement une addition de la classe NSDate permettant de comparer deux dates intuitivement. Les voici:
Continue reading

Redimensionner une UIImage en étant Threadsafe

Il y a peu, je vous présentais ici même comment redimensionner une UIImage. Je vous replace dans le contexte: Dans certains cas, il peut être utile de redimensionner une UIImage. En effet, même si UIImageView gère très bien le redimensionnement, on peut vouloir exporter une image dans une certaine taille. De même, il n’est pas forcement utile de stocker (en mémoire ou bien en dur) une image de grande taille si c’est pour l’afficher réduite par la suite.

Le code qui était présenté est fonctionnel … Oui, mais un collègue m’a fait remarquer que ce n’était pas le cas en multi-threads. Pourquoi ? Tout simplement parce que quand on fait UIGraphicsBeginImageContext(), on travaille dans un contexte unique. Ainsi, quand on voudra redimensionner deux images en même temps, elles partageront le même contexte. Clairement, ça ne peut pas marcher. D’ailleurs: ça ne marche pas !

Continue reading

Calculer un hash MD5

Pour ceux qui ne la connaissent pas, MD5 est une méthode permettant d’obtenir une empreinte numérique unique d’un message (au sens large du terme: chaine de caractère ou fichier). Cet algorithme a longtemps été utilisé à des fins de sécurité. Au risque de me répéter: n’utilisez pas MD5 à des fins de sécurité ! Cet algorithme est maintenant faible. Plus d’informations sur Wikipedia EN.

MD5 peut être utilisé pour générer une clef “unique” à partir d’une chaine de caractères. Exemple concret: j’ai des objets représentant des rendez-vous qui naviguent un peu partout (SQLite local, serveur de calendrier distant, …). Il me faut à tout moment pouvoir identifier uniquement un rendez-vous. La solution que j’ai choisi est de générer une somme MD5 à partir du titre du rendez-vous, de la date de création et l’UDID (voir Comment récupérer l’UDID). Voici l’implémentation que j’utilise pour générer mes MD5 (dans le cas présent, c’est une addition de NSString):
Continue reading

Redimensionner une UIImage

Dans certains cas, il peut être utile de redimensionner une UIImage. En effet, même si UIImageView gère très bien le redimensionnement, on peut vouloir exporter une image dans une certaine taille. De même, il n’est pas forcement utile de stocker (en mémoire ou bien en dur) une image de grande taille si c’est pour l’afficher réduite par la suite.

Pour redimensionner une image, c’est plutôt simple ! L’idée est de créer un contexte d’image de la taille souhaitée (ici 40*40 pixels). Dans ce contexte, en dessine l’image à redimensionner dans la taille souhaitée. Il ne reste alors plus qu’à récupérer l’image redimensionnée avec un UIGraphicsGetImageFromCurrentImageContext. Pour finir, on pensera bien à fermer le contexte courant.

Voici le code final: