Aller au contenu, au menu, à la recherche

mercredi 5 mars 2014

Dix photos de Palestine

Noël dernier, j’étais à Bethlehem. Chaque année, il y a ce camp-chantier organisé par une association palestinienne, avec une vingtaine de volontaires internationaux : pendant dix jours, on creuse le matin, on déplace des pierres, on plante des arbres — et l’après-midi on va se promener, on visite les alentour, des palestiniens viennent nous parler de leur vie, ou de l’histoire du pays.

J'ai enfin mis en forme une dizaine de photos de mon passage là bas, avec quelques notes — si ça vous intéresse, ça se trouve ici :

Dix photos de Palestine — un aperçu des territoires occupés

Bonne lecture !

samedi 19 octobre 2013

Que choisir pour de l'UI : XIBs / Storyboards / Code

Écrire ses interfaces graphiques en code, ou utiliser des XIBs ou des Storyboards : chaque méthode a ses forces et ses faiblesses. Que choisir pour quel cas d'usage ?

Ce diaporama a servi de support à un débat collectif lors de la réunion CocoaHeads Paris d'octobre 2013.

vendredi 26 avril 2013

Fail better — Presenting errors in Cocoa

Here are the slides of the talk I gave at CocoaHeads Paris in April.

It's OK for software to fail — but it should display helpful errors. And the "helpful" part is not optional. "-presentError:" is a nice API to build powerful mechanisms for presenting helpful errors in Cocoa applications.

The "Demo" part is available on GitHub. A good implementation of -presentError: on iOS can also be found there: github.com/hectr/ErrorKit

jeudi 21 mars 2013

Sexisme chez les geeks : Pourquoi notre communauté est malade, et comment y remédier

Cet article a l’ambition impossible de proposer un panorama assez complet des différentes formes de sexisme sévissant dans les communautés geeks; le sujet étant extrêmement vaste et protéiforme, l’article est massif en conséquence. Il comprend beaucoup d’exemples tirés du milieu gamer (…), cependant il est essentiel de comprendre que les mécanismes à l’œuvre sont les mêmes dans les communautés voisines – comics, hacking, programmation, JdR, Logiciel Libre… – communément regroupées sous l’appellation « geek ». Installez-vous confortablement, on en a pour un moment.

Effectivement, il y en a pour un moment : un bien bel article, en longueur, très illustré, truffé d'exemples, pertinent. Bonne lecture.

Sexisme chez les geeks : Pourquoi notre communauté est malade, et comment y remédier, par @Mar_Lard

jeudi 5 avril 2012

Application ePresse 2.0

Logo ePresse v2La version 2 de l'application ePresse est sortie ce matin. Ce kiosque de la presse française propose onze titres (quotidiens nationaux et magazines), et de nombreux autres sont à venir.

Je suis assez fier des moyens techniques mis en œuvre sur cette application ; j'espère que vous apprécierez la navigation dans le catalogue et la bibliothèque, ainsi que la lecture haute-résolution sur un écran Retina.

À titre d'offre de bienvenue, l'application vous offre tous les titres pendant une semaine.

Télécharger gratuitement ePresse sur l'AppStore

jeudi 19 janvier 2012

Linotype: Le film

Après un bref aperçu créé l'année dernière (que j'avais partagé sur le défunt Google Reader), voici la bande-annonce complète du film "Linotype", dédié aux machines d'imprimeries du même nom.

La mécanique est fascinante.

mercredi 18 janvier 2012

Vérifier les liens dans un mail

Comme j'en avais assez d'envoyer des mails contenant des liens morts, j'ai écrit un petit utilitaire pour résoudre ce problème.

Il installe un élément "Vérifier les liens" dans le menu "Services" de Mac OS X.

Lorsqu'un texte est sélectionné dans Mail (ou dans n'importe quelle application Cocoa), l'élément "Vérifier les liens" va extraire les liens contenus dans le texte, vérifier qu'ils sont accessibles, et afficher le résultat du test.

Pour l'instant, ça ne fonctionne qu'avec les liens qui sont seuls sur une ligne de texte. Mais c'est déjà ça. Si ça peut vous être utile…

Télécharger "Vérifier les liens.workflow"

mardi 3 janvier 2012

L'éducation populaire ou l'obligation de subversion

Transmis via Solidarités-Jeunesses, un message qui me tient à cœur :

Par quelque biais qu'on pose la question, la conclusion s'impose: l'éducation populaire ne peut échapper à sa vocation profonde: la subversion. le mot peut faire peur.

On le voit la loi Sapin annonce l'arrivée du privé dans le loisir et la culture: si un maire est obligé (ou a le droit) de soumettre l'attribution d'un équipement d'éducation populaire à un appel d'offre, ou un marché concernant le loisir, ou les vacances, ou le théâtre... comme pour n'importe quel marché public, on ne voit pas ce qui empêcher le privé de se mettre sur les rangs et de dire: je fais mieux et moins cher! La seule réponse à ce défi est dans ce qui fait depuis toujours la légitimité de l'éducation populaire et de l'associatif: la faculté à subvertir. Cela, le secteur marchand ne le fera jamais. (...)

Mais qu'entendons par "subversion"? Seraient-ce les restes du Grand Soir? Non, bien sûr. Cela peut aussi s'appeler citoyenneté, ou politisation ou tout simplement...idéal. Après des décennies où le terrain de la politisation fut occupé par des groupes extrémistes, il peut être utile de rappeler qu'on peut être politisé sans vouloir pendre tous les bourgeois.

L'auteur rappelle alors la déclaration de Villeurbane, rédigée en 1968 par les patrons du théâtre public d'alors avec cette définition de la "subversion" :

"Tout effort d'ordre culturel ne pourra plus que nous apparaître vain aussi longtemps qu'il ne se proposera pas expressément d'être une entreprise de politisation: c'est-à-dire d'inventer sans relâche, à l'intention du non-public, des occasions de se politiser, de se choisir librement, par delà le sentiment d'impuissance et d'absurdité que ne cesse de susciter en lui un système social où les hommes ne sont pratiquement jamais en mesure d'inventer leur propre humanité." (...)

Tant il est vrai qu'à la fin, la seule question est bien d'humaniser la société.

Jacques Bertin, in Politis, Le retour de l'utopie, hors série, février-mars 2000

vendredi 2 décembre 2011

iOS developer: What to do if In-App Purchases stop working?

What to do if In-App Purchases stop working? This post is the first of a series dedicated to iOS development. They address to a rather technical audience, and present aspect or issues encountered when developing applications on Apple's devices.

The first post deals with a frequent issue when implementing Apple's In-App Purchases (IAP). It happens frequently that IAP transactions suddenly stop working, without any visible reason. There can be two steps of failure:

  • Prices stop being retrieved from iTunes Connect.
  • Prices are retrieved, but purchase transactions fail with a generic "Cannot connect to the iTunes Store" error.

Here's how to deal with it.

We won't bother with obvious issues here (like prices not declared on iTunes Connect, wrong product identifiers, invalid test users): the interesting case is the one were everything used to work perfectly, but suddenly errors pop out from nowhere.

Prices not retrieved

The first problem manifests when prices are not retrieved anymore from iTunes Connect. The SKProductsRequest fails with a generic error, although you're sure your product identifiers and App ID are correct.

It seems that iTunes Connect services are very picky about the clean state of a request. A lot of authentication checks are performed, to be sure that the request is legit. If not, the request fails with a non-descriptive generic error.

So you need to convince iTunes Connect that your app is legit. How to do?

A good idea is to ensure that only a single development Provisioning Profile exists for the application. If your device contains several different Provisioning Profiles that match your application, chances are that iTunes Connect will reject your requests.

To ensure this, the easiest steps are to:

  • Remove all Provisioning Profiles from your test device.
  • Delete your application from the device.

Removing the Provisioning Profiles is done in Settings / General / Profiles (see the screenshot below).

Removing the Provisioning Profiles is done in Settings / General / Profiles

But why deleting the application? Because it contains an embedded Provisioning Profile, that can interfer with the profiles on the device. Plus the StoreKit seems to store some state in the application bundle (like the last logged AppleID for this app), and we want to clear these informations to get a fresh state.

This should do the trick, and your prices requests should work again. If they doesn't, try any step you can think to make your app look legit: deconnect your device from the test account (Settings / Store), reboot the device, reset the settings… And don't forget first to ensure you don't miss something obvious (like no network, invalid product identifiers or mismatched App ID).

Transaction request fail

Now here is the case when your prices request works, but when you want to test the actual purchase of an item, the SKPaymentTransaction fails with a rather generic "Cannot connect to the iTunes Store" error. It used to work before, so what happened?

The first cause of troubles can be the iTunes Store Sandbox misbehaving. The Sandbox is not the iTunes Connect component with the best uptime: it frequently happens that some requests are dropped, or that the Sandbox fails to validate any request at all.

How can you be sure? Go have a look in the relevant section of the Apple Developers Forums (you need to be a registered Apple Developer for this). Usually, if the Sandbox is down, a lot of developers will be reporting the issue in a thread.

If the Sandbox seems up, it may be that your test user has expired. Apple recently started to invalidate test users after a specific number of transactions. In the best case, you get a message informing you that the user expired — in the worst case, just a generic error.

You may try to re-activate the test user, but it doesn't always work. The shorter path is to create a new batch of test users, and use them one after another: we one expires, just switch to the next.

Generally speaking, testing with a freshly created test user is one of the best things you can do: it often works, and saves a lot of frustration when transactions refuse to work.

tldr;

If prices requests fail, try to:

  • Delete your application from the device.
  • Remove all Provisioning Profiles.

If transaction requests fail:

  • Check the iTunes Connect Sandbox status on Apple Developer Forums.
  • Create a new test user on iTunes Connect.

jeudi 30 juin 2011

Sortie de l'application ePresse pour iPhone et iPad

Logo de l'application ePresse

L'application ePresse est sortie ce matin !

Il s'agit d'un kiosque numérique, qui rassemble neuf titres de presse française dans une seule application iPhone et iPad. On y trouve pour l'instant les éditions quotidiennes de Libération, du Figaro, du Parisien et Aujourd'hui en France, de L'Équipe et des Échos, mais aussi les éditions hebdomadaires du Nouvel Observateur, du Point et de L'Express. Une présentation plus complète est disponible sur iGeneration.

Cette sortie marque pour moi la fin de plusieurs mois de développement et de peaufinage, pour pouvoir au final présenter quelque chose de qualité. Il y a des raccourcis et des imprécisions, bien sûr : c'est une 1.0. Mais n'hésitez pas à me dire ce que vous en pensez !

ePresse - ePresse

mardi 10 mai 2011

Larry Page on ads for Google

Larry Page, after approving the first ad campaign for Google in ten years:

It’s obviously very contrary to what we normally do, and I think part of the reason we wanted to do it is for that reason. It sort of violates every known principle that we have, and every once in a while, you should test that you really have the right principles. You don’t want to end up too rigid.

jeudi 23 décembre 2010

Minimalist searchbox for Firefox

As you know, I love how the Firefox UI can be customized with only a few lines of CSS. This time, I wanted to simplify the Search box of Firefox 4 — because I don't think we need a bright search-engine icon, and the useless magnifying glass button. Here is the result:


Firefox 4 minimalist search bar — with a few lines in userchrome.css

Compare with the original theme:


Firefox 4 searchbar using the default theme

And here are the few lines you can add to your userChrome.css to achieve this result:

/* Remove the magnifying glass icon on the right of the searchbox */
.search-go-container { display: none; }
.searchbar-textbox .textbox-input-box { padding-right: 7px !important; }

/* Replace the active search engine icon by a magnifying glass */
.searchbar-engine-image { display: none; }
.searchbar-engine-button {
	padding-left: 16px !important;
	background: url("chrome://browser/skin/Search.png") 4px 4px no-repeat;
}

Tested with Firefox 4.0b8 — but should work with Firefox 3.6 too.

vendredi 17 septembre 2010

Firefox 4 comme IE9

La nouvelle interface d'Internet Explorer 9 a été dévoilée hier. Elle a ses défauts, mais son côté minimaliste est vraiment agréable.

D'ailleurs, avec Firefox 4 bêta, il y a moyen d'obtenir la même interface — sans extension, simplement en réorganisant les barres d'outils.

Firefox avec l'interface d'IE9

Il suffit de glisser la barre d'adresse et les quelques boutons nécessaires dans la barre d'onglets, et voilà : une interface simple à la IE9.

samedi 24 juillet 2010

Easter-egg dans la BO d'Inception

J'ai bien aimé la musique d'Inception. Il n'y a pas vraiment de thème qui reste précisément en tête : on se souvient d'une idée générale, de fragments — ce qui colle très bien avec les rêves imbriqués du film.

Bref, Hans Zimmer a mentionné ses sources d'inspiration et la manière dont il avait composé ces musiques dans plusieurs interviews — donc on voit à peu près d'où certaines choses viennent. N'empêche, l'entendre, c'est encore autre chose. Enjoy.


mercredi 30 juin 2010

Fix "duplicate symbols" when linking a universal static library with iOS SDK 4

If you updated to the recently released iOS SDK 4, you may have encountered a rather annoying issue. All projects that link again a static library which is the combination of multiple sub-libraries now fail to link, producing only a "duplicate symbols" error. It is the case, for instance, with the widely used Three20 library for iPhone development.

This is because of a bug in libtool : when building an universal library (understand "with multiple architectures", like the "Standard" build option that includes both armv6 and armv7), if you are merging multiple libs together, libtool will fail to strip properly some parts of the libs, then try to merge them, adding the same symbols several times. It will only be noticed on a linker invocation, such as when building the application that uses the library. This is perfectly explained with much details in this blog post of James Briant.

He suggested a script to fix this issue with Three20. I generalized it, so it can be used for any library that has the same issue.

To use it, open your library Target in Xcode, add a new "Shell Script build phase", and copy the content of this script inside :

#!/bin/bash
# (c) 2010 James Briant, binaryfinery.com
# Edited by Pierre de La Morinerie

if [[ $TARGET_BUILD_DIR == *iphoneos* ]] && [[ $ARCHS == *\ * ]]
then

echo "Rebuilding library as proper multiarch file"

LIB_ARM6=$TEMP_FILES_DIR/Objects-$BUILD_VARIANTS/armv6/$EXECUTABLE_NAME
LIB_ARM7=$TEMP_FILES_DIR/Objects-$BUILD_VARIANTS/armv7/$EXECUTABLE_NAME

# Libtool skrewed up, and built fat binaries in place of the arch-specific ones : strip them.
lipo $LIB_ARM6 -remove armv7 -o $LIB_ARM6
lipo $LIB_ARM7 -remove armv6 -o $LIB_ARM7

# Now recombine the stripped lib to the final product
libtool -static $LIB_ARM6 $LIB_ARM7 -o $BUILT_PRODUCTS_DIR/$EXECUTABLE_NAME

else
echo "Skipping arm multi-architecture rebuild"
fi

Now, each time your project is built, the architectures in the output binary will be correctly merged. This should be as unobtrusive as possible — but hopefully Apple will fix the bug soon.