Titanium par l’exemple, un client twitter en dix minutes.

Bon, bien entendu mon titre est volontairement accrocheur. Et complètement mensonger. Mais il faut bien appâter le chaland un peu. Sinon, je ne serais jamais un blogueur influent.. Alors vive les titres accrocheur 🙂

Mais avant de commencer, il faut peut-être que j’explique ce que c’est que Titanium. Titanium c’est un framework assez génial (et libre) qui permet de faire du dev iphone/android en html/javascript. Histoire que ceux qui n’aiment ni l’objective-C, ni le Java puisse tout de même coder sur ces plateformes là. Histoire aussi de coder qu’une fois son appli et de la voir tourner sur les deux.

Là, vous devez être en train de vous demander : ‘Il va nous parler de dev iphone/android en js ? ‘

Et ben en fait, pas du tout.

Parce que là où Titanium est encore plus génial, c’est que l’on peut coder pour le Desktop aussi, en multiplateforme à savoir Linux, OSX et Windows. Sympa, vous aller me dire, mais bon faire toute une appli desktop en js, voilà quoi …

Oui, mais non, parce que pour le desktop, on peut coder en python (attention en python 2.5 uniquement), en ruby ou.. misère, en php. Et là, ça devient carrément miam.

Ca faisait donc plusieurs mois que j’avais envie de tester le bouzin, mais bon, j’avais déjà pas le temps de bosser sur histoiresderolistes.com alors tester un truc en plus… Et puis les tests c’est bien joli mais pour faire des Hello World! Merci.

Mais comme les vacances, ce n’est pas fait que pour travailler sur le boulot en retard, j’ai pu m’y mettre, un peu. (et puis faut avouer que le billet de @popofr13 sur le dev titanium iphone m’a boosté à écrire le mien). Restait alors le problème du Hello World. Après 30 secondes de réflexion je me suis dit que bidouiller des trucs avec twitter, ça serait rigolo. Et en plus comme c’est bien buzz word twitter, ça plaira, c’est sur.

Et c’est ainsi qu’un froid jour d’avril, une nouvelle catégorie d’article naquit sur le j-mad blog. Une catégorie dédiée aux bidouillages avec Titanium et ayant pour fil rouge le dev d’un client twitter basique (type Pino quoi). Et comme pour chaque projet, il faut un nom, j’en ai trouvé un TwittPouick. Oui je sais. Non, pas de commentaires sur le nom.

1- La genèse, installation et création du projet.

Alors c’est tout simple, pour télécharger Titanium, on va sur le site et on clique sur téléchargement.

Ensuite il n’y a qu’à décompresser l’archive et lancer l’installateur. Petite précision, il y a assez régulièrement de nouvelle version, qui sont indiqués directement dans l’interface de Titanium. Il suffit alors de relancer le cycle dl/décompression/installation.

Une fois Titanium installé et lancé, il suffit de cliquer sur New Project pour voir la fenêtre ci dessous apparaître. Rien de bien difficile à comprendre, il suffit de remplir les champs et de cliquer sur create project (N’oubliez pas de cocher en vert la petite case python tout de même).

Vous arrivez ensuite sur la fenêtre principale composé d’à gauche la liste de vos projets (sur mon screen on voit d’ailleurs mon projet twittpouick) et à droite ben la zone de droite avec un menu horizontal en haut Dashboard / Edit / Test & Package.

  • Le premier ne sert à rien, c’est simplement la liste des options en fonction de si on a un abonnement payant ou pas.
  • L’onglet Edit sert un peu plus, il permet de modifier les infos que l’on a saisit à la création du projet
  • Enfin Test & Package sera celui sur lequel vous allez passer le plus de temps, vu que c’est à partir de là que vous lancerez votre projet. (et qu’un jour quand il sera fini vous le packagerait et tout et tout)

2- Et ensuite ?

Ben ensuite, on prend son navigateur de fichier favori et on va voir ce qu’il nous à générer le tonton Titanium.
Et l’on voit ça :

Bon le fichier jquery n’est pas là de base, c’est moi qui l’est rajouté. Vous comprendrez pourquoi par la suite.

Donc il ne devrait y avoir quasiment que le fichier index.html. Qui correspond à notre fenêtre principale. Avant de partir pour de vrai dans des vrais choses rigolotes (comprendre le client twitter), on va tout de même faire un hello word. Et oui.

Ouvrez le fichier index.html et remplacez son contenu par celui-ci

<html>
    <head>
        <script type="text/python">
      def hello_python():
          return "Hello World"
        </script>
    </head>

    <body >
        <div >
            <div >Le Hello World</div>
            <button onclick="alert(hello_python())">Bouton Hello</button>
        </div>
    </body>
</html>

Allez dans Test & Package, cliquez sur Launch App, une fenêtre blanche se lance avec un bouton, cliquez sur le bouton et mirage, une fenêtre Alert javascript s’affiche avec un Hello World dedans.

Ce qui est logique, si on regarde le code au dessus. On crée une section de code python, on définit une fonction que l’on appelle sur le onclick du bouton, dans un code js donc, et on passe le retour de la fonction python (je le rappelle) en paramètre à la fonction alert js.

En fait cet exemple, bien que très simple, montre la plupart des trucs génials de Titanium.

On peut déclarer des sections de code python, directement dans les fichiers html (mais on peut le faire proprement en dehors aussi, ça sera l’objet d’un prochain billet) et on peut accéder au python du js.

Et c’est aussi valable dans l’autre sens. On peut accéder du python, à du code JS. Que ce soit accéder à des fonctions ou à des variables, que l’on peut modifier, bien entendu (à ce propos, cette page de la doc officielle explique la conversion entre les types python / javascript.

3- Et TwittPouick naquit.

Pour clore ce premier billet, déjà bien long, et justifier un peu, le titre du billet, on va faire une premier truc, c’est récupérer, après clic sur un bouton, sa timeline, dans un mode code grouirk, parce que c’est juste pour finir en beauté ce billet.

3.1 Récupération de sa timeline.

Je ne connais pas les librairies twitter en python. Et je n’ai pas vraiment le temps de me plonger dedans pour voir laquelle est la mieux. Par contre je connais bien restkit, une librairie bien bien sympa de @benoitc et qui marche plutôt bien.

On va donc l’utiliser pour récupérer sa timeline.

3.2 Affichage de sa timeline.

On à une interface HTML. On veut modifier le dom. Moi j’aime bien jquery. Donc on va utiliser Jquery. Directement dans du code python. Et oui. Comme si on était en Js. Sauf que l’on ne pourra pas utiliser le raccourci $ , vu qu’on est en python. On va donc simplement utiliser le vrai objet JQuery.

3.3 Utilisation des API Titanium

On peut bien entendu, encore heureux, utiliser directement les API titanium qui sont en Js. Pour l’exemple, j’utilise Titanium.API.info qui permet d’afficher une chaîne de caractère dans la console.

Bon et maintenant le code, complet, du fichier index.html

<html>
    <head>
   
    <link rel="stylesheet" type="text/css" href="style.css" />
    <link rel="stylesheet" type="text/css" href="color.css" />    
   
    <script type ="text/javascript" src="jquery-1.3.2.js"></script>


    <script type="text/python">
        def getTimelineJquery():
            from restkit import Resource, BasicAuth
            from pyquery import PyQuery as pq
           
            try:
                import simplejson as json
            except ImportError:
                import json # py2.6 only
   
            class TwitterTimeline(Resource):
   
                def __init__(self, pool_instance=None, **kwargs):
                    search_url = "https://api.twitter.com/1/statuses/"
       
                    auth = BasicAuth("TwitterUserName", "TwitterPassword")
       
                    super(TwitterTimeline, self).__init__(search_url, follow_redirect=True,
                                    max_follow_redirect=10,
                                    pool_instance=pool_instance,
                                   filters=[auth],
                                    **kwargs)
       
                def get_timeline(self):
                    return self.get('home_timeline.json')
       
                def request(self, *args, **kwargs):
                    resp = super(TwitterTimeline, self).request(*args, **kwargs)
                    return json.loads(resp.body)
   
            s = TwitterTimeline()
            tl = s.get_timeline()

            for item in tl :
                element = u"""<p class="p_tweet color_p_tweet"> %s :  %s</p>""" % (item['user']['screen_name'], item['text'] )
                Titanium.API.info (element)
                jQuery("#timeline").append(element)

    </script>

    </head>
    <body class="body color_body">
         <div>
           
            <h1>Votre timeline avec TwittPouick</h1>
            <button onclick="getTimelineJquery()"> Get Timeline Jquery </button>
           
            <div id="timeline">

            </div>
        </div>
    </body>
</html>

Vous n’avez plus qu’à installer restkit (avec easy_install), pour python 2.5 N’OUBLIEZ PAS !!!, mettre jquery à coté de votre fichier index.html, mettre votre login / mot de passe twitter et puis lancer l’appli twitter.

Cliquer sur le bouton, quelque seconde après .. miracle les tweets apparaissent. Recliquez sur le bouton, les nouveaux twitts s’ajoutent en bas de liste….

Et voilà, même pas 10 minutes et déjà vous avez un début de client. Comme quoi, je ne vous avais pas tant mené en bateau que ça, dans mon titre, finalement.

4- Conclusion.

Ce premier billet, n’est qu’un premier billet. Il ne va pas très loin dans la présentation de Titanium, parce que je n’ai pas vraiment eu le temps de moi même faire plus. Vivement les prochains billets donc. Enfin, j’espère que c’est ce que vous vous dites en ce moment :).
Pour la suite, je mettrais en place un repository mercurial sur bitbucket où je déposerais les différentes étapes de la création de TwittPouick.

En attendant mon prochain billet, amusez vous bien avec Titanium.

Django-request , ne partez plus en quest de vos stats

Et non, vous ne rêvez pas, on est même pas le 15 avril et déjà, déjà, le billet de l’app django du mois est là. Mais bon, les rencontres django ayant lieu dans maintenant 14 jours et n’ayant pas encore commencer à préparer ma conf, même pas le premier mot (enfin si, bonjour), ce qui fait que je suis ‘dans la banade’, comme l’a fait si justement remarquer il y a peu @daks_

Donc, je préfère me ‘débarrasser’ tout de suite de l’app du mois, comme ça, ça sera au moins une chose de faite.

Ce mois-ci, je vais donc vous présenter django-request, une app pour faire des stats sur la fréquentation de votre django. Oui je sais il y a google analytics pour ça. Mais bon, on sait jamais, ça peut être utile quand même.

1- Où on le trouve, comment on l’installe, tout ça quoi (et la doc) ?

On le trouve à deux endroits :

A noter que quasiment toute la doc se trouve être sur la partie dédiée à django-request sur le site de son auteur.

Pour l’installation, facile, un git clone, un téléchargement de source ou alors pip et easy_install.

Quand à la doc, elle est vraiment très fournie et complète, permettant d’installer, de configurer, d’utiliser, la totale quoi.

2- A quoi ca sert ?

Ben à faire des stats, je l’ai déjà dit. Qui ne seront visibles que dans la partie admin.

On peut avoir de jolis graphiques concernant :

  • les visiteurs uniques
  • les visites basées sur des referrer différents
  • les requêtes reçues par le serveur
  • les requêtes venant des moteur de recherches
  • les requêtes provenant du javascript
  • les requêtes en SSL
  • les requêtes faites par un utilisateur
  • le nombre d’erreur 404
  • le nombre d’erreur, toutes erreurs comprises
  • le nombre d’utilisateur enregistré sur le site qui ont fait des requêtes

Par défaut les calculs seront fait pour les visiteurs uniques, les visites en fonctions des referrers et le nombre global de requêtes.

On obtient ensuite un joli petit graphique qui nous donne tout plein d’infos. Et plein de petits tableaux pour en avoir encore plus.

Et on peut même avoir, des petits templates tags pour voir les users actifs sur le site

3- Comment ça marche ?

Il suffit d’ajouter ‘request’ dans ses installed_apps et d’ajouter le middleware qui va bien. (Attention suivant les middlewares déjà installés, la position du middleware de django-request, dans le tuple des middleware est importantt, mais c’est bien expliqué dans la doc).

Ensuite, tout ce passe dans l’interface d’admin

4- Tips de chez Jmad.

Quand j’ai installé le tout avec easy_install, j’ai oublié de rajouter les chemins pour avoir les templates admins de l’app. Résultat je n’avais rien dans l’admin. Faites y attention ou alors installez request directement dans votre projet django, comme une de vos apps.

Le model Request présente un champ language qui est modélisé en bd par un varchar de 25. Avec mes tests, cette longueur était bien trop petite pour mon firefox. Du coup boum une erreur BD a base de ‘machin qui a été truncated’. J’ai passé la taille du champ à 200 pour être tranquille.

Les différents fichiers js qui sont utilisés sont bien entendu fournis. Pourtant par défaut, les templates vont utilisés ceux hostés ailleurs (sur le site web de l’auteur par exemple). N’oubliez pas de changer cette option si cela vous dérange.

C’est expliqué dans la doc, mais je le redis ici. Une fois que tout est bien configuré, pour aller voir ces stats, vous allez dans l’admin, vous cliquez sur la ligne Request de l’app Request. Là vous avez la liste de toutes les requêtes. (pas très utile là comme ça, vous me direz). Levez les yeux, en haut à droie, à coté du bouton Add Request, vous avez un bouton Overview. Et voilà, cliquez, vous avez vos stats.

Date de lancement de Leelh

Et oui, alors que la Closed béta bat son plein, la date de lancement officielle de Leelh vient de tomber.

Attention, attention, roulement de tambour …. (je ne vous les mime pas, je sius très mauvais en mime écrit du tambour).

!!! La semaine du  26 avril !!!

et oui je parle bien du 26 avril 2010, celui dans 16 jours. Ce qui veut dire que, normalement, d’ici 22 jours maximum, Leelh sera lancé.
Youhou serais-je tenté de dire.

Allez, du coup, pour le plaisir, op une petit Leelh BD, qiu présente les talents dans Leelh.

Lancement d’un side project : Histoiresderolistes.com

‘C’est l’histoire d’un mec …’ qui était rôliste.

Bon ok, c’était facile, mais je trouve que c’est une bonne façon de démarrer ce billet. Billet tout entier consacré à de l’autopromo ou plutôt à l’annonce du lancement d’un de mes side-project comme on dit.

Histoiresderolistes.com. Né d’une idée toute simple à savoir que les rôlistes, dont je suis, adorent se raconter leur vieilles histoires de joueurs, leurs souvenirs de catastrophe évitées ou de justesse, ou pas du tout, leur grand moment de rigolade. Et parfois on a envie de partager ces histoires, pas seulement avec son groupe de joueur actuel, mais avec ses anciens compagnons de parties, ou même avec d’autres rôlistes tout court.

Comme je n’ai pas trouvé un tel endroit, je me suis dit que j’allais la bâtir moi même, la petite taverne virtuelle où nous pourrions tous être barde, le temps d’une histoire.

Alors ce ne fut pas facile de venir à bout de ce projet, dont la taille est pourtant plus que petite. Pour donner une idée de la chronologie :

  • j’ai eu l’idée du site en juillet 2009, j’ai aussitôt acheté le nom de domaine
  • j’ai commencé à aligner quelques lignes de code en aout (merci les vacances), mais ayant du boulot du boulot, en retard, j’ai que très peu avancé.
  • Je m’y suis vraiment mis fin janvier/début février en essayant de trouver du temps la nuit et les week-ends.
  • le week-end de Pâques m’a permis de finaliser le tout et de faire tester à quelques chanceux (merci les gens de #djangocong et du plug).

Mais maintenant, il est en ligne, et vous pouvez aller y lire/raconter des histoires de rôlistes. Et si il est en ligne, c’est aussi grâce à ma chére et tendre qui a été la première des béta testeuses, bien qu’elle ne soit pas du tout rôliste… Le fait qu’il n’y est pas de fautes d’ortographes sur le site (ou presque pas) est par exemple complètement grâce à elle, mais ce n’est pas son seul apport, loin de là.

Et ce n’est pas qu’un ‘simple’ site où les gens soumettent des histoires. Quitte à lancer un truc, autant s’en servir comme bac à sable, pour tester des choses dont je parle dans mes billets.

Comme par exemple, l’introduction de mécanismes tirés des jeux vidéos, comme les titres et succès (qui sont ici appelés badges).

Vous pourrez donc gagner des titres (top posteur par exemple) ou des badges comme le badge du djinn narcissique ou du gobelin fanatique (liste des badges). Exactement comme dans les jeux, vous ne connaitrez pas la manière de débloquer certains badges. Parfois même, vous ne saurez même pas que les badges existent avant de les débloquer.

Ce n’est bien entendu qu’un début, j’ai plein d’autres idées (dont certaines déjà listées dans les billet du ce blog), que je mettrais en place petit à petit. En essayant, ensuite, d’analyser le retour des utilisateurs à mes ‘expériences’.

Mais déjà, la question est de savoir si h2rolistes (et il y a même un twitter et un identi.ca pour suivre les nouveautés) va trouver son public ou non…

Et bien entendu, h2rolistes c’est du 100% django.

Petit mémo concernant la syndication Django

Ce billet n’est qu’un petit mémo rapide, pour éviter que d’autre perdent comme moi du temps à chercher un problème qui n’en est pas un. Si jamais je me trompe dans mon interprétation du problème et dans la solution que j’en donne, je suis preneur d’une explication / correctif dans les commentaires.

Django embarque, dans les contrib, un petit framework pour géré la syndication. Plutôt bien foutu d’ailleurs.

Il fonctionne suivant un principe assez simple, pour chaque flux on définit une classe, ensuite on range les classes dans un dict où la clé sera le nom du flux dans l’url et la valeur, la classe, que l’on passe en paramètre à la vue qui gère l’ensemble des flux. (tout est parfaitement expliqué dans la doc, ici).

Par exemple :

from django.conf.urls.defaults import *
from myproject.feeds import LatestEntries, LatestEntriesByCategory

feeds = {
'latest': LatestEntries,
'categories': LatestEntriesByCategory,
}

urlpatterns = patterns('',
# ...
(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed',
{'feed_dict': feeds}),
# ...
)

ici on aura donc deux urls :

  • /feeds/latest
  • /feeds/categories

On peut définir deux templates celui pour justes les titres et celui pour l’item RSS complet. Les deux templates doivent avoir pour nom :

  • KeyDict_title.html
  • KeyDict_description.html

Soit dans notre exemple :

  • latest_title.html
  • latest_description.html
  • categories_title.html
  • categories_description.html

Et tout fonctionne parfaitement dans le meilleur des mondes.

Maintenant prenant un exemple un peu plus compliqué. Imaginons deux apps django, une pour gérer un blog, une pour gérer des reviews de films.
Les deux apps vont donc mettre en place des flux RSS, logique.
Et les deux vont vouloir mettre en place le flux latest. Donc dans chaque répertoire templates des apps, il y aura un sous-répertoire feeds avec les fichiers latest_title.html et latest_description.html

Et là, patatra. Le deuxième flux (dans l’ordre des INSTALLED_APPS) va utiliser les fichiers templates du premier. Parce qu’apparement la recherche des templates pour les feeds et transversale.
Donc faut nommer de manière différentes ses flux. latestblogs et latestreviews par exemple.

Et là, miracle, ça fonctionne.

Voilà, c’est tout.

Royaumes renaissants, méchants vilains et bullshit

J’ai jusqu’à présent évité de parler de politique / du grand n’importe quoi qui prend nos classes dirigeantes lorsqu’elles parlent d’internet sur ce blog.

Pour deux raisons :

  • parce que des gens le font déjà et très bien
  • parce que j’avais décidé, au lancement de ce blog, de ne pas en parler

Ce billet n’existerait d’ailleurs pas, si j’avais pu poster un commentaire sur le site du monde, pour réagir à l’article que j’ai RT il y a peu, celui sur la dernière bêtise de monsieur Lefebvre.

Je dois même avouer que lorsque j’ai eu le lien, grâce au tweet de @mariom_mdm, j’ai vérifié la date de la parution de l’article, pensant à un poisson d’avril.

Mais non, l’article est daté du 31 mars. C’est donc un vrai article.

Et donc, ce cher porte parole de l’UMP a donc vraiment déclaré qu’il fallait que la société qui gère le jeux vidéos les royaumes renaissants devaient donner des garanties sur leur faculté à empêcher la propagation de cette idéologie ou fermer.

Et il a dit cela pour quoi ? Parce qu’apparemment des terroristes se sont connectés sur le dit site web. Et que forcément, c’était pour promouvoir leur thèse. On n’en sait encore rien, mais, il faut agir, tout de suite. Et brider cet internet maléfique qui est une zone de non droit qui peut pervertir nos enfants.

On remarquera que libération donne deux noms de site web Msn messenger et les royaumes renaissants.

Et monsieur Lefebvre, dégaine alors tout de suite. Mais pas pour taper sur Microsoft, nan sur une petite société de jeux vidéos française. Alors, je préfère eclaircir les choses tout de suite, je n’aurais pas plus été d’accord avec monsieur le porte parole si il avait attaqué Microsoft sur ce point précis en demandant des garanties à cette société, concernant les utilisateurs de ces services.

Parce qu’en plus, je ne vois pas comment faire cela, a part lire l’intégralité des infos qui sont transférés par leur serveurs. (ou alors si, une pop up à chaque connexion : Etes vous un méchant ? Avec deux boutons OUI et NON , et une redirection vers une page ou il y aurait écrit ‘ce n’est pas bien, et du coup nous ne pouvons pas vous laisser entrer’ si l’on clique sur OUI).

Mais ce que je trouve intéressant au final, c’est le choix de la cible. Un jeu vidéo. Et si, au lieu de simplement râler et bien rire, je réfléchis, je me dis que c’est logique.

Un jeu vidéo pointé comme le MAL. C’est après tout logique, lorsque l’on prend en compte la volonté, largement présente depuis quelques temps, de diaboliser internet. Diabolisation qui permettra de mieux pouvoir promulguer des lois liberticides sensées protéger nos enfants (et nos esprits). Comme il fallait bien changer de refrain, les site pédophiles, on y avait déjà eu droit pour lopsi, (d’ailleurs à ce propos, un petit lien (merci @manhack) assez édifiant, sur le sujet) ce sont les jeux vidéos qui ont eu la chance décrocher la timbale.

Et puis, ce qui est bien avec les jeux vidéos, c’est qu’on peut reprendre presque le même discours qu’avec les sites pédophiles en changeant juste quelques mots. Ben oui, pour nos politiques (et là je parle aussi de ségolène royal dont vous pourrez lire une très belle citation dans l’article du monde parlant du sujet), les jeux vidéos, c’est forcément pour les enfants. Donc on recycle le discours (comme quoi, parfois ils savent être écologique)

C’est dommage pour eux que les joueurs de jeux vidéos ne soient pas toujours des enfants. Et que dans le cas des MMORPG, ce ne soit ‘presque jamais’ des enfants (bon ok, d’accord, parfois on pourrait croire que les joueurs de WoW ont toujours 14 ans…) .
Et je le prouve. Et très simplement, Il suffit en effet de faire quelques recherches et on trouve deux études très intéressantes, (au moins deux) qui sont :

  • cette première par  Dmitri Williams, Nick Yee et Scott E. Caplan, universitaires américains (si le lien ne fonctionne pas aller sur ce lien et recherchez everquest 2)
  • la seconde (attention lien pdf) faite par les hôpitaux universitaires de Genève et le CHU de Besançon

Et les deux s’accordent à dire que la moyenne d’âge des joueurs de MMORPG est supérieure à 25 ans (31,16 ans pour la première, 26,2 ans pour la seconde). Alors, je veux bien qu’à 25 ans, on soit encore jeune dans sa tête, mais il me semble que l’on ne peut plus être qualifié ni d’ado, ni d’enfant.

Alors que tout le monde s’accordera à dire que sur MSN, des ados, on en trouve treize à la douzaine.

Autant pour leurs argumentaires ‘bouhh bouhhh faut protéger nos enfants du MALLLL’.

Mais, il n’y a pas de reportage qui passe à la TV, avec des bandes son qui font peur, pour dire que msn, c’est destructeur et addictif et qu’il faut faire attention. Alors que sur les jeux vidéos oui.

Et puis surtout, c’est sur que les boites de jeux vidéos elles font pas des super inaugurations de nouveaux locaux avec plein de petits tours top bon, et où il y a  du coup, un certains nombre de parlementaires et de membres du gouvernement (pour ne pas dire un nombre certain). Et monsieur Balmer, il risquerait de se fâcher tout rouge, si on venait l’embêter avec les terroristes qui utilisent msn.

Mais dans tout les cas, ça reste de la bullshit de compétition. Où alors pourquoi pas demander aux pagesjaunes.fr de vérifier que les infos ne seront donnés qu’à des gentils citoyens ? Et que les cambrioleurs, les méchants, ou les terroristes n’auront pas le droit d’aller chercher une adresse ?

Mieux on pourrait obliger viamichelin et googles maps à donner comme unique itinéraire, celui de la prison la plus proche, dés qu’ils détectent que l’utilisateur est un délinquant ou un criminel en fuite. Comme ça op, monsieur Hibulaire qui pensait aller rapido à un mac do pour casser la croute, il se retrouve en fait en prison, juste parce qu’il a suivit les indications de viamichelin. Trop une bonne idée…

Et au final, pour que ça soit plus simple, on devrait instituer une authentification biométrique citoyenne pour avoir le droit de se connecter à Internet. Et les gens qui ne s’authentifieraient pas tomberaient sur une page blanche, avec pour seul contenu un doigt d’honneur affiché en grand et le slogan ‘Montre nous ton doigt ou on te montre le notre’ écrit en dessous. L’internet français serait super bien protégé comme ça. Et nos enfants, je vous en parle même pas, ma bonne dame.

EDIT du 3 AVRIL : On me signale que cette affaire serait peut-être, surement un poisson d’avril. Comme quoi…. Si ça en est vraiment un, c’était bien foutu avec un article dans le monde et un autre dans libération, non daté du premier avril … (et un article de la stampa, qui parle bien des royaumes renaissants, daté du 27 mars..)

Petits tours des méthodes des querysets.

Les queryset sont une des composantes importantes de Django. Comment en effet interagir avec la BD sans eux ?

Mais est ce que cet outil si important et si souvent utilisé est si bien connu que ça ?

Parce que tout le monde connait count(), filter(), all() et exclude(). Mais qu’n est-il des autres méthodes ? Perso, je suis le premier à aller dans la doc, pour revérifier si ce que je voudrais n’existe pas déjà…

C’est le pourquoi de ce billet, lister quelques méthodes ‘à connaître’ des querysets (et puis comme ça la prochaine fois que j’aurais besoin de vérifier un truc, je pourrais le faire en lisant du français et pas de l’anglais). (Ce n’est au final qu’une redite de la page de doc qui va bien, mais ça peut servir).

1- Les méthodes qui renvoient un queryset (ou assimilés)

annotate(*args, **kwargs)

une petite méthode bien pratique, qui permet de rajouter des colonnes calculées (en utilisant les classes d’agrégat Sum,Count, etc défini par django) pour chaque objets récupérés dans le queryset.

Et ça, c’est plutôt fort. Surtout que l’on peut, bien entendu, ‘traverser’ les foreign key
L’un des exemples de la doc, montre cela en calculant pour un magasin le prix minimum et maximum des livres en vente :

Store.objects.annotate(min_price=Min('books__price'), max_price=Max('books__price'))

values(*fields) et Values_list (*fields)

Deux méthodes plus que miam.
Values retourne un ValuesQuerySet qui est en fait un queryset composé d’une liste de dictionnaires au lieu d’une liste d’instance d’objet modèle. Chaque dictionnaire représente un objet, les paire clés / valeur représentant le nom de l’attribut (la key) et la valeur de l’attribut (sa valeur).
On peut passer à values un paramètre optionnel *fields, qui permet de spécifier la liste des noms d’attribut (des strings donc) que l’on veut récupérer.
Exemple :

>>>Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]

Deux choses importantes à se rappeler, values ne récupère rien pour les manytomany et dans le cas des FK, la clé du dico est le nom ‘vrai’ de l’attribut dans la table (souvent avec _id donc) et la valeur, la valeur de la PK de la FK. Et comme le voit dans l’exemple, si on veut passer le nom explicite de l’attribut de la fk, on peut au choix mettre ou pas le _id, le résultat est le même.

Exemple :

>>> Entry.objects.values()
[{'blog_id: 1, 'headline': u'First Entry', ...}, ...]

>>> Entry.objects.values('
blog')
[{'
blog': 1}, ...]

>>> Entry.objects.values('
blog_id')
[{'
blog_id': 1}, ...]

values_list c’est à peu près la même chose que values, sauf que c’est une liste de tuple et pas une liste de dico. On peut en plus lui passer un paramêtre flat que l’on peut mettre à true , pour ‘aplatir’ les tuples quand l’on demande qu’un seul champ (juste coolos quand on veut une liste de pk)

>>> Entry.objects.values_list('id').order_by('id')
[(1,), (2,), (3,), ...]

>>> Entry.objects.values_list('id', flat=True).order_by('id')
[1, 2, 3, ...]

A quoi sert values et values_list ?

L’intérêt c’est qu’un ValuesQuerySet, c’est comme un queryset. Et que donc on peut utiliser toutes les méthodes des queryset dessus. Y compris refiltrer, order_by, etc etc ..

Et que dans le même temps, on peut alléger la charge, surtout si on a des gros models dont l’on ne veut utiliser que quelques champs.

defer (*fields)

Permet d’indiquer au queryset de ne pas récupérer automatiquement le contenu des champs qui sont passés en paramêtre du defer. Ca peut être utile dans le cas de gros champ texte par exemple (imaginons une vue en liste de billet de blog où l’on ne veut que les titres des billets et pas leur contenu, utiliser un defer(‘body’) pourrait être une possibilité , utiliser un values en serait une autre)

les champs deferred seront récupérés quand on les appelera explicitement. Pour annuler les defer d’un queryset, il suffit d’appeler la fonction avec None en paramêtre.

only (*fields)

C’est l’inverse du defer, on ne récupère que certains champs.

2- Les fonctions qui ne renvoient pas un queryset.

in_bulk(id_list)

Cette petite fonction bien sympa prend une liste de pk et renvoie un dico des objets qui correspondent (les clés étant les pk)

latest(field_name=None)

Renvoie le dernier objet, inséré dans la base, en se basant sur les dates et en utilisant le champ passé en paramètre (qui doit donc être un champ  date).
Si le model en question définit la Meta get_latest_by, on peut appeler latest sans argument.

Ok, cette fonction ‘ne sert à rien’ à part pour rendre plus lisible le code. Mais bon, ça ne mange pas de pain. Et l’utilisation de la Meta get_latest_by permet de ‘centraliser’ la façon de rechercher le dernier, ce qui rendra une modification plus facile.

aggregate(*args, **kwargs)

Retourne un dico des valeurs d’aggrégat calculés non pas objet par objet comme avec annotate, mais sur tout le queryset.

A vous les sommes de champ, les moyennes ou autre. Vive les rapports :).

>>> q = Blog.objects.aggregate(Count('entry'))
{'entry__count': 16}
>>> q = Blog.objects.aggregate(number_of_entries=Count('entry'))
{'number_of_entries': 16}

et comme pour annotate, on peut contrôler le nom, ici de la clé, que notre valeur calculée.

exists()

cette fonction n’existe pas encore dans django, elle sera présente dans la 1.2. Elle permet tout simplement de savoir si le queryset est vide ou pas. (oui je sais, devoir attendre la 1.2 pour avoir cette fonction.. mais bon 🙂 ).

Résultats des jeux pour gagner des clés Leelh

Et voilà arrivée la fin des petits jeux pour gagner des clés closed beta Leelh. J’avais annoncé que je mettais deux clés en jeux, une pour les RT twitter, une pour les commentaires sur mon billet.

Au vu du nombre important de commentaires sur mon blog (33) j’ai décidé de changer les règles du jeux. Il y aura donc une clé pour Twitter et deux pour les commentaires.

Le tirage au sort :
Il y a eu 2 tirages, un pour twitter, un pour les commentaires. J’ai utilisé random.org et une main innocente (celle de ma chère et tendre) pour lancer les tirages.

Concernant twitter, le screen du tirage :

le gagnant est @Gilles_T qui recevra sa clé par DM.

Concernant les commentaires du posts le screen du tirage est :

Les gagnants sont donc :

  • celticghost
  • Aydn

qui recevront leur clés par mail.

Et en tout cas, merci à tous d’avoir participé à ce petit jeu concours. .. Je sens d’ailleurs que je vais en organiser plus souvent, c’est rigolo de faire gagner des choses à des gens :).

EDIT :

Hier soir, lors du tirage, j’ai fait une grosse bêtise, certains, peut-être s’en seront rendu compte. En effet, quelqu’un a posté 2 commentaires, je n’ai donc compté qu’une fois son nom dans le tirage (j’ai donc fait un tirage sur 33 et non 34). Sauf que, du coup, le 28 je l’ai transformé en 27. Alors qu’en fait non, j’aurais du le transformer en 29. Oui je sais, il ne faut pas faire des tirages de concours quand on manque gravement de sommeil. Je ne le ferrais plus.  Je me demandais comment réparer cette injustice lorsque j’ai eu le plaisir de pouvoir vous offrir de nouvelles clés. Du coup, je vais corriger mon erreur en envoyant un clé à notelteers qui était le “vrai” gagnant de hier.

Et j’ai le plaisir de pouvoir faire de nouveaux heureux qui sont :

  • Xamm (y en a qui sont chanceux ….)
  • BulZor
  • Mrm007

Voila voila, et non, il n’y aura pas, une troisième fournée de gagnant … faut pas pousser non plus. 🙂

Petit jeu ou comment gagner des clés pour la closed bêta de Leelh

J’ai déjà parlé il y a quelques temps de Leelh, le Meuporg MMORPG web qui, je le pense, va être bien bien prometteur. J’avais alors annoncé que la closed bêta allait bientôt démarrer.

C’est maintenant chose faite, la closed bêta est là. Et qui dit closed bêta, dit clé qu’il faut avoir pour pouvoir jouer.

Et comme je suis un super gentil blogueur, je vous propose d’en gagner deux. Comment ?

Soit vous retweetez le twitt qui va parler de ce billet et du fait que je fais gagner des clés Leelh.
Soit vous laissez un petit commentaire ici.

Dans tous les cas, je donnerais demain soir, les deux clés (par mail et DM), en tirant au hasard parmi les participants (ou en les donnant direct s’il n’y a qu’un seul commentaire et qu’un seul RT).

En espérant vous croiser bientôt sur Leelh.

(Et puis hop, une petite BD Leelh encore, pour le plaisir des yeux).

EDIT du mardi matin : comme dit hier, j’arrêterai donc la prise en compte des RT/commentaires ce soir vers 23 heures et je ferai alors le tirage au sort (par une main innocente) des gagnants.

ULTIME EDIT : le jeux est fini, les clés ont été distribuées.

Django-rosetta, parce que pierre qui roule n’amasse pas mousse

Vous aimez mon titre ? Parce que moi, j’en suis super fier en fait. Et oui, il m’en faut peu. Bon donc pour la django-app du mois de février, j’avais choisi django-transmeta qui permettait de traduire facilement son contenu. Mais un site n’est pas fait que de contenu, il est aussi fait de label, de menu, de tout plein de truc qu’il faut internationaliser à coup de .po et de .mo. Ce qui est, il faut bien le dire, un poil chiant. Limite je pourrais dire, qu’à vouloir traduire tout ces mots, on pourrait bien finir par y laisser notre peau.

C’est là que django-rosetta intervient.

1- Où on le trouve, comment on l’installe, tout ça quoi (et la doc) ?

Comme bien souvent, sur la page qui lui est destiné, qui est, un google code. Pour l’installation, rosetta fait dans le rustique : tar.gz ou svn checkout. Brut mais efficace.

Ensuite il suffira de rajouter django-rosetta dans les INSTALLED_APPS  et de rajouter ses urls dans l’urlpattern qui va bien. Et c’est tout, après roule ma poule (ou ma pierre, de rosette HA HA).

Pour la doc, la encore, il n’y a que la page home du google code. Mais l’app est suffisament bien faite, pour que la doc présente soit amplement suffisante.

2- Comment ça marche ?

Django-rosetta vous permet de rendre la rédaction des .po moins chiante que dans un simple gedit. Mais du coup, cela veut dire que l’application a besoin d’avoir les permissions d’écritures sur certains des fichiers de votre arborescence.

Du coup, elle n’est utilisable que de l’admin django. C’est un choix qui me semble, en fait, très logique. Et puis est ce que cela existe des gens qui n’utilisent pas du tout la partie admin de django ?

Ensuite, c’est tout simple, on a une liste des fichiers po, avec les pourcentages de traduction effectuées. On en choisit un et on se met au boulot. On peut même choisir si l’on veut afficher toute s les chaines ou que celle que l’on n’a pas encore traduite.

Allez op, deux petites images pour vous montrer le truc, parce que je suis gentil. (Et puis que je ne me suis pas trop fatigué, je reprend honteusement celles du google code officiel).

Voilà, avec cette deuxième app, j’en ai fini de parler, en tout cas pour un temps, d’internationalisation. A bientôt (dans un mois) pour de nouvelles découvertes dans le merveilleux pays des app django.

Réflexions sur les TOD (Truc à la demande)

Ca fait quelques temps que je me dis que je vais écrire un billet sur le sujet. Et quelques temps que je me dis que non, ça ne sert pas à grand chose et que je vais perdre mon temps (et vous faire perdre le votre) en écrivant sur un sujet qui a déjà fait couler tellement d’encre (je pourrais dire qui a fait transiter tellement de bytes, mais je trouve que la vieille expression est bien plus jolie).

Mais au final, l’annonce du lancement de la plateforme Izneo (est ce une référence à celui qui voulait devenir calife à la place du calife ?) m’a décidé à écrire un billet sur les TOD et plus largement sur le marché des Trucs numériques.

Parce que j’ai un peu l’impression que bien souvent, les sociétés de contenu, on va dire, partent du principe que On Demand ça veut dire ‘on va vous prendre pour des cons et s’en mettre plein les poches’.

Je prend un exemple. La série The Mentalist, diffusé sur TF1. Je n’ai pas regardé les épisodes en diffusion le mercredi soir. (j’aime regarder les épisodes dans l’ordre, déjà que la VF …) J’aurais pu les enregistrer puis les remettre dans l’ordre mais j’y ai pas pensé. Mais bon, je me suis dit, je vais voir si je peux pas les regarder en VOD. Je vais donc sur le site de TF1 et là… j’hallucine complet. Un épisode va me couter 1,99 euros. Et je pourrais le voir à volonté pendant 48h. Après, plus rien.

Donc je fais le calcul. 23 épisodes pour la saison 1. soit la totalité de la saison pour 46 euros. Pour simplement pouvoir les regarder pendant 48 heures chaque épisode. Alors que sur amazon, j’ai le coffret DVD complet, pour 35 euros. Et avec des vrais DVD que je peux regarder autant que je veux, quand je le veux (même dans 3 ans) et que je peux prêter à mes amis. Alors qui va acheter de la VOD TF1 ?

Et pour izneo, c’est le même principe. 2 euros (1,99 mais bon allez, arrêtez de chipoter), pour pouvoir lire une bd pendant 10 jours ? Et après plus rien… Alors j’aime beaucoup les livres et j’adorerais les lire en numérique mais faut pas non plus déconner. 2 euros, (voir un peu plus, mais plus que la moitié du prix physique), c’est le prix que je serais prêt à payer pour une édition numérique de BD que je pourrais conserver, ad vitam. Sachant qu’en plus si j’aime je vais acheter la version papier. Mais que même si je n’achète pas la version papier, 2 euros une version numérique (voir un peu plus), ça ne me semble pas être un tarif qui va faire vendre père et mère au maisons d’éditions. Mais deux euros pour un truc lisible pendant 10 jours, sérieusement non. A 50 cents ok, ça me permet de lire une première fois pour savoir si je veux vraiment l’acheter puis de l’acheter. Mais plus.. Faut pas déconner. ( A ce point de ma diatribe, je pense que je dois préciser que je suis un gros consommateurs de bouquins, j’ai un budget mensuel bouquin compris entre 60 et 120 euros et qui monte parfois à 150 euros, donc oui des bouquins j’en achète, sans arrêt, en fait au vu de mon compte en banque, je dirais même que j’en achète trop. Voilà, la précision est faite.)

En fait, je ne comprend vraiment pas comment réfléchissent les vendeurs de TOD… parce qu’on le sait tous qu’hormi les couts d’infrastructure pour gérer les augmentations de charge (les serveurs, la bande passante tout ça), une fois le cout de production du TOD amorti, le prix de vente n’est plus que marge brute.

Donc pourquoi faire des prix aussi élevés ? Et après venir râler que les plateforme ne décollent pas ?

Pourquoi ne pas proposer des prix adéquat, qui allongeront, il est vrai, au départ, le temps de rentabilisation du TOD, mais permettront de vendre plus..

Je sais pas, ça me semble plus logique de vendre 50 000 TOC à 50 cents l’un que 1000 à 2 euros l’un. Mais peut-être que c’est pas logique et qu’il vaut mieux vendre 1000 à 2 euros. Ou alors peut-être que les vendeurs de TOD pensent qu’on est tous des salauds qui ne cherchent qu’à avoir des trucs gratuits et que donc moins cher, ça se vendra pas mieux et qu’il vaut mieux mettre un bon coup de bambou derrière le crane de ceux qui achètent que de tenter de se dire que moins cher, les gens achèteront plus… (A mais là, ça voudrait dire qu’il faudrait un peu faire confiance au consommateur…. c’est sur)
Je ne comprends pas non la volonté de vouloir rendre le TOD périssable. Pour le plaisir d’emmerder ses clients ? Par vieux réflexe d’économie de la rareté en espérant que comme ça, le gentil client qui a acheté une fois sa bd ou son épisode de série, si il veut le revoir ou le relire dans 30 jours, il va le racheter à nouveau ? Sérieusement, pourquoi ?

Enfin, une piste qui est très peu explorée, c’est celle qui a été mise en place par spotify. Pourquoi pas un tarif mensuel avec un accès illimité à des ressources juste en consultation. C’est une idée trop bien pour qu’elle soit mise en place ? Parce que bon, mais si izneo ils me disent :’pour 10 ou 12 ou 14 euros par mois, tu peux lire autant de bd que tu veux’, mais je signe tout de suite et pour longtemps. Et là, ça n’a pas d’importance que si j’arrête mon abonnement à un moment ou un autre, je me retrouve une main devant, une main derrière, parce que pendant les X mois pendant lesquels j’aurais souscrit un abonnement, j’en aurais lu des bouquins. Et ceux qui m’auront vraiment plu, je les aurais même achetés, pour les avoirs, là, en vrai.

Alors après y a les gens qui vont dire ‘ouaip mais si les gens paient 10 ou 12 euros par mois pour lire autant qu’ils veulent, ils vont plus acheter de truc’. Ha ? Ha .. Tiens c’est étrange, je m’étais pas rendu compte que les bibliothèque, les vraies, celles où après s’être inscrit, on peut lire autant de livre que l’on veut et même les ramener chez soi pendant quelques temps, je ne m’étais pas rendu compte que ces lieux de perditions étaient en train de détruire l’économie du livre… Parce que bon, mon histoire de ‘licence globale’ sur un catalogue, c’est un peu ce que mette en place les bibliothèques, depuis des années. Et parfois même, l’inscription est gratuite…. vous vous rendez compte ?

Enfin, je vais arrêter de tirer à boulet rouge sur les vendeurs de TOD ou de Truc en format numériques. Mais bon, ça finit par énerver parfois de les voir pleurer encore et encore parce que les gens achètent pas, de les entendre chouiner que si ils achètent pas c’est parce qu’ils piratent et puis après de voir que quand on veut acheter un truc, on est pris pour des dindons.

Et bien entendu, je généralise. Il y a plein d’initiatives, plus qu’excellentes, comme in libro veritas qui propose différentes licences sur les bouquins (vive les créatives commons) et des pdf gratuits.

Ou Au diable vauvert (oui je sais, je les aime bien, mais bons, ils proposent des tellement bon bouquins) qui a proposé l’intégralité de Jpod, gratuitement, à travers son application Iphone. Et je suis sur que les ventes de Jpod n’ont pas été moins bonnes que les ventes de leurs autres bouquins, ‘malgré’, cette mise à disposition de l’oeuvre. Il faudrait leur demander (@audiablevauvert, je te pose une question 🙂 ), mais je suis prêt à leur payer un coup à boire si je me trompe.

Ce passage au numérique permet à mon sens d’imaginer tellement de nouvelles façons de proposer du contenu, de la culture, que je trouve triste à pleurer la non inventivité des vendeurs de TOD ou assimilés… Espérons qu’un jour cela change. (et les réductions sur le support physique quand on a déjà acheté la version numérique, hein … ou les contenus ‘en plus’ dans les versions numériques, voir des ‘clefs’ dans les contenus physiques pour ouvrir des contenus numériques…)

Izneo, plate forme de BD en ligne

Le salon du livre (un jour faudra que j’y aille, je pourrais dire bonjour à @audiablevauvert comme ça) sera au moins marqué par une annonce (voir plein d’autre, mais j’avoue ne pas avoir bien suivit ce qui s’y passe), la sortie d’izneo, une plateforme d’offre de lecture en ligne pour la BD.

Ce sont pas moins de douze éditeurs (Bamboo,Casterman,Circonflexe,Dargaud,Dupuis,Fei,Fluide Glacial, Grand Angle, Jungle, Kana, Le lombart et Lucky Comics) qui se réunissent et donnent accès à une partie de leur catalogue (600 titres). La promesse étant faite d’enrichir rapidement celui-ci, avec une centaine de titre de plus tout les mois.

izneo – démonstration from izneo on Vimeo.

C’est une initiative que je ne peux que saluer (même si j’aurais bien aimé y voir soleil). Au moins le secteur de la BD, ne fait pas comme d’autre que je ne nommerais pas et finit par passer au numérique.. Bon ok, on est en 2010, ok, des choses auraient pu être faite bien plus tôt, et ok tout n’est pas encore parfait, mais au moins une offre commence à se développer.

Pour l’instant la seule manière de lire des BD sur la plateforme, enfin la seule que l’on connaisse, c’est de la lecture en mode ‘location en streaming’, d’un album. Pour entrer dans les détails, c’est 1,99 euros (à toujours ces bons vieux 99 cents pour un album lisible à volonté, pendant 10 jours.

Et c’est là où je suis pas d’accord. Et c’est ce mode de fonctionnement qui fait que je n’utiliserais surement pas cette plateforme.Et même si je trouve la plateforme sympa et l’outil de lecture bien foutu (et la possibilité de lire les 5 premières pages, pour essayer, être non pas une bonne idée, parce que pour moi cela va de soi, qui achète une bd en librairie sans la feuilleter d’abord ?, mais une fonctionnalitée si peu souvent mis en place, qu’il faut le noter)

Pourquoi ? Je l’explique longuement dans un autre billet, celui ci (et si jamais quelqu’un de chez izneo se perd ici, qu’il aille le lire… 🙂 ). (et non, ce premier billet pour parler de izneo n’est pas juste une excuse pour faire un billet sur les TOD (Truc on demand), enfin disons presque pas).