Lundi 5 juillet 2010 : itinéraire du jour

Vu que google maps ne me permet pas de sauver dans “mes cartes” les trajets piétons que je calculs et bien je vais les sauver ici.

Donc trajet du dimanche 5 Juillet 2010 (départ vers 13h – retour vers 14h30) : boucle de la marne, dans l’autre sens, et un peu plus grande que la veille. Le trajet n’est pas tout à fait exacte car dans Saint Maurice et vers Nogent sur Marne je n’arrives pas à ce que Google Maps prennent le chemin que je veux (une partie piétonne qu’il ne doit pas connaître).

Dimanche 4 Juillet 2010 : itinéraire du jour

Vu que google maps ne me permet pas de sauver dans “mes cartes” les trajets piétons que je calculs et bien je vais les sauver ici.

Donc trajet du dimanche 4 Juillet 2010 (départ vers 21h – retour vers 22h) : petite boucle de la marne. Le trajet n’es pas tout à fait exacte car dans Saint Maurice je n’arrives pas à ce que Google Maps prennent le chemin que je veux (une partie piétonne qu’il ne doit pas connaître).

Ce qui est bien quand on programme, c’est que des fois on s’extasie pour pas grand chose

function disableCommandsWhileEditing()
{
  $("img.disableOnEdit").each(function (i) {
    src = $(this).attr('src');
    pos = src.lastIndexOf(".");
    if (pos>0) {
      $(this).attr('src',src.substring(0,pos) + "_disabled" + src.substring(pos));
    }
  });
}

Depuis quelques temps je vais un peu de Javascript sur mon temps libre (j’en ai pas tant que ça). Je sais c’est bizarre comme truc à faire sur son temps libre … je vous rassure j’ai aussi une vie sociale, je fais du vélo et tout et tout.

Donc voilà, je (re)découvres le Javascript et la programmation web. Et notamment l’utilisation du framework JQuery qui est quand même overpuissant ;) .

La jolie fonction ci-dessus va parcourir toute les images (de la page courante) qui ont pour classe disableOnEdit et modifier le attribut src pour y ajouter _disabled. C’est à dire qu’une image définit de la façon suivante

<img src="map_delete.png" id="map_clear" class="disableOnEdit" alt="Effacer toute la carte" title="Effacer toute la carte" />

deviendra

<img src="map_delete_disabled.png" id="map_clear" class="disableOnEdit" alt="Effacer toute la carte" title="Effacer toute la carte" />

Je vous l’avais bien dit … il m’en faut peu …

vélo, internet, projets collaboratifs, …




C’est quand même beau Internet des fois (même si on peut y perdre pas mal de temps …) … le vélo aussi d’ailleurs. Depuis quelque temps je fais un peu de vélo … de plus en plus. Je reste un amateur mais je commences à y prendre goût. Accessoirement je m’intéresse aussi à la géolocalisation, la carto, les mobiles (iPhone principalement), … Cet après je tombes la dessus : http://ridethecity.com/. En gros un site américain dédié au vélo en ville, utilisant les données d’openstreetmap pour calculer des itinéraires à vélo. En plus ils viennent de sortir une application iPhone (originale je sais).

Donc là je me dis … ouais y a qu’à faire la même chose en version française … C’est pas la première que je me dis que je regardes un peu plus ce qu’il y a dans le projet openstreemap, ce qu’on peut en tirer, faire avec. Voilà l’occasion. Donc je fais une petite recherche Google :

  • sur le wiki d’openstreetmap on trouve déjà pas mal d’informations :
    • Une page pour regrouper toutes les infos liées au vélo : http://wiki.openstreetmap.org/wiki/FR:Bicycle
    • Une page qui explique la notion de cycleway dans openstreetmap : http://wiki.openstreetmap.org/wiki/FR:Cycleway
    • Et les itinéraires cyclables en France : http://wiki.openstreetmap.org/wiki/FR:Itin%C3%A9raires_cyclables. C’est à dire EuroVélo, Grands Itinéraires et voies vertes.
    • Donc en gros ce que j’en comprends après un survol rapide. Comme je le savais déjà openstreetmap est un projet communautaire visant à cartographier le mode et quand on crée/édite/modifie une partie d’une carte/route/… on peut taguer des zones permettant d’indiquer le type de chemin, lieu ou autres. Donc on peut notamment indiquer les pistes cyclables (de différents types) et autres. Il suffit d’avoir un client openstreetmap qui fait les bonnes requêtes et on a bonne outil pour préparer/faire des balades à vélo … pour peu que la zone qui nous intéresse soit correctement renseignée dans openstreetmap. C’est exactement ce que font les gens qui sont derrière le site ride the city.
  • ensuite je tombes sur un poste du forum du site velotaf (que je ne connaissais pas) à propos de opencyclemap : http://www.velotaf.com/lofiversion/index.php/t7990-0.html.
    • ils parlent donc de opencyclemap qui est un site web qui extrait les infos orientées vélo contenues dans openstreetmap. c’est un projet anglais. pour l’instant ça semble assez limité niveau fonctionnalité.
    • par contre je tombes aussi sur ça : http://www.geovelo.fr/. Si gérer par une association qui s’appel Autour du train. Ca ressemble à opencyclemap mais ça semble mieux fait. En plus il prévoit une application iPhone eux aussi.

Résultat il existe déjà pas mal de truc … mais comme je n’ai que ça à foutre (même pas vrai en plus) je sens que je vais déjà voir ce que je peux faire coté visualisation et calcul de “route” en utilisant openstreetmap sur iPhone (ou autres).

La tournée des clubs …




Derrière ce titre à la con ce cache un début de réflexion (peut être à la con aussi), qui m’est venu en écoutant The XX hier soir je ne sais pas pourquoi. L’idée est de faire le parallèle entre la musique avec ses groupes indépendants et le mode du logiciel (au sens large) avec ses développeurs indépendants. Peut être pas très original mais j’ai envi d’essayer de réfléchir tout haut et voir ce qui en ressort.

En schématisant un peu, un groupe de musique avant de sortir son premier album fait des démos, des reprises, la tournée des clubs et bars dans sa région, tourne de plus en plus au fur et à mesure que sont audience grandit, … Généralement le but est de trouver un producteur pour ce fameux premier album. Peut être que cette vision va évoluer, ou plutôt est déjà entrain d’évoluer car l’industrie / la production de musique ne se porte pas si bien que ça en ce moment il parait.

Est ce que cette façon faire existe dans le monde du logiciel ?

  • le producteur : je sais pas si ça va être encore longtemps, mais un groupe de musique généralement cherche à décrocher un contrat avec un producteur qui va l’aider à financer la production/marketing/commercialisation de son album. Or il me semble que dans le mode du logiciel, à part pour les vidéos, cette notion de producteur n’existe pas. Il existe bien quelques initiatives qui peuvent y ressembler : la mode du crowdfouding (qui existe dans plein de domaine, dont la musique), des choses telle que Indie Fund, … mais ça reste assez anecdotique il me semble, non ?
  • ensuite il y a le coté tournée, aller rencontrer son public. Bon c’est sur la musique ça peut se jouer live … on ne va pas aller développer notre futur killerapp en public (et pourquoi pas en fait …). Ça aussi en fait ça existe plus ou moins je pense. Je n’ai pas beaucoup d’exemple la tout de suite sous la main tout de suite , mais il existe des jeux (et autres) qui commencent à faire leur promos dès le début de leur développement via un blog – par exemple : http://the-witness.net/news/.

Donc en gros ne serait-il pas intéressant d’avoir une plateforme permettant en plus d’aider à un simple financement (ce qui est déjà pas mal), pourrait aussi aider les développeurs à affiner leur jeu, par jeu je veux dire affiner leur produit en le confrontant le plus tôt possible à ses futurs utilisateurs … je suis quasiment que ça existe mais c’est où ?

Peut être en mettre en relation avec un autre de mes postes : Fédérer le communauté indy

Disco Rout

Just to test the Grooveshark WordPress plug-in. Here is a great track by Legowelt : Disco Rout

Legowelt by midi8 Legowel by midi8

S’authentifier auprès de son application hébergée sur GAE depuis un client “nom web”.

Google App Engine icon
En ce moment je fais des petits tests avec Google App Engine (GAE). Pour faire simple, GAE est un environnement de développement d’applications web, ainsi que services d’hébergement des applications développées avec. En gros ça permet d’écrire une application et l’héberger avec les mêmes outils (avec quelques différences je suppose) que ceux utilisés par Google … et donc d’héberger le tout sur l’infrastructure de Google. Le tout gratuit tant que l’on ne dépasse pas certains seuils de consommation CPU, bande passante, … largement suffisant pour commencer et (je n’ai pas encore trop creusé la question) ça ne semble pas exorbitant lorsque que l’on doit commencer à payer.

Mais revenons à nos moutons … le but n’est pas d’expliquer ce qu’est GAE mais d’expliquer un cas d’utilisation.

Avec GAE on peut utiliser son propre système d’authentification (ou celui de notre framework web python/java préféré). Mais Google fournit le sien. On peut lui indiquer que tel handler (script qui s’occupe de gérer une requête/URL) ne peut être exécuté que si l’utilisateur s’est authentifié au préalable avec un compte Google. Si l’accès à cette URL se fait depuis un navigateur web, tout est déjà prévu par Google. Lorsque que le client accède à l’URL, s’il n’est pas authentifié, le navigateur est redirigé vers une page où on lui indique qu’il doit se connecter avec son compte Google pour accéder à cette ressource. Une fois l’authentification faite, le navigateur est redirigé vers l’URL d’origine.

Mais que se passe-t-il si je veux faire la même chose en dehors d’un navigateur web ? Dans un script python, ou bien dans une application iPhone par exemple ? Pour ne pas faire de mystère je n’ai pas trouvé tout seul … j’ai un peu cherché si quelqu’un ne s’était pas posé la même question que moi … et à priori je pouvais être sur que c’était déjà le cas. Bon j’ai un peu galéré pour trouver la bonne formulation à faire dans le moteur de recherche de Google mais j’ai fini par tomber sur deux postes sur stackoverflow (pour changer … très bon site, au cas où vous sortiriez d’hibernation et seriez passé à côté).

Bon je pourrais m’arrêter là car il y a (presque) tout ce qu’il faut dans ces deux postes. Pour la version en python vous pouvez aller voir directement la réponse de dalelane. Et pour la version pour iPhone (enfin Objective-C) vous pouvez directement voir cette réponse, celle de Keith Fitzgerald. Dans ces deux réponses c’est exactement la même méthode qui est utilisée, avec deux langages différents. Un autre bon exemple (en python) est d’aller voir les outils qui sont fournis dans le SDK de GAE. Dans les fichiers appcfg.py et appengine_rpc.py il y a du code qui fait ça.

Comme j’aime en rajouter, et que je suis tombé dans un piège je vais commenter la méthode à utiliser et expliquer la petite erreur qui m’a fait perdre du temps. Je vais le faire à partir de la version Objective-C, car c’est celle qui m’intéressait au final (mais la version python m’a permis de trouver mon erreur en ajoutant des logs).

Avant de commencer, j’aimerais ajouter que vous pouvez aller lire la doc suivante : ClientLogin for Installed Applications. ClientLogin c’est l’une des APIs d’authentification fournies par Google.

Les étapes du processus sont :

  1. L’utilisateur final fournit son login et son mot de passe (je n’ai pas encore essayé mais on verra plus tard comment utiliser l’API KeyChain fournie avec Cocoa pour stocker les mots de passe).
  2. L’application contacte le service de Google avec ces informations pour obtenir un token d’authentification : Auth.
  3. Ensuite il faut récupérer un cookie auprès de notre application GAE. Ce cookie sera automatiquement utilisé dans la future requête HTTP que l’on fera à notre application.
  4. Et pour finir on n’a plus qu’à contacter les URLs nécessitant l’authentification en leur ajoutant le token Auth comme paramètre.

Donc (après tout ce blabla) on y va.

D’abord la fonction GAEAuthenticationForUser qui va nous permettre de récupérer le fameux token d’authentification:

- (NSString*)GAEAuthenticationForUser:(NSString*)email withPassword:(NSString*)passwd forApp:(NSString*)app
{

En entrée on prend :

  • l’email de l’utilisateur : login@gmail.com
  • son mot de passe : 6(P;p7/s!#Fb (qu’on aura à priori récupéré grâce à l’API keychain).
  • et l’identifiant de votre application GAE : si votre application est accessible ici http://myapp.appspot.com/ et bien il faut passer myapp.
	// retrieve the &quot;Auth&quot; key
	NSURL* authUrl = [NSURL URLWithString:@&quot;https://www.google.com/accounts/ClientLogin&quot;];
	NSMutableURLRequest* authRequest = [[[NSMutableURLRequest alloc] initWithURL:authUrl] autorelease];
	[authRequest setHTTPMethod:@&quot;POST&quot;];
	[authRequest setValue:@&quot;application/x-www-form-urlencoded&quot; forHTTPHeaderField:@&quot;Content-type&quot;];
	NSString* content = [NSString stringWithFormat:@&quot;Email=%@&amp;Passwd=%@&amp;service=ah&amp;source=%@&amp;accountType=HOSTED_OR_GOOGLE&quot;,
		[self urlEncodeValue:email],
		[self urlEncodeValue:passwd],
		[self urlEncodeValue:app]];
	[authRequest setHTTPBody:[content dataUsingEncoding:NSUTF8StringEncoding]];
	[authRequest setHTTPShouldHandleCookies:YES];

Maintenant on configure notre première requête HTTP. Celle que l’on va faire au service ClientLogin de Google.

  • on créé une NSURL qui représente https://www.google.com/accounts/ClientLogin
  • on créé une requête NSMutableURLRequest (car on va la modifier après sa création) avec cette URL.
  • on veut faire un POST.
  • on prépare un chaine de caractères pour les paramètres de la requête. Elle doit ressembler à Email:login@gmail.com@Passwd=6(P;p7/s!#Fb&service=ah&source=myapp&accountType=HOSTED_OR_GOOGLE. En fait, non elle ne doit pas tout à fait ressembler à ça. Et c’est là que j’ai perdu du temps bêtement. Les valeurs des paramètres doivent être encodées de façon à éviter l’utilisation de certains caractères spéciaux. Et même si j’ai assez vite supposé que mon problème venait de là, je n’arrivais pas à trouver comment faire sans réinventer la roue avec Cocoa. La solution est dans la fonction urlEncodeValue que j’ai trouvée ici.
NSHTTPURLResponse* authResponse;
NSError* authError;
NSData * authData = [NSURLConnection sendSynchronousRequest:authRequest returningResponse:&amp;authResponse error:&amp;authError];

Ensuite on poste la réponse … de façon synchrone (pourquoi pas). Et on récupère le corps de la réponse dans authData.

NSString *authResponseBody = [[[NSString alloc] initWithData:authData encoding:NSUTF8StringEncoding] autorelease];

//loop through response body which is key=value pairs, seperated by \n. The code below is not optimal and certainly error prone.
NSArray *lines = [authResponseBody componentsSeparatedByString:@&quot;\n&quot;];
NSMutableDictionary* token = [NSMutableDictionary dictionary];
for (NSString* s in lines)
{
    NSArray* kvpair = [s componentsSeparatedByString:@&quot;=&quot;];
    if ([kvpair count]&gt;1)
    {
        [token setObject:[kvpair objectAtIndex:1] forKey:[kvpair objectAtIndex:0]];
    }
}

//if google returned an error in the body [google returns Error=Bad Authentication in the body. which is weird, not sure if they use status codes]
if ([token objectForKey:@&quot;Error&quot;])
{
    return nil;
};

if (![token objectForKey:@&quot;Auth&quot;])
{
    return nil;
};
  • On récupère le corps de la réponse sous forme de NSString, elle doit ressembler à quelque chose comme ça :
  • SID=DQAAAJkAAABQe-mE_yaZapZsNR0h65oVFl8-5kwnOU1nf2INyz6edOi22ohSfkzAw9yCax9r0Rjem8Q-XXXXXXXX
    LSID=DQAAAJwAAAALzcIgkGA-l7mJ2SixvOBIA_KR6bBy0qSEtFf2GejuFKw4hWmxTrSwBMtXGg6-ehOul__XXXXXXXX
    Auth=DQAAAJsAAAALzcIgkGA-l7mJ2SixvOBIA_KR6bBy0qSEtFf2GejuFKw4hWmxTrSwBMtXGg6-XXXXXXXX
  • Donc on va parcourir cette chaine ligne par ligne pour construire un dictionnaire.
  • Et on récupère la valeur de la clef Auth dans celui-ci.
 // retrieve the cookie
 NSURL* cookieUrl = [NSURL URLWithString:[NSString stringWithFormat:@&quot;http://myapp.appspot.com/_ah/login?continue=http://myapp.appspot.com/&amp;auth=%@&quot;, [token objectForKey:@&quot;Auth&quot;]]];
 NSHTTPURLResponse* cookieResponse;
 NSError* cookieError;
 NSMutableURLRequest *cookieRequest = [[[NSMutableURLRequest alloc] initWithURL:cookieUrl] autorelease];

 [cookieRequest setHTTPMethod:@&quot;GET&quot;];

 NSData* cookieData = [NSURLConnection sendSynchronousRequest:cookieRequest returningResponse:&amp;cookieResponse error:&amp;cookieError];

 return [token objectForKey:@&quot;Auth&quot;];
}

Finalement on se connecte à notre application pour générer un cookie qui sera utilisé dans la requête suivante.

Maintenant on va pouvoir accéder à notre application en étant authentifié si nécessaire

Contrairement à ce qui est fait dans les postes dont je me suis inspiré, une fois que j’ai récupéré le cookie je n’ai pas besoin de passer le token d’authentification à chaque connexion au serveur. Une fois que j’aurai plus testé je reviendrai peut être sur cette partie.

Et sur le serveur de développement, comment on fait ?

Je n’ai pas encore testé mais ça n’a pas l’air bien compliqué … je reviens la dessus bientôt.

Du numérique vers le mode physique …

J’ai toujours été intéressé / fasciné par la technologie. Cela passe notamment par un intérêt pour la science fiction (enfin surtout du space opera et du cyberpunk plus que de la vraie SF). Et en y réfléchissant bien dans ce genre d’œuvres (livres, film, bds, …) on voit surtout des objets “futuristes” plus que de super logiciels super utiles. A part dans le cyberpunk (et encore).

Tout ça pour en venir où ? Depuis maintenant 15/20 ans je m’intéresse à l’informatique au sens large, la programmation, réalisation, conception, et utilisation de logiciels informatiques car ça me permet de créer/contrôler des choses comme certains dessine, font de la musique, sculpte, … Mais je suis entrain de me rendre compte que les choses n’avance pas aussi vite que ce qu’on peut penser. Il y a encore un faussé énorme entre les gens qui utilisent de façon intensive et naturel l’outil informatique (et je parles bien d’utilisation au sens large, pas seulement de développement logiciel) et le commun de mortels qui a de grande chance (si il vie occident et/ou à un minimum de revenue pour avoir accès à un ordinateur) de savoir vaguement se servir d’un navigateur web et de quelques services web et c’est tout. C’est qui est très loin de l’image hightech qu’on peut avoir de la société par moment.

Même si il reste plein de choses à améliorer et à créer je suis entrain de me demander si tout en gardant comme point de départ mon intérêt pour l’informatique le fait d’y ajouter un peu de concret, de réalité via des objets physiques ne serait pas quelques choses d’intéressant. Ça veut dire quoi se charabia … ça veut dire que j’aimerais m’intéresser à la création/développement d’objet physique utilisant des programmes informatiques dans leur fonctionnement. Ça reste encore très vague …

L’envi m’est venue progressivement depuis 2 ans je penses en découvrant des projets tels que :

Sur quoi ça peut déboucher ? Je ne sais pas … surtout qu’au final je n’ai pas tellement le temps de creuser la question … mais j’aimerais bien.

La panne

Bon je m’étais dit que ce blog ne serait pas un nième blog mort né … mais on en est pas loin. J’ai quand même quelques articles en mode draft que je n’arrives pas à commencer :

  • Être son propre Google : en ce moment on se rend compte de la puissance/importance grandissante de Google. Ce n’est pas une nouveauté mais de plus en plus de monde s’inquiète et se pose des questions. La lecture de cet article “Google et Facebook dans le collimateur du public” (sur le blog de Tristan Nitot) et de cet autre article “About gathering web 2.0 personal data into one safer place” (dans un des commentaire du précédent article) mais fait penser que ce serait bien que je réfléchisse aux moyens existant actuellement pour se passer un maximum de Google (webmail, suite office en ligne, agenda, todolist, flux rss, statistiques de site web, …). Le seul truc que à priori je garderais à coup sur ce serait la recherche. Reste à creuser la sujet.
  • La modélisation pour “nous” les gens normaux … : ça m’est venue après avoir assister à la présentation de Sylvain Lefebvre lors de la 2ème soirée Rencontres Start-up et recherche organisée par le Paris ACM Siggraph. Sylvain n’était pas le seul à présenter ces travaux (et ceux de son équipe) mais c’est son intervention qui m’a le plus intéressé. Le sujet en était : Génération automatique de contenu pour le graphique. Il y a montrait notamment une technique permettant d’assembler/modifier des bouts de modèle 3D pour en créer d’autres. L’opération étant manuelle (mais assistée par le soft) pour éviter la répétition d’un processus complétement généré par un algorithme. En gros ce genre de technique pourrait permettre à quelqu’un qui ne maitrise pas le modélisation de réussir à faire quelques créations … à partir de modèle (ou de bout de modèle) existant (voir ici). Donc je voulais essayer de lister les techniques existantes et voir si il n’y aurait un brèche pour ce genre d’outils. Naïvement je disais que j’avais l’impression qu’on en était toujours à modéliser à l’aide de triangle (ou surface à la limite) ce qui nécessite forcément de capacité “graphique” que je n’ai pas. J’avais un peu trop occulté des outils tel que ZBrush (qui reste un truc de pure “graphiste” donc hors de porté pour moi) et Google Sketchup. J’ai essayé ce dernier quand même car il est gratuit … bon je vais pas m’étendre plus longtemps et j’essaierais de détailler ma pensée dans un autre billet comme prévu.
  • Catching access violation under gcc : Celui est un peu plus technique que les deux précédents et en rapport direct avec un truc que je dois faire au boulot. Juste une histoire d’intercepter des signaux sous Mac OS X pour faire l’équivalent d’un catch(…) avec Visual C++ sous Windows.

(reminder) Q: Is there any way to get a list of GCC’s predefined macros?

A: Enter this command line in your prefered terminal application to generate a list of GCC’s predefined macros:

gcc -dM -E - < /dev/null | sort

seen here : http://developer.apple.com/mac/library/qa/qa2005/qa1424.html