|
|
-
Page 1 of 35 (
683 posts
)
- >>
Septembre 3, 2008
» Beer Over IP, version 2
C'est au prix de quelques sobres petites soirées que j'ai fini par aboutir à un code minimal pour propulser Beer Over IP dynamiquement, à l'aide d'une petite application Django (0.96).
Pour bénéficier de la toute-puissance de cette application web que le monde nous envie, il suffit d'aller faire un tour sur la liste des bières disponibles. Évidemment, pour le moment, cette liste est assez courte... Mais je suis totalement persuadé que toi aussi, tu peux aider à l'allongement de cette liste en fournissant via l'interface de bug de Launchpad :
-
le nom de la bière,
-
une photo ou un lien vers cette photo, sachant que ce média doit être absolument libre (license Creative Commons, par exemple),
-
les crédits appropriés,
À toi de jouer, bientôt, ta binouze favorite sera accessible à tous et toutes, via l'Internet.
Le code de cette application est publiée sous une double license... Non, pas la license IV, mais presque. L'application est libre, sous license WTFPL et BEERWARE. La première permet de faire ce que tu veux j'en ai rien à foutre , tandis que la suivante pose une condition : tu peux faire ce que tu veux avec ce code, mais si on a l'occasion de se rencontrer dans la vraie vie, tu peux me payer un verre .
» Paris Bobun Sprint du 11 au 14 septembre 2008
Un sprint Plone aura lieu chez Pilot Systems à Belleville, au coeur de Paris, du 11 au 14 septembre 2008. Ce rendez-vous incontournable permettra de mettre l'accent sur diverses fonctionnalités de Plone 3, comme le système de tag, le multimédia, plone.net, etc.
Septembre 2, 2008
» Un Chrome qui a besoin de polish
Non, non, je ne vais pas "annoncer" ce qui fait le tour de la blogophonie internationale depuis moins de 24h. Google Chrome sort, voilà.
Super.
Basé sur Webkit. Ouahou. Et le code source de Chrome est libre, lui aussi. Supaireuh. Au départ, Webkit, c'est le moteur qui était dans Konqueror (navigateur de KDE) et qui a été développé en surmultiplié pour Safari, le navigateur de Mac OSX (dérivé de FreeBSD).
Et il paraît que chez Google, on adore le Libre. Et j'ai pas les stats, mais je suis prêt à parier que les ingénieurs de chez Google sont en majorité sur des systèmes d'exploitation alternatifs à Windows.
Le web, en plus, c'est l'interopérabilité, l'endroit où tout le monde essaie de respecter les standards en vigueur, où l'on fait abstraction du système d'exploitation.
Et Google, c'est le big number one, le maousse kosto du web, le big kahuna qui veut flinguer la bande à Steve Ballmer. Et ils ont des armées de développeurs, leur doc Python entre les dents, prêts à faire exploser les barrières de l'Internet et au-delà.
Et donc, qu'est-ce qu'ils nous pondent ? Une appli basée sur WebKit qui ne fonctionne QUE sous Windows ?
Comprends pas. Windows a des parts de marché ultra-majoritaires sur les OS, mais pourquoi se contenter de 80 ou 90% quand on pourrait avoir une application qui couvre 100% des systèmes d'exploitation ? Je comprends rien. Google a largement la puissance de feu nécessaire pour publier simultanément un navigateur basé sur cette librairie Webkit qui est disponible partout et ils ne font que du Windows ?
Au secours ! Le Web 3.0 recule.
» PyRoom 0.3.1, et si on traduisait ?
Comme annoncé sur la page du projet dans Launchpad et comme le rappelait Florian "tiax" Heinle, PyRoom 0.3.1 a été mis à disposition, et est à présent prêt à être traduit... Déjà quelques langues sont déjà disponibles, mais quiconque avec des bonnes notions d'anglais et d'une autre langue peut aider à rendre PyRoom accessible dans toutes les langues du Monde (voire au-delà).
À noter qu'on peut, sous réserves de quelques opérations légèrement geeks installer directement PyRoom dans Ubuntu en utilisant le dépôt PPA officiel.
A ouais... taper
sudo apt-get install pyroom
Trop bien.
» Sortie de Django 1.0, une année de nouveautés
J'étais assez sceptique lors de l'annonce de la roadmap avant l'été mais il faut bien avouer que ça n'a pas chômé pendant ces vacances et que les développeurs sont arrivés à bout des fonctionnalités annoncées. Chapeau bas. Je ne vais pas faire un inventaire exhaustif des nouveautés (je vous laisse consulter la page dédiée) mais plutôt une liste des ajouts vraiment intéressants au quotidien au cours de cette dernière année.
Support complet de l'Unicode
Mergée l'été dernier, le nom de cette branche est assez explicite. Terminés les problèmes de charset/encoding lorsqu'on a des données propres, sinon iconv est votre ami.
Commandes personnalisées
La refactorisation des commandes internes de Django permet depuis un an d'ajouter très facilement des commandes personnalisées à votre projet. Vous pouvez par exemple voir ce que ça donne sur le script qui récupère les flux affichés dans la sidebar de ce site.
Échappement des variables dans les templates
Changement de la politique de sécurité en novembre dernier avec les variables échappées par défaut. Selon les cas, ça peut être pénible pour les mises à jour mais c'était à mon avis utile pour permettre aux débutants de ne pas faire trop d'erreurs à ce niveau. Il est toujours possible de contourner cette restriction via le filtre |safe ou le tag autoescape (great power, great responsabilities, tout ça).
Refactorisation des querysets
Fin avril, un énorme boulot est effectué en interne afin de corriger pas mal de bugs récalcitrants, ça permet (entre autres) d'ordonner plus facilement les querysets, de spécifier les champs couverts par un select_related, d'optimiser la façon de filtrer les résultats, de mettre à jour plusieurs instances d'un coup et surtout, le retour de l'héritage au niveau des modèles !
Modifications dans l'upload de fichiers
Début juillet, ça commence à s'accélérer, il est maintenant possible de lire les fichiers uploadés partie par partie. Ça n'a l'air de rien mais selon les types de fichiers sur lesquels vous travaillez ça peut vraiment faire la différence.
Nouvelle administration utilisant les newforms
C'est LA fonctionnalité qui donne à mon avis à Django une longueur d'avance sur les autres frameworks. Ajoutée mi-juillet, cette branche permet de générer une interface d'administration qui tient compte des droits utilisateurs, qui est vraiment flexible et customisable. L'interface qui était réservée aux personnes de confiance (administrateur) peut maintenant être utilisée pour développer un site complet. Le problème c'est qu'à partir de cette date là, avec les vacances et les commits qui s'accélèrent il devient plus prudent d'attendre la 1.0 et cette fonctionnalité n'a pas eu la promotion qu'elle méritait à mon avis. Cela dit il est temps de tester sa puissance maintenant, je joue avec depuis quelques jours et c'est vraiment du bonheur.
Ajout du support géographique
GeoDjango est enfin ajouté dans les contrib, très beau projet avec énormément de fonctionnalités indispensables lorsque vous commencez à vouloir savoir qui habite près de qui, quelle est la distance parcourue, etc.
Refactorisation des stockages de fichiers
Bon celui là c'est un peu mon chouchou car je l'ai testé à plusieurs reprises pour faire des retours à Marty Alchin et ça m'a mené à partager certains storages utiles pour Django. Il permet par exemple de stocker ses fichiers en local pour du développement et sur S3 pour de la production ou n'importe quelle combinaison possible et imaginable.
Nouveau système de commentaires
Pour finir, ce qui était attendu depuis... toujours, un GSoC est arrivé à terme ! Les commentaires ont été entièrement réécrits, j'utilise une version alpha de cette implémentation et je ne sais pas si je mettrais à jour, peut-être à l'occasion mais elle a l'avantage de ne pas être standard et pour lutter contre le spam on ne fait pas mieux ;-).
Enfin, il y a eu pas mal de ménage de fait sur d'anciennes parties de code (suppression des oldforms/validators entre autres), ce qui le rend plus facilement maintenable et une nouvelle documentation propulsée par Sphinx (l'outil qui mériterait un petit système de tickets pour être tout à fait parfait). Que du bon. De mon côté, on peut pas dire que j'ai vraiment avancé sur mes tickets, j'ai pas mal discuté de l'intérêt de l'utilisation du tag url dans blocktrans et au final la solution est venue presque par hasard ! J'ai pas eu le temps de m'occuper de tout ce qui était relatif à la séparation des tests mais j'ai mis à jour les traductions (ce qui représentait un sacré boulot, heureusement que j'ai eu de l'aide de la team fr).
Une année riche en nouveautés qui montre le dynamisme du framework, la 1.0 n'était qu'une étape nécessaire permettant de partir d'une base saine. Il y a encore 2/3 choses qui méritent d'être remises à plat pour la 1.1 mais sinon c'est clairement positif. Avec de telles fondations, il devient de plus en plus facile de développer son projet parfait, en tenant les délais ;-). Il ne manque plus que la sortie de Starcraft 2 pour faire le grand chelem...
PS : ça sort dans quelques heures, un peu de patience, je le publie maintenant suite à une petite erreur de ma part. En attendant qu'est-ce qui vous pousse/retient d'utiliser cette version ?
[edit du soir] : bon finalement ça commence par une faille de sécurité qui sera suivie d'une RC1.
[edit du 4 septembre, 1h47] : sortie de la version 1.0. Enfin.
La page officielle de migration est un bon début si vous n'êtes pas à jour.
Septembre 1, 2008
» À la saint Gilles, tes yeux écarquille
L'ami Gilles Fabio, me dit de te dire qu'en ce premier septembre 2008, il rouvre un site perso, propulsé par Django et au code source publié sous licence GPL v2+.
En attendant que le contenu débarque en masse, on peut tout de même se réjouir et appeler ça une très bonne nouvelle.
Décidément, 2008...
Août 28, 2008
» Mange-fric solaire
À Bayonne, depuis peu, on a vu apparaître de nouveaux horodateurs. Et attention, pas de la daube, hein ? La même couleur vert-forêt que les précédents, mais d'une minceur à toute épreuve. Fins, élancés...
Bon, l'ingénieur en charge de l'ergonomie et du design a dû se faire mal aux cheveux en fabriquant cette interface...
C'est simple et compliqué à la fois. Y'a des icônes dont on ne comprend pas ce que ça veut dire et y'a aucun texte explicatif. Évidemment qu'on peut pas expliquer en texte. Parce que si on commence avec le français, on est obligé de rajouter le basque, l'espagnol, l'anglais, et le gascon, par dessus-le marché. Et là, ça rentre pas. Les icônes ont bien l'air de parler de piécettes, puis d'un bouton machin-chose, et après, y'a l'icône qui dit rien à personne. Ah. Bon. Ben en demandant des explications, il s'agit du ticket qu'on se doit de remettre en évidence sous le pare-brise.
C'est beau la technique. Moi j'étais fier d'expliquer aux vacanciers que non, ils n'avaient pas besoin de retourner à leur voiture. L'ancien système, c'était : je tape mon immatriculation, je mets les sous, et terminé. Pas besoin de refaire à pinces le chemin en sens inverse pour re-repartir ensuite vers sa destination finale... M'enfin maintenant, puisque c'est le progrès, on revient à la bonne vieille méthode du ticket qui s'imprime et qui se glisse en évidence cent mètres plus loin.
À part ça, il paraît que c'est écolo, cet horodateur... Si si... Solaire, qu'il est. J'entends déjà les moqueries. Un horodateur solaire. Au Pays Basque... Une vraie provocation pour les nuages, qui s'en donnent à coeur joie depuis le début de l'été pour masquer le machin jaune supposé réchauffer le sol qui réchaufferait l'air bien gentiment par la suite. Ben non. Solaire, je te dis. Et en plus, ça marche... Enfin, quand ça plante pas. Parce que j'ai entendu pas mal de gens se plaindre que le système a des ratées. On ne peut pas trop le blâmer. C'est normal, on a toujours une période de débogage avant de balancer les prunes à tour de bras.
N'empêche qu'on notera un petit paradoxe : c'est écolo parce que ça fonctionne au solaire, et en même temps, on t'oblige à imprimer un petit ticket indispensable et à durée de vie très limitée. Donc, l'écologie, mouaif. Si on avait gardé le principe du "je rentre mon immatriculation et pas besoin de ticket", on aurait gagné à ne pas progresser.
En revanche, il y a une manoeuvre qui ne trompe pas. L'arrivée de ces nouveaux horodateurs "plus modernes tu meurs" coïncide très exactement avec la disparition de la sacro-sainte "demi-heure gratuite". Quand j'ai emménagé sur Bayonne, je me réjouissais de voir autant de parcs de stationnement gratuits ou à tarif relativement modique. Et je me réjouissais encore plus qu'on puisse obtenir une demi-heure gratuite de stationnement à tout moment de la journée, pour une course, un saut, une commission vite-faite-bien-faite. Je me réjouissais derechef en sachant qu'entre midi et 14h, le stationnement était gratuit, et qu'on pouvait se garer tranquillement à proximité d'un restaurant du centre, déguster la bonne cuisine bayonnaise en prenant son temps, et repartir sans se faire trop mal au portefeuille.
Aujourd'hui, l'addition devient de plus en plus salée. Les plats coûtent 2 ou 3 EUR de plus, et si tu fais longue table, tu peux prendre une prune de 11 EUR. Plus de stationnement gratuit le midi. Plus de demi-heure gratuite en journée. Plus ou presque plus de parc de stationnement gratuit. La vache à lait est rentrée à l'étable. On alimente les caisses au solaire.
C'est marrant, ça. Le fait que ces nouveaux parcmètres coïncident justement avec les nouveaux tarifs.
C'est marrant, ça. Le fait que ces nouveaux mange-fric solaires aient été installés après l'élection de M. Jean Grenet, et pas avant.
C'est marrant, hein ?
» Upload de fichiers et WSGI
Je viens de releaser gp.fileupload 0.5 qui fournis un ensemble de middlewares
WSGI pour gérer l'upload de fichiers.
Et ceci de manière quasi transparente. On colle le gp.fileupload.FileUpload
dans sa pile d'application et zou; les formulaire pourvu d'un
enctype=multipart/form-data sont attraper au vol par du javascript et une
barre de progression s'affiche à la soumission du formulaire. Il y a une petite
démo (et une belle doc Sphinx) disponible pour les curieux.
En général, on ouvre une transaction, on attends 3 heures qu'un fichier de
300Mo arrive, on se choppe 40 conflits au vol, et avec un peu de chance, la
transaction aboutit.
gp.fileupload.Storage catch les requêtes POST et attends d'avoir lu tout
son contenu.
Le contenu de la requête est parsé pour en extraire les fichiers qui sont écrit
sur le système de fichier dans un répertoire défini.
La requête originale est récrite en remplaçant le contenu original de chaque
fichier trouvé par son chemin sur le système de fichier.
C'est seulement ensuite que l'application à la main, avec un POST qui ne
dépassera pas le kilo octet. Ainsi le fichier est déjà stocké et la durée de la
transaction minimale.
Une option encore pas trop testée permet de desservir toutes les requêtes non
text/html depuis le middleware. Une fois que j'aurais un peu mieux testé ce
machin, l'utilisation de ce middleware pourra devenir totalement transparente
pour l'application.
Je n'ai rien inventé. C'est un système similaire à tramline. Peut être moins
optimal car tramline utilise mod_python et est donc totalement indépendant du
processus de l'application. Mais bon, je penses que c'est à la fois plus
simple d'utilisation (car cela ne nécessite pas Apache et mod_python,
justement) et plus transparent pour l'application.
Août 25, 2008
» Cahier de rentrée 2008-2009
Cahiers, stylos, claviers, souris, navigateurs, gommes, règles... Tout est prêt ? Alors je te prie de noter dans la marge la date et l'heure du devoir surveillé destiné à évaluer ton niveau en blogs et blogueries :
jeudi 28 août 2008, vers les 19h30, en la Taverne de l'Atalante
Et sachez qu'à moins d'un mot dûment signé, la réservation est OBLIGATOIRE, sous peine de recevoir un avertissement et deux heures de colles. Pour réserver, il suffit d'appeler (le jour même) le cinéma au : 05 59 55 76 63 et de bien spécifier que c'est pour le "rendez-vous des blogueurs".
A tes carnets !
Août 22, 2008
» Déboguer un programme Python avec gdb
Python est un langage interprété par une machine virtuelle appelée CPython. Dumoins, CPython est l'implémentation de référence, il en existe d'autres moins répendues (PyPy, Jython, IronPython, etc.). Pour ceux qui ne le savent pas encore, CPython est écrit en langage C. Lorsque CPython plante (« Fatal error: ... », erreur de segmentation ou autre), il est difficile de connaître les raisons du plantage. Ce billet devrait vous éclairer un peu si vous en êtes arrivé à passer par gdb pour déboguer Python. Recompiler Python sans les optimisations
Avant toute chose, je vous conseille vivement de recompiler Python pour désactiver les optimisations. Par défaut, Python demande à gcc d'optimiser au maximum. Or quand on débogue un programme optimisé (-O2 ou -O3), gdb se comporte bizzarement. Récupérez les sources de Python et ses dépendances. Sous Debian, on peut le faire en deux commandes :
apt-get build-dep python2.5
apt-get source python2.5
Modifiez le script configure : remplacez « -O3 » et « -g -O3 » par « -O0 -ggdb », puis compilez Python. Sous Debian :
cd python2.5-<tab>
vim configure
(... modifiez le fichier, sauvez, quittez ...)
dpkg-buildpackage -us -uc
Sinon :
./configure && make
Il n'est pas nécessaire d'installer Python : utilisez simplement le programme généré à la racine (./python) avec gdb.
Quelques informations sur le code source de CPython
Macros importantes :
- op : nom courant pour indiquer « object pointer »
- Py_INCREF(op) / Py_DECREF(op) : incrémente / décrémente le compteur de référence de l'objet
- Py_XINCREF(op) / Py_XDECREF(op) : idem, mais ne fait rien si op vaut NULL
Répertoires principaux :
- Objects/*.c : définition des objets de base (int, str, ...)
- Modules/*.c : code source de modules (bas niveau) écrit en C (_ctypes, _sre, zlib, ...)
- Lib/*.py : modules (haut niveau) écrits en Python
Fichiers intéressants :
- Python/ceval.c : boucle principale qui évalue le bytecode Python. Fichier très compliqué où il ne vaut mieux pas mettre les doigts ;-)
- Python/errors.c : gestion des erreurs
- Python/pythonrun.c : initialisation des modules et objets, gestion de la console
Macros gdbinit
Dans le code source de Python, on y trouve un fichier Misc/gdbinit. C'est une suite de macros pour gdb aidant au debug Python. Commandes principales :
- pystack : affiche la backtrace Python, plusieurs lignes de la forme « nom du fichier (ligne): nom de la fonction »
- pyo : affiche le contenu d'une variable Python (plante si la variable n'est pas du type PyObject !)
Copiez Misc/gdbinit dans ~/.gdbinit pour activer les macros.
Exemple d'une session de débogage
Un backtrace Python ressemble à ça :
(gdb) where
(...)
#3 0xb7ab63ff in time_sleep (...) at Modules/timemodule.c:198
#4 0x08123b5d in PyCFunction_Call (...) at Objects/methodobject.c:81
#5 0x0809523b in call_function (...) at Python/ceval.c:3403
#6 0x08091e84 in PyEval_EvalFrameEx (...) at Python/ceval.c:2205
#7 0x080954fe in fast_function (...) at Python/ceval.c:3491
#8 0x08095335 in call_function (...) at Python/ceval.c:3424
#9 0x08091e84 in PyEval_EvalFrameEx (...) at Python/ceval.c:2205
(...)
#22 0x080b9a4b in run_mod (...) at Python/pythonrun.c:1553
(...)
#26 0x080c7a55 in Py_Main (...) at Modules/main.c:592
#27 0x0805a1e9 in main (...) at ./Modules/python.c:57
Notes :
- Les premières frames montrent où Python en est actuellement : ici (frame #0..#3) Python est en train de dormir
- La fonction PyEval_EvalFrameEx() est le cœur de l'interprète Python. Elle interprète le bytecode, gère les exceptions, s'occupe d'empiler/dépiler les frames, etc.
La backtrace Python n'est pas réellement exploitable. Il vaut mieux utiliser pystack :
(gdb) pystack
/home/haypo/fusil3000/fusil/mas/univers.py (31): execute
/home/haypo/fusil3000/fusil/application.py (196): executeProject
/home/haypo/fusil3000/fusil/application.py (221): runProject
/home/haypo/fusil3000/fusil/application.py (242): main
fusil-python (693): <module>
Ah c'est tout de suite plus clair ! Pour afficher une variable, utilisez la commande pyo :
(gdb) pyo f
object : <frame object at 0x835e92c>
type : frame
refcount: 1
address : 0x835e92c
Débogage avec gdb sans les macros
Le gros problème des macros gdbinit est qu'elles ont besoin que le processus soit actif car des fonctions CPython sont réellement appelée par ces macros ! Donc si on travaille sur un fichier core ou que les macros ne fonctionnent pas, il faut passer en « mode manuel » (à la mano quoi ;-)).
(gdb) frame 5
#5 0x0809524f in call_function (pp_stack=0xbfdd3cfc, oparg=1) at Python/ceval.c:3403
3403 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
(gdb) print callargs
$3 = (PyObject *) 0xb788502c
(gdb) print *callargs
$4 = {ob_refcnt = 1, ob_type = 0x8168e40}
(gdb) print callargs->ob_type.tp_name
$5 = 0x814bc25 "tuple"
N'importe quel objet Python a au moins deux attributs : ob_type (pointeur vers son type) et ob_refcnt (compteur de références).
On sait qu'on a un tuple, on peut donc maintenant caster avec le type PyTupleObject :
(gdb) print *(PyTupleObject*)callargs
$7 = {ob_base = {ob_base = {ob_refcnt = 1, ob_type = 0x8168e40}, ob_size = 1}, ob_item = {0x81b5fc4}}
(gdb) print (*(PyTupleObject*)callargs).ob_item[0]
$9 = (PyObject *) 0x81b5fc4
(gdb) print (*(PyTupleObject*)callargs).ob_item[0]->ob_type.tp_name
$10 = 0x816154b "float"
(gdb) print *((PyFloatObject*)(*(PyTupleObject*)callargs).ob_item[0])
$12 = {ob_base = {ob_refcnt = 3, ob_type = 0x818dbe0}, ob_fval = 0.001}
Tout ça pour voir que callargs est un tuple contenant un nombre flottant : « (0.001,) » !
Pour récupérer la backtrace, il faut itérer sur les frames « PyEval_EvalEx » en partant du début. Déjà, voyons quelles sont les frames :
(gdb) where
(...)
#6 0x08091e98 in PyEval_EvalFrameEx (...) at Python/ceval.c:2205
(...)
#9 0x08091e98 in PyEval_EvalFrameEx (...) at Python/ceval.c:2205
(...)
#12 0x08091e98 in PyEval_EvalFrameEx (...) at Python/ceval.c:2205
(...)
C'est donc les frames 6, 9, 12, etc. Commandes pour récupérer le nom du fichier et la ligne :
(gdb) frame 6
(gdb) printf "%s\n", ((PyStringObject*)co->co_filename)->ob_sval
/home/haypo/prog/fusil/fusil/mas/univers.py
(gdb) lineno
31
(gdb) frame 9
(gdb) printf "%s\n", ((PyStringObject*)co->co_filename)->ob_sval
/home/haypo/prog/fusil/fusil/application.py
(gdb) lineno
196
(...)
On retrouve la même chose que pystack :
- /home/haypo/fusil3000/fusil/mas/univers.py:31
- /home/haypo/fusil3000/fusil/application.py:196
- ...
Mots de la fin
J'espère que vous n'aurez pas à en arriver là (utiliser gdb), mais parfois on n'a pas le choix.
Pour finir, une astuce pour utiliser Valgrind avec Python : il existe un fichier Misc/valgrind-python.supp dans le code source de Python. Utilisez-le avec un commande du style « valgrind --suppressions=(...)/Misc/valgrind-python.supp -- python script.py » pour ignorer les très nombreux faux positifs sur PyObject_Free() et PyObject_Realloc().
Août 21, 2008
Août 20, 2008
» Conférence Pycon Fr 2008 - Apprenez d'abord le python
Août 17, 2008
» Réunion mensuelle Paris 30 aout 2008
Comme chaque mois, la réunion mensuelle AFPy sur Paris.
Août 13, 2008
» Ouverture de BeerOverIp
Matthew Walster, alias dotwaffle avait touité ceci:
Opsview_IRC++ Big help guys, thanks! Now, there ought to be a site for BeerOverIP - Scred?
Il était apparemment content de l'aide apportée par le channel IRC opsview, et il se demande ne devrait-il pas y avoir un site pour le protocole BeerOverIP (Bière sur IP) ?
Ce qui m'a fait bondir sur mon clavier et créer en un temps record (c'est donc très sale au point de vue HTML) : Beer Over IP.
À présent, si tu veux offrir une bière via le web, tu peux.
TODO:
-
pouvoir choisir le type de bière (beeroverip.org/stout, beeroverip.org/lager, beeroverip.org/blonde). Pour la marque de bière, j'y crois pas trop, je pense pas pouvoir disposer d'images libres de droit.
-
ajouter une forme d'internationalisation qui change la langue d'affichage en fonction du navigateur.
-
vérifier que tout ceci est conforme à la loi Évin (hem... je doute).
Août 12, 2008
» Annonce : ch. dév. web django
On pensait que la saison avait un fort impact sur le recrutement, mais il arrive qu'on soit détrompé.
La société pour laquelle je travaille, Interface IP, cherche à recruter un développeur web "agile". Nous travaillons quasi-exclusivement en utilisant le framework web Django, et c'est en priorité ce type de profil que nous recherchons, mais nous n'excluons pas d'étudier les candidatures de développeurs ayant suffisamment de curiosité intellectuelle pour avoir envie de découvrir de nouvelles technologies...
La curiosité c'est bien, mais l'expérience, c'est encore mieux : évidemment, il faut posséder une bonne culture Web et maîtriser au moins un framework web de type MVC (rails, symfony, turbogears, DJANGO) mettra ton CV sur le dessus de la pile. Si en plus tu es familier d'un gestionnaire de révisions (mercurial, bzr, git, svn...) et que tu pratiques le développement dirigé par les tests (TDD), alors c'est le summum.
Notre société est basée à Bayonne, France, et si nous acceptons une dose de télétravail,
il est plus facile pour nous d'avoir quelqu'un sur place.
Contacter Sébastien Guibert, en adressant CV + petit mot gentil à recrutement arobase interfaceip point fr
(il n'est pas nécessaire de parler basque pour répondre à l'annonce)
» Le manuel d'utilisation Plone 3 en français !
Plone 3 est disponible depuis 1 an. Aujourd'hui, c'est son manuel utilisateur qui est disponible... en français !
Août 11, 2008
» La liste des applications/lib utiles pour un nouveau projet Django - Keep Da Link
Août 9, 2008
» Back from Dax
Je suis donc allé hier soir à l'observatoire de Dax, sous un ciel splendide, d'une stabilité tout à fait correcte compte tenu des conditions qui avaient précédé.
Une bonne soixantaine de visiteurs ce soir-là, avec deux télescopes en batterie pour une jolie petite séance d'observation. Les étoiles filantes ont évidemment donné lieu à des "OH !" et des "AH !" (ainsi que des "oh, zût, je l'ai encore loupée"). Note aux gens : les étoiles filantes, on en voit toute l'année. Des fois, c'est même des vraies pluies qui peuvent éclairer "comme en plein jour". Pour ma part, je n'ai jamais fait de sortie astronomique sans en voir. Il suffit donc de sortir des villes à la pollution lumineuse suffocante et de regarder sans se faire mal au cou la partie ouest-nord-ouest du ciel. Bref.
Ai revu avec plaisir l'ami HFOSAF. C'est étrange, on se voit une fois l'an, et c'est comme si on s'était quittés la veille... à part que le temps de se dire "bonjour", et on a déjà passé 7 heures à raconter des conneries. C'est d'ailleurs à cause de cette étrange distortion spatio-temporelle que je me suis retrouvé au lit vers 8h du mat', et debout trop tôt.
Là, dodo.
Note :
J'avais pris le D70, comme pour voir ce que ça pouvait donner de faire des photos de nuit sans utiliser de flash. Mouais bon... Ça bouge, c'est flou, sombre, sans détail. Mais des fois, on a des belles surprises. La prochaine fois, je viens avec un trépied.
Album "Nuit des étoiles 2008 - Dax"
Août 8, 2008
» Dax is back
Ce soir, j'irai à Dax.... non non non non, je ne suis pas subitement devenu amateur des fêtes de Dax ou autres machins en blanc et rouge. Il se trouve que c'est la Nuit de Étoiles, et connaissant bien la bonne réputation de l'observatoire, et avec la quasi certitude d'y retrouver de vieux copains, c'est certainement le lieu idéal.
Même si le temps est incertain. Y'a toujours des totoches au frais et du café au chaud, alors...
» Pyroom 0.3
Ce n'est pas pour que j'y sois pour grand-chose, en fait tout le mérite vient essentiellement à Florian Heinle (alias tiax), ainsi que d'autres membres de l'équipe de développement de PyRoom, qui ont consciencieusement travaillé à faire progresser cet outil libre.
PyRoom est disponible en version 0.3 depuis le (tout nouveau tout beau) site internet pyroom.org. Le paquetage pour Debian / Ubuntu devrait bientôt être disponible.
PyRoom est un éditeur de texte plein-écran, monochrome. Comme l'application prend tout l'écran, et qu'elle dispose des "gadgets" minimum, elle élimine les distractions et l'utilisateur peut se concentrer sur son travail essentiel, écrire.
PyRoom est entièrement conçu en Python / GTK et est distribué selon les termes de la licence GPL v3.
-
Page 1 of 35 (
683 posts
)
- >>
|