From 3416382f37c527194c845d3ba65cd3fea12f4181 Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Fri, 19 Aug 2011 19:35:56 -0100 Subject: [PATCH 1/8] Update documentation --- a-distutils2-gsoc.html | 186 ++ amap-media-paniers-bio-a-5e.html | 188 ++ ...-summer-of-code-working-on-distutils2.html | 298 +++ ...context-to-build-up-a-web-recommender.html | 333 ++++ archives.html | 198 ++ author/Alexis Métaireau.html | 1084 +++++++++++ categories.html | 129 ++ category/asso.html | 292 +++ category/dev.html | 777 ++++++++ category/python.html | 190 ++ category/system.html | 351 ++++ category/thoughts.html | 238 +++ ...y-change-your-gnome-desktop-wallpaper.html | 198 ++ feeds/all-en.atom.xml | 1681 +++++++++++++++++ feeds/all.atom.xml | 1681 +++++++++++++++++ feeds/asso.atom.xml | 135 ++ feeds/dev.atom.xml | 1167 ++++++++++++ feeds/python.atom.xml | 41 + feeds/system.atom.xml | 200 ++ feeds/thoughts.atom.xml | 146 ++ first-week-working-on-distutils2.html | 226 +++ ...or-how-the-social-coding-can-help-you.html | 256 +++ ...-to-go-to-the-distutils2-paris-sprint.html | 173 ++ how-to-install-nginx-php-53-on-freebsd.html | 202 ++ how-to-reboot-your-bebox-using-the-cli.html | 204 ++ index.html | 1097 +++++++++++ ...oducing-the-distutils2-index-crawlers.html | 274 +++ le-temps-des-graces-courrez-y.html | 215 +++ pages/projects.html | 163 ++ pelican-9-months-later.html | 172 ++ ...imple-static-blog-generator-in-python.html | 216 +++ pypi-on-couchdb.html | 248 +++ python-go.html | 256 +++ ...vironnement-la-consommation-etudiante.html | 195 ++ sprinting-on-distutils2-in-tours.html | 236 +++ static/images/unison.png | Bin 0 -> 12100 bytes tag/browsers.html | 329 ++++ tag/dbpedia.html | 190 ++ tag/freebsd.html | 302 +++ tag/java.html | 221 +++ tag/nice story.html | 168 ++ tag/open source.html | 168 ++ tag/pelican.html | 168 ++ tag/python.html | 273 +++ tag/recommendations.html | 329 ++++ tag/sparql.html | 190 ++ tag/unison.html | 302 +++ tag/users.html | 329 ++++ tags.html | 0 theme/css/main.css | 424 +++++ theme/css/pygment.css | 205 ++ theme/css/reset.css | 52 + theme/css/wide.css | 43 + theme/images/icons/delicious.png | Bin 0 -> 963 bytes theme/images/icons/lastfm.png | Bin 0 -> 980 bytes theme/images/icons/linkedin.png | Bin 0 -> 376 bytes theme/images/icons/rss.png | Bin 0 -> 896 bytes theme/images/icons/twitter.png | Bin 0 -> 835 bytes travailler-moins-pour-mieux-travailler.html | 198 ++ un-coup-de-main-pour-mon-memoire.html | 181 ++ ...text-rest-to-power-your-presentations.html | 182 ++ ...g-dbpedia-to-get-languages-influences.html | 194 ++ using-jpype-to-bridge-python-and-java.html | 225 +++ ...sync-your-dev-environment-with-unison.html | 306 +++ wrap-up-of-the-distutils2-paris-sprint.html | 192 ++ 65 files changed, 18817 insertions(+) create mode 100644 a-distutils2-gsoc.html create mode 100644 amap-media-paniers-bio-a-5e.html create mode 100644 an-amazing-summer-of-code-working-on-distutils2.html create mode 100644 analyse-users-browsing-context-to-build-up-a-web-recommender.html create mode 100644 archives.html create mode 100644 author/Alexis Métaireau.html create mode 100644 categories.html create mode 100644 category/asso.html create mode 100644 category/dev.html create mode 100644 category/python.html create mode 100644 category/system.html create mode 100644 category/thoughts.html create mode 100644 dynamically-change-your-gnome-desktop-wallpaper.html create mode 100644 feeds/all-en.atom.xml create mode 100644 feeds/all.atom.xml create mode 100644 feeds/asso.atom.xml create mode 100644 feeds/dev.atom.xml create mode 100644 feeds/python.atom.xml create mode 100644 feeds/system.atom.xml create mode 100644 feeds/thoughts.atom.xml create mode 100644 first-week-working-on-distutils2.html create mode 100644 fork-you-or-how-the-social-coding-can-help-you.html create mode 100644 help-me-to-go-to-the-distutils2-paris-sprint.html create mode 100644 how-to-install-nginx-php-53-on-freebsd.html create mode 100644 how-to-reboot-your-bebox-using-the-cli.html create mode 100644 index.html create mode 100644 introducing-the-distutils2-index-crawlers.html create mode 100644 le-temps-des-graces-courrez-y.html create mode 100644 pages/projects.html create mode 100644 pelican-9-months-later.html create mode 100644 pelican-a-simple-static-blog-generator-in-python.html create mode 100644 pypi-on-couchdb.html create mode 100644 python-go.html create mode 100644 semaine-de-lenvironnement-la-consommation-etudiante.html create mode 100644 sprinting-on-distutils2-in-tours.html create mode 100644 static/images/unison.png create mode 100644 tag/browsers.html create mode 100644 tag/dbpedia.html create mode 100644 tag/freebsd.html create mode 100644 tag/java.html create mode 100644 tag/nice story.html create mode 100644 tag/open source.html create mode 100644 tag/pelican.html create mode 100644 tag/python.html create mode 100644 tag/recommendations.html create mode 100644 tag/sparql.html create mode 100644 tag/unison.html create mode 100644 tag/users.html create mode 100644 tags.html create mode 100644 theme/css/main.css create mode 100644 theme/css/pygment.css create mode 100644 theme/css/reset.css create mode 100644 theme/css/wide.css create mode 100644 theme/images/icons/delicious.png create mode 100644 theme/images/icons/lastfm.png create mode 100644 theme/images/icons/linkedin.png create mode 100644 theme/images/icons/rss.png create mode 100644 theme/images/icons/twitter.png create mode 100644 travailler-moins-pour-mieux-travailler.html create mode 100644 un-coup-de-main-pour-mon-memoire.html create mode 100644 use-restructured-text-rest-to-power-your-presentations.html create mode 100644 using-dbpedia-to-get-languages-influences.html create mode 100644 using-jpype-to-bridge-python-and-java.html create mode 100644 working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html create mode 100644 wrap-up-of-the-distutils2-paris-sprint.html diff --git a/a-distutils2-gsoc.html b/a-distutils2-gsoc.html new file mode 100644 index 0000000..89d90de --- /dev/null +++ b/a-distutils2-gsoc.html @@ -0,0 +1,186 @@ + + + + A Distutils2 GSoC + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

A Distutils2 GSoC

+
+ +

WOW. I've been accepted to be a part of the +Google Summer Of Code +program, and will work on python +distutils2, with +a +lot of +(intersting!) people.

+
+So, it's about building the successor of Distutils2, ie. "the +python package manager". Today, there is too many ways to package a +python application (pip, setuptools, distribute, distutils, etc.) +so there is a huge effort to make in order to make all this +packaging stuff interoperable, as pointed out by +the PEP 376.
+

In more details, I'm going to work on the Installer / Uninstaller +features of Distutils2, and on a PyPI XML-RPC client for distutils2. +Here are the already defined tasks:

+
    +
  • Implement Distutils2 APIs described in PEP 376.
  • +
  • Add the uninstall command.
  • +
  • think about a basic installer / uninstaller script. (with deps) +-- similar to pip/easy_install
  • +
  • in a pypi subpackage;
  • +
  • Integrate a module similar to setuptools' package_index'
  • +
  • PyPI XML-RPC client for distutils 2: +http://bugs.python.org/issue8190
  • +
+

As I'm relatively new to python, I'll need some extra work in order +to apply all good practice, among other things that can make a +developper-life joyful. I'll post here, each week, my advancement, +and my tought about python and especialy python packaging world.

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/amap-media-paniers-bio-a-5e.html b/amap-media-paniers-bio-a-5e.html new file mode 100644 index 0000000..41d3f85 --- /dev/null +++ b/amap-media-paniers-bio-a-5e.html @@ -0,0 +1,188 @@ + + + + AMAP + Média = Paniers bio à 5e ?! + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

AMAP + Média = Paniers bio à 5e ?!

+
+ +

Le raccourci me semble un peu rapide. Et pourtant, il est emprunté +bien trop souvent. La dernière mes-utilisation que j'ai à décrier +est celle d'un reportage télé, passé sur France 2 vendredi 23 +Octobre +(voir la vidéo), +ou on parles de +l'AMAP étudiante Zest.

+

Malgré tout le temps passé à expliquer que justement, l'AMAP c'est +avant tout, pour nous, une notion de solidarité envers les +agriculteurs, malgré le fait que le message soit plus profond que +simplement aller acheter du bio (ça, c'est possible aussi en +supermarché), malgré le fait qu'il s'agisse en fait d'une remise en +cause plus profonde de la société, les journalistes n'ont choisi de +prendre que les quelques secondes qui leurs convenaient, celles qui +ne faisaient pas tache, celle ou je dis que "l'AMAP permet aux +étudiants de réapprendre à cuisiner, plutôt que de manger des +nouilles et de se faire des plats réchauffés". Bien sur, je l'ai +dit et je le pense d'ailleurs, là n'est pas le problème, mais mon +message n'était pas celui là.

+

Jamais, dans les quelques minutes du reportage, on ne dit ce que +AMAP signifie: Association de Maintien d'une Agriculture +Paysanne. On ne parles même pas des agriculteurs ! C'est +simplement plus facile pour les étudiants de venir récupérer leurs +paniers, puisque les points de distribution sont sur les facs, et +en plus ça ne coute que 5 euros ! ...

+

Alors je crois bon de rappeler que L'AMAP n'est pas seulement un +service, c'est un engagement. Sur 5 mois, un engagement solidaire, +c'est la donnée principale de l'équation, celle sans quoi ça ne +peut fonctionner. Par le biais de cette AMAP, on essaye de montrer +que d'autres agricultures sont possibles, que la solidarité c'est +bien réel, et qu'il est possible de sortir du +tout, tout de suite.

+

Mais bon, apparemment, ça passe pas bien à la télé.

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/an-amazing-summer-of-code-working-on-distutils2.html b/an-amazing-summer-of-code-working-on-distutils2.html new file mode 100644 index 0000000..2e3cc23 --- /dev/null +++ b/an-amazing-summer-of-code-working-on-distutils2.html @@ -0,0 +1,298 @@ + + + + An amazing summer of code working on distutils2 + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

An amazing summer of code working on distutils2

+
+ +

The Google Summer of Code I've +spent working on distutils2 +is over. It was a really amazing experience, for many reasons.

+

First of all, we had a very good team, we were 5 students working +on distutils2: Zubin, +Éric, +Josip, +Konrad and me. In addition, +Mouad have worked on the PyPI +testing infrastructure. You could find what each person have done +on +the wiki page of distutils2.

+

We were in contact with each others really often, helping us when +possible (in #distutils), and were continuously aware of the state +of the work of each participant. This, in my opinion, have bring us +in a good shape.

+

Then, I've learned a lot. Python packaging was completely new to me +at the time of the GSoC start, and I was pretty unfamiliar with +python good practices too, as I've been introducing myself to +python in the late 2009.

+

I've recently looked at some python code I wrote just three months +ago, and I was amazed to think about many improvements to made on +it. I guess this is a good indicator of the path I've traveled +since I wrote it.

+

This summer was awesome because I've learned about python good +practices, now having some strong +mercurial knowledge, and I've +seen a little how the python community works.

+

Then, I would like to say a big thanks to all the mentors that have +hanged around while needed, on IRC or via mail, and especially my +mentor for this summer, Tarek Ziadé.

+

Thanks a lot for your motivation, your leadership and your +cheerfulness, even with a new-born and a new work!

+
+

Why ?

+

I wanted to work on python packaging because, as the time pass, we +were having a sort of complex tools in this field. Each one wanted +to add features to distutils, but not in a standard way.

+

Now, we have PEPs that describes some format we agreed on (see PEP +345), and we wanted to have a tool on which users can base their +code on, that's distutils2.

+
+
+

My job

+

I had to provides a way to crawl the PyPI indexes in a simple way, +and do some installation / uninstallation scripts.

+

All the work done is available in +my bitbucket repository.

+
+

Crawling the PyPI indexes

+

There are two ways of requesting informations from the indexes: +using the "simple" index, that is a kind of REST index, and using +XML-RPC.

+

I've done the two implementations, and a high level API to query +those twos. Basically, this supports the mirroring infrastructure +defined in PEP 381. So far, the work I've done is gonna be used in +pip (they've basically copy/paste the code, but this will change as +soon as we get something completely stable for distutils2), and +that's a good news, as it was the main reason for what I've done +that.

+

I've tried to have an unified API for the clients, to switch from +one to another implementation easily. I'm already thinking of +adding others crawlers to this stuff, and it was made to be +extensible.

+

If you want to get more informations about the crawlers/PyPI +clients, please refer to the distutils2 documentation, especially +the pages about indexes.

+

You can find the changes I made about this in the +distutils2 source code .

+
+
+

Installation / Uninstallation scripts

+

Next step was to think about an installation script, and an +uninstaller. I've not done the uninstaller part, and it's a smart +part, as it's basically removing some files from the system, so +I'll probably do it in a near future.

+

distutils2 provides a way to +install distributions, and to handle dependencies between releases. +For now, this support is only about the last version of the +METADATA (1.2) (See, the PEP 345), but I'm working on a +compatibility layer for the old metadata, and for the informations +provided via PIP requires.txt, for instance.

+
+
+

Extra work

+

Also, I've done some extra work. this includes:

+
    +
  • working on the PEP 345, and having some discussion about it +(about the names of some fields).
  • +
  • writing a PyPI server mock, useful for tests. you can find more +information about it on the +documentation.
  • +
+
+
+
+

Futures plans

+

As I said, I've enjoyed working on distutils2, and the people I've +met here are really pleasant to work with. So I want to continue +contributing on python, and especially on python packaging, because +there is still a lot of things to do in this scope, to get +something really usable.

+

I'm not plainly satisfied by the work I've done, so I'll probably +tweak it a bit: the installer part is not yet completely finished, +and I want to add support for a real +REST +index in the future.

+

We'll talk again of this in the next months, probably, but we +definitely need a real +REST +API for PyPI, as the "simple" index +is an ugly hack, in my opinion. I'll work on a serious +proposition about this, maybe involving +CouchDB, as it seems to be a good option +for what we want here.

+
+
+

Issues

+

I've encountered some issues during this summer. The main one is +that's hard to work remotely, especially being in the same room +that we live, with others. I like to just think about a project +with other people, a paper and a pencil, no computers. This have +been not so possible at the start of the project, as I needed to +read a lot of code to understand the codebase, and then to +read/write emails.

+

I've finally managed to work in an office, so good point for +home/office separation.

+

I'd not planned there will be so a high number of emails to read, +in order to follow what's up in the python world, and be a part of +the community seems to takes some times to read/write emails, +especially for those (like me) that arent so confortable with +english (but this had brought me some english fu !).

+
+
+

Thanks !

+

A big thanks to Graine Libre and +Makina Corpus, which has offered +me to come into their offices from time to time, to share they +cheerfulness ! Many thanks too to the Google Summer of Code program +for setting up such an initiative. If you're a student, if you're +interested about FOSS, dont hesitate any second, it's a really good +opportunity to work on interesting projects!

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/analyse-users-browsing-context-to-build-up-a-web-recommender.html b/analyse-users-browsing-context-to-build-up-a-web-recommender.html new file mode 100644 index 0000000..ec118bf --- /dev/null +++ b/analyse-users-browsing-context-to-build-up-a-web-recommender.html @@ -0,0 +1,333 @@ + + + + Analyse users' browsing context to build up a web recommender + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Analyse users' browsing context to build up a web recommender

+
+ +

No, this is not an april's fool ;)

+

Wow, it's been a long time. My year in Oxford is going really well. I realized +few days ago that the end of the year is approaching really quickly. +Exams are coming in one month or such and then I'll be working full time on my dissertation topic.

+

When I learned we'll have about 6 month to work on something, I first thought +about doing a packaging related stuff, but finally decided to start something +new. After all, that's the good time to learn.

+

Since a long time, I'm being impressed by the last.fm +recommender system. They're scrobbling the music I listen to since something +like 5 years now and the recommendations they're doing are really nice and +accurate (I discovered a lot of great artists listening to the +"neighbour radio".) (by the way, here is +my lastfm account)

+

So I decided to work on recommender systems, to better understand what is it +about.

+

Recommender systems are usually used to increase the sales of products +(like Amazon.com does) which is not really what I'm looking for (The one who +know me a bit know I'm kind of sick about all this consumerism going on).

+

Actually, the most simple thing I thought of was the web: I'm browsing it quite +every day and each time new content appears. I've stopped to follow my feed +reader because of the +information overload, and reduced drastically the number of people I follow on +twitter.

+

Too much information kills the information.

+

You shall got what will be my dissertation topic: a recommender system for +the web. Well, such recommender systems already exists, so I will try to add contextual +information to them: you're probably not interested by the same topics at different +times of the day, or depending on the computer you're using. We can also +probably make good use of the way you browse to create groups into the content +you're browsing (or even use the great firefox4 tab group feature).

+

There is a large part of concerns to have about user's privacy as well.

+

Here is my proposal (copy/pasted from the one I had to do for my master)

+
+

Introduction and rationale

+

Nowadays, people surf the web more and more often. New web pages are created +each day so the amount of information to retrieve is more important as the time +passes. These users uses the web in different contexts, from finding cooking +recipes to technical articles.

+

A lot of people share the same interest to various topics, and the quantity of +information is such than it's really hard to triage them efficiently without +spending hours doing it. Firstly because of the huge quantity of information +but also because the triage is something relative to each person. Although, this +triage can be facilitated by fetching the browsing information of all +particular individuals and put the in perspective.

+

Machine learning is a branch of Artificial Intelligence (AI) which deals with how +a program can learn from data. Recommendation systems are a particular +application area of machine learning which is able to recommend things (links +in our case) to the users, given a particular database containing the previous +choices users have made.

+

This browsing information is currently available in browsers. Even if it is not +in a very usable format, it is possible to transform it to something useful. +This information gold mine just wait to be used. Although, it is not as simple as +it can seems at the first approach: It is important to take care of the context +the user is in while browsing links. For instance, It's more likely that during +the day, a computer scientist will browse computing related links, and that during +the evening, he browse cooking recipes or something else.

+

Page contents are also interesting to analyse, because that's what people +browse and what actually contain the most interesting part of the information. +The raw data extracted from the browsing can then be translated into +something more useful (namely tags, type of resource, visit frequency, +navigation context etc.)

+

The goal of this dissertation is to create a recommender system for web links, +including this context information.

+

At the end of the dissertation, different pieces of software will be provided, +from raw data collection from the browser to a recommendation system.

+
+
+

Background Review

+

This dissertation is mainly about data extraction, analysis and recommendation +systems. Two different research area can be isolated: Data preprocessing and +Information filtering.

+

The first step in order to make recommendations is to gather some data. The +more data we have available, the better it is (T. Segaran, 2007). This data can +be retrieved in various ways, one of them is to get it directly from user's +browsers.

+
+

Data preparation and extraction

+

The data gathered from browsers is basically URLs and additional information +about the context of the navigation. There is clearly a need to extract more +information about the meaning of the data the user is browsing, starting by the +content of the web pages.

+

Because the information provided on the current Web is not meant to be read by +machines (T. Berners Lee, 2001) there is a need of tools to extract meaning from +web pages. The information needs to be preprocessed before stored in a machine +readable format, allowing to make recommendations (Choochart et Al, 2004).

+

Data preparation is composed of two steps: cleaning and structuring ( +Castellano et Al, 2007). Because raw data can contain a lot of un-needed text +(such as menus, headers etc.) and need to be cleaned prior to be stored. +Multiple techniques can be used here and belongs to boilerplate removal and +full text extraction (Kohlschütter et Al, 2010).

+

Then, structuring the information: category, type of content (news, blog, wiki) +can be extracted from raw data. This kind of information is not clearly defined +by HTML pages so there is a need of tools to recognise them.

+

Some context-related information can also be inferred from each resource. It can go +from the visit frequency to the navigation group the user was in while +browsing. It is also possible to determine if the user "liked" a resource, and +determine a mark for it, which can be used by information filtering a later +step (T. Segaran, 2007).

+

At this stage, structuring the data is required. Storing this kind of +information in RDBMS can be a bit tedious and require complex queries to get +back the data in an usable format. Graph databases can play a major role in the +simplification of information storage and querying.

+
+
+

Information filtering

+

To filter the information, three techniques can be used (Balabanovic et +Al, 1997):

+
    +
  • The content-based approach states that if an user have liked something in the +past, he is more likely to like similar things in the future. So it's about +establishing a profile for the user and compare new items against it.
  • +
  • The collaborative approach will rather recommend items that other similar users +have liked. This approach consider only the relationship between users, and +not the profile of the user we are making recommendations to.
  • +
  • the hybrid approach, which appeared recently combine both of the previous +approaches, giving recommendations when items score high regarding user's +profile, or if a similar user already liked it.
  • +
+

Grouping is also something to consider at this stage (G. Myatt, 2007). +Because we are dealing with huge amount of data, it can be useful to detect group +of data that can fit together. Data clustering is able to find such groups (T. +Segaran, 2007).

+

References:

+
    +
  • Balabanović, M., & Shoham, Y. (1997). Fab: content-based, collaborative +recommendation. Communications of the ACM, 40(3), 66–72. ACM. +Retrieved March 1, 2011, from http://portal.acm.org/citation.cfm?id=245108.245124&.
  • +
  • Berners-Lee, T., Hendler, J., & Lassila, O. (2001). +The semantic web: Scientific american. Scientific American, 284(5), 34–43. +Retrieved November 21, 2010, from http://www.citeulike.org/group/222/article/1176986.
  • +
  • Castellano, G., Fanelli, A., & Torsello, M. (2007). +LODAP: a LOg DAta Preprocessor for mining Web browsing patterns. Proceedings of the 6th Conference on 6th WSEAS Int. Conf. on Artificial Intelligence, Knowledge Engineering and Data Bases-Volume 6 (p. 12–17). World Scientific and Engineering Academy and Society (WSEAS). Retrieved March 8, 2011, from http://portal.acm.org/citation.cfm?id=1348485.1348488.
  • +
  • Kohlschutter, C., Fankhauser, P., & Nejdl, W. (2010). Boilerplate detection using shallow text features. Proceedings of the third ACM international conference on Web search and data mining (p. 441–450). ACM. Retrieved March 8, 2011, from http://portal.acm.org/citation.cfm?id=1718542.
  • +
  • Myatt, G. J. (2007). Making Sense of Data: A Practical Guide to Exploratory +Data Analysis and Data Mining.
  • +
  • Segaran, T. (2007). Collective Intelligence.
  • +
+
+
+
+

Privacy

+

The first thing that's come to people minds when it comes to process their +browsing data is privacy. People don't want to be stalked. That's perfectly +right, and I don't either.

+

But such a system don't have to deal with people identities. It's completely +possible to process completely anonymous data, and that's probably what I'm +gonna do.

+

By the way, if you have interesting thoughts about that, if you do know +projects that do seems related, fire the comments !

+
+
+

What's the plan ?

+

There is a lot of different things to explore, especially because I'm +a complete novice in that field.

+
    +
  • I want to develop a firefox plugin, to extract the browsing informations ( +still, I need to know exactly which kind of informations to retrieve). The +idea is to provide some raw browsing data, and then to transform it and to +store it in the better possible way.
  • +
  • Analyse how to store the informations in a graph database. What can be the +different methods to store this data and to visualize the relationship +between different pieces of data? How can I define the different contexts, +and add those informations in the db?
  • +
  • Process the data using well known recommendation algorithms. Compare the +results and criticize their value.
  • +
+

There is plenty of stuff I want to try during this experimentation:

+
    +
  • I want to try using Geshi to visualize the connexion between the links, +and the contexts
  • +
  • Try using graph databases such as Neo4j
  • +
  • Having a deeper look at tools such as scikit.learn (a machine learning +toolkit in python)
  • +
  • Analyse web pages in order to categorize them. Processing their +contents as well, to do some keyword based classification will be done.
  • +
+

Lot of work on its way, yay !

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/archives.html b/archives.html new file mode 100644 index 0000000..cebf423 --- /dev/null +++ b/archives.html @@ -0,0 +1,198 @@ + + + + Alexis' log + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+

Archives for Alexis' log

+ +
+ +
Wed 11 November 2009
+
AMAP + Média = Paniers bio à 5e ?!
+ +
Thu 17 December 2009
+
Python ? go !
+ +
Wed 24 February 2010
+
Semaine de l’environnement: La consommation étudiante
+ +
Sun 28 March 2010
+
Le temps des grâces, courrez-y !
+ +
Sat 01 May 2010
+
A Distutils2 GSoC
+ +
Fri 04 June 2010
+
first week working on distutils2
+ +
Fri 25 June 2010
+
Use Restructured Text (ReST) to power your presentations
+ +
Tue 06 July 2010
+
Introducing the distutils2 index crawlers
+ +
Tue 06 July 2010
+
Sprinting on distutils2 in Tours
+ +
Mon 16 August 2010
+
An amazing summer of code working on distutils2
+ +
Wed 06 October 2010
+
Pelican, a simple static blog generator in python
+ +
Sun 10 October 2010
+
How to install NGINX + PHP 5.3 on FreeBSD.
+ +
Mon 11 October 2010
+
Dynamically change your gnome desktop wallpaper
+ +
Thu 21 October 2010
+
How to reboot your bebox using the CLI
+ +
Fri 05 November 2010
+
Fork you ! or how the social coding can help you
+ +
Sat 15 January 2011
+
Help me to go to the distutils2 paris' sprint
+ +
Thu 20 January 2011
+
PyPI on CouchDB
+ +
Tue 08 February 2011
+
Wrap up of the distutils2 paris' sprint
+ +
Wed 16 March 2011
+
Working directly on your server? How to backup and sync your dev environment with unison
+ +
Fri 01 April 2011
+
Analyse users' browsing context to build up a web recommender
+ +
Thu 19 May 2011
+
Travailler moins pour mieux travailler ?
+ +
Wed 25 May 2011
+
Un coup de main pour mon mémoire!
+ +
Sat 11 June 2011
+
Using JPype to bridge python and Java
+ +
Mon 25 July 2011
+
Pelican, 9 months later
+ +
Tue 16 August 2011
+
Using dbpedia to get languages influences
+ +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/author/Alexis Métaireau.html b/author/Alexis Métaireau.html new file mode 100644 index 0000000..2cc12f2 --- /dev/null +++ b/author/Alexis Métaireau.html @@ -0,0 +1,1084 @@ + + + + Alexis' log - Alexis Métaireau + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + +
+

Other articles

+
+
    + + + + + + + + + +
  1. + + + + + + + +
  2. + + + + + + + +
  3. + + + + + + + +
  4. + + + + + + + +
  5. + + + + + + + +
  6. + + + + + + + +
  7. +
    +

    Help me to go to the distutils2 paris' sprint

    +
    + +
    + +

    Edit: Thanks to logilab and some amazing people, I can make it to paris for the +sprint. Many thanks to them for the support!

    +

    There will be a distutils2 sprint from the 27th to the 30th of january, thanks +to logilab which will host the event.

    +

    You can find more ...

    + read more +

    There are comments.

    +
    +
  8. + + + + + + + +
  9. +
    +

    How to install NGINX + PHP 5.3 on FreeBSD.

    +
    + +
    + +

    I've not managed so far to get completely rid of php, so here's a simple +reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but +that's worse to have the piece of configuration somewhere !

    +
    +# update the ports
    +$ portsnap fetch update
    +
    +# install php5 port
    +$ make ...
    + read more +

    There are comments.

    +
    +
  10. + + + + + + + +
  11. +
    +

    How to reboot your bebox using the CLI

    +
    + +
    + +

    I've an internet connection which, for some obscure reasons, tend to be very +slow from time to time. After rebooting the box (yes, that's a hard solution), +all the things seems to go fine again.

    +
    +

    EDIT : Using grep

    +

    After a bit of reflexion, that's also really easy ...

    + read more +

    There are comments.

    +
    +
  12. + + + + + + + +
  13. +
    +

    Introducing the distutils2 index crawlers

    +
    + +
    + +

    I'm working for about a month for distutils2, even if I was being a +bit busy (as I had some class courses and exams to work on)

    +

    I'll try do sum-up my general feelings here, and the work I've made +so far. You can also find, if ...

    + read more +

    There are comments.

    +
    +
  14. + + + + + + + +
  15. + + + + + + + +
  16. + + + + + + + +
  17. + + + + + + + +
  18. +
    +

    PyPI on CouchDB

    +
    + +
    + +

    By now, there are two ways to retrieve data from PyPI (the Python Package +Index). You can both rely on xml/rpc or on the "simple" API. The simple +API is not so simple to use as the name suggest, and have several existing +drawbacks.

    +

    Basically, if you want to ...

    + read more +

    There are comments.

    +
    +
  19. + + + + + + + +
  20. +
    +

    Python ? go !

    +
    + +
    + +

    Cela fait maintenant un peu plus d'un mois que je travaille sur un +projet en django, et que, +nécessairement, je me forme à Python. Je +prends un plaisir non dissimulé à découvrir ce langage (et à +l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui +me ...

    + read more +

    There are comments.

    +
    +
  21. + + + + + + + +
  22. + + + + + + + +
  23. +
    +

    Sprinting on distutils2 in Tours

    +
    + +
    + +

    Yesterday, as I was traveling to Tours, I've took some time to +visit Éric, another student who's working on distutils2 this +summer, as a part of the GSoC. Basically, it was to take a drink, +discuss a bit about distutils2, our respective tasks and general +feelings, and to ...

    + read more +

    There are comments.

    +
    +
  24. + + + + + + + +
  25. +
    +

    Travailler moins pour mieux travailler ?

    +
    + +
    + +

    Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +je suis assez impressionné du résultat: je suis de retour chez mes parents pour +le "easter break" et j'en ai profité pour donner un coup aux travaux de la +maison (et pour me reposer ...

    + read more +

    There are comments.

    +
    +
  26. + + + + + + + +
  27. +
    +

    Un coup de main pour mon mémoire!

    +
    + +
    + +

    Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit +coup de main.

    +

    Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent ...

    + read more +

    There are comments.

    +
    +
  28. + + + + + + + +
  29. + + + + + + + +
  30. +
    +

    Using dbpedia to get languages influences

    +
    + +
    + +

    While browsing the Python's wikipedia page, I found information about the languages +influenced by python, and the languages that influenced python itself.

    +

    Well, that's kind of interesting to know which languages influenced others, +it could even be more interesting to have an overview of the connexion between +them ...

    + read more +

    There are comments.

    +
    +
  31. + + + + + + + +
  32. +
    +

    Using JPype to bridge python and Java

    +
    + +
    + +

    Java provides some interesting libraries that have no exact equivalent in +python. In my case, the awesome boilerpipe library allows me to remove +uninteresting parts of HTML pages, like menus, footers and other "boilerplate" +contents.

    +

    Boilerpipe is written in Java. Two solutions then: using java from python or +reimplement boilerpipe ...

    + read more +

    There are comments.

    +
    +
  33. + + + + + + + +
  34. +
    +

    Working directly on your server? How to backup and sync your dev environment with unison

    +
    + +
    + +

    I have a server running freebsd since some time now, and was wondering about +the possibility to directly have a development environment ready to use when +I get a internet connexion, even if I'm not on my computer.

    +

    Since I use vim to code, and spend most of my ...

    + read more +

    There are comments.

    +
    +
  35. + + + + + + + +
  36. +
    +

    Wrap up of the distutils2 paris' sprint

    +
    + +
    + +

    Finally, thanks to a bunch of people that helped me to pay my train and bus +tickets, I've made it to paris for the distutils2 sprint.

    +

    They have been a bit more than 10 people to come during the sprint, and it was +very productive. Here's a taste ...

    + read more +

    There are comments.

    +
    +
  37. + + + + + + +
+
+ + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/categories.html b/categories.html new file mode 100644 index 0000000..a1b8ad9 --- /dev/null +++ b/categories.html @@ -0,0 +1,129 @@ + + + + Alexis' log + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/category/asso.html b/category/asso.html new file mode 100644 index 0000000..984caed --- /dev/null +++ b/category/asso.html @@ -0,0 +1,292 @@ + + + + Alexis' log - asso + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + +
+

Other articles

+
+
    + + + + + + + + + +
  1. + + + + + + + +
  2. + + + + + + +
+
+ + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/category/dev.html b/category/dev.html new file mode 100644 index 0000000..4348d7c --- /dev/null +++ b/category/dev.html @@ -0,0 +1,777 @@ + + + + Alexis' log - dev + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + +
+

Other articles

+
+
    + + + + + + + + + +
  1. +
    +

    Using JPype to bridge python and Java

    +
    + +
    + +

    Java provides some interesting libraries that have no exact equivalent in +python. In my case, the awesome boilerpipe library allows me to remove +uninteresting parts of HTML pages, like menus, footers and other "boilerplate" +contents.

    +

    Boilerpipe is written in Java. Two solutions then: using java from python or +reimplement boilerpipe ...

    + read more +

    There are comments.

    +
    +
  2. + + + + + + + +
  3. +
    +

    Un coup de main pour mon mémoire!

    +
    + +
    + +

    Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit +coup de main.

    +

    Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent ...

    + read more +

    There are comments.

    +
    +
  4. + + + + + + + +
  5. + + + + + + + +
  6. +
    +

    Wrap up of the distutils2 paris' sprint

    +
    + +
    + +

    Finally, thanks to a bunch of people that helped me to pay my train and bus +tickets, I've made it to paris for the distutils2 sprint.

    +

    They have been a bit more than 10 people to come during the sprint, and it was +very productive. Here's a taste ...

    + read more +

    There are comments.

    +
    +
  7. + + + + + + + +
  8. +
    +

    PyPI on CouchDB

    +
    + +
    + +

    By now, there are two ways to retrieve data from PyPI (the Python Package +Index). You can both rely on xml/rpc or on the "simple" API. The simple +API is not so simple to use as the name suggest, and have several existing +drawbacks.

    +

    Basically, if you want to ...

    + read more +

    There are comments.

    +
    +
  9. + + + + + + + +
  10. +
    +

    Help me to go to the distutils2 paris' sprint

    +
    + +
    + +

    Edit: Thanks to logilab and some amazing people, I can make it to paris for the +sprint. Many thanks to them for the support!

    +

    There will be a distutils2 sprint from the 27th to the 30th of january, thanks +to logilab which will host the event.

    +

    You can find more ...

    + read more +

    There are comments.

    +
    +
  11. + + + + + + + +
  12. +
    +

    How to reboot your bebox using the CLI

    +
    + +
    + +

    I've an internet connection which, for some obscure reasons, tend to be very +slow from time to time. After rebooting the box (yes, that's a hard solution), +all the things seems to go fine again.

    +
    +

    EDIT : Using grep

    +

    After a bit of reflexion, that's also really easy ...

    + read more +

    There are comments.

    +
    +
  13. + + + + + + + +
  14. + + + + + + + +
  15. + + + + + + + +
  16. + + + + + + + +
  17. +
    +

    Introducing the distutils2 index crawlers

    +
    + +
    + +

    I'm working for about a month for distutils2, even if I was being a +bit busy (as I had some class courses and exams to work on)

    +

    I'll try do sum-up my general feelings here, and the work I've made +so far. You can also find, if ...

    + read more +

    There are comments.

    +
    +
  18. + + + + + + + +
  19. +
    +

    Sprinting on distutils2 in Tours

    +
    + +
    + +

    Yesterday, as I was traveling to Tours, I've took some time to +visit Éric, another student who's working on distutils2 this +summer, as a part of the GSoC. Basically, it was to take a drink, +discuss a bit about distutils2, our respective tasks and general +feelings, and to ...

    + read more +

    There are comments.

    +
    +
  20. + + + + + + + +
  21. + + + + + + + +
  22. + + + + + + + +
  23. + + + + + + + +
  24. +
    +

    Python ? go !

    +
    + +
    + +

    Cela fait maintenant un peu plus d'un mois que je travaille sur un +projet en django, et que, +nécessairement, je me forme à Python. Je +prends un plaisir non dissimulé à découvrir ce langage (et à +l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui +me ...

    + read more +

    There are comments.

    +
    +
  25. + + + + + + +
+
+ + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/category/python.html b/category/python.html new file mode 100644 index 0000000..348d984 --- /dev/null +++ b/category/python.html @@ -0,0 +1,190 @@ + + + + Alexis' log - python + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/category/system.html b/category/system.html new file mode 100644 index 0000000..cfaec8f --- /dev/null +++ b/category/system.html @@ -0,0 +1,351 @@ + + + + Alexis' log - system + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + +
+

Other articles

+
+
    + + + + + + + + + +
  1. +
    +

    How to install NGINX + PHP 5.3 on FreeBSD.

    +
    + +
    + +

    I've not managed so far to get completely rid of php, so here's a simple +reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but +that's worse to have the piece of configuration somewhere !

    +
    +# update the ports
    +$ portsnap fetch update
    +
    +# install php5 port
    +$ make ...
    + read more +

    There are comments.

    +
    +
  2. + + + + + + +
+
+ + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/category/thoughts.html b/category/thoughts.html new file mode 100644 index 0000000..fd2f272 --- /dev/null +++ b/category/thoughts.html @@ -0,0 +1,238 @@ + + + + Alexis' log - thoughts + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + +
+

Other articles

+
+
    + + + + + + + + + +
  1. + + + + + + +
+
+ + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/dynamically-change-your-gnome-desktop-wallpaper.html b/dynamically-change-your-gnome-desktop-wallpaper.html new file mode 100644 index 0000000..b0cbdac --- /dev/null +++ b/dynamically-change-your-gnome-desktop-wallpaper.html @@ -0,0 +1,198 @@ + + + + Dynamically change your gnome desktop wallpaper + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Dynamically change your gnome desktop wallpaper

+
+ +

In gnome, you can can use a XML file to have a dynamic wallpaper. +It's not so easy, and you can't just tell: use the pictures in this folder to do +so.

+

You can have a look to the git repository if you want: http://github.com/ametaireau/gnome-background-generator

+

Some time ago, I've made a little python script to ease that, and you can now +use it too. It's named "gnome-background-generator", and you can install it via +pip for instance.

+
$ pip install gnome-background-generator
+
+

Then, you have just to use it this way:

+
$ gnome-background-generator -p ~/Images/walls -s
+/home/alexis/Images/walls/dynamic-wallpaper.xml generated
+
+

Here is a extract of the --help:

+
$ gnome-background-generator --help
+usage: gnome-background-generator [-h] [-p PATH] [-o OUTPUT]
+                                  [-t TRANSITION_TIME] [-d DISPLAY_TIME] [-s]
+                                  [-b]
+
+A simple command line tool to generate an XML file to use for gnome
+wallpapers, to have dynamic walls
+
+optional arguments:
+  -h, --help            show this help message and exit
+  -p PATH, --path PATH  Path to look for the pictures. If no output is
+                        specified, will be used too for outputing the dynamic-
+                        wallpaper.xml file. Default value is the current
+                        directory (.)
+  -o OUTPUT, --output OUTPUT
+                        Output filename. If no filename is specified, a
+                        dynamic-wallpaper.xml file will be generated in the
+                        path containing the pictures. You can also use "-" to
+                        display the xml in the stdout.
+  -t TRANSITION_TIME, --transition-time TRANSITION_TIME
+                        Time (in seconds) transitions must last (default value
+                        is 2 seconds)
+  -d DISPLAY_TIME, --display-time DISPLAY_TIME
+                        Time (in seconds) a picture must be displayed. Default
+                        value is 900 (15mn)
+  -s, --set-background  '''try to set the background using gnome-appearance-
+                        properties
+  -b, --debug
+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/feeds/all-en.atom.xml b/feeds/all-en.atom.xml new file mode 100644 index 0000000..720562d --- /dev/null +++ b/feeds/all-en.atom.xml @@ -0,0 +1,1681 @@ + +Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00ZUsing dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +influenced by python, and the languages that influenced python itself.</p> +<p>Well, that's kind of interesting to know which languages influenced others, +it could even be more interesting to have an overview of the connexion between +them, keeping python as the main focus.</p> +<p>This information is available on the wikipedia page, but not in a really +exploitable format. Hopefully, this information is provided into the +information box present on the majority of wikipedia pages. And… guess what? +there is project with the goal to scrap and index all this information in +a more queriable way, using the semantic web technologies.</p> +<p>Well, you may have guessed it, the project in question in dbpedia, and exposes +information in the form of RDF triples, which are way more easy to work with +than simple HTML.</p> +<p>For instance, let's take the page about python: +<a class="reference external" href="http://dbpedia.org/page/Python_%28programming_language%29">http://dbpedia.org/page/Python_%28programming_language%29</a></p> +<p>The interesting properties here are &quot;Influenced&quot; and &quot;InfluencedBy&quot;, which +allows us to get a list of languages. Unfortunately, they are not really using +all the power of the Semantic Web here, and the list is actually a string with +coma separated values in it.</p> +<p>Anyway, we can use a simple rule: All wikipedia pages of programming languages +are either named after the name of the language itself, or suffixed with &quot;( +programming language)&quot;, which is the case for python.</p> +<p>So I've built <a class="reference external" href="https://github.com/ametaireau/experiments/blob/master/influences/get_influences.py">a tiny script to extract the information from dbpedia</a> and transform them into a shiny graph using graphviz.</p> +<p>After a nice:</p> +<pre class="literal-block"> +$ python get_influences.py python dot | dot -Tpng &gt; influences.png +</pre> +<p>The result is the following graph (<a class="reference external" href="http://files.lolnet.org/alexis/influences.png">see it directly here</a>)</p> +<img alt="http://files.lolnet.org/alexis/influences.png" src="http://files.lolnet.org/alexis/influences.png" style="width: 800px;" /> +<p>While reading this diagram, keep in mind that it is a) not listing all the +languages and b) keeping a python perspective.</p> +<p>This means that you can trust the scheme by following the arrows from python to +something and from something to python, it is not trying to get the matching +between all the languages at the same time to keep stuff readable.</p> +<p>It would certainly be possible to have all the connections between all +languages (and the resulting script would be easier) to do so, but the resulting +graph would probably be way less readable.</p> +<p>You can find the script <a class="reference external" href="https://github.com/ametaireau/experiments">on my github account</a>. Feel free to adapt it for +whatever you want if you feel hackish.</p> +Pelican, 9 months later2011-07-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html/<p>Back in October, I released <a class="reference external" href="http://docs.notmyidea.org/alexis/pelican">pelican</a>, +a little piece of code I wrote to power this weblog. I had simple needs: I wanted +to be able to use my text editor of choice (vim), a vcs (mercurial) and +restructured text. I started to write a really simple blog engine +in something like a hundred python lines and released it on github.</p> +<p>And people started contributing. I wasn't at all expecting to see people +interested in such a little piece of code, but it turned out that they were. +I refactored the code to make it evolve a bit more by two times and eventually, +in 9 months, got 49 forks, 139 issues and 73 pull requests.</p> +<p><strong>Which is clearly awesome.</strong></p> +<p>I pulled features such as translations, tag +clouds, integration with different services such as twitter or piwik, import +from dotclear and rss, fixed +a number of mistakes and improved a lot the codebase. This was a proof that +there is a bunch of people that are willing to make better softwares just for +the sake of fun.</p> +<p>Thank you, guys, you're why I like open source so much.</p> +Using JPype to bridge python and Java2011-06-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html/<p>Java provides some interesting libraries that have no exact equivalent in +python. In my case, the awesome boilerpipe library allows me to remove +uninteresting parts of HTML pages, like menus, footers and other &quot;boilerplate&quot; +contents.</p> +<p>Boilerpipe is written in Java. Two solutions then: using java from python or +reimplement boilerpipe in python. I will let you guess which one I chosen, meh.</p> +<p>JPype allows to bridge python project with java libraries. It takes another +point of view than Jython: rather than reimplementing python in Java, both +languages are interfacing at the VM level. This means you need to start a VM +from your python script, but it does the job and stay fully compatible with +Cpython and its C extensions.</p> +<div class="section" id="first-steps-with-jpype"> +<h2>First steps with JPype</h2> +<p>Once JPype installed (you'll have to hack a bit some files to integrate +seamlessly with your system) you can access java classes by doing something +like that:</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">jpype</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">startJVM</span><span class="p">(</span><span class="n">jpype</span><span class="o">.</span><span class="n">getDefaultJVMPath</span><span class="p">())</span> + +<span class="c"># you can then access to the basic java functions</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">java</span><span class="o">.</span><span class="n">lang</span><span class="o">.</span><span class="n">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="s">&quot;hello world&quot;</span><span class="p">)</span> + +<span class="c"># and you have to shutdown the VM at the end</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">shutdownJVM</span><span class="p">()</span> +</pre></div> +<p>Okay, now we have a hello world, but what we want seems somehow more complex. +We want to interact with java classes, so we will have to load them.</p> +</div> +<div class="section" id="interfacing-with-boilerpipe"> +<h2>Interfacing with Boilerpipe</h2> +<p>To install boilerpipe, you just have to run an ant script:</p> +<pre class="literal-block"> +$ cd boilerpipe +$ ant +</pre> +<p>Here is a simple example of how to use boilerpipe in Java, from their sources</p> +<div class="highlight"><pre><span class="kn">package</span> <span class="n">de</span><span class="o">.</span><span class="na">l3s</span><span class="o">.</span><span class="na">boilerpipe</span><span class="o">.</span><span class="na">demo</span><span class="o">;</span> +<span class="kn">import</span> <span class="nn">java.net.URL</span><span class="o">;</span> +<span class="kn">import</span> <span class="nn">de.l3s.boilerpipe.extractors.ArticleExtractor</span><span class="o">;</span> + +<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Oneliner</span> <span class="o">{</span> + <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span> + <span class="kd">final</span> <span class="n">URL</span> <span class="n">url</span> <span class="o">=</span> <span class="k">new</span> <span class="n">URL</span><span class="o">(</span><span class="s">&quot;http://notmyidea.org&quot;</span><span class="o">);</span> + <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">ArticleExtractor</span><span class="o">.</span><span class="na">INSTANCE</span><span class="o">.</span><span class="na">getText</span><span class="o">(</span><span class="n">url</span><span class="o">));</span> + <span class="o">}</span> +<span class="o">}</span> +</pre></div> +<p>To run it:</p> +<div class="highlight"><pre><span class="nv">$ </span>javac -cp dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar src/demo/de/l3s/boilerpipe/demo/Oneliner.java +<span class="nv">$ </span>java -cp src/demo:dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar de.l3s.boilerpipe.demo.Oneliner +</pre></div> +<p>Yes, this is kind of ugly, sorry for your eyes. +Let's try something similar, but from python</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">jpype</span> + +<span class="c"># start the JVM with the good classpaths</span> +<span class="n">classpath</span> <span class="o">=</span> <span class="s">&quot;dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar&quot;</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">startJVM</span><span class="p">(</span><span class="n">jpype</span><span class="o">.</span><span class="n">getDefaultJVMPath</span><span class="p">(),</span> <span class="s">&quot;-Djava.class.path=</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">classpath</span><span class="p">)</span> + +<span class="c"># get the Java classes we want to use</span> +<span class="n">DefaultExtractor</span> <span class="o">=</span> <span class="n">jpype</span><span class="o">.</span><span class="n">JPackage</span><span class="p">(</span><span class="s">&quot;de&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">l3s</span><span class="o">.</span><span class="n">boilerpipe</span><span class="o">.</span><span class="n">extractors</span><span class="o">.</span><span class="n">DefaultExtractor</span> + +<span class="c"># call them !</span> +<span class="k">print</span> <span class="n">DefaultExtractor</span><span class="o">.</span><span class="n">INSTANCE</span><span class="o">.</span><span class="n">getText</span><span class="p">(</span><span class="n">jpype</span><span class="o">.</span><span class="n">java</span><span class="o">.</span><span class="n">net</span><span class="o">.</span><span class="n">URL</span><span class="p">(</span><span class="s">&quot;http://blog.notmyidea.org&quot;</span><span class="p">))</span> +</pre></div> +<p>And you get what you want.</p> +<p>I must say I didn't thought it could work so easily. This will allow me to +extract text content from URLs and remove the <em>boilerplate</em> text easily +for infuse (my master thesis project), without having to write java code, nice!</p> +</div> +Un coup de main pour mon mémoire!2011-05-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html/<p>Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit +coup de main.</p> +<p>Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent +last.fm, je fais quelque chose de similaire mais pour les sites internet: en me +basant sur ce que vous visitez quotidiennement et comment vous le visitez (quelles +horaires, quelle emplacement géographique, etc.) je souhaites proposer des liens +qui vous intéresseront potentiellement, en me basant sur l'avis des personnes qui +ont des profils similaires au votre.</p> +<p>Le projet est loin d'être terminé, mais la première étape est de récupérer des +données de navigation, idéalement beaucoup de données de navigation. Donc si +vous pouvez me filer un coup de main je vous en serais éternellement +reconnaissant (pour ceux qui font semblant de pas comprendre, entendez &quot;tournée +générale&quot;).</p> +<p>J'ai créé un petit site web (en anglais) qui résume un peu le concept, qui vous +propose de vous inscrire et de télécharger un plugin firefox qui m'enverra des +information sur les sites que vous visitez (si vous avez l'habitude d'utiliser +chrome vous pouvez considérer de switcher à firefox4 pour les deux prochains +mois pour me filer un coup de main). Il est possible de désactiver le plugin +d'un simple clic si vous souhaitez garder votre vie privée privée ;-)</p> +<p>Le site est par là: <a class="reference external" href="http://infuse.notmyidea.org">http://infuse.notmyidea.org</a>. Une fois le plugin téléchargé +et le compte créé il faut renseigner vos identifiants dans le plugin en +question, et c'est tout!</p> +<p>A votre bon cœur ! Je récupérerais probablement des données durant les 2 +prochains mois pour ensuite les analyser correctement.</p> +<p>Merci pour votre aide !</p> +Travailler moins pour mieux travailler ?2011-05-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +je suis assez impressionné du résultat: je suis de retour chez mes parents pour +le &quot;easter break&quot; et j'en ai profité pour donner un coup aux travaux de la +maison (et pour me reposer un brin!).</p> +<p>Bosser en extérieur est un réel plaisir et faire quelque chose de manuel +également. Je n'ai pas pour habitude de bricoler autre chose que du logiciel et +c'est vraiment quelque chose que j'apprécie.</p> +<p>J'avoue, je mens un peu quand je dis que j'étais complètement déconnecté: +j'ai vérifié mes mails assez régulièrement en utilisant mon téléphone +(merci Arnaud pour le prêt du gadget!) et j'ai limité ma présence web au strict +minimum. Je veux dire par là pas de twitter, pas d'IRC et autres mailing-lists.</p> +<p>Quand je dis hors-ligne, je ne dis pas que je n'ai pas travaillé sur mon +ordinateur. J'ai à fournir beaucoup plus de travail que ce que je ne pensait en +premier lieu pour la rédaction de mon mémoire et j'ai passé quelques heures par +ci par là à lire des articles et livres sur le sujet ainsi que rédigé une bonne +partie de mon mémoire durant ces 10 jours. Résultat ? Les heures que j'ai passées à travailler ont +été étonnement plus productives que celles que j'ai l'habitude de passer derrière +un écran. Je ne parles pas uniquement du fait de procrastiner; évidemment c'est +une des causes principales de ma perte de productivité, mais je pense également +au fait de laisser le cerveau reposer, au moins en ce qui concerne la partie +informatique. Bricoler demande de la concentration et de la réflexion mais +permet également de laisser son esprit vagabonder. J'ai pu donc avancer mes +sur certaines parties de mon mémoire alors que j'étais en train de poser le +bardage sur la garage par exemple.</p> +<p>Passer du temps sur autre chose (qui demandait également de la concentration +par ailleurs) m'a permis d'être réellement plus efficace lors de mes phases de +rédaction et de lecture.</p> +<p>Je me demande depuis quelques temps quel sera mon futur travail et quelle forme +il prendra. Éééh oui, la fin des études arrive pour la fin de l'année, c'est +pas une blague. Et je me pose sérieusement la question du travail aux 3/4 +temps. La raison principale étant que je ne souhaites pas passer la majeure +partie de mon temps à travailler derrière un écran et que la formation que j'ai +m'y rattache beaucoup. Ne me comprenez pas de travers: j'aime ce que je fais; +mais j'aime aussi ce que je fais à coté de l'informatique: associatif, projets +alternatifs, permaculture et autres.</p> +<p>Viens s'ajouter à ça le fait d'avoir une qualité de vie qui me semble pouvoir +passer par le fait de travailler moins (&quot;il est marant ce gamin, il à pas encore commencé +à travailler qu'il veut bosser moins, regarde moi cette feignasse!&quot;) et +travailler plus efficacement. Bien sur, on n'est jamais 100% productif et c'est +d'autant plus vrai pour moi, alors si gagner en productivité peut passer par +travailler moins, pourquoi pas s'y essayer !</p> +<p>Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez des +retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée ?</p> +Analyse users' browsing context to build up a web recommender2011-04-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html/<p>No, this is not an april's fool ;)</p> +<p>Wow, it's been a long time. My year in Oxford is going really well. I realized +few days ago that the end of the year is approaching really quickly. +Exams are coming in one month or such and then I'll be working full time on my dissertation topic.</p> +<p>When I learned we'll have about 6 month to work on something, I first thought +about doing a packaging related stuff, but finally decided to start something +new. After all, that's the good time to learn.</p> +<p>Since a long time, I'm being impressed by the <a class="reference external" href="http://last.fm">last.fm</a> +recommender system. They're <em>scrobbling</em> the music I listen to since something +like 5 years now and the recommendations they're doing are really nice and +accurate (I discovered <strong>a lot</strong> of great artists listening to the +&quot;neighbour radio&quot;.) (by the way, <a class="reference external" href="http://lastfm.com/user/akounet/">here is</a> +my lastfm account)</p> +<p>So I decided to work on recommender systems, to better understand what is it +about.</p> +<p>Recommender systems are usually used to increase the sales of products +(like Amazon.com does) which is not really what I'm looking for (The one who +know me a bit know I'm kind of sick about all this consumerism going on).</p> +<p>Actually, the most simple thing I thought of was the web: I'm browsing it quite +every day and each time new content appears. I've stopped to follow <a class="reference external" href="https://bitbucket.org/bruno/aspirator/">my feed +reader</a> because of the +information overload, and reduced drastically the number of people I follow <a class="reference external" href="http://twitter.com/ametaireau/">on +twitter</a>.</p> +<p>Too much information kills the information.</p> +<p>You shall got what will be my dissertation topic: a recommender system for +the web. Well, such recommender systems already exists, so I will try to add contextual +information to them: you're probably not interested by the same topics at different +times of the day, or depending on the computer you're using. We can also +probably make good use of the way you browse to create groups into the content +you're browsing (or even use the great firefox4 tab group feature).</p> +<p>There is a large part of concerns to have about user's privacy as well.</p> +<p>Here is my proposal (copy/pasted from the one I had to do for my master)</p> +<div class="section" id="introduction-and-rationale"> +<h2>Introduction and rationale</h2> +<p>Nowadays, people surf the web more and more often. New web pages are created +each day so the amount of information to retrieve is more important as the time +passes. These users uses the web in different contexts, from finding cooking +recipes to technical articles.</p> +<p>A lot of people share the same interest to various topics, and the quantity of +information is such than it's really hard to triage them efficiently without +spending hours doing it. Firstly because of the huge quantity of information +but also because the triage is something relative to each person. Although, this +triage can be facilitated by fetching the browsing information of all +particular individuals and put the in perspective.</p> +<p>Machine learning is a branch of Artificial Intelligence (AI) which deals with how +a program can learn from data. Recommendation systems are a particular +application area of machine learning which is able to recommend things (links +in our case) to the users, given a particular database containing the previous +choices users have made.</p> +<p>This browsing information is currently available in browsers. Even if it is not +in a very usable format, it is possible to transform it to something useful. +This information gold mine just wait to be used. Although, it is not as simple as +it can seems at the first approach: It is important to take care of the context +the user is in while browsing links. For instance, It's more likely that during +the day, a computer scientist will browse computing related links, and that during +the evening, he browse cooking recipes or something else.</p> +<p>Page contents are also interesting to analyse, because that's what people +browse and what actually contain the most interesting part of the information. +The raw data extracted from the browsing can then be translated into +something more useful (namely tags, type of resource, visit frequency, +navigation context etc.)</p> +<p>The goal of this dissertation is to create a recommender system for web links, +including this context information.</p> +<p>At the end of the dissertation, different pieces of software will be provided, +from raw data collection from the browser to a recommendation system.</p> +</div> +<div class="section" id="background-review"> +<h2>Background Review</h2> +<p>This dissertation is mainly about data extraction, analysis and recommendation +systems. Two different research area can be isolated: Data preprocessing and +Information filtering.</p> +<p>The first step in order to make recommendations is to gather some data. The +more data we have available, the better it is (T. Segaran, 2007). This data can +be retrieved in various ways, one of them is to get it directly from user's +browsers.</p> +<div class="section" id="data-preparation-and-extraction"> +<h3>Data preparation and extraction</h3> +<p>The data gathered from browsers is basically URLs and additional information +about the context of the navigation. There is clearly a need to extract more +information about the meaning of the data the user is browsing, starting by the +content of the web pages.</p> +<p>Because the information provided on the current Web is not meant to be read by +machines (T. Berners Lee, 2001) there is a need of tools to extract meaning from +web pages. The information needs to be preprocessed before stored in a machine +readable format, allowing to make recommendations (Choochart et Al, 2004).</p> +<p>Data preparation is composed of two steps: cleaning and structuring ( +Castellano et Al, 2007). Because raw data can contain a lot of un-needed text +(such as menus, headers etc.) and need to be cleaned prior to be stored. +Multiple techniques can be used here and belongs to boilerplate removal and +full text extraction (Kohlschütter et Al, 2010).</p> +<p>Then, structuring the information: category, type of content (news, blog, wiki) +can be extracted from raw data. This kind of information is not clearly defined +by HTML pages so there is a need of tools to recognise them.</p> +<p>Some context-related information can also be inferred from each resource. It can go +from the visit frequency to the navigation group the user was in while +browsing. It is also possible to determine if the user &quot;liked&quot; a resource, and +determine a mark for it, which can be used by information filtering a later +step (T. Segaran, 2007).</p> +<p>At this stage, structuring the data is required. Storing this kind of +information in RDBMS can be a bit tedious and require complex queries to get +back the data in an usable format. Graph databases can play a major role in the +simplification of information storage and querying.</p> +</div> +<div class="section" id="information-filtering"> +<h3>Information filtering</h3> +<p>To filter the information, three techniques can be used (Balabanovic et +Al, 1997):</p> +<ul class="simple"> +<li>The content-based approach states that if an user have liked something in the +past, he is more likely to like similar things in the future. So it's about +establishing a profile for the user and compare new items against it.</li> +<li>The collaborative approach will rather recommend items that other similar users +have liked. This approach consider only the relationship between users, and +not the profile of the user we are making recommendations to.</li> +<li>the hybrid approach, which appeared recently combine both of the previous +approaches, giving recommendations when items score high regarding user's +profile, or if a similar user already liked it.</li> +</ul> +<p>Grouping is also something to consider at this stage (G. Myatt, 2007). +Because we are dealing with huge amount of data, it can be useful to detect group +of data that can fit together. Data clustering is able to find such groups (T. +Segaran, 2007).</p> +<p>References:</p> +<ul class="simple"> +<li>Balabanović, M., &amp; Shoham, Y. (1997). Fab: content-based, collaborative +recommendation. Communications of the ACM, 40(3), 66–72. ACM. +Retrieved March 1, 2011, from <a class="reference external" href="http://portal.acm.org/citation.cfm?id=245108.245124&amp;amp">http://portal.acm.org/citation.cfm?id=245108.245124&amp;amp</a>;.</li> +<li>Berners-Lee, T., Hendler, J., &amp; Lassila, O. (2001). +The semantic web: Scientific american. Scientific American, 284(5), 34–43. +Retrieved November 21, 2010, from <a class="reference external" href="http://www.citeulike.org/group/222/article/1176986">http://www.citeulike.org/group/222/article/1176986</a>.</li> +<li>Castellano, G., Fanelli, A., &amp; Torsello, M. (2007). +LODAP: a LOg DAta Preprocessor for mining Web browsing patterns. Proceedings of the 6th Conference on 6th WSEAS Int. Conf. on Artificial Intelligence, Knowledge Engineering and Data Bases-Volume 6 (p. 12–17). World Scientific and Engineering Academy and Society (WSEAS). Retrieved March 8, 2011, from <a class="reference external" href="http://portal.acm.org/citation.cfm?id=1348485.1348488">http://portal.acm.org/citation.cfm?id=1348485.1348488</a>.</li> +<li>Kohlschutter, C., Fankhauser, P., &amp; Nejdl, W. (2010). Boilerplate detection using shallow text features. Proceedings of the third ACM international conference on Web search and data mining (p. 441–450). ACM. Retrieved March 8, 2011, from <a class="reference external" href="http://portal.acm.org/citation.cfm?id=1718542">http://portal.acm.org/citation.cfm?id=1718542</a>.</li> +<li>Myatt, G. J. (2007). Making Sense of Data: A Practical Guide to Exploratory +Data Analysis and Data Mining.</li> +<li>Segaran, T. (2007). Collective Intelligence.</li> +</ul> +</div> +</div> +<div class="section" id="privacy"> +<h2>Privacy</h2> +<p>The first thing that's come to people minds when it comes to process their +browsing data is privacy. People don't want to be stalked. That's perfectly +right, and I don't either.</p> +<p>But such a system don't have to deal with people identities. It's completely +possible to process completely anonymous data, and that's probably what I'm +gonna do.</p> +<p>By the way, if you have interesting thoughts about that, if you do know +projects that do seems related, fire the comments !</p> +</div> +<div class="section" id="what-s-the-plan"> +<h2>What's the plan ?</h2> +<p>There is a lot of different things to explore, especially because I'm +a complete novice in that field.</p> +<ul class="simple"> +<li>I want to develop a firefox plugin, to extract the browsing informations ( +still, I need to know exactly which kind of informations to retrieve). The +idea is to provide some <em>raw</em> browsing data, and then to transform it and to +store it in the better possible way.</li> +<li>Analyse how to store the informations in a graph database. What can be the +different methods to store this data and to visualize the relationship +between different pieces of data? How can I define the different contexts, +and add those informations in the db?</li> +<li>Process the data using well known recommendation algorithms. Compare the +results and criticize their value.</li> +</ul> +<p>There is plenty of stuff I want to try during this experimentation:</p> +<ul class="simple"> +<li>I want to try using Geshi to visualize the connexion between the links, +and the contexts</li> +<li>Try using graph databases such as Neo4j</li> +<li>Having a deeper look at tools such as scikit.learn (a machine learning +toolkit in python)</li> +<li>Analyse web pages in order to categorize them. Processing their +contents as well, to do some keyword based classification will be done.</li> +</ul> +<p>Lot of work on its way, yay !</p> +</div> +Working directly on your server? How to backup and sync your dev environment with unison2011-03-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html/<p>I have a server running freebsd since some time now, and was wondering about +the possibility to directly have a development environment ready to use when +I get a internet connexion, even if I'm not on my computer.</p> +<p>Since I use vim to code, and spend most of my time in a console while +developing, it's possible to work via ssh, from everywhere.</p> +<p>The only problem is the synchronisation of the source code, config files etc. +from my machine to the server.</p> +<p>Unison provides an interesting way to synchronise two folders, even over +a network. So let's do it !</p> +<div class="section" id="creating-the-jail"> +<h2>Creating the jail</h2> +<p>In case you don't use FreeBSD, you can skip this section.</p> +<div class="highlight"><pre><span class="c"># I have a flavour jail named default</span> +<span class="nv">$ </span>ezjail-admin -f default workspace.notmyidea.org 172.19.1.6 +<span class="nv">$ </span>ezjail-admin start workspace.notmyidea.org +</pre></div> +<p>In my case, because the &quot;default&quot; flavour contains already a lot of interesting +things, my jail come already setup with ssh, bash and vim for instance, but +maybe you'll need it in your case.</p> +<p>I want to be redirected to the ssh of the jail when I connect to the host with +the 20006 port. Add lines in <cite>/etc/pf.conf</cite>:</p> +<pre class="literal-block"> +workspace_jail=&quot;172.19.1.6&quot; +rdr on $ext_if proto tcp from any to $ext_ip port 20006 -&gt; $workspace_jail port 22 +</pre> +<p>Reload packet filter rules</p> +<div class="highlight"><pre><span class="nv">$ </span>/etc/rc.d/pf reload +</pre></div> +</div> +<div class="section" id="working-with-unison"> +<h2>Working with unison</h2> +<p>Now that we've set up the jail. Set up unison on the server and on your client. +Unison is available on the freebsd ports so just install it</p> +<div class="highlight"><pre><span class="nv">$ </span>ssh notmyidea.org -p 20006 +<span class="nv">$ </span>make -C /usr/ports/net/unison-nox11 config-recursive +<span class="nv">$ </span>make -C /usr/ports/net/unison-nox11 package-recursive +</pre></div> +<p>Install as well unison on your local machine. Double check to install the same +version on the client and on the server. Ubuntu contains the 2.27.57 as well as +the 2.32.52.</p> +<p>Check that unison is installed and reachable via ssh from your machine</p> +<div class="highlight"><pre><span class="nv">$ </span>ssh notmyidea.org -p 20006 unison -version +unison version 2.27.157 +<span class="nv">$ </span>unison -version +unison version 2.27.57 +</pre></div> +</div> +<div class="section" id="let-sync-our-folders"> +<h2>Let sync our folders</h2> +<p>The first thing I want to sync is my vim configuration. Well, it's already <a class="reference external" href="http://github.com/ametaireau/dotfiles/">in +a git repository</a> but let's try to use +unison for it right now.</p> +<p>I have two machines then: <cite>workspace</cite>, the jail, and <cite>ecureuil</cite> my laptop.</p> +<div class="highlight"><pre>unison .vim ssh://notmyidea.org:20006/.vim +unison .vimrc ssh://notmyidea.org:20006/.vimrc +</pre></div> +<p>It is also possible to put all the informations in a config file, and then to +only run <cite>unison</cite>. (fire up <cite>vim ~/.unison/default.prf</cite>.</p> +<p>Here is my config:</p> +<pre class="literal-block"> +root = /home/alexis +root = ssh://notmyidea.org:20006 + +path = .vimrc +path = dotfiles +path = dev + +follow = Name * +</pre> +<p>My vimrc is in fact a symbolic link on my laptop, but I don't want to specify +each of the links to unison. That's why the <cite>follow = Name *</cite> is for.</p> +<p>The folders you want to synchronize are maybe a bit large. If so, considering +others options such as rsync for the first import may be a good idea (I enjoyed +my university huge upload bandwith to upload 2GB in 20mn ;)</p> +</div> +<div class="section" id="run-the-script-frequently"> +<h2>Run the script frequently</h2> +<p>Once that done, you just need to run the unison command line some times when +you want to sync your two machines. I've wrote a tiny script to get some +feedback from the sync:</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">os</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span> + +<span class="n">DEFAULT_LOGFILE</span> <span class="o">=</span> <span class="s">&quot;~/unison.log&quot;</span> +<span class="n">PROGRAM_NAME</span> <span class="o">=</span> <span class="s">&quot;Unison syncer&quot;</span> + +<span class="k">def</span> <span class="nf">sync</span><span class="p">(</span><span class="n">logfile</span><span class="o">=</span><span class="n">DEFAULT_LOGFILE</span><span class="p">,</span> <span class="n">program_name</span><span class="o">=</span><span class="n">PROGRAM_NAME</span><span class="p">):</span> + <span class="c"># init</span> + <span class="n">display_message</span> <span class="o">=</span> <span class="bp">True</span> + <span class="n">error</span> <span class="o">=</span> <span class="bp">False</span> + + <span class="n">before</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> + <span class="c"># call unison to make the sync</span> + <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">&#39;unison -batch &gt; {0}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">logfile</span><span class="p">))</span> + + <span class="c"># get the duration of the operation</span> + <span class="n">td</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="o">-</span> <span class="n">before</span> + <span class="n">delta</span> <span class="o">=</span> <span class="p">(</span><span class="n">td</span><span class="o">.</span><span class="n">microseconds</span> <span class="o">+</span> <span class="p">(</span><span class="n">td</span><span class="o">.</span><span class="n">seconds</span> <span class="o">+</span> <span class="n">td</span><span class="o">.</span><span class="n">days</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">3600</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="o">**</span><span class="mi">6</span><span class="p">)</span> <span class="o">/</span> <span class="mi">10</span><span class="o">**</span><span class="mi">6</span> + + <span class="c"># check what was the last entry in the log</span> + <span class="n">log</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">logfile</span><span class="p">))</span> + <span class="n">lines</span> <span class="o">=</span> <span class="n">log</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span> + <span class="k">if</span> <span class="s">&#39;No updates to propagate&#39;</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span> + <span class="n">display_message</span> <span class="o">=</span> <span class="bp">False</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">output</span> <span class="o">=</span> <span class="p">[</span><span class="n">l</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">lines</span> <span class="k">if</span> <span class="s">&quot;Synchronization&quot;</span> <span class="ow">in</span> <span class="n">l</span><span class="p">]</span> + + <span class="n">message</span> <span class="o">=</span> <span class="n">output</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> + <span class="n">message</span> <span class="o">+=</span> <span class="s">&quot; It took {0}s.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">display_message</span><span class="p">:</span> + <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">&#39;notify-send -i {2} &quot;{0}&quot; &quot;{1}&quot;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">program_name</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> + <span class="s">&#39;error&#39;</span> <span class="k">if</span> <span class="n">error</span> <span class="k">else</span> <span class="s">&#39;info&#39;</span><span class="p">))</span> + +<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> + <span class="n">sync</span><span class="p">()</span> +</pre></div> +<p>This is probably perfectible, but that does the job.</p> +<p>Last step is to tell you machine to run that frequently. That's what <cite>crontab</cite> +is made for, so let's <cite>crontab -e</cite>:</p> +<pre class="literal-block"> +$ * */3 * * * . ~/.Xdbus; /usr/bin/python /home/alexis/dev/python/unison-syncer/sync.py +</pre> +<p>The <cite>~/.Xdbus</cite> allows cron to communicate with your X11 session. Here is its +content.</p> +<div class="highlight"><pre><span class="c">#!/bin/bash</span> + +<span class="c"># Get the pid of nautilus</span> +<span class="nv">nautilus_pid</span><span class="o">=</span><span class="k">$(</span>pgrep -u <span class="nv">$LOGNAME</span> -n nautilus<span class="k">)</span> + +<span class="c"># If nautilus isn&#39;t running, just exit silently</span> +<span class="k">if</span> <span class="o">[</span> -z <span class="s2">&quot;$nautilus_pid&quot;</span> <span class="o">]</span>; <span class="k">then</span> +<span class="nb">exit </span>0 +<span class="k">fi</span> + +<span class="c"># Grab the DBUS_SESSION_BUS_ADDRESS variable from nautilus&#39;s environment</span> +<span class="nb">eval</span> <span class="k">$(</span>tr <span class="s1">&#39;\0&#39;</span> <span class="s1">&#39;\n&#39;</span> &lt; /proc/<span class="nv">$nautilus_pid</span>/environ | grep <span class="s1">&#39;^DBUS_SESSION_BUS_ADDRESS=&#39;</span><span class="k">)</span> + +<span class="c"># Check that we actually found it</span> +<span class="k">if</span> <span class="o">[</span> -z <span class="s2">&quot;$DBUS_SESSION_BUS_ADDRESS&quot;</span> <span class="o">]</span>; <span class="k">then</span> +<span class="nb">echo</span> <span class="s2">&quot;Failed to find bus address&quot;</span> &gt;&amp;2 +<span class="nb">exit </span>1 +<span class="k">fi</span> + +<span class="c"># export it so that child processes will inherit it</span> +<span class="nb">export </span>DBUS_SESSION_BUS_ADDRESS +</pre></div> +<p>And it comes from <a class="reference external" href="http://ubuntuforums.org/showthread.php?p=10148738#post10148738">here</a>.</p> +<p>A sync takes about 20s + the upload time on my machine, which stay acceptable for +all of my developments.</p> +</div> +Wrap up of the distutils2 paris' sprint2011-02-08T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html/<p>Finally, thanks to a bunch of people that helped me to pay my train and bus +tickets, I've made it to paris for the distutils2 sprint.</p> +<p>They have been a bit more than 10 people to come during the sprint, and it was +very productive. Here's a taste of what we've been working on:</p> +<ul class="simple"> +<li>the <cite>datafiles</cite>, a way to specify and to handle the installation of files which +are not python-related (pictures, manpages and so on).</li> +<li><cite>mkgcfg</cite>, a tool to help you to create a setup.cfg in minutes (and with funny +examples)</li> +<li>converters from setup.py scripts. We do now have a piece of code which +reads your current <cite>setup.py</cite> file and fill in some fields in the <cite>setup.cfg</cite> +for you.</li> +<li>a compatibility layer for distutils1, so it can read the <cite>setup.cfg</cite> you will +wrote for distutils2 :-)</li> +<li>the uninstaller, so it's now possible to uninstall what have been installed +by distutils2 (see PEP 376)</li> +<li>the installer, and the setuptools compatibility layer, which will allow you +to rely on setuptools' based distributions (and there are plenty of them!)</li> +<li>The compilers, so they are more flexible than they were. Since that's an +obscure part of the code for distutils2 commiters (it comes directly from the +distutils1 ages), having some guys who understood the problematics here was +a must.</li> +</ul> +<p>Some people have also tried to port their packaging from distutils1 to +distutils2. They have spotted a number of bugs and made some improvements +to the code, to make it more friendly to use.</p> +<p>I'm really pleased to see how newcomers went trough the code, and started +hacking so fast. I must say it wasn't the case when we started to work on +distutils1 so that's a very good point: people now can hack the code quicker +than they could before.</p> +<p>Some of the features here are not <em>completely</em> finished yet, but are on the +tubes, and will be ready for a release (hopefully) at the end of the week.</p> +<p>Big thanks to logilab for hosting (and sponsoring my train ticket) and +providing us food, and to bearstech for providing some money for breakfast and +bears^Wbeers.</p> +<p>Again, a big thanks to all the people who gave me money to pay the transport, +I really wasn't expecting such thing to happen :-)</p> +PyPI on CouchDB2011-01-20T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html/<p>By now, there are two ways to retrieve data from PyPI (the Python Package +Index). You can both rely on xml/rpc or on the &quot;simple&quot; API. The simple +API is not so simple to use as the name suggest, and have several existing +drawbacks.</p> +<p>Basically, if you want to use informations coming from the simple API, you will +have to parse web pages manually, to extract informations using some black +vodoo magic. Badly, magic have a price, and it's sometimes impossible to get +exactly the informations you want to get from this index. That's the technique +currently being used by distutils2, setuptools and pip.</p> +<p>On the other side, while XML/RPC is working fine, it's requiring extra work +to the python servers each time you request something, which can lead to +some outages from time to time. Also, it's important to point out that, even if +PyPI have a mirroring infrastructure, it's only for the so-called <em>simple</em> API, +and not for the XML/RPC.</p> +<div class="section" id="couchdb"> +<h2>CouchDB</h2> +<p>Here comes CouchDB. CouchDB is a document oriented database, that +knows how to speak REST and JSON. It's easy to use, and provides out of the box +a replication mechanism.</p> +</div> +<div class="section" id="so-what"> +<h2>So, what ?</h2> +<p>Hmm, I'm sure you got it. I've wrote a piece of software to link informations from +PyPI to a CouchDB instance. Then you can replicate all the PyPI index with only +one HTTP request on the CouchDB server. You can also access the informations +from the index directly using a REST API, speaking json. Handy.</p> +<p>So PyPIonCouch is using the PyPI XML/RPC API to get data from PyPI, and +generate records in the CouchDB instance.</p> +<p>The final goal is to avoid to rely on this &quot;simple&quot; API, and rely on a REST +insterface instead. I have set up a couchdb server on my server, which is +available at <a class="reference external" href="http://couchdb.notmyidea.org/_utils/database.html?pypi">http://couchdb.notmyidea.org/_utils/database.html?pypi</a>.</p> +<p>There is not a lot to +see there for now, but I've done the first import from PyPI yesterday and all +went fine: it's possible to access the metadata of all PyPI projects via a REST +interface. Next step is to write a client for this REST interface in +distutils2.</p> +</div> +<div class="section" id="example"> +<h2>Example</h2> +<p>For now, you can use pypioncouch via the command line, or via the python API.</p> +<div class="section" id="using-the-command-line"> +<h3>Using the command line</h3> +<p>You can do something like that for a full import. This <strong>will</strong> take long, +because it's fetching all the projects at pypi and importing their metadata:</p> +<pre class="literal-block"> +$ pypioncouch --fullimport http://your.couchdb.instance/ +</pre> +<p>If you already have the data on your couchdb instance, you can just update it +with the last informations from pypi. <strong>However, I recommend to just replicate +the principal node, hosted at http://couchdb.notmyidea.org/pypi/</strong>, to avoid +the duplication of nodes:</p> +<pre class="literal-block"> +$ pypioncouch --update http://your.couchdb.instance/ +</pre> +<p>The principal node is updated once a day by now, I'll try to see if it's +enough, and ajust with the time.</p> +</div> +<div class="section" id="using-the-python-api"> +<h3>Using the python API</h3> +<p>You can also use the python API to interact with pypioncouch:</p> +<pre class="literal-block"> +&gt;&gt;&gt; from pypioncouch import XmlRpcImporter, import_all, update +&gt;&gt;&gt; full_import() +&gt;&gt;&gt; update() +</pre> +</div> +</div> +<div class="section" id="what-s-next"> +<h2>What's next ?</h2> +<p>I want to make a couchapp, in order to navigate PyPI easily. Here are some of +the features I want to propose:</p> +<ul class="simple"> +<li>List all the available projects</li> +<li>List all the projects, filtered by specifiers</li> +<li>List all the projects by author/maintainer</li> +<li>List all the projects by keywords</li> +<li>Page for each project.</li> +<li>Provide a PyPI &quot;Simple&quot; API equivalent, even if I want to replace it, I do +think it will be really easy to setup mirrors that way, with the out of the +box couchdb replication</li> +</ul> +<p>I also still need to polish the import mechanism, so I can directly store in +couchdb:</p> +<ul class="simple"> +<li>The OPML files for each project</li> +<li>The upload_time as couchdb friendly format (list of int)</li> +<li>The tags as lists (currently it's only a string separated by spaces</li> +</ul> +<p>The work I've done by now is available on +<a class="reference external" href="https://bitbucket.org/ametaireau/pypioncouch/">https://bitbucket.org/ametaireau/pypioncouch/</a>. Keep in mind that it's still +a work in progress, and everything can break at any time. However, any feedback +will be appreciated !</p> +</div> +Help me to go to the distutils2 paris' sprint2011-01-15T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html/<p><strong>Edit: Thanks to logilab and some amazing people, I can make it to paris for the +sprint. Many thanks to them for the support!</strong></p> +<p>There will be a distutils2 sprint from the 27th to the 30th of january, thanks +to logilab which will host the event.</p> +<p>You can find more informations about the sprint on the wiki page of the event +(<a class="reference external" href="http://wiki.python.org/moin/Distutils/SprintParis">http://wiki.python.org/moin/Distutils/SprintParis</a>).</p> +<p>I really want to go there but I'm unfortunately blocked in UK for money reasons. +The cheapest two ways I've found is about £80, which I can't afford. +Following some advices on #distutils, I've set up a ChipIn account for that, so +if some people want to help me making it to go there, they can give me some +money that way.</p> +<p>I'll probably work on the installer (to support old distutils and +setuptools distributions) and on the uninstaller (depending on the first +task). If I can't make it to paris, I'll hang around on IRC to give some help +while needed.</p> +<p>If you want to contribute some money to help me go there, feel free to use this +chipin page: <a class="reference external" href="http://ametaireau.chipin.com/distutils2-sprint-in-paris">http://ametaireau.chipin.com/distutils2-sprint-in-paris</a></p> +<p>Thanks for your support !</p> +Fork you ! or how the social coding can help you2010-11-05T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html/<p>With <a class="reference external" href="http://github.com">github</a> and <a class="reference external" href="http://www.bitbucket.org">bitbucket</a> coming around, a lot of new usages appears for the +developpers: it's now easy to get feedback on your code/modifications, and to get +help from others by, for instance, forking repositories.</p> +<p>Eeach time I see people helping others, I'm amazed by how we like to share +our knowledge.</p> +<p>I say github, because it seems to be the more mainstream, but I think it's +something strongly related to the <a class="reference external" href="http://en.wikipedia.org/wiki/Distributed_revision_control">DVCS</a> principles: the &quot;only&quot; thing github have +made is to turn that into a social network, and to reveal the awesomeness of the +DVCSes to the masses.</p> +<p>What is really interesting is to see how this platform is addictive: it's +automatically updating a webpages with the more accurate informations about the +projects you're involved in, and add a bit of magic to that using webhooks, +allowing you to update your website each time you push to you repository, for +instance.</p> +<p>Quite nothing, indeed, but, I don't know why, I find this fascinating.</p> +<p>I haven't had the privilege to see my projects forked from github by strangers, +but I've forked others repository to give an hand some times, when I wanted to, +and the main reason is &quot;because it's <strong>fun</strong>&quot; to do so.</p> +<p>Yeah, you're probably right, you have to be a nerd to find fun to fork others. +The good point is that geeks are a kind of nerds, and some geeks are coders :)</p> +<div class="section" id="new-ways-to-contribute"> +<h2>New ways to contribute</h2> +<p>In addition, it seems that he community, or the communities, are there, on those +new social networks for coders. It's really handy to drop an eye on interesting +projects, to report bugs, propose new features, and check what new projects this +or this person have made.</p> +<p>Well, &quot;it's not new&quot;, you may think. That's true, because it's been a while that +SVN was there and even CVS before that. But, it was a bit messy to &quot;fork&quot; a +project, isn't it ? And I'm not talking about all the hell SVN involved with it +(who have not had issues with those messy .svn folders raises an hand !).</p> +<p>It have not been so easy to share code and thoughts about code, to propose +changes on existing code, than now. You think it's better to implement this or +that in a different way ? Clone it (fork it), make your changes and publish +them, and then ask projects owners about it. For sure you'll have answers.</p> +<p>Even if they don't want it, you can easily keep your changes, and keep getting +their updates!</p> +<p>Also, lot of <em>fashionables</em> projects tend to move on DVCS. +Personally, if I know I can fork on a DVCS instead of from a &quot;simple&quot; VCS, +I'll probably be quicker to fork/clone, and to publish changes on my own copy, +than if I had to do so on the upstream repository (and I'll likely dont have +the rights to push to it), because I will not be afraid to break things.</p> +<p>DVCSes makes the contribution easier.</p> +</div> +<div class="section" id="release-early-release-often"> +<h2>Release early, release often</h2> +<p>Maybe have you read <a class="reference external" href="http://www.catb.org/~esr/writings/cathedral-bazaar/">The cathedral and the bazaar</a>, by Eric Steven Raymond ? +(If not, consider doing so, it's a really interesting reading)</p> +<p>Among a lot of others interesting things, one hint he gives is <em>release early, +release often</em>.</p> +<p>I understand it as: if you want to get contributors, release your code early, +even if it's not perfect, and don't be afraid to publish your changes each +time it's needed.</p> +<p>Without notifying it, that's basically what I was doing for my own projects. +I guess that's because Social coding platforms encourages those practices, +partially cause of the possible impact publishing each of your changes can have +on your final solution.</p> +<p>If you have considered publishing your projects, code snippets, or whatever +(code related) but did not done it, considering them not yet ready, maybe +should you think about it twice: you can get feedback and probably start some +interesting discussions about it, if you write code that's readable, of course!</p> +</div> +<div class="section" id="a-step-further-for-open-source-softwares"> +<h2>A step further for open source softwares</h2> +<p>Well, DVCSes are a honking great idea, and they're starting to be really +powerful when applied to free softwares. I mean: if you can't see a project, +it will be hard to contribute to it. And, I don't think anyone wants to +contribute to something closed/proprietary, <em>just for fun</em>. Or maybe am I +missing something.</p> +<p>Maybe it's a kind of revolution, about free and open source softwares (<a class="reference external" href="http://en.wikipedia.org/wiki/Free_and_open_source_software">FOSS</a>), +that is going on. I really like to know I have my word to say about the changes +in the tools I use, and to know that I can make them evolve.</p> +<p>Let's take an example. Imagine I'm using a web framework on daily basis, as a +part of my job as a web developer. I do like using an open source software +because I know how it's working, and because I know that I can interact with the +authors of the framework while they're doing the changes on it.</p> +<p>That's communication, nothing more, and of course I can do that with an internal +proprietary solution, but it will cost me <strong>a lot</strong> more time, for a dead-simple +reason: a company is not as big and powerful as a community can be: it will cost +time to work on this framework, resources to maintain it, fix bugs etc.</p> +<p>Well, I'm starting advocating here about Free and Open Source Softwares use on +companies, what is a bit beyond the scope of this article, so let's back to +our DVCSes and new social related tools.</p> +<p>If I find a bug in this framework, while working, I have the possibility to +go and talk with the creators of the framework, to open a ticket, and even to +make a fix for it, because I've access to the source code. If I want to create a +new feature, I just have to fork it, hack it, and then publish my code to have +feedback of the community.</p> +<p>My fix/work will benefit to all the people (and maybe others companies) working +with this framework, and it's a way to prove the community that my company is +enough skilled to make code-fixes to the framework, so that's all good !</p> +</div> +<div class="section" id="what-s-next"> +<h2>What's next ?</h2> +<p>I hope those social coding platforms are only the begining of a new area. I hope +they will make people realize what the power of the community is, and how easily +they can becomes part of it.</p> +<p>If you're not using them right now, maybe you should do so: have a +look on how the programs you're using are made, consider publishing your +experimentations, and share them with others, you will see, it's kind of +addictive !</p> +</div> +How to reboot your bebox using the CLI2010-10-21T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html/<p>I've an internet connection which, for some obscure reasons, tend to be very +slow from time to time. After rebooting the box (yes, that's a hard solution), +all the things seems to go fine again.</p> +<div class="section" id="edit-using-grep"> +<h2>EDIT : Using grep</h2> +<p>After a bit of reflexion, that's also really easy to do using directly the +command line tools curl, grep and tail (but really harder to read).</p> +<div class="highlight"><pre>curl -X POST -u joel:joel http://bebox.config/cgi/b/info/restart/<span class="se">\?</span>be<span class="se">\=</span>0<span class="se">\&amp;</span>l0<span class="se">\=</span>1<span class="se">\&amp;</span>l1<span class="se">\=</span>0<span class="se">\&amp;</span>tid<span class="se">\=</span>RESTART -d <span class="s2">&quot;0=17&amp;2=`curl -u joel:joel http://bebox.config/cgi/b/info/restart/\?be\=0\&amp;l0\=1\&amp;l1\=0\&amp;tid\=RESTART | grep -o &quot;</span><span class="nv">name</span><span class="o">=</span><span class="s1">&#39;2&#39;</span> <span class="nv">value</span><span class="o">=</span><span class="err">&#39;</span><span class="o">[</span>0-9<span class="o">]</span><span class="se">\+</span><span class="s2">&quot; | grep -o &quot;</span><span class="o">[</span>0-9<span class="o">]</span><span class="se">\+</span><span class="s2">&quot; | tail -n 1`&amp;1&quot;</span> +</pre></div> +</div> +<div class="section" id="the-python-version"> +<h2>The Python version</h2> +<p>Well, that's not the optimal solution, that's a bit &quot;gruik&quot;, but it works.</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">urllib2</span> +<span class="kn">import</span> <span class="nn">urlparse</span> +<span class="kn">import</span> <span class="nn">re</span> +<span class="kn">import</span> <span class="nn">argparse</span> + +<span class="n">REBOOT_URL</span> <span class="o">=</span> <span class="s">&#39;/b/info/restart/?be=0&amp;l0=1&amp;l1=0&amp;tid=RESTART&#39;</span> +<span class="n">BOX_URL</span> <span class="o">=</span> <span class="s">&#39;http://bebox.config/cgi&#39;</span> + +<span class="k">def</span> <span class="nf">open_url</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span> + <span class="n">passman</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">HTTPPasswordMgrWithDefaultRealm</span><span class="p">()</span> + <span class="n">passman</span><span class="o">.</span><span class="n">add_password</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> + <span class="n">authhandler</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">HTTPBasicAuthHandler</span><span class="p">(</span><span class="n">passman</span><span class="p">)</span> + + <span class="n">opener</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span><span class="n">authhandler</span><span class="p">)</span> + + <span class="n">urllib2</span><span class="o">.</span><span class="n">install_opener</span><span class="p">(</span><span class="n">opener</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> + +<span class="k">def</span> <span class="nf">reboot</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">open_url</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> + <span class="n">token</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&quot;name\=</span><span class="se">\\</span><span class="s">&#39;2</span><span class="se">\\</span><span class="s">&#39; value=</span><span class="se">\\</span><span class="s">&#39;([0-9]+)</span><span class="se">\\</span><span class="s">&#39;&quot;</span><span class="p">,</span> <span class="n">data</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> + <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s">&#39;0=17&amp;2=</span><span class="si">%s</span><span class="s">&amp;1&#39;</span> <span class="o">%</span> <span class="n">token</span><span class="p">))</span> + +<span class="k">if</span> <span class="n">__file__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span> + <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s">&quot;&quot;&quot;Reboot your bebox !&quot;&quot;&quot;</span><span class="p">)</span> + + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">dest</span><span class="o">=</span><span class="s">&#39;user&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&#39;username&#39;</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">dest</span><span class="o">=</span><span class="s">&#39;password&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&#39;password&#39;</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">boxurl</span><span class="o">=</span><span class="s">&#39;boxurl&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">BOX_URL</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&#39;Base box url. Default is </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">BOX_URL</span><span class="p">)</span> + + <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> + <span class="n">url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urljoin</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">boxurl</span><span class="p">,</span> <span class="n">REBOOT_URL</span><span class="p">)</span> + <span class="n">reboot</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">password</span><span class="p">)</span> +</pre></div> +</div> +Dynamically change your gnome desktop wallpaper2010-10-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html/<p>In gnome, you can can use a XML file to have a dynamic wallpaper. +It's not so easy, and you can't just tell: use the pictures in this folder to do +so.</p> +<p>You can have a look to the git repository if you want: <a class="reference external" href="http://github.com/ametaireau/gnome-background-generator">http://github.com/ametaireau/gnome-background-generator</a></p> +<p>Some time ago, I've made a little python script to ease that, and you can now +use it too. It's named &quot;gnome-background-generator&quot;, and you can install it via +pip for instance.</p> +<div class="highlight"><pre>$ pip install gnome-background-generator +</pre></div> +<p>Then, you have just to use it this way:</p> +<div class="highlight"><pre>$ gnome-background-generator -p ~/Images/walls -s +/home/alexis/Images/walls/dynamic-wallpaper.xml generated +</pre></div> +<p>Here is a extract of the <cite>--help</cite>:</p> +<div class="highlight"><pre>$ gnome-background-generator --help +usage: gnome-background-generator [-h] [-p PATH] [-o OUTPUT] + [-t TRANSITION_TIME] [-d DISPLAY_TIME] [-s] + [-b] + +A simple command line tool to generate an XML file to use for gnome +wallpapers, to have dynamic walls + +optional arguments: + -h, --help show this help message and exit + -p PATH, --path PATH Path to look for the pictures. If no output is + specified, will be used too for outputing the dynamic- + wallpaper.xml file. Default value is the current + directory (.) + -o OUTPUT, --output OUTPUT + Output filename. If no filename is specified, a + dynamic-wallpaper.xml file will be generated in the + path containing the pictures. You can also use &quot;-&quot; to + display the xml in the stdout. + -t TRANSITION_TIME, --transition-time TRANSITION_TIME + Time (in seconds) transitions must last (default value + is 2 seconds) + -d DISPLAY_TIME, --display-time DISPLAY_TIME + Time (in seconds) a picture must be displayed. Default + value is 900 (15mn) + -s, --set-background &#39;&#39;&#39;try to set the background using gnome-appearance- + properties + -b, --debug +</pre></div> +How to install NGINX + PHP 5.3 on FreeBSD.2010-10-10T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html/<p>I've not managed so far to get completely rid of php, so here's a simple +reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but +that's worse to have the piece of configuration somewhere !</p> +<pre class="literal-block"> +# update the ports +$ portsnap fetch update + +# install php5 port +$ make config-recursive -C /usr/ports/lang/php5-extensions +$ make package-recursive -C /usr/ports/lang/php5-extensions + +# install nginx +$ make config-recursive -C /usr/ports/www/nginx-devel +$ make package-recursive -C /usr/ports/www/nginx-devel +</pre> +<p>Now we have all the dependencies installed, we need to configure a bit the +server.</p> +<p>That's a simple thing in fact, but it could be good to have something that will +work without effort over time.</p> +<p>Here's a sample of my configuration:</p> +<pre class="literal-block"> +server { + server_name ndd; + set $path /path/to/your/files; + root $path; + + location / { + index index.php; + } + + location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { + access_log off; + expires 30d; + } + + location ~ .php$ { + fastcgi_param SCRIPT_FILENAME $path$fastcgi_script_name; + fastcgi_pass backend; + include fastcgi_params; + } +} + +upstream backend { + server 127.0.0.1:9000; +} +</pre> +<p>And that's it !</p> +Pelican, a simple static blog generator in python2010-10-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html/<p>Those days, I've wrote a little python application to fit my blogging needs. +I'm an occasional blogger, a vim lover, I like restructured text and DVCSes, so +I've made a little tool that makes good use of all that.</p> +<p><a class="reference external" href="http://alexis.notmyidea.org/pelican/">Pelican</a> (for calepin) is just a simple tool to generate your blog as static +files, letting you using your editor of choice (vim!). It's easy to extend, +and has a template support (via jinja2).</p> +<p>I've made it to fit <em>my</em> needs. I hope it will fit yours, but maybe it wont, and +it have not be designed to feet everyone's needs.</p> +<p>Need an example ? You're looking at it ! This weblog is using pelican to be +generated, also for the atom feeds.</p> +<p>I've released it under AGPL, since I want all the modifications to be profitable +to all the users.</p> +<p>You can find a mercurial repository to fork at <a class="reference external" href="http://hg.lolnet.org/pelican/">http://hg.lolnet.org/pelican/</a>, +feel free to hack it !</p> +<p>If you just want to get started, use your installer of choice (pip, easy_install, …) +And then have a look to the help (<cite>pelican --help</cite>)</p> +<div class="highlight"><pre><span class="nv">$ </span>pip install pelican +</pre></div> +<div class="section" id="usage"> +<h2>Usage</h2> +<p>Here's a sample usage of pelican</p> +<div class="highlight"><pre><span class="nv">$ </span>pelican . +writing /home/alexis/projets/notmyidea.org/output/index.html +writing /home/alexis/projets/notmyidea.org/output/tags.html +writing /home/alexis/projets/notmyidea.org/output/categories.html +writing /home/alexis/projets/notmyidea.org/output/archives.html +writing /home/alexis/projets/notmyidea.org/output/category/python.html +writing +/home/alexis/projets/notmyidea.org/output/pelican-a-simple-static-blog-generator-in-python.html +Done ! +</pre></div> +<p>You also can use the <cite>--help</cite> option for the command line to get more +informations</p> +<div class="highlight"><pre><span class="nv">$pelican</span> --help +usage: pelican <span class="o">[</span>-h<span class="o">]</span> <span class="o">[</span>-t TEMPLATES<span class="o">]</span> <span class="o">[</span>-o OUTPUT<span class="o">]</span> <span class="o">[</span>-m MARKUP<span class="o">]</span> <span class="o">[</span>-s SETTINGS<span class="o">]</span> <span class="o">[</span>-b<span class="o">]</span> + path + +A tool to generate a static blog, with restructured text input files. + +positional arguments: + path Path where to find the content files <span class="o">(</span>default is + <span class="s2">&quot;content&quot;</span><span class="o">)</span>. + +optional arguments: + -h, --help show this <span class="nb">help </span>message and <span class="nb">exit</span> + -t TEMPLATES, --templates-path TEMPLATES + Path where to find the templates. If not specified, + will uses the ones included with pelican. + -o OUTPUT, --output OUTPUT + Where to output the generated files. If not specified, + a directory will be created, named <span class="s2">&quot;output&quot;</span> in the + current path. + -m MARKUP, --markup MARKUP + the markup language to use. Currently only + ReSTreucturedtext is available. + -s SETTINGS, --settings SETTINGS + the settings of the application. Default to None. + -b, --debug +</pre></div> +<p>Enjoy :)</p> +</div> +An amazing summer of code working on distutils22010-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html/<p>The <a class="reference external" href="http://code.google.com/soc/">Google Summer of Code</a> I've +spent working on <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> +is over. It was a really amazing experience, for many reasons.</p> +<p>First of all, we had a very good team, we were 5 students working +on distutils2: <a class="reference external" href="http://zubin71.wordpress.com">Zubin</a>, +<a class="reference external" href="http://wokslog.wordpress.com/">Éric</a>, +<a class="reference external" href="http://gsoc.djolonga.com/">Josip</a>, +<a class="reference external" href="http://konryd.blogspot.com/">Konrad</a> and me. In addition, +<a class="reference external" href="http://mouadino.blogspot.com/">Mouad</a> have worked on the PyPI +testing infrastructure. You could find what each person have done +on +<a class="reference external" href="http://bitbucket.org/tarek/distutils2/wiki/GSoC_2010_teams">the wiki page of distutils2</a>.</p> +<p>We were in contact with each others really often, helping us when +possible (in #distutils), and were continuously aware of the state +of the work of each participant. This, in my opinion, have bring us +in a good shape.</p> +<p>Then, I've learned a lot. Python packaging was completely new to me +at the time of the GSoC start, and I was pretty unfamiliar with +python good practices too, as I've been introducing myself to +python in the late 2009.</p> +<p>I've recently looked at some python code I wrote just three months +ago, and I was amazed to think about many improvements to made on +it. I guess this is a good indicator of the path I've traveled +since I wrote it.</p> +<p>This summer was awesome because I've learned about python good +practices, now having some strong +<a class="reference external" href="http://mercurial.selenic.com/">mercurial</a> knowledge, and I've +seen a little how the python community works.</p> +<p>Then, I would like to say a big thanks to all the mentors that have +hanged around while needed, on IRC or via mail, and especially my +mentor for this summer, <a class="reference external" href="http://tarek.ziade.org">Tarek Ziadé</a>.</p> +<p>Thanks a lot for your motivation, your leadership and your +cheerfulness, even with a new-born and a new work!</p> +<div class="section" id="why"> +<h2>Why ?</h2> +<p>I wanted to work on python packaging because, as the time pass, we +were having a sort of complex tools in this field. Each one wanted +to add features to distutils, but not in a standard way.</p> +<p>Now, we have PEPs that describes some format we agreed on (see PEP +345), and we wanted to have a tool on which users can base their +code on, that's <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a>.</p> +</div> +<div class="section" id="my-job"> +<h2>My job</h2> +<p>I had to provides a way to crawl the PyPI indexes in a simple way, +and do some installation / uninstallation scripts.</p> +<p>All the work done is available in +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/">my bitbucket repository</a>.</p> +<div class="section" id="crawling-the-pypi-indexes"> +<h3>Crawling the PyPI indexes</h3> +<p>There are two ways of requesting informations from the indexes: +using the &quot;simple&quot; index, that is a kind of REST index, and using +XML-RPC.</p> +<p>I've done the two implementations, and a high level API to query +those twos. Basically, this supports the mirroring infrastructure +defined in PEP 381. So far, the work I've done is gonna be used in +pip (they've basically copy/paste the code, but this will change as +soon as we get something completely stable for distutils2), and +that's a good news, as it was the main reason for what I've done +that.</p> +<p>I've tried to have an unified API for the clients, to switch from +one to another implementation easily. I'm already thinking of +adding others crawlers to this stuff, and it was made to be +extensible.</p> +<p>If you want to get more informations about the crawlers/PyPI +clients, please refer to the distutils2 documentation, especially +<a class="reference external" href="http://distutils2.notmyidea.org/library/distutils2.index.html">the pages about indexes</a>.</p> +<p>You can find the changes I made about this in the +<a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> source code .</p> +</div> +<div class="section" id="installation-uninstallation-scripts"> +<h3>Installation / Uninstallation scripts</h3> +<p>Next step was to think about an installation script, and an +uninstaller. I've not done the uninstaller part, and it's a smart +part, as it's basically removing some files from the system, so +I'll probably do it in a near future.</p> +<p><a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> provides a way to +install distributions, and to handle dependencies between releases. +For now, this support is only about the last version of the +METADATA (1.2) (See, the PEP 345), but I'm working on a +compatibility layer for the old metadata, and for the informations +provided via PIP requires.txt, for instance.</p> +</div> +<div class="section" id="extra-work"> +<h3>Extra work</h3> +<p>Also, I've done some extra work. this includes:</p> +<ul class="simple"> +<li>working on the PEP 345, and having some discussion about it +(about the names of some fields).</li> +<li>writing a PyPI server mock, useful for tests. you can find more +information about it on the +<a class="reference external" href="http://distutils.notmyidea.org">documentation</a>.</li> +</ul> +</div> +</div> +<div class="section" id="futures-plans"> +<h2>Futures plans</h2> +<p>As I said, I've enjoyed working on distutils2, and the people I've +met here are really pleasant to work with. So I <em>want</em> to continue +contributing on python, and especially on python packaging, because +there is still a lot of things to do in this scope, to get +something really usable.</p> +<p>I'm not plainly satisfied by the work I've done, so I'll probably +tweak it a bit: the installer part is not yet completely finished, +and I want to add support for a real +<a class="reference external" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a> +index in the future.</p> +<p>We'll talk again of this in the next months, probably, but we +definitely need a real +<a class="reference external" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a> +API for <a class="reference external" href="http://pypi.python.org">PyPI</a>, as the &quot;simple&quot; index +<em>is</em> an ugly hack, in my opinion. I'll work on a serious +proposition about this, maybe involving +<a class="reference external" href="http://couchdb.org">CouchDB</a>, as it seems to be a good option +for what we want here.</p> +</div> +<div class="section" id="issues"> +<h2>Issues</h2> +<p>I've encountered some issues during this summer. The main one is +that's hard to work remotely, especially being in the same room +that we live, with others. I like to just think about a project +with other people, a paper and a pencil, no computers. This have +been not so possible at the start of the project, as I needed to +read a lot of code to understand the codebase, and then to +read/write emails.</p> +<p>I've finally managed to work in an office, so good point for +home/office separation.</p> +<p>I'd not planned there will be so a high number of emails to read, +in order to follow what's up in the python world, and be a part of +the community seems to takes some times to read/write emails, +especially for those (like me) that arent so confortable with +english (but this had brought me some english fu !).</p> +</div> +<div class="section" id="thanks"> +<h2>Thanks !</h2> +<p>A big thanks to <a class="reference external" href="http://www.graine-libre.fr/">Graine Libre</a> and +<a class="reference external" href="http://www.makina-corpus.com/">Makina Corpus</a>, which has offered +me to come into their offices from time to time, to share they +cheerfulness ! Many thanks too to the Google Summer of Code program +for setting up such an initiative. If you're a student, if you're +interested about FOSS, dont hesitate any second, it's a really good +opportunity to work on interesting projects!</p> +</div> +Introducing the distutils2 index crawlers2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html/<p>I'm working for about a month for distutils2, even if I was being a +bit busy (as I had some class courses and exams to work on)</p> +<p>I'll try do sum-up my general feelings here, and the work I've made +so far. You can also find, if you're interested, my weekly +summaries in +<a class="reference external" href="http://wiki.notmyidea.org/distutils2_schedule">a dedicated wiki page</a>.</p> +<div class="section" id="general-feelings"> +<h2>General feelings</h2> +<p>First, and it's a really important point, the GSoC is going very +well, for me as for other students, at least from my perspective. +It's a pleasure to work with such enthusiast people, as this make +the global atmosphere very pleasant to live.</p> +<p>First of all, I've spent time to read the existing codebase, and to +understand what we're going to do, and what's the rationale to do +so.</p> +<p>It's really clear for me now: what we're building is the +foundations of a packaging infrastructure in python. The fact is +that many projects co-exists, and comes all with their good +concepts. Distutils2 tries to take the interesting parts of all, +and to provide it in the python standard libs, respecting the +recently written PEP about packaging.</p> +<p>With distutils2, it will be simpler to make &quot;things&quot; compatible. So +if you think about a new way to deal with distributions and +packaging in python, you can use the Distutils2 APIs to do so.</p> +</div> +<div class="section" id="tasks"> +<h2>Tasks</h2> +<p>My main task while working on distutils2 is to provide an +installation and an un-installation command, as described in PEP +376. For this, I first need to get informations about the existing +distributions (what's their version, name, metadata, dependencies, +etc.)</p> +<p>The main index, you probably know and use, is PyPI. You can access +it at <a class="reference external" href="http://pypi.python.org">http://pypi.python.org</a>.</p> +</div> +<div class="section" id="pypi-index-crawling"> +<h2>PyPI index crawling</h2> +<p>There is two ways to get these informations from PyPI: using the +simple API, or via xml-rpc calls.</p> +<p>A goal was to use the version specifiers defined +in`PEP 345 &lt;<a class="reference external" href="http://www.python.org/dev/peps/pep-0345/">http://www.python.org/dev/peps/pep-0345/</a>&gt;`_ and to +provides a way to sort the grabbed distributions depending our +needs, to pick the version we want/need.</p> +<div class="section" id="using-the-simple-api"> +<h3>Using the simple API</h3> +<p>The simple API is composed of HTML pages you can access at +<a class="reference external" href="http://pypi.python.org/simple/">http://pypi.python.org/simple/</a>.</p> +<p>Distribute and Setuptools already provides a crawler for that, but +it deals with their internal mechanisms, and I found that the code +was not so clear as I want, that's why I've preferred to pick up +the good ideas, and some implementation details, plus re-thinking +the global architecture.</p> +<p>The rules are simple: each project have a dedicated page, which +allows us to get informations about:</p> +<ul class="simple"> +<li>the distribution download locations (for some versions)</li> +<li>homepage links</li> +<li>some other useful informations, as the bugtracker address, for +instance.</li> +</ul> +<p>If you want to find all the distributions of the &quot;EggsAndSpam&quot; +project, you could do the following (do not take so attention to +the names here, as the API will probably change a bit):</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">index</span> <span class="o">=</span> <span class="n">SimpleIndex</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">index</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;EggsAndSpam&quot;</span><span class="p">)</span> +<span class="p">[</span><span class="n">EggsAndSpam</span> <span class="mf">1.1</span><span class="p">,</span> <span class="n">EggsAndSpam</span> <span class="mf">1.2</span><span class="p">,</span> <span class="n">EggsAndSpam</span> <span class="mf">1.3</span><span class="p">]</span> +</pre></div> +<p>We also could use version specifiers:</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">index</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;EggsAndSpam (&lt; =1.2)&quot;</span><span class="p">)</span> +<span class="p">[</span><span class="n">EggsAndSpam</span> <span class="mf">1.1</span><span class="p">,</span> <span class="n">EggsAndSpam</span> <span class="mf">1.2</span><span class="p">]</span> +</pre></div> +<p>Internally, what's done here is the following:</p> +<ul class="simple"> +<li>it process the +<a class="reference external" href="http://pypi.python.org/simple/FooBar/">http://pypi.python.org/simple/FooBar/</a> +page, searching for download URLs.</li> +<li>for each found distribution download URL, it creates an object, +containing informations about the project name, the version and the +URL where the archive remains.</li> +<li>it sort the found distributions, using version numbers. The +default behavior here is to prefer source distributions (over +binary ones), and to rely on the last &quot;final&quot; distribution (rather +than beta, alpha etc. ones)</li> +</ul> +<p>So, nothing hard or difficult here.</p> +<p>We provides a bunch of other features, like relying on the new PyPI +mirroring infrastructure or filter the found distributions by some +criterias. If you're curious, please browse the +<a class="reference external" href="http://distutils2.notmyidea.org/">distutils2 documentation</a>.</p> +</div> +<div class="section" id="using-xml-rpc"> +<h3>Using xml-rpc</h3> +<p>We also can make some xmlrpc calls to retreive informations from +PyPI. It's a really more reliable way to get informations from from +the index (as it's just the index that provides the informations), +but cost processes on the PyPI distant server.</p> +<p>For now, this way of querying the xmlrpc client is not available on +Distutils2, as I'm working on it. The main pieces are already +present (I'll reuse some work I've made from the SimpleIndex +querying, and +<a class="reference external" href="http://github.com/ametaireau/pypiclient">some code already set up</a>), +what I need to do is to provide a xml-rpc PyPI mock server, and +that's on what I'm actually working on.</p> +</div> +</div> +<div class="section" id="processes"> +<h2>Processes</h2> +<p>For now, I'm trying to follow the &quot;documentation, then test, then +code&quot; path, and that seems to be really needed while working with a +community. Code is hard to read/understand, compared to +documentation, and it's easier to change.</p> +<p>While writing the simple index crawling work, I must have done this +to avoid some changes on the API, and some loss of time.</p> +<p>Also, I've set up +<a class="reference external" href="http://wiki.notmyidea.org/distutils2_schedule">a schedule</a>, and +the goal is to be sure everything will be ready in time, for the +end of the summer. (And now, I need to learn to follow schedules +...)</p> +</div> +Sprinting on distutils2 in Tours2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html/<p>Yesterday, as I was traveling to Tours, I've took some time to +visit Éric, another student who's working on distutils2 this +summer, as a part of the GSoC. Basically, it was to take a drink, +discuss a bit about distutils2, our respective tasks and general +feelings, and to put a face on a pseudonym. I'd really enjoyed this +time, because Éric knows a lot of things about mercurial and python +good practices, and I'm eager to learn about those. So, we have +discussed about things, have not wrote so much code, but have some +things to propose so far, about documentation, and I also provides +here some bribes of conversations we had.</p> +<div class="section" id="documentation"> +<h2>Documentation</h2> +<p>While writing the PyPI simple index crawler documentation, I +realized that we miss some structure, or how-to about the +documentation. Yep, you read well. We lack documentation on how to +make documentation. Heh. We're missing some rules to follow, and +this lead to a not-so-structured final documentation. We probably +target three type of publics, and we can split the documentation +regarding those:</p> +<ul class="simple"> +<li><strong>Packagers</strong> who want to distribute their softwares.</li> +<li><strong>End users</strong> who need to understand how to use end user +commands, like the installer/uninstaller</li> +<li><strong>packaging coders</strong> who <em>use</em> distutils2, as a base for +building a package manager.</li> +</ul> +<p>We also need to discuss about a pattern to follow while writing +documentation. How many parts do we need ? Where to put the API +description ? etc. That's maybe seems to be not so important, but I +guess the readers would appreciate to have the same structure all +along distutils2 documentation.</p> +</div> +<div class="section" id="mercurial"> +<h2>Mercurial</h2> +<p>I'm really <em>not</em> a mercurial power user. I use it on daily basis, +but I lack of basic knowledge about it. Big thanks Éric for sharing +yours with me, you're of a great help. We have talked about some +mercurial extensions that seems to make the life simpler, while +used the right way. I've not used them so far, so consider this as +a personal note.</p> +<ul class="simple"> +<li>hg histedit, to edit the history</li> +<li>hg crecord, to select the changes to commit</li> +</ul> +<p>We have spent some time to review a merge I made sunday, to +re-merge it, and commit the changes as a new changeset. Awesome. +These things make me say I <strong>need</strong> to read +<a class="reference external" href="http://hgbook.red-bean.com/read/">the hg book</a>, and will do as +soon as I got some spare time: mercurial seems to be simply great. +So ... Great. I'm a powerful merger now !</p> +</div> +<div class="section" id="on-using-tools"> +<h2>On using tools</h2> +<p>Because we <em>also</em> are <em>hackers</em>, we have shared a bit our ways to +code, the tools we use, etc. Both of us were using vim, and I've +discovered vimdiff and hgtk, which will completely change the way I +navigate into the mercurial history. We aren't &quot;power users&quot;, so we +have learned from each other about vim tips. You can find +<a class="reference external" href="http://github.com/ametaireau/dotfiles">my dotfiles on github</a>, +if it could help. They're not perfect, and not intended to be, +because changing all the time, as I learn. Don't hesitate to have a +look, and to propose enhancements if you have !</p> +</div> +<div class="section" id="on-being-pythonic"> +<h2>On being pythonic</h2> +<p>My background as an old Java user disserves me so far, as the +paradigms are not the same while coding in python. Hard to find the +more pythonic way to do, and sometimes hard to unlearn my way to +think about software engineering. Well, it seems that the only +solution is to read code, and to re-read import this from times to +times ! +<a class="reference external" href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html">Coding like a pythonista</a> +seems to be a must-read, so, I know what to do.</p> +</div> +<div class="section" id="conclusion"> +<h2>Conclusion</h2> +<p>It was really great. Next time, we'll need to focus a bit more on +distutils2, and to have a bullet list of things to do, but days +like this one are opportunities to catch ! We'll probably do +another sprint in a few weeks, stay tuned !</p> +</div> +Use Restructured Text (ReST) to power your presentations2010-06-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html/<p>Wednesday, we give a presentation, with some friends, about the +CouchDB Database, to +<a class="reference external" href="http://www.toulibre.org">the Toulouse local LUG</a>. Thanks a lot +to all the presents for being there, it was a pleasure to talk +about this topic with you. Too bad the season is over now an I quit +Toulouse next year.</p> +<p>During our brainstorming about the topic, we +used some paper, and we wanted to make a presentation the simpler +way. First thing that come to my mind was using +<a class="reference external" href="http://docutils.sourceforge.net/rst.html">restructured text</a>, so +I've wrote a simple file containing our different bullet points. In +fact, there is quite nothing to do then, to have a working +presentation.</p> +<p>So far, I've used +<a class="reference external" href="http://code.google.com/p/rst2pdf/">the rst2pdf program</a>, and a +simple template, to generate output. It's probably simple to have +similar results using latex + beamer, I'll try this next time, but +as I'm not familiar with latex syntax, restructured text was a +great option.</p> +<p>Here are +<a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.pdf">the final PDF output</a>, +<a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.rst">Rhe ReST source</a>, +<a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/slides.style">the theme used</a>, +and the command line to generate the PDF:</p> +<pre class="literal-block"> +rst2pdf couchdb.rst -b1 -s ../slides.style +</pre> +first week working on distutils22010-06-04T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html/<p>As I've been working on +<a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a> during the past +week, taking part of the +<a class="reference external" href="http://code.google.com/intl/fr/soc/">GSOC</a> program, here is a +short summary of what I've done so far.</p> +<p>As my courses are not over yet, I've not worked as much as I +wanted, and this will continues until the end of June. My main +tasks are about making installation and uninstallation commands, to +have a simple way to install distributions via +<a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a>.</p> +<p>To do this, we need to rely on informations provided by the Python +Package Index (<a class="reference external" href="http://pypi.python.org/">PyPI</a>), and there is at +least two ways to retreive informations from here: XML-RPC and the +&quot;simple&quot; API.</p> +<p>So, I've been working on porting some +<a class="reference external" href="http://bitbucket.org/tarek/distribute/">Distribute</a> related +stuff to <a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a>, cutting +off all non distutils' things, as we do not want to depend from +Distribute's internals. My main work has been about reading the +whole code, writing tests about this and making those tests +possible.</p> +<p>In fact, there was a need of a pypi mocked server, and, after +reading and introducing myself to the distutils behaviors and code, +I've taken some time to improve the work +<a class="reference external" href="http://bitbucket.org/konrad">Konrad</a> makes about this mock.</p> +<div class="section" id="a-pypi-server-mock"> +<h2>A PyPI Server mock</h2> +<p>The mock is embeded in a thread, to make it available during the +tests, in a non blocking way. We first used +<a class="reference external" href="http://wsgi.org">WSGI</a> and +<a class="reference external" href="http://docs.python.org/library/wsgiref.html">wsgiref</a> in order +control what to serve, and to log the requests made to the server, +but finally realised that +<a class="reference external" href="http://docs.python.org/library/wsgiref.html">wsgiref</a> is not +python 2.4 compatible (and we <em>need</em> to be python 2.4 compatible in +Distutils2).</p> +<p>So, we switched to +<a class="reference external" href="http://docs.python.org/library/basehttpserver.html">BaseHTTPServer</a> +and +<a class="reference external" href="http://docs.python.org/library/simplehttpserver.html">SimpleHTTPServer</a>, +and updated our tests accordingly. It's been an opportunity to +realize that <a class="reference external" href="http://wsgi.org">WSGI</a> has been a great step +forward for making HTTP servers, and expose a really simplest way +to discuss with HTTP !</p> +<p>You can find +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/changesets">the modifications I made</a>, +and the +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/src/tip/docs/source/test_framework.rst">related docs</a> +about this on +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/">my bitbucket distutils2 clone</a>.</p> +</div> +<div class="section" id="the-pypi-simple-api"> +<h2>The PyPI Simple API</h2> +<p>So, back to the main problematic: make a python library to access +and request information stored on PyPI, via the simple API. As I +said, I've just grabbed the work made from +<a class="reference external" href="http://bitbucket.org/tarek/distribute/">Distribute</a>, and played +a bit with, in order to view what are the different use cases, and +started to write the related tests.</p> +</div> +<div class="section" id="the-work-to-come"> +<h2>The work to come</h2> +<p>So, once all use cases covered with tests, I'll rewrite a bit the +grabbed code, and do some software design work (to not expose all +things as privates methods, have a clear API, and other things like +this), then update the tests accordingly and write a documentation +to make this clear.</p> +<p>Next step is to a little client, as I've +<a class="reference external" href="http://github.com/ametaireau/pypiclient">already started here</a> +I'll take you updated !</p> +</div> +A Distutils2 GSoC2010-05-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html/<p>WOW. I've been accepted to be a part of the +<a class="reference external" href="http://code.google.com/intl/fr/soc/">Google Summer Of Code</a> +program, and will work on <a class="reference external" href="http://python.org/">python</a> +<a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a>, with +<a class="reference external" href="http://pygsoc.wordpress.com/">a</a> +<a class="reference external" href="http://konryd.blogspot.com/">lot</a> <a class="reference external" href="http://ziade.org/">of</a> +(intersting!) <a class="reference external" href="http://zubin71.wordpress.com/">people</a>.</p> +<blockquote> +So, it's about building the successor of Distutils2, ie. &quot;the +python package manager&quot;. Today, there is too&nbsp;many ways to package a +python application (pip, setuptools, distribute, distutils, etc.) +so&nbsp;there is a huge effort to make in order to make all this +packaging stuff interoperable, as pointed out by +the&nbsp;<a class="reference external" href="http://www.python.org/dev/peps/pep-0376/">PEP 376</a>.</blockquote> +<p>In more details, I'm going to work on the Installer / Uninstaller +features of Distutils2, and on a PyPI XML-RPC client for distutils2. +Here are the already defined tasks:</p> +<ul class="simple"> +<li>Implement Distutils2 APIs described in PEP 376.</li> +<li>Add the uninstall command.</li> +<li>think about a basic installer / uninstaller script. (with deps) +-- similar to pip/easy_install</li> +<li>in a pypi subpackage;</li> +<li>Integrate a module similar to setuptools' package_index'</li> +<li>PyPI XML-RPC client for distutils 2: +<a class="reference external" href="http://bugs.python.org/issue8190">http://bugs.python.org/issue8190</a></li> +</ul> +<p>As I'm relatively new to python, I'll need some extra work in order +to apply all good practice, among other things that can make a +developper-life joyful. I'll post here, each week, my advancement, +and my tought about python and especialy python packaging world.</p> +Le temps des grâces, courrez-y !2010-03-28T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html/<p>Ouf, notre +<a class="reference external" href="http://www.reseaugrappe.org">semaine de l'environnement</a> s'est +terminée, après un peu de neige et un brin de soleil quand il en +fallait.</p> +<p>Ce fut l'occasion de rencontrer beaucoup de gens biens, et +de regarder d'un peu plus près toutes ces problématiques qui +mériteraient à elles seules, chacune un billet. Après un répis +d'une semaine, pour récupérer des folies organisatrices (c'est ça +qui fait du bien, ceci dit -- les folies, pas le repos), je me +retrouve de nouveau sur ces mêms réflexions, grâce aux journées +organisées par +<a class="reference external" href="http://www.fne.asso.fr/">France Nature Environnement</a>, qui +proposaient ce jeudi soir une projection de &quot;Le temps des grâces&quot;, +un documentaire sur l'agriculture.</p> +<p>Parce que depuis 60 ans, il est pratiqué le remembrement des +parcelles à gogo, parce que nos sols deviennent completement morts +à cause des tonnes d'intrants qu'on leur fait absorber, et parce +que les exploitations s'agrandissent sans en finir pour tenter de +réagir façe à un marché financier toujours plus insaisissable, mené +de très loin par la PAC, il fallait un film pour en parler. C'est +ce que fait &quot;le temps des grâçes&quot;, avec un bon sens et une facilité +à faire passer des messages, qu'on ne peut qu'applaudir.</p> +<p>Malheureusement il s'agissait de la dernière diffusion à +<a class="reference external" href="http://www.cinemas-utopia.org/toulouse/">L'Utopia de Toulouse</a>... +Si vous en avez l'occasion, sautez dessus et profitez le temps de +ces 2 heures, ou vous pourrez écouter à la fois des discours +d'agronomes, d'agriculteurs, de chercheurs et bien d'autres, qui +dressent un constat pas si brillant de notre agriculture. On n'est +pas sorti de l'auberge, enfin, c'est l'expression.</p> +<p>Je vous laisse avec le synopsis et une bande annonce.</p> +<blockquote> +Une enquête documentaire sur +le monde agricole français aujourd'hui à travers de nombreux récits +: agriculteurs, chercheurs, agronomes, écrivains... Un monde qui +parvient à résister aux bouleversements qui le frappent - +économiques, scientifiques, sociaux - et qui, bon gré mal gré, +continue d'entretenir les liens entre générations. Un monde au +centre d'interrogations majeures sur l'avenir.</blockquote> +<p>Ainsi qu'un commentaire que je ne peux m'empécher de relayer, +trouvé sur allocine.fr (oui, vous savez, ce site rempli de pubs).</p> +<blockquote> +Le temps des grâces c'est je pense le plus grand film traitant de +l'écologie en tant que documentaire ou en sujet principal, on y +apprend une multitude de choses, on en ressort en colère contre le +système, le film propose différents points de vues, ici on a pas de +voix off moralisatrice à deux balles avec des gros titres bien +surlignés pour que même les beaufs matant TF1 puissent comprendre, +ici même si ça reste accessible au citoyen lambda, le film ne fait +pas de compromis avec le monde agroalimentaire, il ose dénoncer les +filière d'agronomie qui apprennent pas les bonnes choses à leurs +étudiants, aux lobbys de cette agro-industrie qui n'en fait qu'à sa +tête pour amasser de l'argent, cette tendance à tout uniformiser et +détruire… Franchement j'ai trouvé ça génial de bout en bout, +captivant, on explore cette campagne française, on comprend les +dilemmes des paysants. Le film n'étant pas opposé à la modernité, +ni même réactionnaire, il propose juste un constat alarmant du +monde agricole français, tout en proposant des alternatives qui +pourraient être utilisée, si les pouvoirs publics lâchaient un peu +la main des lobbys. Passionnant, vraiment.</blockquote> +<p>Courrez-y, je vous dis.</p> +Semaine de l’environnement: La consommation étudiante2010-02-24T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html/<p>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a class="reference external" href="http://www.framasoft.net/">Framasoft</a>, à <a class="reference external" href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a class="reference external" href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l'informatique), mais aussi <a class="reference external" href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a class="reference external" href="http://www.attac.org/">ATTAC</a> (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.</p> +<p>Dans cette optique, depuis près de 3 ans (déjà !), au sein du +<a class="reference external" href="http://www.reseaugrappe.org">réseau GRAPPE</a>, on <em>essaye</em> +d'aborder des thématiques qui touchent de près ou de loin à +l'environnement, parce que c'est un sujet qui nous importe et nous +passionne. L'année dernière, c'était l'alimentation étudiante, ce +qui à abouti à la publication de +<a class="reference external" href="http://public.reseaugrappe.org/alimentation.pdf">la revue &quot;les étudiants se mettent à table&quot;</a>. +Cette année c'est la consommation étudiante qui est au programme.</p> +<div class="section" id="la-consommation-etudiante"> +<h2>La consommation étudiante ?</h2> +<p>L'idée principale de cette étude est de tenter de faire une analyse +de la &quot;société de consommation&quot;, souvent questionnée par les +étudiants et par d'autres, et de jeter un œil sur le rapport des +étudiants à cette société: Quoi et comment consomment-ils ? Les +universités et les écoles ne poussent-elles pas d’une certaine +manière les étudiants à la consommation ? Quelles sont les +alternatives face aux dérives de surconsommation ?</p> +<blockquote> +Analyse des pratiques, réflexions et mobilisations des étudiants en +termes de consommation seront réalisés pour comprendre leur modes +de vie, mais aussi leurs attentes, leurs propositions sur cette +thématique</blockquote> +</div> +<div class="section" id="la-semaine-de-l-environnement"> +<h2>La semaine de l'environnement !</h2> +<p>A travers l'ensemble des villes du réseau, +des projections de films et des débats auront donc lieu sur ce +thème, lors de la semaine de l'environnement 2010, qui se déroulera +d'ailleurs durant le mois de Mars +<a class="reference external" href="http://www.reseaugrappe.org/la-semaine-de-lenvironnement-programme/">partout en france</a>, +et <strong>du 6 au 14 Mars sur Toulouse</strong>. +<a class="reference external" href="http://docs.notmyidea.org/sde/prog-toulouse.pdf">Jetez un oeil au programme</a> +! Avec pour objectif de sonder un peu le ressenti des étudiants en +terme de consommation, nous avons mis en place +<a class="reference external" href="http://spreadsheets.google.com/viewform?formkey=dHV2bVllS2lWbzhyV3NBN3NUbi1TM2c6MA">un questionnaire en ligne</a>, +que vous pouvez compléter en une petite 10aine de minutes, +n'hésitez pas ! +<a class="reference external" href="http://www.reseaugrappe.org/consommation/">La page sur la consommation étudiante sur le site du GRAPPE</a></p> +</div> +Python ? go !2009-12-17T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-12-17:/python-go.html/<p>Cela fait maintenant un peu plus d'un mois que je travaille sur un +projet en <a class="reference external" href="http://www.djangoproject.org">django</a>, et que, +nécessairement, je me forme à <a class="reference external" href="http://python.org/">Python</a>. Je +prends un plaisir non dissimulé à découvrir ce langage (et à +l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui +me viennent à l'esprit à propos de Python, sont &quot;logique&quot; et +&quot;simple&quot;. Et pourtant puissant pour autant. Je ne manque d'ailleurs +pas une occasion pour faire un peu d'<em>évangélisation</em> auprès des +quelques personnes qui veulent bien m'écouter.</p> +<div class="section" id="the-zen-of-python"> +<h2>The Zen of Python</h2> +<p>Avant toute autre chose, je pense utile de citer Tim Peters, et +<a class="reference external" href="http://www.python.org/dev/peps/pep-0020/">le PEP20</a>, qui +constituent une très bonne introduction au langage, qui prends la +forme d'un <em>easter egg</em> présent dans python</p> +<div class="highlight"><pre>&gt;&gt;&gt; import this +The Zen of Python, by Tim Peters + +Beautiful is better than ugly. +Explicit is better than implicit. +Simple is better than complex. +Complex is better than complicated. +Flat is better than nested. +Sparse is better than dense. +Readability counts. +Special cases aren<span class="s1">&#39;t special enough to break the rules.</span> +<span class="s1">Although practicality beats purity.</span> +<span class="s1">Errors should never pass silently.</span> +<span class="s1">Unless explicitly silenced.</span> +<span class="s1">In the face of ambiguity, refuse the temptation to guess.</span> +<span class="s1">There should be one-- and preferably only one --obvious way to do it.</span> +<span class="s1">Although that way may not be obvious at first unless you&#39;</span>re Dutch. +Now is better than never. +Although never is often better than *right* now. +If the implementation is hard to explain, it<span class="s1">&#39;s a bad idea.</span> +<span class="s1">If the implementation is easy to explain, it may be a good idea.</span> +<span class="s1">Namespaces are one honking great idea -- let&#39;</span>s <span class="k">do </span>more of those! +</pre></div> +<p>J'ai la vague impression que c'est ce que j'ai toujours cherché à +faire en PHP, et particulièrement dans +<a class="reference external" href="http://www.spiral-project.org">le framework Spiral</a>, mais en +ajoutant ces concepts dans une sur-couche au langage. Ici, c'est +directement de <em>l'esprit</em> de python qu'il s'agit, ce qui signifie +que la plupart des bibliothèques python suivent ces concepts. Elle +est pas belle la vie ?</p> +</div> +<div class="section" id="comment-commencer-et-par-ou"> +<h2>Comment commencer, et par ou ?</h2> +<p>Pour ma part, j'ai commencé par la lecture de quelques livres et +articles intéressants, qui constituent une bonne entrée en matière +sur le sujet (La liste n'est bien évidemment pas exhaustive et vos +commentaires sont les bienvenus) :</p> +<ul class="simple"> +<li><a class="reference external" href="http://diveintopython.adrahon.org/">Dive into python</a></li> +<li><a class="reference external" href="http://www.swaroopch.com/notes/Python_fr:Table_des_Matières">A byte of python</a></li> +<li><a class="reference external" href="http://www.amazon.fr/Python-Petit-guide-lusage-développeur/dp/2100508830">Python: petit guide à l'usage du développeur agile</a> +de <a class="reference external" href="http://tarekziade.wordpress.com/">Tarek Ziadé</a></li> +<li><a class="reference external" href="http://docs.python.org/index.html">La documentation officielle python</a>, +bien sûr !</li> +<li><a class="reference external" href="http://video.pycon.fr/videos/pycon-fr-2009/">Les vidéos du pyconfr 2009</a>!</li> +<li>Un peu de temps, et une console python ouverte :)</li> +</ul> +<p>J'essaye par ailleurs de partager au maximum les ressources que je +trouve de temps à autres, que ce soit +<a class="reference external" href="http://www.twitter.com/ametaireau">via twitter</a> ou +<a class="reference external" href="http://delicious.com/ametaireau">via mon compte delicious</a>. +Allez jeter un œil +<a class="reference external" href="http://delicious.com/ametaireau/python">au tag python</a> sur mon +profil, peut être que vous trouverez des choses intéressantes, qui +sait!</p> +</div> +<div class="section" id="un-python-sexy"> +<h2>Un python sexy</h2> +<p>Quelques fonctionnalités qui devraient vous mettre l'eau à la +bouche:</p> +<ul class="simple"> +<li><a class="reference external" href="http://docs.python.org/library/stdtypes.html#comparisons">Le chaînage des opérateurs de comparaison</a> +est possible (a&lt;b &lt;c dans une condition)</li> +<li>Assignation de valeurs multiples (il est possible de faire a,b,c += 1,2,3 par exemple)</li> +<li><a class="reference external" href="http://docs.python.org/tutorial/datastructures.html">Les listes</a> +sont simples à manipuler !</li> +<li>Les <a class="reference external" href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions">list comprehension</a>, +ou comment faire des opérations complexes sur les listes, de +manière simple.</li> +<li>Les +<a class="reference external" href="http://docs.python.org/library/doctest.html?highlight=doctest">doctests</a>: +ou comment faire des tests directement dans la documentation de vos +classes, tout en la documentant avec de vrais exemples.</li> +<li>Les +<a class="reference external" href="http://www.python.org/doc/essays/metaclasses/meta-vladimir.txt">métaclasses</a>, +ou comment contrôler la manière dont les classes se construisent</li> +<li>Python est +<a class="reference external" href="http://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language">un langage à typage fort dynamique</a>: +c'est ce qui m'agaçait avec PHP qui est un langage à typage faible +dynamique.</li> +</ul> +<p>Cous pouvez également aller regarder +<a class="reference external" href="http://video.pycon.fr/videos/free/53/">l'atelier donné par Victor Stinner durant le Pyconfr 09</a>. +Have fun !</p> +</div> +AMAP + Média = Paniers bio à 5e ?!2009-11-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html/<p>Le raccourci me semble un peu rapide. Et pourtant, il est emprunté +bien trop souvent. La dernière <em>mes-utilisation</em> que j'ai à décrier +est celle d'un reportage télé, passé sur France 2 vendredi 23 +Octobre +(<a class="reference external" href="http://docs.notmyidea.org/amap/amap-fr2.avi">voir la vidéo</a>), +ou on parles de +<a class="reference external" href="http://amap.zest.free.fr">l'AMAP étudiante Zest</a>.</p> +<p>Malgré tout le temps passé à expliquer que justement, l'AMAP c'est +avant tout, pour nous, une notion de solidarité envers les +agriculteurs, malgré le fait que le message soit plus profond que +simplement aller acheter du bio (ça, c'est possible aussi en +supermarché), malgré le fait qu'il s'agisse en fait d'une remise en +cause plus profonde de la société, les journalistes n'ont choisi de +prendre que les quelques secondes qui leurs convenaient, celles qui +ne faisaient pas tache, celle ou je dis que &quot;l'AMAP permet aux +étudiants de réapprendre à cuisiner, plutôt que de manger des +nouilles et de se faire des plats réchauffés&quot;. Bien sur, je l'ai +dit et je le pense d'ailleurs, là n'est pas le problème, mais mon +message n'était pas celui là.</p> +<p>Jamais, dans les quelques minutes du reportage, on ne dit ce que +AMAP signifie: Association de <strong>Maintien</strong> d'une Agriculture +<strong>Paysanne</strong>. On ne parles même pas des agriculteurs ! C'est +simplement plus facile pour les étudiants de venir récupérer leurs +paniers, puisque les points de distribution sont sur les facs, et +en plus ça ne coute que 5 euros ! ...</p> +<p>Alors je crois bon de rappeler que L'AMAP n'est pas seulement un +service, c'est un engagement. Sur 5 mois, un engagement solidaire, +c'est la donnée principale de l'équation, celle sans quoi ça ne +peut fonctionner. Par le biais de cette AMAP, on essaye de montrer +que d'autres agricultures sont possibles, que la solidarité c'est +bien réel, et qu'il est possible de sortir du +<em>tout, tout de suite</em>.</p> +<p>Mais bon, apparemment, ça passe pas bien à la télé.</p> + \ No newline at end of file diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml new file mode 100644 index 0000000..4e1f5f6 --- /dev/null +++ b/feeds/all.atom.xml @@ -0,0 +1,1681 @@ + +Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00ZUsing dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +influenced by python, and the languages that influenced python itself.</p> +<p>Well, that's kind of interesting to know which languages influenced others, +it could even be more interesting to have an overview of the connexion between +them, keeping python as the main focus.</p> +<p>This information is available on the wikipedia page, but not in a really +exploitable format. Hopefully, this information is provided into the +information box present on the majority of wikipedia pages. And… guess what? +there is project with the goal to scrap and index all this information in +a more queriable way, using the semantic web technologies.</p> +<p>Well, you may have guessed it, the project in question in dbpedia, and exposes +information in the form of RDF triples, which are way more easy to work with +than simple HTML.</p> +<p>For instance, let's take the page about python: +<a class="reference external" href="http://dbpedia.org/page/Python_%28programming_language%29">http://dbpedia.org/page/Python_%28programming_language%29</a></p> +<p>The interesting properties here are &quot;Influenced&quot; and &quot;InfluencedBy&quot;, which +allows us to get a list of languages. Unfortunately, they are not really using +all the power of the Semantic Web here, and the list is actually a string with +coma separated values in it.</p> +<p>Anyway, we can use a simple rule: All wikipedia pages of programming languages +are either named after the name of the language itself, or suffixed with &quot;( +programming language)&quot;, which is the case for python.</p> +<p>So I've built <a class="reference external" href="https://github.com/ametaireau/experiments/blob/master/influences/get_influences.py">a tiny script to extract the information from dbpedia</a> and transform them into a shiny graph using graphviz.</p> +<p>After a nice:</p> +<pre class="literal-block"> +$ python get_influences.py python dot | dot -Tpng &gt; influences.png +</pre> +<p>The result is the following graph (<a class="reference external" href="http://files.lolnet.org/alexis/influences.png">see it directly here</a>)</p> +<img alt="http://files.lolnet.org/alexis/influences.png" src="http://files.lolnet.org/alexis/influences.png" style="width: 800px;" /> +<p>While reading this diagram, keep in mind that it is a) not listing all the +languages and b) keeping a python perspective.</p> +<p>This means that you can trust the scheme by following the arrows from python to +something and from something to python, it is not trying to get the matching +between all the languages at the same time to keep stuff readable.</p> +<p>It would certainly be possible to have all the connections between all +languages (and the resulting script would be easier) to do so, but the resulting +graph would probably be way less readable.</p> +<p>You can find the script <a class="reference external" href="https://github.com/ametaireau/experiments">on my github account</a>. Feel free to adapt it for +whatever you want if you feel hackish.</p> +Pelican, 9 months later2011-07-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html/<p>Back in October, I released <a class="reference external" href="http://docs.notmyidea.org/alexis/pelican">pelican</a>, +a little piece of code I wrote to power this weblog. I had simple needs: I wanted +to be able to use my text editor of choice (vim), a vcs (mercurial) and +restructured text. I started to write a really simple blog engine +in something like a hundred python lines and released it on github.</p> +<p>And people started contributing. I wasn't at all expecting to see people +interested in such a little piece of code, but it turned out that they were. +I refactored the code to make it evolve a bit more by two times and eventually, +in 9 months, got 49 forks, 139 issues and 73 pull requests.</p> +<p><strong>Which is clearly awesome.</strong></p> +<p>I pulled features such as translations, tag +clouds, integration with different services such as twitter or piwik, import +from dotclear and rss, fixed +a number of mistakes and improved a lot the codebase. This was a proof that +there is a bunch of people that are willing to make better softwares just for +the sake of fun.</p> +<p>Thank you, guys, you're why I like open source so much.</p> +Using JPype to bridge python and Java2011-06-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html/<p>Java provides some interesting libraries that have no exact equivalent in +python. In my case, the awesome boilerpipe library allows me to remove +uninteresting parts of HTML pages, like menus, footers and other &quot;boilerplate&quot; +contents.</p> +<p>Boilerpipe is written in Java. Two solutions then: using java from python or +reimplement boilerpipe in python. I will let you guess which one I chosen, meh.</p> +<p>JPype allows to bridge python project with java libraries. It takes another +point of view than Jython: rather than reimplementing python in Java, both +languages are interfacing at the VM level. This means you need to start a VM +from your python script, but it does the job and stay fully compatible with +Cpython and its C extensions.</p> +<div class="section" id="first-steps-with-jpype"> +<h2>First steps with JPype</h2> +<p>Once JPype installed (you'll have to hack a bit some files to integrate +seamlessly with your system) you can access java classes by doing something +like that:</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">jpype</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">startJVM</span><span class="p">(</span><span class="n">jpype</span><span class="o">.</span><span class="n">getDefaultJVMPath</span><span class="p">())</span> + +<span class="c"># you can then access to the basic java functions</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">java</span><span class="o">.</span><span class="n">lang</span><span class="o">.</span><span class="n">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="s">&quot;hello world&quot;</span><span class="p">)</span> + +<span class="c"># and you have to shutdown the VM at the end</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">shutdownJVM</span><span class="p">()</span> +</pre></div> +<p>Okay, now we have a hello world, but what we want seems somehow more complex. +We want to interact with java classes, so we will have to load them.</p> +</div> +<div class="section" id="interfacing-with-boilerpipe"> +<h2>Interfacing with Boilerpipe</h2> +<p>To install boilerpipe, you just have to run an ant script:</p> +<pre class="literal-block"> +$ cd boilerpipe +$ ant +</pre> +<p>Here is a simple example of how to use boilerpipe in Java, from their sources</p> +<div class="highlight"><pre><span class="kn">package</span> <span class="n">de</span><span class="o">.</span><span class="na">l3s</span><span class="o">.</span><span class="na">boilerpipe</span><span class="o">.</span><span class="na">demo</span><span class="o">;</span> +<span class="kn">import</span> <span class="nn">java.net.URL</span><span class="o">;</span> +<span class="kn">import</span> <span class="nn">de.l3s.boilerpipe.extractors.ArticleExtractor</span><span class="o">;</span> + +<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Oneliner</span> <span class="o">{</span> + <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span> + <span class="kd">final</span> <span class="n">URL</span> <span class="n">url</span> <span class="o">=</span> <span class="k">new</span> <span class="n">URL</span><span class="o">(</span><span class="s">&quot;http://notmyidea.org&quot;</span><span class="o">);</span> + <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">ArticleExtractor</span><span class="o">.</span><span class="na">INSTANCE</span><span class="o">.</span><span class="na">getText</span><span class="o">(</span><span class="n">url</span><span class="o">));</span> + <span class="o">}</span> +<span class="o">}</span> +</pre></div> +<p>To run it:</p> +<div class="highlight"><pre><span class="nv">$ </span>javac -cp dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar src/demo/de/l3s/boilerpipe/demo/Oneliner.java +<span class="nv">$ </span>java -cp src/demo:dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar de.l3s.boilerpipe.demo.Oneliner +</pre></div> +<p>Yes, this is kind of ugly, sorry for your eyes. +Let's try something similar, but from python</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">jpype</span> + +<span class="c"># start the JVM with the good classpaths</span> +<span class="n">classpath</span> <span class="o">=</span> <span class="s">&quot;dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar&quot;</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">startJVM</span><span class="p">(</span><span class="n">jpype</span><span class="o">.</span><span class="n">getDefaultJVMPath</span><span class="p">(),</span> <span class="s">&quot;-Djava.class.path=</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">classpath</span><span class="p">)</span> + +<span class="c"># get the Java classes we want to use</span> +<span class="n">DefaultExtractor</span> <span class="o">=</span> <span class="n">jpype</span><span class="o">.</span><span class="n">JPackage</span><span class="p">(</span><span class="s">&quot;de&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">l3s</span><span class="o">.</span><span class="n">boilerpipe</span><span class="o">.</span><span class="n">extractors</span><span class="o">.</span><span class="n">DefaultExtractor</span> + +<span class="c"># call them !</span> +<span class="k">print</span> <span class="n">DefaultExtractor</span><span class="o">.</span><span class="n">INSTANCE</span><span class="o">.</span><span class="n">getText</span><span class="p">(</span><span class="n">jpype</span><span class="o">.</span><span class="n">java</span><span class="o">.</span><span class="n">net</span><span class="o">.</span><span class="n">URL</span><span class="p">(</span><span class="s">&quot;http://blog.notmyidea.org&quot;</span><span class="p">))</span> +</pre></div> +<p>And you get what you want.</p> +<p>I must say I didn't thought it could work so easily. This will allow me to +extract text content from URLs and remove the <em>boilerplate</em> text easily +for infuse (my master thesis project), without having to write java code, nice!</p> +</div> +Un coup de main pour mon mémoire!2011-05-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html/<p>Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit +coup de main.</p> +<p>Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent +last.fm, je fais quelque chose de similaire mais pour les sites internet: en me +basant sur ce que vous visitez quotidiennement et comment vous le visitez (quelles +horaires, quelle emplacement géographique, etc.) je souhaites proposer des liens +qui vous intéresseront potentiellement, en me basant sur l'avis des personnes qui +ont des profils similaires au votre.</p> +<p>Le projet est loin d'être terminé, mais la première étape est de récupérer des +données de navigation, idéalement beaucoup de données de navigation. Donc si +vous pouvez me filer un coup de main je vous en serais éternellement +reconnaissant (pour ceux qui font semblant de pas comprendre, entendez &quot;tournée +générale&quot;).</p> +<p>J'ai créé un petit site web (en anglais) qui résume un peu le concept, qui vous +propose de vous inscrire et de télécharger un plugin firefox qui m'enverra des +information sur les sites que vous visitez (si vous avez l'habitude d'utiliser +chrome vous pouvez considérer de switcher à firefox4 pour les deux prochains +mois pour me filer un coup de main). Il est possible de désactiver le plugin +d'un simple clic si vous souhaitez garder votre vie privée privée ;-)</p> +<p>Le site est par là: <a class="reference external" href="http://infuse.notmyidea.org">http://infuse.notmyidea.org</a>. Une fois le plugin téléchargé +et le compte créé il faut renseigner vos identifiants dans le plugin en +question, et c'est tout!</p> +<p>A votre bon cœur ! Je récupérerais probablement des données durant les 2 +prochains mois pour ensuite les analyser correctement.</p> +<p>Merci pour votre aide !</p> +Travailler moins pour mieux travailler ?2011-05-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +je suis assez impressionné du résultat: je suis de retour chez mes parents pour +le &quot;easter break&quot; et j'en ai profité pour donner un coup aux travaux de la +maison (et pour me reposer un brin!).</p> +<p>Bosser en extérieur est un réel plaisir et faire quelque chose de manuel +également. Je n'ai pas pour habitude de bricoler autre chose que du logiciel et +c'est vraiment quelque chose que j'apprécie.</p> +<p>J'avoue, je mens un peu quand je dis que j'étais complètement déconnecté: +j'ai vérifié mes mails assez régulièrement en utilisant mon téléphone +(merci Arnaud pour le prêt du gadget!) et j'ai limité ma présence web au strict +minimum. Je veux dire par là pas de twitter, pas d'IRC et autres mailing-lists.</p> +<p>Quand je dis hors-ligne, je ne dis pas que je n'ai pas travaillé sur mon +ordinateur. J'ai à fournir beaucoup plus de travail que ce que je ne pensait en +premier lieu pour la rédaction de mon mémoire et j'ai passé quelques heures par +ci par là à lire des articles et livres sur le sujet ainsi que rédigé une bonne +partie de mon mémoire durant ces 10 jours. Résultat ? Les heures que j'ai passées à travailler ont +été étonnement plus productives que celles que j'ai l'habitude de passer derrière +un écran. Je ne parles pas uniquement du fait de procrastiner; évidemment c'est +une des causes principales de ma perte de productivité, mais je pense également +au fait de laisser le cerveau reposer, au moins en ce qui concerne la partie +informatique. Bricoler demande de la concentration et de la réflexion mais +permet également de laisser son esprit vagabonder. J'ai pu donc avancer mes +sur certaines parties de mon mémoire alors que j'étais en train de poser le +bardage sur la garage par exemple.</p> +<p>Passer du temps sur autre chose (qui demandait également de la concentration +par ailleurs) m'a permis d'être réellement plus efficace lors de mes phases de +rédaction et de lecture.</p> +<p>Je me demande depuis quelques temps quel sera mon futur travail et quelle forme +il prendra. Éééh oui, la fin des études arrive pour la fin de l'année, c'est +pas une blague. Et je me pose sérieusement la question du travail aux 3/4 +temps. La raison principale étant que je ne souhaites pas passer la majeure +partie de mon temps à travailler derrière un écran et que la formation que j'ai +m'y rattache beaucoup. Ne me comprenez pas de travers: j'aime ce que je fais; +mais j'aime aussi ce que je fais à coté de l'informatique: associatif, projets +alternatifs, permaculture et autres.</p> +<p>Viens s'ajouter à ça le fait d'avoir une qualité de vie qui me semble pouvoir +passer par le fait de travailler moins (&quot;il est marant ce gamin, il à pas encore commencé +à travailler qu'il veut bosser moins, regarde moi cette feignasse!&quot;) et +travailler plus efficacement. Bien sur, on n'est jamais 100% productif et c'est +d'autant plus vrai pour moi, alors si gagner en productivité peut passer par +travailler moins, pourquoi pas s'y essayer !</p> +<p>Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez des +retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée ?</p> +Analyse users' browsing context to build up a web recommender2011-04-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html/<p>No, this is not an april's fool ;)</p> +<p>Wow, it's been a long time. My year in Oxford is going really well. I realized +few days ago that the end of the year is approaching really quickly. +Exams are coming in one month or such and then I'll be working full time on my dissertation topic.</p> +<p>When I learned we'll have about 6 month to work on something, I first thought +about doing a packaging related stuff, but finally decided to start something +new. After all, that's the good time to learn.</p> +<p>Since a long time, I'm being impressed by the <a class="reference external" href="http://last.fm">last.fm</a> +recommender system. They're <em>scrobbling</em> the music I listen to since something +like 5 years now and the recommendations they're doing are really nice and +accurate (I discovered <strong>a lot</strong> of great artists listening to the +&quot;neighbour radio&quot;.) (by the way, <a class="reference external" href="http://lastfm.com/user/akounet/">here is</a> +my lastfm account)</p> +<p>So I decided to work on recommender systems, to better understand what is it +about.</p> +<p>Recommender systems are usually used to increase the sales of products +(like Amazon.com does) which is not really what I'm looking for (The one who +know me a bit know I'm kind of sick about all this consumerism going on).</p> +<p>Actually, the most simple thing I thought of was the web: I'm browsing it quite +every day and each time new content appears. I've stopped to follow <a class="reference external" href="https://bitbucket.org/bruno/aspirator/">my feed +reader</a> because of the +information overload, and reduced drastically the number of people I follow <a class="reference external" href="http://twitter.com/ametaireau/">on +twitter</a>.</p> +<p>Too much information kills the information.</p> +<p>You shall got what will be my dissertation topic: a recommender system for +the web. Well, such recommender systems already exists, so I will try to add contextual +information to them: you're probably not interested by the same topics at different +times of the day, or depending on the computer you're using. We can also +probably make good use of the way you browse to create groups into the content +you're browsing (or even use the great firefox4 tab group feature).</p> +<p>There is a large part of concerns to have about user's privacy as well.</p> +<p>Here is my proposal (copy/pasted from the one I had to do for my master)</p> +<div class="section" id="introduction-and-rationale"> +<h2>Introduction and rationale</h2> +<p>Nowadays, people surf the web more and more often. New web pages are created +each day so the amount of information to retrieve is more important as the time +passes. These users uses the web in different contexts, from finding cooking +recipes to technical articles.</p> +<p>A lot of people share the same interest to various topics, and the quantity of +information is such than it's really hard to triage them efficiently without +spending hours doing it. Firstly because of the huge quantity of information +but also because the triage is something relative to each person. Although, this +triage can be facilitated by fetching the browsing information of all +particular individuals and put the in perspective.</p> +<p>Machine learning is a branch of Artificial Intelligence (AI) which deals with how +a program can learn from data. Recommendation systems are a particular +application area of machine learning which is able to recommend things (links +in our case) to the users, given a particular database containing the previous +choices users have made.</p> +<p>This browsing information is currently available in browsers. Even if it is not +in a very usable format, it is possible to transform it to something useful. +This information gold mine just wait to be used. Although, it is not as simple as +it can seems at the first approach: It is important to take care of the context +the user is in while browsing links. For instance, It's more likely that during +the day, a computer scientist will browse computing related links, and that during +the evening, he browse cooking recipes or something else.</p> +<p>Page contents are also interesting to analyse, because that's what people +browse and what actually contain the most interesting part of the information. +The raw data extracted from the browsing can then be translated into +something more useful (namely tags, type of resource, visit frequency, +navigation context etc.)</p> +<p>The goal of this dissertation is to create a recommender system for web links, +including this context information.</p> +<p>At the end of the dissertation, different pieces of software will be provided, +from raw data collection from the browser to a recommendation system.</p> +</div> +<div class="section" id="background-review"> +<h2>Background Review</h2> +<p>This dissertation is mainly about data extraction, analysis and recommendation +systems. Two different research area can be isolated: Data preprocessing and +Information filtering.</p> +<p>The first step in order to make recommendations is to gather some data. The +more data we have available, the better it is (T. Segaran, 2007). This data can +be retrieved in various ways, one of them is to get it directly from user's +browsers.</p> +<div class="section" id="data-preparation-and-extraction"> +<h3>Data preparation and extraction</h3> +<p>The data gathered from browsers is basically URLs and additional information +about the context of the navigation. There is clearly a need to extract more +information about the meaning of the data the user is browsing, starting by the +content of the web pages.</p> +<p>Because the information provided on the current Web is not meant to be read by +machines (T. Berners Lee, 2001) there is a need of tools to extract meaning from +web pages. The information needs to be preprocessed before stored in a machine +readable format, allowing to make recommendations (Choochart et Al, 2004).</p> +<p>Data preparation is composed of two steps: cleaning and structuring ( +Castellano et Al, 2007). Because raw data can contain a lot of un-needed text +(such as menus, headers etc.) and need to be cleaned prior to be stored. +Multiple techniques can be used here and belongs to boilerplate removal and +full text extraction (Kohlschütter et Al, 2010).</p> +<p>Then, structuring the information: category, type of content (news, blog, wiki) +can be extracted from raw data. This kind of information is not clearly defined +by HTML pages so there is a need of tools to recognise them.</p> +<p>Some context-related information can also be inferred from each resource. It can go +from the visit frequency to the navigation group the user was in while +browsing. It is also possible to determine if the user &quot;liked&quot; a resource, and +determine a mark for it, which can be used by information filtering a later +step (T. Segaran, 2007).</p> +<p>At this stage, structuring the data is required. Storing this kind of +information in RDBMS can be a bit tedious and require complex queries to get +back the data in an usable format. Graph databases can play a major role in the +simplification of information storage and querying.</p> +</div> +<div class="section" id="information-filtering"> +<h3>Information filtering</h3> +<p>To filter the information, three techniques can be used (Balabanovic et +Al, 1997):</p> +<ul class="simple"> +<li>The content-based approach states that if an user have liked something in the +past, he is more likely to like similar things in the future. So it's about +establishing a profile for the user and compare new items against it.</li> +<li>The collaborative approach will rather recommend items that other similar users +have liked. This approach consider only the relationship between users, and +not the profile of the user we are making recommendations to.</li> +<li>the hybrid approach, which appeared recently combine both of the previous +approaches, giving recommendations when items score high regarding user's +profile, or if a similar user already liked it.</li> +</ul> +<p>Grouping is also something to consider at this stage (G. Myatt, 2007). +Because we are dealing with huge amount of data, it can be useful to detect group +of data that can fit together. Data clustering is able to find such groups (T. +Segaran, 2007).</p> +<p>References:</p> +<ul class="simple"> +<li>Balabanović, M., &amp; Shoham, Y. (1997). Fab: content-based, collaborative +recommendation. Communications of the ACM, 40(3), 66–72. ACM. +Retrieved March 1, 2011, from <a class="reference external" href="http://portal.acm.org/citation.cfm?id=245108.245124&amp;amp">http://portal.acm.org/citation.cfm?id=245108.245124&amp;amp</a>;.</li> +<li>Berners-Lee, T., Hendler, J., &amp; Lassila, O. (2001). +The semantic web: Scientific american. Scientific American, 284(5), 34–43. +Retrieved November 21, 2010, from <a class="reference external" href="http://www.citeulike.org/group/222/article/1176986">http://www.citeulike.org/group/222/article/1176986</a>.</li> +<li>Castellano, G., Fanelli, A., &amp; Torsello, M. (2007). +LODAP: a LOg DAta Preprocessor for mining Web browsing patterns. Proceedings of the 6th Conference on 6th WSEAS Int. Conf. on Artificial Intelligence, Knowledge Engineering and Data Bases-Volume 6 (p. 12–17). World Scientific and Engineering Academy and Society (WSEAS). Retrieved March 8, 2011, from <a class="reference external" href="http://portal.acm.org/citation.cfm?id=1348485.1348488">http://portal.acm.org/citation.cfm?id=1348485.1348488</a>.</li> +<li>Kohlschutter, C., Fankhauser, P., &amp; Nejdl, W. (2010). Boilerplate detection using shallow text features. Proceedings of the third ACM international conference on Web search and data mining (p. 441–450). ACM. Retrieved March 8, 2011, from <a class="reference external" href="http://portal.acm.org/citation.cfm?id=1718542">http://portal.acm.org/citation.cfm?id=1718542</a>.</li> +<li>Myatt, G. J. (2007). Making Sense of Data: A Practical Guide to Exploratory +Data Analysis and Data Mining.</li> +<li>Segaran, T. (2007). Collective Intelligence.</li> +</ul> +</div> +</div> +<div class="section" id="privacy"> +<h2>Privacy</h2> +<p>The first thing that's come to people minds when it comes to process their +browsing data is privacy. People don't want to be stalked. That's perfectly +right, and I don't either.</p> +<p>But such a system don't have to deal with people identities. It's completely +possible to process completely anonymous data, and that's probably what I'm +gonna do.</p> +<p>By the way, if you have interesting thoughts about that, if you do know +projects that do seems related, fire the comments !</p> +</div> +<div class="section" id="what-s-the-plan"> +<h2>What's the plan ?</h2> +<p>There is a lot of different things to explore, especially because I'm +a complete novice in that field.</p> +<ul class="simple"> +<li>I want to develop a firefox plugin, to extract the browsing informations ( +still, I need to know exactly which kind of informations to retrieve). The +idea is to provide some <em>raw</em> browsing data, and then to transform it and to +store it in the better possible way.</li> +<li>Analyse how to store the informations in a graph database. What can be the +different methods to store this data and to visualize the relationship +between different pieces of data? How can I define the different contexts, +and add those informations in the db?</li> +<li>Process the data using well known recommendation algorithms. Compare the +results and criticize their value.</li> +</ul> +<p>There is plenty of stuff I want to try during this experimentation:</p> +<ul class="simple"> +<li>I want to try using Geshi to visualize the connexion between the links, +and the contexts</li> +<li>Try using graph databases such as Neo4j</li> +<li>Having a deeper look at tools such as scikit.learn (a machine learning +toolkit in python)</li> +<li>Analyse web pages in order to categorize them. Processing their +contents as well, to do some keyword based classification will be done.</li> +</ul> +<p>Lot of work on its way, yay !</p> +</div> +Working directly on your server? How to backup and sync your dev environment with unison2011-03-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html/<p>I have a server running freebsd since some time now, and was wondering about +the possibility to directly have a development environment ready to use when +I get a internet connexion, even if I'm not on my computer.</p> +<p>Since I use vim to code, and spend most of my time in a console while +developing, it's possible to work via ssh, from everywhere.</p> +<p>The only problem is the synchronisation of the source code, config files etc. +from my machine to the server.</p> +<p>Unison provides an interesting way to synchronise two folders, even over +a network. So let's do it !</p> +<div class="section" id="creating-the-jail"> +<h2>Creating the jail</h2> +<p>In case you don't use FreeBSD, you can skip this section.</p> +<div class="highlight"><pre><span class="c"># I have a flavour jail named default</span> +<span class="nv">$ </span>ezjail-admin -f default workspace.notmyidea.org 172.19.1.6 +<span class="nv">$ </span>ezjail-admin start workspace.notmyidea.org +</pre></div> +<p>In my case, because the &quot;default&quot; flavour contains already a lot of interesting +things, my jail come already setup with ssh, bash and vim for instance, but +maybe you'll need it in your case.</p> +<p>I want to be redirected to the ssh of the jail when I connect to the host with +the 20006 port. Add lines in <cite>/etc/pf.conf</cite>:</p> +<pre class="literal-block"> +workspace_jail=&quot;172.19.1.6&quot; +rdr on $ext_if proto tcp from any to $ext_ip port 20006 -&gt; $workspace_jail port 22 +</pre> +<p>Reload packet filter rules</p> +<div class="highlight"><pre><span class="nv">$ </span>/etc/rc.d/pf reload +</pre></div> +</div> +<div class="section" id="working-with-unison"> +<h2>Working with unison</h2> +<p>Now that we've set up the jail. Set up unison on the server and on your client. +Unison is available on the freebsd ports so just install it</p> +<div class="highlight"><pre><span class="nv">$ </span>ssh notmyidea.org -p 20006 +<span class="nv">$ </span>make -C /usr/ports/net/unison-nox11 config-recursive +<span class="nv">$ </span>make -C /usr/ports/net/unison-nox11 package-recursive +</pre></div> +<p>Install as well unison on your local machine. Double check to install the same +version on the client and on the server. Ubuntu contains the 2.27.57 as well as +the 2.32.52.</p> +<p>Check that unison is installed and reachable via ssh from your machine</p> +<div class="highlight"><pre><span class="nv">$ </span>ssh notmyidea.org -p 20006 unison -version +unison version 2.27.157 +<span class="nv">$ </span>unison -version +unison version 2.27.57 +</pre></div> +</div> +<div class="section" id="let-sync-our-folders"> +<h2>Let sync our folders</h2> +<p>The first thing I want to sync is my vim configuration. Well, it's already <a class="reference external" href="http://github.com/ametaireau/dotfiles/">in +a git repository</a> but let's try to use +unison for it right now.</p> +<p>I have two machines then: <cite>workspace</cite>, the jail, and <cite>ecureuil</cite> my laptop.</p> +<div class="highlight"><pre>unison .vim ssh://notmyidea.org:20006/.vim +unison .vimrc ssh://notmyidea.org:20006/.vimrc +</pre></div> +<p>It is also possible to put all the informations in a config file, and then to +only run <cite>unison</cite>. (fire up <cite>vim ~/.unison/default.prf</cite>.</p> +<p>Here is my config:</p> +<pre class="literal-block"> +root = /home/alexis +root = ssh://notmyidea.org:20006 + +path = .vimrc +path = dotfiles +path = dev + +follow = Name * +</pre> +<p>My vimrc is in fact a symbolic link on my laptop, but I don't want to specify +each of the links to unison. That's why the <cite>follow = Name *</cite> is for.</p> +<p>The folders you want to synchronize are maybe a bit large. If so, considering +others options such as rsync for the first import may be a good idea (I enjoyed +my university huge upload bandwith to upload 2GB in 20mn ;)</p> +</div> +<div class="section" id="run-the-script-frequently"> +<h2>Run the script frequently</h2> +<p>Once that done, you just need to run the unison command line some times when +you want to sync your two machines. I've wrote a tiny script to get some +feedback from the sync:</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">os</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span> + +<span class="n">DEFAULT_LOGFILE</span> <span class="o">=</span> <span class="s">&quot;~/unison.log&quot;</span> +<span class="n">PROGRAM_NAME</span> <span class="o">=</span> <span class="s">&quot;Unison syncer&quot;</span> + +<span class="k">def</span> <span class="nf">sync</span><span class="p">(</span><span class="n">logfile</span><span class="o">=</span><span class="n">DEFAULT_LOGFILE</span><span class="p">,</span> <span class="n">program_name</span><span class="o">=</span><span class="n">PROGRAM_NAME</span><span class="p">):</span> + <span class="c"># init</span> + <span class="n">display_message</span> <span class="o">=</span> <span class="bp">True</span> + <span class="n">error</span> <span class="o">=</span> <span class="bp">False</span> + + <span class="n">before</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> + <span class="c"># call unison to make the sync</span> + <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">&#39;unison -batch &gt; {0}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">logfile</span><span class="p">))</span> + + <span class="c"># get the duration of the operation</span> + <span class="n">td</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="o">-</span> <span class="n">before</span> + <span class="n">delta</span> <span class="o">=</span> <span class="p">(</span><span class="n">td</span><span class="o">.</span><span class="n">microseconds</span> <span class="o">+</span> <span class="p">(</span><span class="n">td</span><span class="o">.</span><span class="n">seconds</span> <span class="o">+</span> <span class="n">td</span><span class="o">.</span><span class="n">days</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">3600</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="o">**</span><span class="mi">6</span><span class="p">)</span> <span class="o">/</span> <span class="mi">10</span><span class="o">**</span><span class="mi">6</span> + + <span class="c"># check what was the last entry in the log</span> + <span class="n">log</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">logfile</span><span class="p">))</span> + <span class="n">lines</span> <span class="o">=</span> <span class="n">log</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span> + <span class="k">if</span> <span class="s">&#39;No updates to propagate&#39;</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span> + <span class="n">display_message</span> <span class="o">=</span> <span class="bp">False</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">output</span> <span class="o">=</span> <span class="p">[</span><span class="n">l</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">lines</span> <span class="k">if</span> <span class="s">&quot;Synchronization&quot;</span> <span class="ow">in</span> <span class="n">l</span><span class="p">]</span> + + <span class="n">message</span> <span class="o">=</span> <span class="n">output</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> + <span class="n">message</span> <span class="o">+=</span> <span class="s">&quot; It took {0}s.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">display_message</span><span class="p">:</span> + <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">&#39;notify-send -i {2} &quot;{0}&quot; &quot;{1}&quot;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">program_name</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> + <span class="s">&#39;error&#39;</span> <span class="k">if</span> <span class="n">error</span> <span class="k">else</span> <span class="s">&#39;info&#39;</span><span class="p">))</span> + +<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> + <span class="n">sync</span><span class="p">()</span> +</pre></div> +<p>This is probably perfectible, but that does the job.</p> +<p>Last step is to tell you machine to run that frequently. That's what <cite>crontab</cite> +is made for, so let's <cite>crontab -e</cite>:</p> +<pre class="literal-block"> +$ * */3 * * * . ~/.Xdbus; /usr/bin/python /home/alexis/dev/python/unison-syncer/sync.py +</pre> +<p>The <cite>~/.Xdbus</cite> allows cron to communicate with your X11 session. Here is its +content.</p> +<div class="highlight"><pre><span class="c">#!/bin/bash</span> + +<span class="c"># Get the pid of nautilus</span> +<span class="nv">nautilus_pid</span><span class="o">=</span><span class="k">$(</span>pgrep -u <span class="nv">$LOGNAME</span> -n nautilus<span class="k">)</span> + +<span class="c"># If nautilus isn&#39;t running, just exit silently</span> +<span class="k">if</span> <span class="o">[</span> -z <span class="s2">&quot;$nautilus_pid&quot;</span> <span class="o">]</span>; <span class="k">then</span> +<span class="nb">exit </span>0 +<span class="k">fi</span> + +<span class="c"># Grab the DBUS_SESSION_BUS_ADDRESS variable from nautilus&#39;s environment</span> +<span class="nb">eval</span> <span class="k">$(</span>tr <span class="s1">&#39;\0&#39;</span> <span class="s1">&#39;\n&#39;</span> &lt; /proc/<span class="nv">$nautilus_pid</span>/environ | grep <span class="s1">&#39;^DBUS_SESSION_BUS_ADDRESS=&#39;</span><span class="k">)</span> + +<span class="c"># Check that we actually found it</span> +<span class="k">if</span> <span class="o">[</span> -z <span class="s2">&quot;$DBUS_SESSION_BUS_ADDRESS&quot;</span> <span class="o">]</span>; <span class="k">then</span> +<span class="nb">echo</span> <span class="s2">&quot;Failed to find bus address&quot;</span> &gt;&amp;2 +<span class="nb">exit </span>1 +<span class="k">fi</span> + +<span class="c"># export it so that child processes will inherit it</span> +<span class="nb">export </span>DBUS_SESSION_BUS_ADDRESS +</pre></div> +<p>And it comes from <a class="reference external" href="http://ubuntuforums.org/showthread.php?p=10148738#post10148738">here</a>.</p> +<p>A sync takes about 20s + the upload time on my machine, which stay acceptable for +all of my developments.</p> +</div> +Wrap up of the distutils2 paris' sprint2011-02-08T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html/<p>Finally, thanks to a bunch of people that helped me to pay my train and bus +tickets, I've made it to paris for the distutils2 sprint.</p> +<p>They have been a bit more than 10 people to come during the sprint, and it was +very productive. Here's a taste of what we've been working on:</p> +<ul class="simple"> +<li>the <cite>datafiles</cite>, a way to specify and to handle the installation of files which +are not python-related (pictures, manpages and so on).</li> +<li><cite>mkgcfg</cite>, a tool to help you to create a setup.cfg in minutes (and with funny +examples)</li> +<li>converters from setup.py scripts. We do now have a piece of code which +reads your current <cite>setup.py</cite> file and fill in some fields in the <cite>setup.cfg</cite> +for you.</li> +<li>a compatibility layer for distutils1, so it can read the <cite>setup.cfg</cite> you will +wrote for distutils2 :-)</li> +<li>the uninstaller, so it's now possible to uninstall what have been installed +by distutils2 (see PEP 376)</li> +<li>the installer, and the setuptools compatibility layer, which will allow you +to rely on setuptools' based distributions (and there are plenty of them!)</li> +<li>The compilers, so they are more flexible than they were. Since that's an +obscure part of the code for distutils2 commiters (it comes directly from the +distutils1 ages), having some guys who understood the problematics here was +a must.</li> +</ul> +<p>Some people have also tried to port their packaging from distutils1 to +distutils2. They have spotted a number of bugs and made some improvements +to the code, to make it more friendly to use.</p> +<p>I'm really pleased to see how newcomers went trough the code, and started +hacking so fast. I must say it wasn't the case when we started to work on +distutils1 so that's a very good point: people now can hack the code quicker +than they could before.</p> +<p>Some of the features here are not <em>completely</em> finished yet, but are on the +tubes, and will be ready for a release (hopefully) at the end of the week.</p> +<p>Big thanks to logilab for hosting (and sponsoring my train ticket) and +providing us food, and to bearstech for providing some money for breakfast and +bears^Wbeers.</p> +<p>Again, a big thanks to all the people who gave me money to pay the transport, +I really wasn't expecting such thing to happen :-)</p> +PyPI on CouchDB2011-01-20T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html/<p>By now, there are two ways to retrieve data from PyPI (the Python Package +Index). You can both rely on xml/rpc or on the &quot;simple&quot; API. The simple +API is not so simple to use as the name suggest, and have several existing +drawbacks.</p> +<p>Basically, if you want to use informations coming from the simple API, you will +have to parse web pages manually, to extract informations using some black +vodoo magic. Badly, magic have a price, and it's sometimes impossible to get +exactly the informations you want to get from this index. That's the technique +currently being used by distutils2, setuptools and pip.</p> +<p>On the other side, while XML/RPC is working fine, it's requiring extra work +to the python servers each time you request something, which can lead to +some outages from time to time. Also, it's important to point out that, even if +PyPI have a mirroring infrastructure, it's only for the so-called <em>simple</em> API, +and not for the XML/RPC.</p> +<div class="section" id="couchdb"> +<h2>CouchDB</h2> +<p>Here comes CouchDB. CouchDB is a document oriented database, that +knows how to speak REST and JSON. It's easy to use, and provides out of the box +a replication mechanism.</p> +</div> +<div class="section" id="so-what"> +<h2>So, what ?</h2> +<p>Hmm, I'm sure you got it. I've wrote a piece of software to link informations from +PyPI to a CouchDB instance. Then you can replicate all the PyPI index with only +one HTTP request on the CouchDB server. You can also access the informations +from the index directly using a REST API, speaking json. Handy.</p> +<p>So PyPIonCouch is using the PyPI XML/RPC API to get data from PyPI, and +generate records in the CouchDB instance.</p> +<p>The final goal is to avoid to rely on this &quot;simple&quot; API, and rely on a REST +insterface instead. I have set up a couchdb server on my server, which is +available at <a class="reference external" href="http://couchdb.notmyidea.org/_utils/database.html?pypi">http://couchdb.notmyidea.org/_utils/database.html?pypi</a>.</p> +<p>There is not a lot to +see there for now, but I've done the first import from PyPI yesterday and all +went fine: it's possible to access the metadata of all PyPI projects via a REST +interface. Next step is to write a client for this REST interface in +distutils2.</p> +</div> +<div class="section" id="example"> +<h2>Example</h2> +<p>For now, you can use pypioncouch via the command line, or via the python API.</p> +<div class="section" id="using-the-command-line"> +<h3>Using the command line</h3> +<p>You can do something like that for a full import. This <strong>will</strong> take long, +because it's fetching all the projects at pypi and importing their metadata:</p> +<pre class="literal-block"> +$ pypioncouch --fullimport http://your.couchdb.instance/ +</pre> +<p>If you already have the data on your couchdb instance, you can just update it +with the last informations from pypi. <strong>However, I recommend to just replicate +the principal node, hosted at http://couchdb.notmyidea.org/pypi/</strong>, to avoid +the duplication of nodes:</p> +<pre class="literal-block"> +$ pypioncouch --update http://your.couchdb.instance/ +</pre> +<p>The principal node is updated once a day by now, I'll try to see if it's +enough, and ajust with the time.</p> +</div> +<div class="section" id="using-the-python-api"> +<h3>Using the python API</h3> +<p>You can also use the python API to interact with pypioncouch:</p> +<pre class="literal-block"> +&gt;&gt;&gt; from pypioncouch import XmlRpcImporter, import_all, update +&gt;&gt;&gt; full_import() +&gt;&gt;&gt; update() +</pre> +</div> +</div> +<div class="section" id="what-s-next"> +<h2>What's next ?</h2> +<p>I want to make a couchapp, in order to navigate PyPI easily. Here are some of +the features I want to propose:</p> +<ul class="simple"> +<li>List all the available projects</li> +<li>List all the projects, filtered by specifiers</li> +<li>List all the projects by author/maintainer</li> +<li>List all the projects by keywords</li> +<li>Page for each project.</li> +<li>Provide a PyPI &quot;Simple&quot; API equivalent, even if I want to replace it, I do +think it will be really easy to setup mirrors that way, with the out of the +box couchdb replication</li> +</ul> +<p>I also still need to polish the import mechanism, so I can directly store in +couchdb:</p> +<ul class="simple"> +<li>The OPML files for each project</li> +<li>The upload_time as couchdb friendly format (list of int)</li> +<li>The tags as lists (currently it's only a string separated by spaces</li> +</ul> +<p>The work I've done by now is available on +<a class="reference external" href="https://bitbucket.org/ametaireau/pypioncouch/">https://bitbucket.org/ametaireau/pypioncouch/</a>. Keep in mind that it's still +a work in progress, and everything can break at any time. However, any feedback +will be appreciated !</p> +</div> +Help me to go to the distutils2 paris' sprint2011-01-15T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html/<p><strong>Edit: Thanks to logilab and some amazing people, I can make it to paris for the +sprint. Many thanks to them for the support!</strong></p> +<p>There will be a distutils2 sprint from the 27th to the 30th of january, thanks +to logilab which will host the event.</p> +<p>You can find more informations about the sprint on the wiki page of the event +(<a class="reference external" href="http://wiki.python.org/moin/Distutils/SprintParis">http://wiki.python.org/moin/Distutils/SprintParis</a>).</p> +<p>I really want to go there but I'm unfortunately blocked in UK for money reasons. +The cheapest two ways I've found is about £80, which I can't afford. +Following some advices on #distutils, I've set up a ChipIn account for that, so +if some people want to help me making it to go there, they can give me some +money that way.</p> +<p>I'll probably work on the installer (to support old distutils and +setuptools distributions) and on the uninstaller (depending on the first +task). If I can't make it to paris, I'll hang around on IRC to give some help +while needed.</p> +<p>If you want to contribute some money to help me go there, feel free to use this +chipin page: <a class="reference external" href="http://ametaireau.chipin.com/distutils2-sprint-in-paris">http://ametaireau.chipin.com/distutils2-sprint-in-paris</a></p> +<p>Thanks for your support !</p> +Fork you ! or how the social coding can help you2010-11-05T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html/<p>With <a class="reference external" href="http://github.com">github</a> and <a class="reference external" href="http://www.bitbucket.org">bitbucket</a> coming around, a lot of new usages appears for the +developpers: it's now easy to get feedback on your code/modifications, and to get +help from others by, for instance, forking repositories.</p> +<p>Eeach time I see people helping others, I'm amazed by how we like to share +our knowledge.</p> +<p>I say github, because it seems to be the more mainstream, but I think it's +something strongly related to the <a class="reference external" href="http://en.wikipedia.org/wiki/Distributed_revision_control">DVCS</a> principles: the &quot;only&quot; thing github have +made is to turn that into a social network, and to reveal the awesomeness of the +DVCSes to the masses.</p> +<p>What is really interesting is to see how this platform is addictive: it's +automatically updating a webpages with the more accurate informations about the +projects you're involved in, and add a bit of magic to that using webhooks, +allowing you to update your website each time you push to you repository, for +instance.</p> +<p>Quite nothing, indeed, but, I don't know why, I find this fascinating.</p> +<p>I haven't had the privilege to see my projects forked from github by strangers, +but I've forked others repository to give an hand some times, when I wanted to, +and the main reason is &quot;because it's <strong>fun</strong>&quot; to do so.</p> +<p>Yeah, you're probably right, you have to be a nerd to find fun to fork others. +The good point is that geeks are a kind of nerds, and some geeks are coders :)</p> +<div class="section" id="new-ways-to-contribute"> +<h2>New ways to contribute</h2> +<p>In addition, it seems that he community, or the communities, are there, on those +new social networks for coders. It's really handy to drop an eye on interesting +projects, to report bugs, propose new features, and check what new projects this +or this person have made.</p> +<p>Well, &quot;it's not new&quot;, you may think. That's true, because it's been a while that +SVN was there and even CVS before that. But, it was a bit messy to &quot;fork&quot; a +project, isn't it ? And I'm not talking about all the hell SVN involved with it +(who have not had issues with those messy .svn folders raises an hand !).</p> +<p>It have not been so easy to share code and thoughts about code, to propose +changes on existing code, than now. You think it's better to implement this or +that in a different way ? Clone it (fork it), make your changes and publish +them, and then ask projects owners about it. For sure you'll have answers.</p> +<p>Even if they don't want it, you can easily keep your changes, and keep getting +their updates!</p> +<p>Also, lot of <em>fashionables</em> projects tend to move on DVCS. +Personally, if I know I can fork on a DVCS instead of from a &quot;simple&quot; VCS, +I'll probably be quicker to fork/clone, and to publish changes on my own copy, +than if I had to do so on the upstream repository (and I'll likely dont have +the rights to push to it), because I will not be afraid to break things.</p> +<p>DVCSes makes the contribution easier.</p> +</div> +<div class="section" id="release-early-release-often"> +<h2>Release early, release often</h2> +<p>Maybe have you read <a class="reference external" href="http://www.catb.org/~esr/writings/cathedral-bazaar/">The cathedral and the bazaar</a>, by Eric Steven Raymond ? +(If not, consider doing so, it's a really interesting reading)</p> +<p>Among a lot of others interesting things, one hint he gives is <em>release early, +release often</em>.</p> +<p>I understand it as: if you want to get contributors, release your code early, +even if it's not perfect, and don't be afraid to publish your changes each +time it's needed.</p> +<p>Without notifying it, that's basically what I was doing for my own projects. +I guess that's because Social coding platforms encourages those practices, +partially cause of the possible impact publishing each of your changes can have +on your final solution.</p> +<p>If you have considered publishing your projects, code snippets, or whatever +(code related) but did not done it, considering them not yet ready, maybe +should you think about it twice: you can get feedback and probably start some +interesting discussions about it, if you write code that's readable, of course!</p> +</div> +<div class="section" id="a-step-further-for-open-source-softwares"> +<h2>A step further for open source softwares</h2> +<p>Well, DVCSes are a honking great idea, and they're starting to be really +powerful when applied to free softwares. I mean: if you can't see a project, +it will be hard to contribute to it. And, I don't think anyone wants to +contribute to something closed/proprietary, <em>just for fun</em>. Or maybe am I +missing something.</p> +<p>Maybe it's a kind of revolution, about free and open source softwares (<a class="reference external" href="http://en.wikipedia.org/wiki/Free_and_open_source_software">FOSS</a>), +that is going on. I really like to know I have my word to say about the changes +in the tools I use, and to know that I can make them evolve.</p> +<p>Let's take an example. Imagine I'm using a web framework on daily basis, as a +part of my job as a web developer. I do like using an open source software +because I know how it's working, and because I know that I can interact with the +authors of the framework while they're doing the changes on it.</p> +<p>That's communication, nothing more, and of course I can do that with an internal +proprietary solution, but it will cost me <strong>a lot</strong> more time, for a dead-simple +reason: a company is not as big and powerful as a community can be: it will cost +time to work on this framework, resources to maintain it, fix bugs etc.</p> +<p>Well, I'm starting advocating here about Free and Open Source Softwares use on +companies, what is a bit beyond the scope of this article, so let's back to +our DVCSes and new social related tools.</p> +<p>If I find a bug in this framework, while working, I have the possibility to +go and talk with the creators of the framework, to open a ticket, and even to +make a fix for it, because I've access to the source code. If I want to create a +new feature, I just have to fork it, hack it, and then publish my code to have +feedback of the community.</p> +<p>My fix/work will benefit to all the people (and maybe others companies) working +with this framework, and it's a way to prove the community that my company is +enough skilled to make code-fixes to the framework, so that's all good !</p> +</div> +<div class="section" id="what-s-next"> +<h2>What's next ?</h2> +<p>I hope those social coding platforms are only the begining of a new area. I hope +they will make people realize what the power of the community is, and how easily +they can becomes part of it.</p> +<p>If you're not using them right now, maybe you should do so: have a +look on how the programs you're using are made, consider publishing your +experimentations, and share them with others, you will see, it's kind of +addictive !</p> +</div> +How to reboot your bebox using the CLI2010-10-21T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html/<p>I've an internet connection which, for some obscure reasons, tend to be very +slow from time to time. After rebooting the box (yes, that's a hard solution), +all the things seems to go fine again.</p> +<div class="section" id="edit-using-grep"> +<h2>EDIT : Using grep</h2> +<p>After a bit of reflexion, that's also really easy to do using directly the +command line tools curl, grep and tail (but really harder to read).</p> +<div class="highlight"><pre>curl -X POST -u joel:joel http://bebox.config/cgi/b/info/restart/<span class="se">\?</span>be<span class="se">\=</span>0<span class="se">\&amp;</span>l0<span class="se">\=</span>1<span class="se">\&amp;</span>l1<span class="se">\=</span>0<span class="se">\&amp;</span>tid<span class="se">\=</span>RESTART -d <span class="s2">&quot;0=17&amp;2=`curl -u joel:joel http://bebox.config/cgi/b/info/restart/\?be\=0\&amp;l0\=1\&amp;l1\=0\&amp;tid\=RESTART | grep -o &quot;</span><span class="nv">name</span><span class="o">=</span><span class="s1">&#39;2&#39;</span> <span class="nv">value</span><span class="o">=</span><span class="err">&#39;</span><span class="o">[</span>0-9<span class="o">]</span><span class="se">\+</span><span class="s2">&quot; | grep -o &quot;</span><span class="o">[</span>0-9<span class="o">]</span><span class="se">\+</span><span class="s2">&quot; | tail -n 1`&amp;1&quot;</span> +</pre></div> +</div> +<div class="section" id="the-python-version"> +<h2>The Python version</h2> +<p>Well, that's not the optimal solution, that's a bit &quot;gruik&quot;, but it works.</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">urllib2</span> +<span class="kn">import</span> <span class="nn">urlparse</span> +<span class="kn">import</span> <span class="nn">re</span> +<span class="kn">import</span> <span class="nn">argparse</span> + +<span class="n">REBOOT_URL</span> <span class="o">=</span> <span class="s">&#39;/b/info/restart/?be=0&amp;l0=1&amp;l1=0&amp;tid=RESTART&#39;</span> +<span class="n">BOX_URL</span> <span class="o">=</span> <span class="s">&#39;http://bebox.config/cgi&#39;</span> + +<span class="k">def</span> <span class="nf">open_url</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span> + <span class="n">passman</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">HTTPPasswordMgrWithDefaultRealm</span><span class="p">()</span> + <span class="n">passman</span><span class="o">.</span><span class="n">add_password</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> + <span class="n">authhandler</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">HTTPBasicAuthHandler</span><span class="p">(</span><span class="n">passman</span><span class="p">)</span> + + <span class="n">opener</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span><span class="n">authhandler</span><span class="p">)</span> + + <span class="n">urllib2</span><span class="o">.</span><span class="n">install_opener</span><span class="p">(</span><span class="n">opener</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> + +<span class="k">def</span> <span class="nf">reboot</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">open_url</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> + <span class="n">token</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&quot;name\=</span><span class="se">\\</span><span class="s">&#39;2</span><span class="se">\\</span><span class="s">&#39; value=</span><span class="se">\\</span><span class="s">&#39;([0-9]+)</span><span class="se">\\</span><span class="s">&#39;&quot;</span><span class="p">,</span> <span class="n">data</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> + <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s">&#39;0=17&amp;2=</span><span class="si">%s</span><span class="s">&amp;1&#39;</span> <span class="o">%</span> <span class="n">token</span><span class="p">))</span> + +<span class="k">if</span> <span class="n">__file__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span> + <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s">&quot;&quot;&quot;Reboot your bebox !&quot;&quot;&quot;</span><span class="p">)</span> + + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">dest</span><span class="o">=</span><span class="s">&#39;user&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&#39;username&#39;</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">dest</span><span class="o">=</span><span class="s">&#39;password&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&#39;password&#39;</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">boxurl</span><span class="o">=</span><span class="s">&#39;boxurl&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">BOX_URL</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&#39;Base box url. Default is </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">BOX_URL</span><span class="p">)</span> + + <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> + <span class="n">url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urljoin</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">boxurl</span><span class="p">,</span> <span class="n">REBOOT_URL</span><span class="p">)</span> + <span class="n">reboot</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">password</span><span class="p">)</span> +</pre></div> +</div> +Dynamically change your gnome desktop wallpaper2010-10-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html/<p>In gnome, you can can use a XML file to have a dynamic wallpaper. +It's not so easy, and you can't just tell: use the pictures in this folder to do +so.</p> +<p>You can have a look to the git repository if you want: <a class="reference external" href="http://github.com/ametaireau/gnome-background-generator">http://github.com/ametaireau/gnome-background-generator</a></p> +<p>Some time ago, I've made a little python script to ease that, and you can now +use it too. It's named &quot;gnome-background-generator&quot;, and you can install it via +pip for instance.</p> +<div class="highlight"><pre>$ pip install gnome-background-generator +</pre></div> +<p>Then, you have just to use it this way:</p> +<div class="highlight"><pre>$ gnome-background-generator -p ~/Images/walls -s +/home/alexis/Images/walls/dynamic-wallpaper.xml generated +</pre></div> +<p>Here is a extract of the <cite>--help</cite>:</p> +<div class="highlight"><pre>$ gnome-background-generator --help +usage: gnome-background-generator [-h] [-p PATH] [-o OUTPUT] + [-t TRANSITION_TIME] [-d DISPLAY_TIME] [-s] + [-b] + +A simple command line tool to generate an XML file to use for gnome +wallpapers, to have dynamic walls + +optional arguments: + -h, --help show this help message and exit + -p PATH, --path PATH Path to look for the pictures. If no output is + specified, will be used too for outputing the dynamic- + wallpaper.xml file. Default value is the current + directory (.) + -o OUTPUT, --output OUTPUT + Output filename. If no filename is specified, a + dynamic-wallpaper.xml file will be generated in the + path containing the pictures. You can also use &quot;-&quot; to + display the xml in the stdout. + -t TRANSITION_TIME, --transition-time TRANSITION_TIME + Time (in seconds) transitions must last (default value + is 2 seconds) + -d DISPLAY_TIME, --display-time DISPLAY_TIME + Time (in seconds) a picture must be displayed. Default + value is 900 (15mn) + -s, --set-background &#39;&#39;&#39;try to set the background using gnome-appearance- + properties + -b, --debug +</pre></div> +How to install NGINX + PHP 5.3 on FreeBSD.2010-10-10T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html/<p>I've not managed so far to get completely rid of php, so here's a simple +reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but +that's worse to have the piece of configuration somewhere !</p> +<pre class="literal-block"> +# update the ports +$ portsnap fetch update + +# install php5 port +$ make config-recursive -C /usr/ports/lang/php5-extensions +$ make package-recursive -C /usr/ports/lang/php5-extensions + +# install nginx +$ make config-recursive -C /usr/ports/www/nginx-devel +$ make package-recursive -C /usr/ports/www/nginx-devel +</pre> +<p>Now we have all the dependencies installed, we need to configure a bit the +server.</p> +<p>That's a simple thing in fact, but it could be good to have something that will +work without effort over time.</p> +<p>Here's a sample of my configuration:</p> +<pre class="literal-block"> +server { + server_name ndd; + set $path /path/to/your/files; + root $path; + + location / { + index index.php; + } + + location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { + access_log off; + expires 30d; + } + + location ~ .php$ { + fastcgi_param SCRIPT_FILENAME $path$fastcgi_script_name; + fastcgi_pass backend; + include fastcgi_params; + } +} + +upstream backend { + server 127.0.0.1:9000; +} +</pre> +<p>And that's it !</p> +Pelican, a simple static blog generator in python2010-10-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html/<p>Those days, I've wrote a little python application to fit my blogging needs. +I'm an occasional blogger, a vim lover, I like restructured text and DVCSes, so +I've made a little tool that makes good use of all that.</p> +<p><a class="reference external" href="http://alexis.notmyidea.org/pelican/">Pelican</a> (for calepin) is just a simple tool to generate your blog as static +files, letting you using your editor of choice (vim!). It's easy to extend, +and has a template support (via jinja2).</p> +<p>I've made it to fit <em>my</em> needs. I hope it will fit yours, but maybe it wont, and +it have not be designed to feet everyone's needs.</p> +<p>Need an example ? You're looking at it ! This weblog is using pelican to be +generated, also for the atom feeds.</p> +<p>I've released it under AGPL, since I want all the modifications to be profitable +to all the users.</p> +<p>You can find a mercurial repository to fork at <a class="reference external" href="http://hg.lolnet.org/pelican/">http://hg.lolnet.org/pelican/</a>, +feel free to hack it !</p> +<p>If you just want to get started, use your installer of choice (pip, easy_install, …) +And then have a look to the help (<cite>pelican --help</cite>)</p> +<div class="highlight"><pre><span class="nv">$ </span>pip install pelican +</pre></div> +<div class="section" id="usage"> +<h2>Usage</h2> +<p>Here's a sample usage of pelican</p> +<div class="highlight"><pre><span class="nv">$ </span>pelican . +writing /home/alexis/projets/notmyidea.org/output/index.html +writing /home/alexis/projets/notmyidea.org/output/tags.html +writing /home/alexis/projets/notmyidea.org/output/categories.html +writing /home/alexis/projets/notmyidea.org/output/archives.html +writing /home/alexis/projets/notmyidea.org/output/category/python.html +writing +/home/alexis/projets/notmyidea.org/output/pelican-a-simple-static-blog-generator-in-python.html +Done ! +</pre></div> +<p>You also can use the <cite>--help</cite> option for the command line to get more +informations</p> +<div class="highlight"><pre><span class="nv">$pelican</span> --help +usage: pelican <span class="o">[</span>-h<span class="o">]</span> <span class="o">[</span>-t TEMPLATES<span class="o">]</span> <span class="o">[</span>-o OUTPUT<span class="o">]</span> <span class="o">[</span>-m MARKUP<span class="o">]</span> <span class="o">[</span>-s SETTINGS<span class="o">]</span> <span class="o">[</span>-b<span class="o">]</span> + path + +A tool to generate a static blog, with restructured text input files. + +positional arguments: + path Path where to find the content files <span class="o">(</span>default is + <span class="s2">&quot;content&quot;</span><span class="o">)</span>. + +optional arguments: + -h, --help show this <span class="nb">help </span>message and <span class="nb">exit</span> + -t TEMPLATES, --templates-path TEMPLATES + Path where to find the templates. If not specified, + will uses the ones included with pelican. + -o OUTPUT, --output OUTPUT + Where to output the generated files. If not specified, + a directory will be created, named <span class="s2">&quot;output&quot;</span> in the + current path. + -m MARKUP, --markup MARKUP + the markup language to use. Currently only + ReSTreucturedtext is available. + -s SETTINGS, --settings SETTINGS + the settings of the application. Default to None. + -b, --debug +</pre></div> +<p>Enjoy :)</p> +</div> +An amazing summer of code working on distutils22010-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html/<p>The <a class="reference external" href="http://code.google.com/soc/">Google Summer of Code</a> I've +spent working on <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> +is over. It was a really amazing experience, for many reasons.</p> +<p>First of all, we had a very good team, we were 5 students working +on distutils2: <a class="reference external" href="http://zubin71.wordpress.com">Zubin</a>, +<a class="reference external" href="http://wokslog.wordpress.com/">Éric</a>, +<a class="reference external" href="http://gsoc.djolonga.com/">Josip</a>, +<a class="reference external" href="http://konryd.blogspot.com/">Konrad</a> and me. In addition, +<a class="reference external" href="http://mouadino.blogspot.com/">Mouad</a> have worked on the PyPI +testing infrastructure. You could find what each person have done +on +<a class="reference external" href="http://bitbucket.org/tarek/distutils2/wiki/GSoC_2010_teams">the wiki page of distutils2</a>.</p> +<p>We were in contact with each others really often, helping us when +possible (in #distutils), and were continuously aware of the state +of the work of each participant. This, in my opinion, have bring us +in a good shape.</p> +<p>Then, I've learned a lot. Python packaging was completely new to me +at the time of the GSoC start, and I was pretty unfamiliar with +python good practices too, as I've been introducing myself to +python in the late 2009.</p> +<p>I've recently looked at some python code I wrote just three months +ago, and I was amazed to think about many improvements to made on +it. I guess this is a good indicator of the path I've traveled +since I wrote it.</p> +<p>This summer was awesome because I've learned about python good +practices, now having some strong +<a class="reference external" href="http://mercurial.selenic.com/">mercurial</a> knowledge, and I've +seen a little how the python community works.</p> +<p>Then, I would like to say a big thanks to all the mentors that have +hanged around while needed, on IRC or via mail, and especially my +mentor for this summer, <a class="reference external" href="http://tarek.ziade.org">Tarek Ziadé</a>.</p> +<p>Thanks a lot for your motivation, your leadership and your +cheerfulness, even with a new-born and a new work!</p> +<div class="section" id="why"> +<h2>Why ?</h2> +<p>I wanted to work on python packaging because, as the time pass, we +were having a sort of complex tools in this field. Each one wanted +to add features to distutils, but not in a standard way.</p> +<p>Now, we have PEPs that describes some format we agreed on (see PEP +345), and we wanted to have a tool on which users can base their +code on, that's <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a>.</p> +</div> +<div class="section" id="my-job"> +<h2>My job</h2> +<p>I had to provides a way to crawl the PyPI indexes in a simple way, +and do some installation / uninstallation scripts.</p> +<p>All the work done is available in +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/">my bitbucket repository</a>.</p> +<div class="section" id="crawling-the-pypi-indexes"> +<h3>Crawling the PyPI indexes</h3> +<p>There are two ways of requesting informations from the indexes: +using the &quot;simple&quot; index, that is a kind of REST index, and using +XML-RPC.</p> +<p>I've done the two implementations, and a high level API to query +those twos. Basically, this supports the mirroring infrastructure +defined in PEP 381. So far, the work I've done is gonna be used in +pip (they've basically copy/paste the code, but this will change as +soon as we get something completely stable for distutils2), and +that's a good news, as it was the main reason for what I've done +that.</p> +<p>I've tried to have an unified API for the clients, to switch from +one to another implementation easily. I'm already thinking of +adding others crawlers to this stuff, and it was made to be +extensible.</p> +<p>If you want to get more informations about the crawlers/PyPI +clients, please refer to the distutils2 documentation, especially +<a class="reference external" href="http://distutils2.notmyidea.org/library/distutils2.index.html">the pages about indexes</a>.</p> +<p>You can find the changes I made about this in the +<a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> source code .</p> +</div> +<div class="section" id="installation-uninstallation-scripts"> +<h3>Installation / Uninstallation scripts</h3> +<p>Next step was to think about an installation script, and an +uninstaller. I've not done the uninstaller part, and it's a smart +part, as it's basically removing some files from the system, so +I'll probably do it in a near future.</p> +<p><a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> provides a way to +install distributions, and to handle dependencies between releases. +For now, this support is only about the last version of the +METADATA (1.2) (See, the PEP 345), but I'm working on a +compatibility layer for the old metadata, and for the informations +provided via PIP requires.txt, for instance.</p> +</div> +<div class="section" id="extra-work"> +<h3>Extra work</h3> +<p>Also, I've done some extra work. this includes:</p> +<ul class="simple"> +<li>working on the PEP 345, and having some discussion about it +(about the names of some fields).</li> +<li>writing a PyPI server mock, useful for tests. you can find more +information about it on the +<a class="reference external" href="http://distutils.notmyidea.org">documentation</a>.</li> +</ul> +</div> +</div> +<div class="section" id="futures-plans"> +<h2>Futures plans</h2> +<p>As I said, I've enjoyed working on distutils2, and the people I've +met here are really pleasant to work with. So I <em>want</em> to continue +contributing on python, and especially on python packaging, because +there is still a lot of things to do in this scope, to get +something really usable.</p> +<p>I'm not plainly satisfied by the work I've done, so I'll probably +tweak it a bit: the installer part is not yet completely finished, +and I want to add support for a real +<a class="reference external" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a> +index in the future.</p> +<p>We'll talk again of this in the next months, probably, but we +definitely need a real +<a class="reference external" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a> +API for <a class="reference external" href="http://pypi.python.org">PyPI</a>, as the &quot;simple&quot; index +<em>is</em> an ugly hack, in my opinion. I'll work on a serious +proposition about this, maybe involving +<a class="reference external" href="http://couchdb.org">CouchDB</a>, as it seems to be a good option +for what we want here.</p> +</div> +<div class="section" id="issues"> +<h2>Issues</h2> +<p>I've encountered some issues during this summer. The main one is +that's hard to work remotely, especially being in the same room +that we live, with others. I like to just think about a project +with other people, a paper and a pencil, no computers. This have +been not so possible at the start of the project, as I needed to +read a lot of code to understand the codebase, and then to +read/write emails.</p> +<p>I've finally managed to work in an office, so good point for +home/office separation.</p> +<p>I'd not planned there will be so a high number of emails to read, +in order to follow what's up in the python world, and be a part of +the community seems to takes some times to read/write emails, +especially for those (like me) that arent so confortable with +english (but this had brought me some english fu !).</p> +</div> +<div class="section" id="thanks"> +<h2>Thanks !</h2> +<p>A big thanks to <a class="reference external" href="http://www.graine-libre.fr/">Graine Libre</a> and +<a class="reference external" href="http://www.makina-corpus.com/">Makina Corpus</a>, which has offered +me to come into their offices from time to time, to share they +cheerfulness ! Many thanks too to the Google Summer of Code program +for setting up such an initiative. If you're a student, if you're +interested about FOSS, dont hesitate any second, it's a really good +opportunity to work on interesting projects!</p> +</div> +Introducing the distutils2 index crawlers2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html/<p>I'm working for about a month for distutils2, even if I was being a +bit busy (as I had some class courses and exams to work on)</p> +<p>I'll try do sum-up my general feelings here, and the work I've made +so far. You can also find, if you're interested, my weekly +summaries in +<a class="reference external" href="http://wiki.notmyidea.org/distutils2_schedule">a dedicated wiki page</a>.</p> +<div class="section" id="general-feelings"> +<h2>General feelings</h2> +<p>First, and it's a really important point, the GSoC is going very +well, for me as for other students, at least from my perspective. +It's a pleasure to work with such enthusiast people, as this make +the global atmosphere very pleasant to live.</p> +<p>First of all, I've spent time to read the existing codebase, and to +understand what we're going to do, and what's the rationale to do +so.</p> +<p>It's really clear for me now: what we're building is the +foundations of a packaging infrastructure in python. The fact is +that many projects co-exists, and comes all with their good +concepts. Distutils2 tries to take the interesting parts of all, +and to provide it in the python standard libs, respecting the +recently written PEP about packaging.</p> +<p>With distutils2, it will be simpler to make &quot;things&quot; compatible. So +if you think about a new way to deal with distributions and +packaging in python, you can use the Distutils2 APIs to do so.</p> +</div> +<div class="section" id="tasks"> +<h2>Tasks</h2> +<p>My main task while working on distutils2 is to provide an +installation and an un-installation command, as described in PEP +376. For this, I first need to get informations about the existing +distributions (what's their version, name, metadata, dependencies, +etc.)</p> +<p>The main index, you probably know and use, is PyPI. You can access +it at <a class="reference external" href="http://pypi.python.org">http://pypi.python.org</a>.</p> +</div> +<div class="section" id="pypi-index-crawling"> +<h2>PyPI index crawling</h2> +<p>There is two ways to get these informations from PyPI: using the +simple API, or via xml-rpc calls.</p> +<p>A goal was to use the version specifiers defined +in`PEP 345 &lt;<a class="reference external" href="http://www.python.org/dev/peps/pep-0345/">http://www.python.org/dev/peps/pep-0345/</a>&gt;`_ and to +provides a way to sort the grabbed distributions depending our +needs, to pick the version we want/need.</p> +<div class="section" id="using-the-simple-api"> +<h3>Using the simple API</h3> +<p>The simple API is composed of HTML pages you can access at +<a class="reference external" href="http://pypi.python.org/simple/">http://pypi.python.org/simple/</a>.</p> +<p>Distribute and Setuptools already provides a crawler for that, but +it deals with their internal mechanisms, and I found that the code +was not so clear as I want, that's why I've preferred to pick up +the good ideas, and some implementation details, plus re-thinking +the global architecture.</p> +<p>The rules are simple: each project have a dedicated page, which +allows us to get informations about:</p> +<ul class="simple"> +<li>the distribution download locations (for some versions)</li> +<li>homepage links</li> +<li>some other useful informations, as the bugtracker address, for +instance.</li> +</ul> +<p>If you want to find all the distributions of the &quot;EggsAndSpam&quot; +project, you could do the following (do not take so attention to +the names here, as the API will probably change a bit):</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">index</span> <span class="o">=</span> <span class="n">SimpleIndex</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">index</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;EggsAndSpam&quot;</span><span class="p">)</span> +<span class="p">[</span><span class="n">EggsAndSpam</span> <span class="mf">1.1</span><span class="p">,</span> <span class="n">EggsAndSpam</span> <span class="mf">1.2</span><span class="p">,</span> <span class="n">EggsAndSpam</span> <span class="mf">1.3</span><span class="p">]</span> +</pre></div> +<p>We also could use version specifiers:</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">index</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;EggsAndSpam (&lt; =1.2)&quot;</span><span class="p">)</span> +<span class="p">[</span><span class="n">EggsAndSpam</span> <span class="mf">1.1</span><span class="p">,</span> <span class="n">EggsAndSpam</span> <span class="mf">1.2</span><span class="p">]</span> +</pre></div> +<p>Internally, what's done here is the following:</p> +<ul class="simple"> +<li>it process the +<a class="reference external" href="http://pypi.python.org/simple/FooBar/">http://pypi.python.org/simple/FooBar/</a> +page, searching for download URLs.</li> +<li>for each found distribution download URL, it creates an object, +containing informations about the project name, the version and the +URL where the archive remains.</li> +<li>it sort the found distributions, using version numbers. The +default behavior here is to prefer source distributions (over +binary ones), and to rely on the last &quot;final&quot; distribution (rather +than beta, alpha etc. ones)</li> +</ul> +<p>So, nothing hard or difficult here.</p> +<p>We provides a bunch of other features, like relying on the new PyPI +mirroring infrastructure or filter the found distributions by some +criterias. If you're curious, please browse the +<a class="reference external" href="http://distutils2.notmyidea.org/">distutils2 documentation</a>.</p> +</div> +<div class="section" id="using-xml-rpc"> +<h3>Using xml-rpc</h3> +<p>We also can make some xmlrpc calls to retreive informations from +PyPI. It's a really more reliable way to get informations from from +the index (as it's just the index that provides the informations), +but cost processes on the PyPI distant server.</p> +<p>For now, this way of querying the xmlrpc client is not available on +Distutils2, as I'm working on it. The main pieces are already +present (I'll reuse some work I've made from the SimpleIndex +querying, and +<a class="reference external" href="http://github.com/ametaireau/pypiclient">some code already set up</a>), +what I need to do is to provide a xml-rpc PyPI mock server, and +that's on what I'm actually working on.</p> +</div> +</div> +<div class="section" id="processes"> +<h2>Processes</h2> +<p>For now, I'm trying to follow the &quot;documentation, then test, then +code&quot; path, and that seems to be really needed while working with a +community. Code is hard to read/understand, compared to +documentation, and it's easier to change.</p> +<p>While writing the simple index crawling work, I must have done this +to avoid some changes on the API, and some loss of time.</p> +<p>Also, I've set up +<a class="reference external" href="http://wiki.notmyidea.org/distutils2_schedule">a schedule</a>, and +the goal is to be sure everything will be ready in time, for the +end of the summer. (And now, I need to learn to follow schedules +...)</p> +</div> +Sprinting on distutils2 in Tours2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html/<p>Yesterday, as I was traveling to Tours, I've took some time to +visit Éric, another student who's working on distutils2 this +summer, as a part of the GSoC. Basically, it was to take a drink, +discuss a bit about distutils2, our respective tasks and general +feelings, and to put a face on a pseudonym. I'd really enjoyed this +time, because Éric knows a lot of things about mercurial and python +good practices, and I'm eager to learn about those. So, we have +discussed about things, have not wrote so much code, but have some +things to propose so far, about documentation, and I also provides +here some bribes of conversations we had.</p> +<div class="section" id="documentation"> +<h2>Documentation</h2> +<p>While writing the PyPI simple index crawler documentation, I +realized that we miss some structure, or how-to about the +documentation. Yep, you read well. We lack documentation on how to +make documentation. Heh. We're missing some rules to follow, and +this lead to a not-so-structured final documentation. We probably +target three type of publics, and we can split the documentation +regarding those:</p> +<ul class="simple"> +<li><strong>Packagers</strong> who want to distribute their softwares.</li> +<li><strong>End users</strong> who need to understand how to use end user +commands, like the installer/uninstaller</li> +<li><strong>packaging coders</strong> who <em>use</em> distutils2, as a base for +building a package manager.</li> +</ul> +<p>We also need to discuss about a pattern to follow while writing +documentation. How many parts do we need ? Where to put the API +description ? etc. That's maybe seems to be not so important, but I +guess the readers would appreciate to have the same structure all +along distutils2 documentation.</p> +</div> +<div class="section" id="mercurial"> +<h2>Mercurial</h2> +<p>I'm really <em>not</em> a mercurial power user. I use it on daily basis, +but I lack of basic knowledge about it. Big thanks Éric for sharing +yours with me, you're of a great help. We have talked about some +mercurial extensions that seems to make the life simpler, while +used the right way. I've not used them so far, so consider this as +a personal note.</p> +<ul class="simple"> +<li>hg histedit, to edit the history</li> +<li>hg crecord, to select the changes to commit</li> +</ul> +<p>We have spent some time to review a merge I made sunday, to +re-merge it, and commit the changes as a new changeset. Awesome. +These things make me say I <strong>need</strong> to read +<a class="reference external" href="http://hgbook.red-bean.com/read/">the hg book</a>, and will do as +soon as I got some spare time: mercurial seems to be simply great. +So ... Great. I'm a powerful merger now !</p> +</div> +<div class="section" id="on-using-tools"> +<h2>On using tools</h2> +<p>Because we <em>also</em> are <em>hackers</em>, we have shared a bit our ways to +code, the tools we use, etc. Both of us were using vim, and I've +discovered vimdiff and hgtk, which will completely change the way I +navigate into the mercurial history. We aren't &quot;power users&quot;, so we +have learned from each other about vim tips. You can find +<a class="reference external" href="http://github.com/ametaireau/dotfiles">my dotfiles on github</a>, +if it could help. They're not perfect, and not intended to be, +because changing all the time, as I learn. Don't hesitate to have a +look, and to propose enhancements if you have !</p> +</div> +<div class="section" id="on-being-pythonic"> +<h2>On being pythonic</h2> +<p>My background as an old Java user disserves me so far, as the +paradigms are not the same while coding in python. Hard to find the +more pythonic way to do, and sometimes hard to unlearn my way to +think about software engineering. Well, it seems that the only +solution is to read code, and to re-read import this from times to +times ! +<a class="reference external" href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html">Coding like a pythonista</a> +seems to be a must-read, so, I know what to do.</p> +</div> +<div class="section" id="conclusion"> +<h2>Conclusion</h2> +<p>It was really great. Next time, we'll need to focus a bit more on +distutils2, and to have a bullet list of things to do, but days +like this one are opportunities to catch ! We'll probably do +another sprint in a few weeks, stay tuned !</p> +</div> +Use Restructured Text (ReST) to power your presentations2010-06-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html/<p>Wednesday, we give a presentation, with some friends, about the +CouchDB Database, to +<a class="reference external" href="http://www.toulibre.org">the Toulouse local LUG</a>. Thanks a lot +to all the presents for being there, it was a pleasure to talk +about this topic with you. Too bad the season is over now an I quit +Toulouse next year.</p> +<p>During our brainstorming about the topic, we +used some paper, and we wanted to make a presentation the simpler +way. First thing that come to my mind was using +<a class="reference external" href="http://docutils.sourceforge.net/rst.html">restructured text</a>, so +I've wrote a simple file containing our different bullet points. In +fact, there is quite nothing to do then, to have a working +presentation.</p> +<p>So far, I've used +<a class="reference external" href="http://code.google.com/p/rst2pdf/">the rst2pdf program</a>, and a +simple template, to generate output. It's probably simple to have +similar results using latex + beamer, I'll try this next time, but +as I'm not familiar with latex syntax, restructured text was a +great option.</p> +<p>Here are +<a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.pdf">the final PDF output</a>, +<a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.rst">Rhe ReST source</a>, +<a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/slides.style">the theme used</a>, +and the command line to generate the PDF:</p> +<pre class="literal-block"> +rst2pdf couchdb.rst -b1 -s ../slides.style +</pre> +first week working on distutils22010-06-04T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html/<p>As I've been working on +<a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a> during the past +week, taking part of the +<a class="reference external" href="http://code.google.com/intl/fr/soc/">GSOC</a> program, here is a +short summary of what I've done so far.</p> +<p>As my courses are not over yet, I've not worked as much as I +wanted, and this will continues until the end of June. My main +tasks are about making installation and uninstallation commands, to +have a simple way to install distributions via +<a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a>.</p> +<p>To do this, we need to rely on informations provided by the Python +Package Index (<a class="reference external" href="http://pypi.python.org/">PyPI</a>), and there is at +least two ways to retreive informations from here: XML-RPC and the +&quot;simple&quot; API.</p> +<p>So, I've been working on porting some +<a class="reference external" href="http://bitbucket.org/tarek/distribute/">Distribute</a> related +stuff to <a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a>, cutting +off all non distutils' things, as we do not want to depend from +Distribute's internals. My main work has been about reading the +whole code, writing tests about this and making those tests +possible.</p> +<p>In fact, there was a need of a pypi mocked server, and, after +reading and introducing myself to the distutils behaviors and code, +I've taken some time to improve the work +<a class="reference external" href="http://bitbucket.org/konrad">Konrad</a> makes about this mock.</p> +<div class="section" id="a-pypi-server-mock"> +<h2>A PyPI Server mock</h2> +<p>The mock is embeded in a thread, to make it available during the +tests, in a non blocking way. We first used +<a class="reference external" href="http://wsgi.org">WSGI</a> and +<a class="reference external" href="http://docs.python.org/library/wsgiref.html">wsgiref</a> in order +control what to serve, and to log the requests made to the server, +but finally realised that +<a class="reference external" href="http://docs.python.org/library/wsgiref.html">wsgiref</a> is not +python 2.4 compatible (and we <em>need</em> to be python 2.4 compatible in +Distutils2).</p> +<p>So, we switched to +<a class="reference external" href="http://docs.python.org/library/basehttpserver.html">BaseHTTPServer</a> +and +<a class="reference external" href="http://docs.python.org/library/simplehttpserver.html">SimpleHTTPServer</a>, +and updated our tests accordingly. It's been an opportunity to +realize that <a class="reference external" href="http://wsgi.org">WSGI</a> has been a great step +forward for making HTTP servers, and expose a really simplest way +to discuss with HTTP !</p> +<p>You can find +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/changesets">the modifications I made</a>, +and the +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/src/tip/docs/source/test_framework.rst">related docs</a> +about this on +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/">my bitbucket distutils2 clone</a>.</p> +</div> +<div class="section" id="the-pypi-simple-api"> +<h2>The PyPI Simple API</h2> +<p>So, back to the main problematic: make a python library to access +and request information stored on PyPI, via the simple API. As I +said, I've just grabbed the work made from +<a class="reference external" href="http://bitbucket.org/tarek/distribute/">Distribute</a>, and played +a bit with, in order to view what are the different use cases, and +started to write the related tests.</p> +</div> +<div class="section" id="the-work-to-come"> +<h2>The work to come</h2> +<p>So, once all use cases covered with tests, I'll rewrite a bit the +grabbed code, and do some software design work (to not expose all +things as privates methods, have a clear API, and other things like +this), then update the tests accordingly and write a documentation +to make this clear.</p> +<p>Next step is to a little client, as I've +<a class="reference external" href="http://github.com/ametaireau/pypiclient">already started here</a> +I'll take you updated !</p> +</div> +A Distutils2 GSoC2010-05-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html/<p>WOW. I've been accepted to be a part of the +<a class="reference external" href="http://code.google.com/intl/fr/soc/">Google Summer Of Code</a> +program, and will work on <a class="reference external" href="http://python.org/">python</a> +<a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a>, with +<a class="reference external" href="http://pygsoc.wordpress.com/">a</a> +<a class="reference external" href="http://konryd.blogspot.com/">lot</a> <a class="reference external" href="http://ziade.org/">of</a> +(intersting!) <a class="reference external" href="http://zubin71.wordpress.com/">people</a>.</p> +<blockquote> +So, it's about building the successor of Distutils2, ie. &quot;the +python package manager&quot;. Today, there is too&nbsp;many ways to package a +python application (pip, setuptools, distribute, distutils, etc.) +so&nbsp;there is a huge effort to make in order to make all this +packaging stuff interoperable, as pointed out by +the&nbsp;<a class="reference external" href="http://www.python.org/dev/peps/pep-0376/">PEP 376</a>.</blockquote> +<p>In more details, I'm going to work on the Installer / Uninstaller +features of Distutils2, and on a PyPI XML-RPC client for distutils2. +Here are the already defined tasks:</p> +<ul class="simple"> +<li>Implement Distutils2 APIs described in PEP 376.</li> +<li>Add the uninstall command.</li> +<li>think about a basic installer / uninstaller script. (with deps) +-- similar to pip/easy_install</li> +<li>in a pypi subpackage;</li> +<li>Integrate a module similar to setuptools' package_index'</li> +<li>PyPI XML-RPC client for distutils 2: +<a class="reference external" href="http://bugs.python.org/issue8190">http://bugs.python.org/issue8190</a></li> +</ul> +<p>As I'm relatively new to python, I'll need some extra work in order +to apply all good practice, among other things that can make a +developper-life joyful. I'll post here, each week, my advancement, +and my tought about python and especialy python packaging world.</p> +Le temps des grâces, courrez-y !2010-03-28T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html/<p>Ouf, notre +<a class="reference external" href="http://www.reseaugrappe.org">semaine de l'environnement</a> s'est +terminée, après un peu de neige et un brin de soleil quand il en +fallait.</p> +<p>Ce fut l'occasion de rencontrer beaucoup de gens biens, et +de regarder d'un peu plus près toutes ces problématiques qui +mériteraient à elles seules, chacune un billet. Après un répis +d'une semaine, pour récupérer des folies organisatrices (c'est ça +qui fait du bien, ceci dit -- les folies, pas le repos), je me +retrouve de nouveau sur ces mêms réflexions, grâce aux journées +organisées par +<a class="reference external" href="http://www.fne.asso.fr/">France Nature Environnement</a>, qui +proposaient ce jeudi soir une projection de &quot;Le temps des grâces&quot;, +un documentaire sur l'agriculture.</p> +<p>Parce que depuis 60 ans, il est pratiqué le remembrement des +parcelles à gogo, parce que nos sols deviennent completement morts +à cause des tonnes d'intrants qu'on leur fait absorber, et parce +que les exploitations s'agrandissent sans en finir pour tenter de +réagir façe à un marché financier toujours plus insaisissable, mené +de très loin par la PAC, il fallait un film pour en parler. C'est +ce que fait &quot;le temps des grâçes&quot;, avec un bon sens et une facilité +à faire passer des messages, qu'on ne peut qu'applaudir.</p> +<p>Malheureusement il s'agissait de la dernière diffusion à +<a class="reference external" href="http://www.cinemas-utopia.org/toulouse/">L'Utopia de Toulouse</a>... +Si vous en avez l'occasion, sautez dessus et profitez le temps de +ces 2 heures, ou vous pourrez écouter à la fois des discours +d'agronomes, d'agriculteurs, de chercheurs et bien d'autres, qui +dressent un constat pas si brillant de notre agriculture. On n'est +pas sorti de l'auberge, enfin, c'est l'expression.</p> +<p>Je vous laisse avec le synopsis et une bande annonce.</p> +<blockquote> +Une enquête documentaire sur +le monde agricole français aujourd'hui à travers de nombreux récits +: agriculteurs, chercheurs, agronomes, écrivains... Un monde qui +parvient à résister aux bouleversements qui le frappent - +économiques, scientifiques, sociaux - et qui, bon gré mal gré, +continue d'entretenir les liens entre générations. Un monde au +centre d'interrogations majeures sur l'avenir.</blockquote> +<p>Ainsi qu'un commentaire que je ne peux m'empécher de relayer, +trouvé sur allocine.fr (oui, vous savez, ce site rempli de pubs).</p> +<blockquote> +Le temps des grâces c'est je pense le plus grand film traitant de +l'écologie en tant que documentaire ou en sujet principal, on y +apprend une multitude de choses, on en ressort en colère contre le +système, le film propose différents points de vues, ici on a pas de +voix off moralisatrice à deux balles avec des gros titres bien +surlignés pour que même les beaufs matant TF1 puissent comprendre, +ici même si ça reste accessible au citoyen lambda, le film ne fait +pas de compromis avec le monde agroalimentaire, il ose dénoncer les +filière d'agronomie qui apprennent pas les bonnes choses à leurs +étudiants, aux lobbys de cette agro-industrie qui n'en fait qu'à sa +tête pour amasser de l'argent, cette tendance à tout uniformiser et +détruire… Franchement j'ai trouvé ça génial de bout en bout, +captivant, on explore cette campagne française, on comprend les +dilemmes des paysants. Le film n'étant pas opposé à la modernité, +ni même réactionnaire, il propose juste un constat alarmant du +monde agricole français, tout en proposant des alternatives qui +pourraient être utilisée, si les pouvoirs publics lâchaient un peu +la main des lobbys. Passionnant, vraiment.</blockquote> +<p>Courrez-y, je vous dis.</p> +Semaine de l’environnement: La consommation étudiante2010-02-24T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html/<p>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a class="reference external" href="http://www.framasoft.net/">Framasoft</a>, à <a class="reference external" href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a class="reference external" href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l'informatique), mais aussi <a class="reference external" href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a class="reference external" href="http://www.attac.org/">ATTAC</a> (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.</p> +<p>Dans cette optique, depuis près de 3 ans (déjà !), au sein du +<a class="reference external" href="http://www.reseaugrappe.org">réseau GRAPPE</a>, on <em>essaye</em> +d'aborder des thématiques qui touchent de près ou de loin à +l'environnement, parce que c'est un sujet qui nous importe et nous +passionne. L'année dernière, c'était l'alimentation étudiante, ce +qui à abouti à la publication de +<a class="reference external" href="http://public.reseaugrappe.org/alimentation.pdf">la revue &quot;les étudiants se mettent à table&quot;</a>. +Cette année c'est la consommation étudiante qui est au programme.</p> +<div class="section" id="la-consommation-etudiante"> +<h2>La consommation étudiante ?</h2> +<p>L'idée principale de cette étude est de tenter de faire une analyse +de la &quot;société de consommation&quot;, souvent questionnée par les +étudiants et par d'autres, et de jeter un œil sur le rapport des +étudiants à cette société: Quoi et comment consomment-ils ? Les +universités et les écoles ne poussent-elles pas d’une certaine +manière les étudiants à la consommation ? Quelles sont les +alternatives face aux dérives de surconsommation ?</p> +<blockquote> +Analyse des pratiques, réflexions et mobilisations des étudiants en +termes de consommation seront réalisés pour comprendre leur modes +de vie, mais aussi leurs attentes, leurs propositions sur cette +thématique</blockquote> +</div> +<div class="section" id="la-semaine-de-l-environnement"> +<h2>La semaine de l'environnement !</h2> +<p>A travers l'ensemble des villes du réseau, +des projections de films et des débats auront donc lieu sur ce +thème, lors de la semaine de l'environnement 2010, qui se déroulera +d'ailleurs durant le mois de Mars +<a class="reference external" href="http://www.reseaugrappe.org/la-semaine-de-lenvironnement-programme/">partout en france</a>, +et <strong>du 6 au 14 Mars sur Toulouse</strong>. +<a class="reference external" href="http://docs.notmyidea.org/sde/prog-toulouse.pdf">Jetez un oeil au programme</a> +! Avec pour objectif de sonder un peu le ressenti des étudiants en +terme de consommation, nous avons mis en place +<a class="reference external" href="http://spreadsheets.google.com/viewform?formkey=dHV2bVllS2lWbzhyV3NBN3NUbi1TM2c6MA">un questionnaire en ligne</a>, +que vous pouvez compléter en une petite 10aine de minutes, +n'hésitez pas ! +<a class="reference external" href="http://www.reseaugrappe.org/consommation/">La page sur la consommation étudiante sur le site du GRAPPE</a></p> +</div> +Python ? go !2009-12-17T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-12-17:/python-go.html/<p>Cela fait maintenant un peu plus d'un mois que je travaille sur un +projet en <a class="reference external" href="http://www.djangoproject.org">django</a>, et que, +nécessairement, je me forme à <a class="reference external" href="http://python.org/">Python</a>. Je +prends un plaisir non dissimulé à découvrir ce langage (et à +l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui +me viennent à l'esprit à propos de Python, sont &quot;logique&quot; et +&quot;simple&quot;. Et pourtant puissant pour autant. Je ne manque d'ailleurs +pas une occasion pour faire un peu d'<em>évangélisation</em> auprès des +quelques personnes qui veulent bien m'écouter.</p> +<div class="section" id="the-zen-of-python"> +<h2>The Zen of Python</h2> +<p>Avant toute autre chose, je pense utile de citer Tim Peters, et +<a class="reference external" href="http://www.python.org/dev/peps/pep-0020/">le PEP20</a>, qui +constituent une très bonne introduction au langage, qui prends la +forme d'un <em>easter egg</em> présent dans python</p> +<div class="highlight"><pre>&gt;&gt;&gt; import this +The Zen of Python, by Tim Peters + +Beautiful is better than ugly. +Explicit is better than implicit. +Simple is better than complex. +Complex is better than complicated. +Flat is better than nested. +Sparse is better than dense. +Readability counts. +Special cases aren<span class="s1">&#39;t special enough to break the rules.</span> +<span class="s1">Although practicality beats purity.</span> +<span class="s1">Errors should never pass silently.</span> +<span class="s1">Unless explicitly silenced.</span> +<span class="s1">In the face of ambiguity, refuse the temptation to guess.</span> +<span class="s1">There should be one-- and preferably only one --obvious way to do it.</span> +<span class="s1">Although that way may not be obvious at first unless you&#39;</span>re Dutch. +Now is better than never. +Although never is often better than *right* now. +If the implementation is hard to explain, it<span class="s1">&#39;s a bad idea.</span> +<span class="s1">If the implementation is easy to explain, it may be a good idea.</span> +<span class="s1">Namespaces are one honking great idea -- let&#39;</span>s <span class="k">do </span>more of those! +</pre></div> +<p>J'ai la vague impression que c'est ce que j'ai toujours cherché à +faire en PHP, et particulièrement dans +<a class="reference external" href="http://www.spiral-project.org">le framework Spiral</a>, mais en +ajoutant ces concepts dans une sur-couche au langage. Ici, c'est +directement de <em>l'esprit</em> de python qu'il s'agit, ce qui signifie +que la plupart des bibliothèques python suivent ces concepts. Elle +est pas belle la vie ?</p> +</div> +<div class="section" id="comment-commencer-et-par-ou"> +<h2>Comment commencer, et par ou ?</h2> +<p>Pour ma part, j'ai commencé par la lecture de quelques livres et +articles intéressants, qui constituent une bonne entrée en matière +sur le sujet (La liste n'est bien évidemment pas exhaustive et vos +commentaires sont les bienvenus) :</p> +<ul class="simple"> +<li><a class="reference external" href="http://diveintopython.adrahon.org/">Dive into python</a></li> +<li><a class="reference external" href="http://www.swaroopch.com/notes/Python_fr:Table_des_Matières">A byte of python</a></li> +<li><a class="reference external" href="http://www.amazon.fr/Python-Petit-guide-lusage-développeur/dp/2100508830">Python: petit guide à l'usage du développeur agile</a> +de <a class="reference external" href="http://tarekziade.wordpress.com/">Tarek Ziadé</a></li> +<li><a class="reference external" href="http://docs.python.org/index.html">La documentation officielle python</a>, +bien sûr !</li> +<li><a class="reference external" href="http://video.pycon.fr/videos/pycon-fr-2009/">Les vidéos du pyconfr 2009</a>!</li> +<li>Un peu de temps, et une console python ouverte :)</li> +</ul> +<p>J'essaye par ailleurs de partager au maximum les ressources que je +trouve de temps à autres, que ce soit +<a class="reference external" href="http://www.twitter.com/ametaireau">via twitter</a> ou +<a class="reference external" href="http://delicious.com/ametaireau">via mon compte delicious</a>. +Allez jeter un œil +<a class="reference external" href="http://delicious.com/ametaireau/python">au tag python</a> sur mon +profil, peut être que vous trouverez des choses intéressantes, qui +sait!</p> +</div> +<div class="section" id="un-python-sexy"> +<h2>Un python sexy</h2> +<p>Quelques fonctionnalités qui devraient vous mettre l'eau à la +bouche:</p> +<ul class="simple"> +<li><a class="reference external" href="http://docs.python.org/library/stdtypes.html#comparisons">Le chaînage des opérateurs de comparaison</a> +est possible (a&lt;b &lt;c dans une condition)</li> +<li>Assignation de valeurs multiples (il est possible de faire a,b,c += 1,2,3 par exemple)</li> +<li><a class="reference external" href="http://docs.python.org/tutorial/datastructures.html">Les listes</a> +sont simples à manipuler !</li> +<li>Les <a class="reference external" href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions">list comprehension</a>, +ou comment faire des opérations complexes sur les listes, de +manière simple.</li> +<li>Les +<a class="reference external" href="http://docs.python.org/library/doctest.html?highlight=doctest">doctests</a>: +ou comment faire des tests directement dans la documentation de vos +classes, tout en la documentant avec de vrais exemples.</li> +<li>Les +<a class="reference external" href="http://www.python.org/doc/essays/metaclasses/meta-vladimir.txt">métaclasses</a>, +ou comment contrôler la manière dont les classes se construisent</li> +<li>Python est +<a class="reference external" href="http://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language">un langage à typage fort dynamique</a>: +c'est ce qui m'agaçait avec PHP qui est un langage à typage faible +dynamique.</li> +</ul> +<p>Cous pouvez également aller regarder +<a class="reference external" href="http://video.pycon.fr/videos/free/53/">l'atelier donné par Victor Stinner durant le Pyconfr 09</a>. +Have fun !</p> +</div> +AMAP + Média = Paniers bio à 5e ?!2009-11-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html/<p>Le raccourci me semble un peu rapide. Et pourtant, il est emprunté +bien trop souvent. La dernière <em>mes-utilisation</em> que j'ai à décrier +est celle d'un reportage télé, passé sur France 2 vendredi 23 +Octobre +(<a class="reference external" href="http://docs.notmyidea.org/amap/amap-fr2.avi">voir la vidéo</a>), +ou on parles de +<a class="reference external" href="http://amap.zest.free.fr">l'AMAP étudiante Zest</a>.</p> +<p>Malgré tout le temps passé à expliquer que justement, l'AMAP c'est +avant tout, pour nous, une notion de solidarité envers les +agriculteurs, malgré le fait que le message soit plus profond que +simplement aller acheter du bio (ça, c'est possible aussi en +supermarché), malgré le fait qu'il s'agisse en fait d'une remise en +cause plus profonde de la société, les journalistes n'ont choisi de +prendre que les quelques secondes qui leurs convenaient, celles qui +ne faisaient pas tache, celle ou je dis que &quot;l'AMAP permet aux +étudiants de réapprendre à cuisiner, plutôt que de manger des +nouilles et de se faire des plats réchauffés&quot;. Bien sur, je l'ai +dit et je le pense d'ailleurs, là n'est pas le problème, mais mon +message n'était pas celui là.</p> +<p>Jamais, dans les quelques minutes du reportage, on ne dit ce que +AMAP signifie: Association de <strong>Maintien</strong> d'une Agriculture +<strong>Paysanne</strong>. On ne parles même pas des agriculteurs ! C'est +simplement plus facile pour les étudiants de venir récupérer leurs +paniers, puisque les points de distribution sont sur les facs, et +en plus ça ne coute que 5 euros ! ...</p> +<p>Alors je crois bon de rappeler que L'AMAP n'est pas seulement un +service, c'est un engagement. Sur 5 mois, un engagement solidaire, +c'est la donnée principale de l'équation, celle sans quoi ça ne +peut fonctionner. Par le biais de cette AMAP, on essaye de montrer +que d'autres agricultures sont possibles, que la solidarité c'est +bien réel, et qu'il est possible de sortir du +<em>tout, tout de suite</em>.</p> +<p>Mais bon, apparemment, ça passe pas bien à la télé.</p> + \ No newline at end of file diff --git a/feeds/asso.atom.xml b/feeds/asso.atom.xml new file mode 100644 index 0000000..7e4621c --- /dev/null +++ b/feeds/asso.atom.xml @@ -0,0 +1,135 @@ + +Alexis' loghttp://blog.notmyidea.org2010-03-28T00:00:00ZLe temps des grâces, courrez-y !2010-03-28T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html/<p>Ouf, notre +<a class="reference external" href="http://www.reseaugrappe.org">semaine de l'environnement</a> s'est +terminée, après un peu de neige et un brin de soleil quand il en +fallait.</p> +<p>Ce fut l'occasion de rencontrer beaucoup de gens biens, et +de regarder d'un peu plus près toutes ces problématiques qui +mériteraient à elles seules, chacune un billet. Après un répis +d'une semaine, pour récupérer des folies organisatrices (c'est ça +qui fait du bien, ceci dit -- les folies, pas le repos), je me +retrouve de nouveau sur ces mêms réflexions, grâce aux journées +organisées par +<a class="reference external" href="http://www.fne.asso.fr/">France Nature Environnement</a>, qui +proposaient ce jeudi soir une projection de &quot;Le temps des grâces&quot;, +un documentaire sur l'agriculture.</p> +<p>Parce que depuis 60 ans, il est pratiqué le remembrement des +parcelles à gogo, parce que nos sols deviennent completement morts +à cause des tonnes d'intrants qu'on leur fait absorber, et parce +que les exploitations s'agrandissent sans en finir pour tenter de +réagir façe à un marché financier toujours plus insaisissable, mené +de très loin par la PAC, il fallait un film pour en parler. C'est +ce que fait &quot;le temps des grâçes&quot;, avec un bon sens et une facilité +à faire passer des messages, qu'on ne peut qu'applaudir.</p> +<p>Malheureusement il s'agissait de la dernière diffusion à +<a class="reference external" href="http://www.cinemas-utopia.org/toulouse/">L'Utopia de Toulouse</a>... +Si vous en avez l'occasion, sautez dessus et profitez le temps de +ces 2 heures, ou vous pourrez écouter à la fois des discours +d'agronomes, d'agriculteurs, de chercheurs et bien d'autres, qui +dressent un constat pas si brillant de notre agriculture. On n'est +pas sorti de l'auberge, enfin, c'est l'expression.</p> +<p>Je vous laisse avec le synopsis et une bande annonce.</p> +<blockquote> +Une enquête documentaire sur +le monde agricole français aujourd'hui à travers de nombreux récits +: agriculteurs, chercheurs, agronomes, écrivains... Un monde qui +parvient à résister aux bouleversements qui le frappent - +économiques, scientifiques, sociaux - et qui, bon gré mal gré, +continue d'entretenir les liens entre générations. Un monde au +centre d'interrogations majeures sur l'avenir.</blockquote> +<p>Ainsi qu'un commentaire que je ne peux m'empécher de relayer, +trouvé sur allocine.fr (oui, vous savez, ce site rempli de pubs).</p> +<blockquote> +Le temps des grâces c'est je pense le plus grand film traitant de +l'écologie en tant que documentaire ou en sujet principal, on y +apprend une multitude de choses, on en ressort en colère contre le +système, le film propose différents points de vues, ici on a pas de +voix off moralisatrice à deux balles avec des gros titres bien +surlignés pour que même les beaufs matant TF1 puissent comprendre, +ici même si ça reste accessible au citoyen lambda, le film ne fait +pas de compromis avec le monde agroalimentaire, il ose dénoncer les +filière d'agronomie qui apprennent pas les bonnes choses à leurs +étudiants, aux lobbys de cette agro-industrie qui n'en fait qu'à sa +tête pour amasser de l'argent, cette tendance à tout uniformiser et +détruire… Franchement j'ai trouvé ça génial de bout en bout, +captivant, on explore cette campagne française, on comprend les +dilemmes des paysants. Le film n'étant pas opposé à la modernité, +ni même réactionnaire, il propose juste un constat alarmant du +monde agricole français, tout en proposant des alternatives qui +pourraient être utilisée, si les pouvoirs publics lâchaient un peu +la main des lobbys. Passionnant, vraiment.</blockquote> +<p>Courrez-y, je vous dis.</p> +Semaine de l’environnement: La consommation étudiante2010-02-24T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html/<p>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a class="reference external" href="http://www.framasoft.net/">Framasoft</a>, à <a class="reference external" href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a class="reference external" href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l'informatique), mais aussi <a class="reference external" href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a class="reference external" href="http://www.attac.org/">ATTAC</a> (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.</p> +<p>Dans cette optique, depuis près de 3 ans (déjà !), au sein du +<a class="reference external" href="http://www.reseaugrappe.org">réseau GRAPPE</a>, on <em>essaye</em> +d'aborder des thématiques qui touchent de près ou de loin à +l'environnement, parce que c'est un sujet qui nous importe et nous +passionne. L'année dernière, c'était l'alimentation étudiante, ce +qui à abouti à la publication de +<a class="reference external" href="http://public.reseaugrappe.org/alimentation.pdf">la revue &quot;les étudiants se mettent à table&quot;</a>. +Cette année c'est la consommation étudiante qui est au programme.</p> +<div class="section" id="la-consommation-etudiante"> +<h2>La consommation étudiante ?</h2> +<p>L'idée principale de cette étude est de tenter de faire une analyse +de la &quot;société de consommation&quot;, souvent questionnée par les +étudiants et par d'autres, et de jeter un œil sur le rapport des +étudiants à cette société: Quoi et comment consomment-ils ? Les +universités et les écoles ne poussent-elles pas d’une certaine +manière les étudiants à la consommation ? Quelles sont les +alternatives face aux dérives de surconsommation ?</p> +<blockquote> +Analyse des pratiques, réflexions et mobilisations des étudiants en +termes de consommation seront réalisés pour comprendre leur modes +de vie, mais aussi leurs attentes, leurs propositions sur cette +thématique</blockquote> +</div> +<div class="section" id="la-semaine-de-l-environnement"> +<h2>La semaine de l'environnement !</h2> +<p>A travers l'ensemble des villes du réseau, +des projections de films et des débats auront donc lieu sur ce +thème, lors de la semaine de l'environnement 2010, qui se déroulera +d'ailleurs durant le mois de Mars +<a class="reference external" href="http://www.reseaugrappe.org/la-semaine-de-lenvironnement-programme/">partout en france</a>, +et <strong>du 6 au 14 Mars sur Toulouse</strong>. +<a class="reference external" href="http://docs.notmyidea.org/sde/prog-toulouse.pdf">Jetez un oeil au programme</a> +! Avec pour objectif de sonder un peu le ressenti des étudiants en +terme de consommation, nous avons mis en place +<a class="reference external" href="http://spreadsheets.google.com/viewform?formkey=dHV2bVllS2lWbzhyV3NBN3NUbi1TM2c6MA">un questionnaire en ligne</a>, +que vous pouvez compléter en une petite 10aine de minutes, +n'hésitez pas ! +<a class="reference external" href="http://www.reseaugrappe.org/consommation/">La page sur la consommation étudiante sur le site du GRAPPE</a></p> +</div> +AMAP + Média = Paniers bio à 5e ?!2009-11-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html/<p>Le raccourci me semble un peu rapide. Et pourtant, il est emprunté +bien trop souvent. La dernière <em>mes-utilisation</em> que j'ai à décrier +est celle d'un reportage télé, passé sur France 2 vendredi 23 +Octobre +(<a class="reference external" href="http://docs.notmyidea.org/amap/amap-fr2.avi">voir la vidéo</a>), +ou on parles de +<a class="reference external" href="http://amap.zest.free.fr">l'AMAP étudiante Zest</a>.</p> +<p>Malgré tout le temps passé à expliquer que justement, l'AMAP c'est +avant tout, pour nous, une notion de solidarité envers les +agriculteurs, malgré le fait que le message soit plus profond que +simplement aller acheter du bio (ça, c'est possible aussi en +supermarché), malgré le fait qu'il s'agisse en fait d'une remise en +cause plus profonde de la société, les journalistes n'ont choisi de +prendre que les quelques secondes qui leurs convenaient, celles qui +ne faisaient pas tache, celle ou je dis que &quot;l'AMAP permet aux +étudiants de réapprendre à cuisiner, plutôt que de manger des +nouilles et de se faire des plats réchauffés&quot;. Bien sur, je l'ai +dit et je le pense d'ailleurs, là n'est pas le problème, mais mon +message n'était pas celui là.</p> +<p>Jamais, dans les quelques minutes du reportage, on ne dit ce que +AMAP signifie: Association de <strong>Maintien</strong> d'une Agriculture +<strong>Paysanne</strong>. On ne parles même pas des agriculteurs ! C'est +simplement plus facile pour les étudiants de venir récupérer leurs +paniers, puisque les points de distribution sont sur les facs, et +en plus ça ne coute que 5 euros ! ...</p> +<p>Alors je crois bon de rappeler que L'AMAP n'est pas seulement un +service, c'est un engagement. Sur 5 mois, un engagement solidaire, +c'est la donnée principale de l'équation, celle sans quoi ça ne +peut fonctionner. Par le biais de cette AMAP, on essaye de montrer +que d'autres agricultures sont possibles, que la solidarité c'est +bien réel, et qu'il est possible de sortir du +<em>tout, tout de suite</em>.</p> +<p>Mais bon, apparemment, ça passe pas bien à la télé.</p> + \ No newline at end of file diff --git a/feeds/dev.atom.xml b/feeds/dev.atom.xml new file mode 100644 index 0000000..20be302 --- /dev/null +++ b/feeds/dev.atom.xml @@ -0,0 +1,1167 @@ + +Alexis' loghttp://blog.notmyidea.org2011-07-25T00:00:00ZPelican, 9 months later2011-07-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html/<p>Back in October, I released <a class="reference external" href="http://docs.notmyidea.org/alexis/pelican">pelican</a>, +a little piece of code I wrote to power this weblog. I had simple needs: I wanted +to be able to use my text editor of choice (vim), a vcs (mercurial) and +restructured text. I started to write a really simple blog engine +in something like a hundred python lines and released it on github.</p> +<p>And people started contributing. I wasn't at all expecting to see people +interested in such a little piece of code, but it turned out that they were. +I refactored the code to make it evolve a bit more by two times and eventually, +in 9 months, got 49 forks, 139 issues and 73 pull requests.</p> +<p><strong>Which is clearly awesome.</strong></p> +<p>I pulled features such as translations, tag +clouds, integration with different services such as twitter or piwik, import +from dotclear and rss, fixed +a number of mistakes and improved a lot the codebase. This was a proof that +there is a bunch of people that are willing to make better softwares just for +the sake of fun.</p> +<p>Thank you, guys, you're why I like open source so much.</p> +Using JPype to bridge python and Java2011-06-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html/<p>Java provides some interesting libraries that have no exact equivalent in +python. In my case, the awesome boilerpipe library allows me to remove +uninteresting parts of HTML pages, like menus, footers and other &quot;boilerplate&quot; +contents.</p> +<p>Boilerpipe is written in Java. Two solutions then: using java from python or +reimplement boilerpipe in python. I will let you guess which one I chosen, meh.</p> +<p>JPype allows to bridge python project with java libraries. It takes another +point of view than Jython: rather than reimplementing python in Java, both +languages are interfacing at the VM level. This means you need to start a VM +from your python script, but it does the job and stay fully compatible with +Cpython and its C extensions.</p> +<div class="section" id="first-steps-with-jpype"> +<h2>First steps with JPype</h2> +<p>Once JPype installed (you'll have to hack a bit some files to integrate +seamlessly with your system) you can access java classes by doing something +like that:</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">jpype</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">startJVM</span><span class="p">(</span><span class="n">jpype</span><span class="o">.</span><span class="n">getDefaultJVMPath</span><span class="p">())</span> + +<span class="c"># you can then access to the basic java functions</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">java</span><span class="o">.</span><span class="n">lang</span><span class="o">.</span><span class="n">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="s">&quot;hello world&quot;</span><span class="p">)</span> + +<span class="c"># and you have to shutdown the VM at the end</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">shutdownJVM</span><span class="p">()</span> +</pre></div> +<p>Okay, now we have a hello world, but what we want seems somehow more complex. +We want to interact with java classes, so we will have to load them.</p> +</div> +<div class="section" id="interfacing-with-boilerpipe"> +<h2>Interfacing with Boilerpipe</h2> +<p>To install boilerpipe, you just have to run an ant script:</p> +<pre class="literal-block"> +$ cd boilerpipe +$ ant +</pre> +<p>Here is a simple example of how to use boilerpipe in Java, from their sources</p> +<div class="highlight"><pre><span class="kn">package</span> <span class="n">de</span><span class="o">.</span><span class="na">l3s</span><span class="o">.</span><span class="na">boilerpipe</span><span class="o">.</span><span class="na">demo</span><span class="o">;</span> +<span class="kn">import</span> <span class="nn">java.net.URL</span><span class="o">;</span> +<span class="kn">import</span> <span class="nn">de.l3s.boilerpipe.extractors.ArticleExtractor</span><span class="o">;</span> + +<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Oneliner</span> <span class="o">{</span> + <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span> + <span class="kd">final</span> <span class="n">URL</span> <span class="n">url</span> <span class="o">=</span> <span class="k">new</span> <span class="n">URL</span><span class="o">(</span><span class="s">&quot;http://notmyidea.org&quot;</span><span class="o">);</span> + <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">ArticleExtractor</span><span class="o">.</span><span class="na">INSTANCE</span><span class="o">.</span><span class="na">getText</span><span class="o">(</span><span class="n">url</span><span class="o">));</span> + <span class="o">}</span> +<span class="o">}</span> +</pre></div> +<p>To run it:</p> +<div class="highlight"><pre><span class="nv">$ </span>javac -cp dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar src/demo/de/l3s/boilerpipe/demo/Oneliner.java +<span class="nv">$ </span>java -cp src/demo:dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar de.l3s.boilerpipe.demo.Oneliner +</pre></div> +<p>Yes, this is kind of ugly, sorry for your eyes. +Let's try something similar, but from python</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">jpype</span> + +<span class="c"># start the JVM with the good classpaths</span> +<span class="n">classpath</span> <span class="o">=</span> <span class="s">&quot;dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar&quot;</span> +<span class="n">jpype</span><span class="o">.</span><span class="n">startJVM</span><span class="p">(</span><span class="n">jpype</span><span class="o">.</span><span class="n">getDefaultJVMPath</span><span class="p">(),</span> <span class="s">&quot;-Djava.class.path=</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">classpath</span><span class="p">)</span> + +<span class="c"># get the Java classes we want to use</span> +<span class="n">DefaultExtractor</span> <span class="o">=</span> <span class="n">jpype</span><span class="o">.</span><span class="n">JPackage</span><span class="p">(</span><span class="s">&quot;de&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">l3s</span><span class="o">.</span><span class="n">boilerpipe</span><span class="o">.</span><span class="n">extractors</span><span class="o">.</span><span class="n">DefaultExtractor</span> + +<span class="c"># call them !</span> +<span class="k">print</span> <span class="n">DefaultExtractor</span><span class="o">.</span><span class="n">INSTANCE</span><span class="o">.</span><span class="n">getText</span><span class="p">(</span><span class="n">jpype</span><span class="o">.</span><span class="n">java</span><span class="o">.</span><span class="n">net</span><span class="o">.</span><span class="n">URL</span><span class="p">(</span><span class="s">&quot;http://blog.notmyidea.org&quot;</span><span class="p">))</span> +</pre></div> +<p>And you get what you want.</p> +<p>I must say I didn't thought it could work so easily. This will allow me to +extract text content from URLs and remove the <em>boilerplate</em> text easily +for infuse (my master thesis project), without having to write java code, nice!</p> +</div> +Un coup de main pour mon mémoire!2011-05-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html/<p>Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit +coup de main.</p> +<p>Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent +last.fm, je fais quelque chose de similaire mais pour les sites internet: en me +basant sur ce que vous visitez quotidiennement et comment vous le visitez (quelles +horaires, quelle emplacement géographique, etc.) je souhaites proposer des liens +qui vous intéresseront potentiellement, en me basant sur l'avis des personnes qui +ont des profils similaires au votre.</p> +<p>Le projet est loin d'être terminé, mais la première étape est de récupérer des +données de navigation, idéalement beaucoup de données de navigation. Donc si +vous pouvez me filer un coup de main je vous en serais éternellement +reconnaissant (pour ceux qui font semblant de pas comprendre, entendez &quot;tournée +générale&quot;).</p> +<p>J'ai créé un petit site web (en anglais) qui résume un peu le concept, qui vous +propose de vous inscrire et de télécharger un plugin firefox qui m'enverra des +information sur les sites que vous visitez (si vous avez l'habitude d'utiliser +chrome vous pouvez considérer de switcher à firefox4 pour les deux prochains +mois pour me filer un coup de main). Il est possible de désactiver le plugin +d'un simple clic si vous souhaitez garder votre vie privée privée ;-)</p> +<p>Le site est par là: <a class="reference external" href="http://infuse.notmyidea.org">http://infuse.notmyidea.org</a>. Une fois le plugin téléchargé +et le compte créé il faut renseigner vos identifiants dans le plugin en +question, et c'est tout!</p> +<p>A votre bon cœur ! Je récupérerais probablement des données durant les 2 +prochains mois pour ensuite les analyser correctement.</p> +<p>Merci pour votre aide !</p> +Analyse users' browsing context to build up a web recommender2011-04-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html/<p>No, this is not an april's fool ;)</p> +<p>Wow, it's been a long time. My year in Oxford is going really well. I realized +few days ago that the end of the year is approaching really quickly. +Exams are coming in one month or such and then I'll be working full time on my dissertation topic.</p> +<p>When I learned we'll have about 6 month to work on something, I first thought +about doing a packaging related stuff, but finally decided to start something +new. After all, that's the good time to learn.</p> +<p>Since a long time, I'm being impressed by the <a class="reference external" href="http://last.fm">last.fm</a> +recommender system. They're <em>scrobbling</em> the music I listen to since something +like 5 years now and the recommendations they're doing are really nice and +accurate (I discovered <strong>a lot</strong> of great artists listening to the +&quot;neighbour radio&quot;.) (by the way, <a class="reference external" href="http://lastfm.com/user/akounet/">here is</a> +my lastfm account)</p> +<p>So I decided to work on recommender systems, to better understand what is it +about.</p> +<p>Recommender systems are usually used to increase the sales of products +(like Amazon.com does) which is not really what I'm looking for (The one who +know me a bit know I'm kind of sick about all this consumerism going on).</p> +<p>Actually, the most simple thing I thought of was the web: I'm browsing it quite +every day and each time new content appears. I've stopped to follow <a class="reference external" href="https://bitbucket.org/bruno/aspirator/">my feed +reader</a> because of the +information overload, and reduced drastically the number of people I follow <a class="reference external" href="http://twitter.com/ametaireau/">on +twitter</a>.</p> +<p>Too much information kills the information.</p> +<p>You shall got what will be my dissertation topic: a recommender system for +the web. Well, such recommender systems already exists, so I will try to add contextual +information to them: you're probably not interested by the same topics at different +times of the day, or depending on the computer you're using. We can also +probably make good use of the way you browse to create groups into the content +you're browsing (or even use the great firefox4 tab group feature).</p> +<p>There is a large part of concerns to have about user's privacy as well.</p> +<p>Here is my proposal (copy/pasted from the one I had to do for my master)</p> +<div class="section" id="introduction-and-rationale"> +<h2>Introduction and rationale</h2> +<p>Nowadays, people surf the web more and more often. New web pages are created +each day so the amount of information to retrieve is more important as the time +passes. These users uses the web in different contexts, from finding cooking +recipes to technical articles.</p> +<p>A lot of people share the same interest to various topics, and the quantity of +information is such than it's really hard to triage them efficiently without +spending hours doing it. Firstly because of the huge quantity of information +but also because the triage is something relative to each person. Although, this +triage can be facilitated by fetching the browsing information of all +particular individuals and put the in perspective.</p> +<p>Machine learning is a branch of Artificial Intelligence (AI) which deals with how +a program can learn from data. Recommendation systems are a particular +application area of machine learning which is able to recommend things (links +in our case) to the users, given a particular database containing the previous +choices users have made.</p> +<p>This browsing information is currently available in browsers. Even if it is not +in a very usable format, it is possible to transform it to something useful. +This information gold mine just wait to be used. Although, it is not as simple as +it can seems at the first approach: It is important to take care of the context +the user is in while browsing links. For instance, It's more likely that during +the day, a computer scientist will browse computing related links, and that during +the evening, he browse cooking recipes or something else.</p> +<p>Page contents are also interesting to analyse, because that's what people +browse and what actually contain the most interesting part of the information. +The raw data extracted from the browsing can then be translated into +something more useful (namely tags, type of resource, visit frequency, +navigation context etc.)</p> +<p>The goal of this dissertation is to create a recommender system for web links, +including this context information.</p> +<p>At the end of the dissertation, different pieces of software will be provided, +from raw data collection from the browser to a recommendation system.</p> +</div> +<div class="section" id="background-review"> +<h2>Background Review</h2> +<p>This dissertation is mainly about data extraction, analysis and recommendation +systems. Two different research area can be isolated: Data preprocessing and +Information filtering.</p> +<p>The first step in order to make recommendations is to gather some data. The +more data we have available, the better it is (T. Segaran, 2007). This data can +be retrieved in various ways, one of them is to get it directly from user's +browsers.</p> +<div class="section" id="data-preparation-and-extraction"> +<h3>Data preparation and extraction</h3> +<p>The data gathered from browsers is basically URLs and additional information +about the context of the navigation. There is clearly a need to extract more +information about the meaning of the data the user is browsing, starting by the +content of the web pages.</p> +<p>Because the information provided on the current Web is not meant to be read by +machines (T. Berners Lee, 2001) there is a need of tools to extract meaning from +web pages. The information needs to be preprocessed before stored in a machine +readable format, allowing to make recommendations (Choochart et Al, 2004).</p> +<p>Data preparation is composed of two steps: cleaning and structuring ( +Castellano et Al, 2007). Because raw data can contain a lot of un-needed text +(such as menus, headers etc.) and need to be cleaned prior to be stored. +Multiple techniques can be used here and belongs to boilerplate removal and +full text extraction (Kohlschütter et Al, 2010).</p> +<p>Then, structuring the information: category, type of content (news, blog, wiki) +can be extracted from raw data. This kind of information is not clearly defined +by HTML pages so there is a need of tools to recognise them.</p> +<p>Some context-related information can also be inferred from each resource. It can go +from the visit frequency to the navigation group the user was in while +browsing. It is also possible to determine if the user &quot;liked&quot; a resource, and +determine a mark for it, which can be used by information filtering a later +step (T. Segaran, 2007).</p> +<p>At this stage, structuring the data is required. Storing this kind of +information in RDBMS can be a bit tedious and require complex queries to get +back the data in an usable format. Graph databases can play a major role in the +simplification of information storage and querying.</p> +</div> +<div class="section" id="information-filtering"> +<h3>Information filtering</h3> +<p>To filter the information, three techniques can be used (Balabanovic et +Al, 1997):</p> +<ul class="simple"> +<li>The content-based approach states that if an user have liked something in the +past, he is more likely to like similar things in the future. So it's about +establishing a profile for the user and compare new items against it.</li> +<li>The collaborative approach will rather recommend items that other similar users +have liked. This approach consider only the relationship between users, and +not the profile of the user we are making recommendations to.</li> +<li>the hybrid approach, which appeared recently combine both of the previous +approaches, giving recommendations when items score high regarding user's +profile, or if a similar user already liked it.</li> +</ul> +<p>Grouping is also something to consider at this stage (G. Myatt, 2007). +Because we are dealing with huge amount of data, it can be useful to detect group +of data that can fit together. Data clustering is able to find such groups (T. +Segaran, 2007).</p> +<p>References:</p> +<ul class="simple"> +<li>Balabanović, M., &amp; Shoham, Y. (1997). Fab: content-based, collaborative +recommendation. Communications of the ACM, 40(3), 66–72. ACM. +Retrieved March 1, 2011, from <a class="reference external" href="http://portal.acm.org/citation.cfm?id=245108.245124&amp;amp">http://portal.acm.org/citation.cfm?id=245108.245124&amp;amp</a>;.</li> +<li>Berners-Lee, T., Hendler, J., &amp; Lassila, O. (2001). +The semantic web: Scientific american. Scientific American, 284(5), 34–43. +Retrieved November 21, 2010, from <a class="reference external" href="http://www.citeulike.org/group/222/article/1176986">http://www.citeulike.org/group/222/article/1176986</a>.</li> +<li>Castellano, G., Fanelli, A., &amp; Torsello, M. (2007). +LODAP: a LOg DAta Preprocessor for mining Web browsing patterns. Proceedings of the 6th Conference on 6th WSEAS Int. Conf. on Artificial Intelligence, Knowledge Engineering and Data Bases-Volume 6 (p. 12–17). World Scientific and Engineering Academy and Society (WSEAS). Retrieved March 8, 2011, from <a class="reference external" href="http://portal.acm.org/citation.cfm?id=1348485.1348488">http://portal.acm.org/citation.cfm?id=1348485.1348488</a>.</li> +<li>Kohlschutter, C., Fankhauser, P., &amp; Nejdl, W. (2010). Boilerplate detection using shallow text features. Proceedings of the third ACM international conference on Web search and data mining (p. 441–450). ACM. Retrieved March 8, 2011, from <a class="reference external" href="http://portal.acm.org/citation.cfm?id=1718542">http://portal.acm.org/citation.cfm?id=1718542</a>.</li> +<li>Myatt, G. J. (2007). Making Sense of Data: A Practical Guide to Exploratory +Data Analysis and Data Mining.</li> +<li>Segaran, T. (2007). Collective Intelligence.</li> +</ul> +</div> +</div> +<div class="section" id="privacy"> +<h2>Privacy</h2> +<p>The first thing that's come to people minds when it comes to process their +browsing data is privacy. People don't want to be stalked. That's perfectly +right, and I don't either.</p> +<p>But such a system don't have to deal with people identities. It's completely +possible to process completely anonymous data, and that's probably what I'm +gonna do.</p> +<p>By the way, if you have interesting thoughts about that, if you do know +projects that do seems related, fire the comments !</p> +</div> +<div class="section" id="what-s-the-plan"> +<h2>What's the plan ?</h2> +<p>There is a lot of different things to explore, especially because I'm +a complete novice in that field.</p> +<ul class="simple"> +<li>I want to develop a firefox plugin, to extract the browsing informations ( +still, I need to know exactly which kind of informations to retrieve). The +idea is to provide some <em>raw</em> browsing data, and then to transform it and to +store it in the better possible way.</li> +<li>Analyse how to store the informations in a graph database. What can be the +different methods to store this data and to visualize the relationship +between different pieces of data? How can I define the different contexts, +and add those informations in the db?</li> +<li>Process the data using well known recommendation algorithms. Compare the +results and criticize their value.</li> +</ul> +<p>There is plenty of stuff I want to try during this experimentation:</p> +<ul class="simple"> +<li>I want to try using Geshi to visualize the connexion between the links, +and the contexts</li> +<li>Try using graph databases such as Neo4j</li> +<li>Having a deeper look at tools such as scikit.learn (a machine learning +toolkit in python)</li> +<li>Analyse web pages in order to categorize them. Processing their +contents as well, to do some keyword based classification will be done.</li> +</ul> +<p>Lot of work on its way, yay !</p> +</div> +Wrap up of the distutils2 paris' sprint2011-02-08T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html/<p>Finally, thanks to a bunch of people that helped me to pay my train and bus +tickets, I've made it to paris for the distutils2 sprint.</p> +<p>They have been a bit more than 10 people to come during the sprint, and it was +very productive. Here's a taste of what we've been working on:</p> +<ul class="simple"> +<li>the <cite>datafiles</cite>, a way to specify and to handle the installation of files which +are not python-related (pictures, manpages and so on).</li> +<li><cite>mkgcfg</cite>, a tool to help you to create a setup.cfg in minutes (and with funny +examples)</li> +<li>converters from setup.py scripts. We do now have a piece of code which +reads your current <cite>setup.py</cite> file and fill in some fields in the <cite>setup.cfg</cite> +for you.</li> +<li>a compatibility layer for distutils1, so it can read the <cite>setup.cfg</cite> you will +wrote for distutils2 :-)</li> +<li>the uninstaller, so it's now possible to uninstall what have been installed +by distutils2 (see PEP 376)</li> +<li>the installer, and the setuptools compatibility layer, which will allow you +to rely on setuptools' based distributions (and there are plenty of them!)</li> +<li>The compilers, so they are more flexible than they were. Since that's an +obscure part of the code for distutils2 commiters (it comes directly from the +distutils1 ages), having some guys who understood the problematics here was +a must.</li> +</ul> +<p>Some people have also tried to port their packaging from distutils1 to +distutils2. They have spotted a number of bugs and made some improvements +to the code, to make it more friendly to use.</p> +<p>I'm really pleased to see how newcomers went trough the code, and started +hacking so fast. I must say it wasn't the case when we started to work on +distutils1 so that's a very good point: people now can hack the code quicker +than they could before.</p> +<p>Some of the features here are not <em>completely</em> finished yet, but are on the +tubes, and will be ready for a release (hopefully) at the end of the week.</p> +<p>Big thanks to logilab for hosting (and sponsoring my train ticket) and +providing us food, and to bearstech for providing some money for breakfast and +bears^Wbeers.</p> +<p>Again, a big thanks to all the people who gave me money to pay the transport, +I really wasn't expecting such thing to happen :-)</p> +PyPI on CouchDB2011-01-20T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html/<p>By now, there are two ways to retrieve data from PyPI (the Python Package +Index). You can both rely on xml/rpc or on the &quot;simple&quot; API. The simple +API is not so simple to use as the name suggest, and have several existing +drawbacks.</p> +<p>Basically, if you want to use informations coming from the simple API, you will +have to parse web pages manually, to extract informations using some black +vodoo magic. Badly, magic have a price, and it's sometimes impossible to get +exactly the informations you want to get from this index. That's the technique +currently being used by distutils2, setuptools and pip.</p> +<p>On the other side, while XML/RPC is working fine, it's requiring extra work +to the python servers each time you request something, which can lead to +some outages from time to time. Also, it's important to point out that, even if +PyPI have a mirroring infrastructure, it's only for the so-called <em>simple</em> API, +and not for the XML/RPC.</p> +<div class="section" id="couchdb"> +<h2>CouchDB</h2> +<p>Here comes CouchDB. CouchDB is a document oriented database, that +knows how to speak REST and JSON. It's easy to use, and provides out of the box +a replication mechanism.</p> +</div> +<div class="section" id="so-what"> +<h2>So, what ?</h2> +<p>Hmm, I'm sure you got it. I've wrote a piece of software to link informations from +PyPI to a CouchDB instance. Then you can replicate all the PyPI index with only +one HTTP request on the CouchDB server. You can also access the informations +from the index directly using a REST API, speaking json. Handy.</p> +<p>So PyPIonCouch is using the PyPI XML/RPC API to get data from PyPI, and +generate records in the CouchDB instance.</p> +<p>The final goal is to avoid to rely on this &quot;simple&quot; API, and rely on a REST +insterface instead. I have set up a couchdb server on my server, which is +available at <a class="reference external" href="http://couchdb.notmyidea.org/_utils/database.html?pypi">http://couchdb.notmyidea.org/_utils/database.html?pypi</a>.</p> +<p>There is not a lot to +see there for now, but I've done the first import from PyPI yesterday and all +went fine: it's possible to access the metadata of all PyPI projects via a REST +interface. Next step is to write a client for this REST interface in +distutils2.</p> +</div> +<div class="section" id="example"> +<h2>Example</h2> +<p>For now, you can use pypioncouch via the command line, or via the python API.</p> +<div class="section" id="using-the-command-line"> +<h3>Using the command line</h3> +<p>You can do something like that for a full import. This <strong>will</strong> take long, +because it's fetching all the projects at pypi and importing their metadata:</p> +<pre class="literal-block"> +$ pypioncouch --fullimport http://your.couchdb.instance/ +</pre> +<p>If you already have the data on your couchdb instance, you can just update it +with the last informations from pypi. <strong>However, I recommend to just replicate +the principal node, hosted at http://couchdb.notmyidea.org/pypi/</strong>, to avoid +the duplication of nodes:</p> +<pre class="literal-block"> +$ pypioncouch --update http://your.couchdb.instance/ +</pre> +<p>The principal node is updated once a day by now, I'll try to see if it's +enough, and ajust with the time.</p> +</div> +<div class="section" id="using-the-python-api"> +<h3>Using the python API</h3> +<p>You can also use the python API to interact with pypioncouch:</p> +<pre class="literal-block"> +&gt;&gt;&gt; from pypioncouch import XmlRpcImporter, import_all, update +&gt;&gt;&gt; full_import() +&gt;&gt;&gt; update() +</pre> +</div> +</div> +<div class="section" id="what-s-next"> +<h2>What's next ?</h2> +<p>I want to make a couchapp, in order to navigate PyPI easily. Here are some of +the features I want to propose:</p> +<ul class="simple"> +<li>List all the available projects</li> +<li>List all the projects, filtered by specifiers</li> +<li>List all the projects by author/maintainer</li> +<li>List all the projects by keywords</li> +<li>Page for each project.</li> +<li>Provide a PyPI &quot;Simple&quot; API equivalent, even if I want to replace it, I do +think it will be really easy to setup mirrors that way, with the out of the +box couchdb replication</li> +</ul> +<p>I also still need to polish the import mechanism, so I can directly store in +couchdb:</p> +<ul class="simple"> +<li>The OPML files for each project</li> +<li>The upload_time as couchdb friendly format (list of int)</li> +<li>The tags as lists (currently it's only a string separated by spaces</li> +</ul> +<p>The work I've done by now is available on +<a class="reference external" href="https://bitbucket.org/ametaireau/pypioncouch/">https://bitbucket.org/ametaireau/pypioncouch/</a>. Keep in mind that it's still +a work in progress, and everything can break at any time. However, any feedback +will be appreciated !</p> +</div> +Help me to go to the distutils2 paris' sprint2011-01-15T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html/<p><strong>Edit: Thanks to logilab and some amazing people, I can make it to paris for the +sprint. Many thanks to them for the support!</strong></p> +<p>There will be a distutils2 sprint from the 27th to the 30th of january, thanks +to logilab which will host the event.</p> +<p>You can find more informations about the sprint on the wiki page of the event +(<a class="reference external" href="http://wiki.python.org/moin/Distutils/SprintParis">http://wiki.python.org/moin/Distutils/SprintParis</a>).</p> +<p>I really want to go there but I'm unfortunately blocked in UK for money reasons. +The cheapest two ways I've found is about £80, which I can't afford. +Following some advices on #distutils, I've set up a ChipIn account for that, so +if some people want to help me making it to go there, they can give me some +money that way.</p> +<p>I'll probably work on the installer (to support old distutils and +setuptools distributions) and on the uninstaller (depending on the first +task). If I can't make it to paris, I'll hang around on IRC to give some help +while needed.</p> +<p>If you want to contribute some money to help me go there, feel free to use this +chipin page: <a class="reference external" href="http://ametaireau.chipin.com/distutils2-sprint-in-paris">http://ametaireau.chipin.com/distutils2-sprint-in-paris</a></p> +<p>Thanks for your support !</p> +How to reboot your bebox using the CLI2010-10-21T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html/<p>I've an internet connection which, for some obscure reasons, tend to be very +slow from time to time. After rebooting the box (yes, that's a hard solution), +all the things seems to go fine again.</p> +<div class="section" id="edit-using-grep"> +<h2>EDIT : Using grep</h2> +<p>After a bit of reflexion, that's also really easy to do using directly the +command line tools curl, grep and tail (but really harder to read).</p> +<div class="highlight"><pre>curl -X POST -u joel:joel http://bebox.config/cgi/b/info/restart/<span class="se">\?</span>be<span class="se">\=</span>0<span class="se">\&amp;</span>l0<span class="se">\=</span>1<span class="se">\&amp;</span>l1<span class="se">\=</span>0<span class="se">\&amp;</span>tid<span class="se">\=</span>RESTART -d <span class="s2">&quot;0=17&amp;2=`curl -u joel:joel http://bebox.config/cgi/b/info/restart/\?be\=0\&amp;l0\=1\&amp;l1\=0\&amp;tid\=RESTART | grep -o &quot;</span><span class="nv">name</span><span class="o">=</span><span class="s1">&#39;2&#39;</span> <span class="nv">value</span><span class="o">=</span><span class="err">&#39;</span><span class="o">[</span>0-9<span class="o">]</span><span class="se">\+</span><span class="s2">&quot; | grep -o &quot;</span><span class="o">[</span>0-9<span class="o">]</span><span class="se">\+</span><span class="s2">&quot; | tail -n 1`&amp;1&quot;</span> +</pre></div> +</div> +<div class="section" id="the-python-version"> +<h2>The Python version</h2> +<p>Well, that's not the optimal solution, that's a bit &quot;gruik&quot;, but it works.</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">urllib2</span> +<span class="kn">import</span> <span class="nn">urlparse</span> +<span class="kn">import</span> <span class="nn">re</span> +<span class="kn">import</span> <span class="nn">argparse</span> + +<span class="n">REBOOT_URL</span> <span class="o">=</span> <span class="s">&#39;/b/info/restart/?be=0&amp;l0=1&amp;l1=0&amp;tid=RESTART&#39;</span> +<span class="n">BOX_URL</span> <span class="o">=</span> <span class="s">&#39;http://bebox.config/cgi&#39;</span> + +<span class="k">def</span> <span class="nf">open_url</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span> + <span class="n">passman</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">HTTPPasswordMgrWithDefaultRealm</span><span class="p">()</span> + <span class="n">passman</span><span class="o">.</span><span class="n">add_password</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> + <span class="n">authhandler</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">HTTPBasicAuthHandler</span><span class="p">(</span><span class="n">passman</span><span class="p">)</span> + + <span class="n">opener</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span><span class="n">authhandler</span><span class="p">)</span> + + <span class="n">urllib2</span><span class="o">.</span><span class="n">install_opener</span><span class="p">(</span><span class="n">opener</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> + +<span class="k">def</span> <span class="nf">reboot</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">open_url</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> + <span class="n">token</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&quot;name\=</span><span class="se">\\</span><span class="s">&#39;2</span><span class="se">\\</span><span class="s">&#39; value=</span><span class="se">\\</span><span class="s">&#39;([0-9]+)</span><span class="se">\\</span><span class="s">&#39;&quot;</span><span class="p">,</span> <span class="n">data</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> + <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s">&#39;0=17&amp;2=</span><span class="si">%s</span><span class="s">&amp;1&#39;</span> <span class="o">%</span> <span class="n">token</span><span class="p">))</span> + +<span class="k">if</span> <span class="n">__file__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span> + <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s">&quot;&quot;&quot;Reboot your bebox !&quot;&quot;&quot;</span><span class="p">)</span> + + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">dest</span><span class="o">=</span><span class="s">&#39;user&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&#39;username&#39;</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">dest</span><span class="o">=</span><span class="s">&#39;password&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&#39;password&#39;</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">boxurl</span><span class="o">=</span><span class="s">&#39;boxurl&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">BOX_URL</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&#39;Base box url. Default is </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">BOX_URL</span><span class="p">)</span> + + <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> + <span class="n">url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urljoin</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">boxurl</span><span class="p">,</span> <span class="n">REBOOT_URL</span><span class="p">)</span> + <span class="n">reboot</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">password</span><span class="p">)</span> +</pre></div> +</div> +Dynamically change your gnome desktop wallpaper2010-10-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html/<p>In gnome, you can can use a XML file to have a dynamic wallpaper. +It's not so easy, and you can't just tell: use the pictures in this folder to do +so.</p> +<p>You can have a look to the git repository if you want: <a class="reference external" href="http://github.com/ametaireau/gnome-background-generator">http://github.com/ametaireau/gnome-background-generator</a></p> +<p>Some time ago, I've made a little python script to ease that, and you can now +use it too. It's named &quot;gnome-background-generator&quot;, and you can install it via +pip for instance.</p> +<div class="highlight"><pre>$ pip install gnome-background-generator +</pre></div> +<p>Then, you have just to use it this way:</p> +<div class="highlight"><pre>$ gnome-background-generator -p ~/Images/walls -s +/home/alexis/Images/walls/dynamic-wallpaper.xml generated +</pre></div> +<p>Here is a extract of the <cite>--help</cite>:</p> +<div class="highlight"><pre>$ gnome-background-generator --help +usage: gnome-background-generator [-h] [-p PATH] [-o OUTPUT] + [-t TRANSITION_TIME] [-d DISPLAY_TIME] [-s] + [-b] + +A simple command line tool to generate an XML file to use for gnome +wallpapers, to have dynamic walls + +optional arguments: + -h, --help show this help message and exit + -p PATH, --path PATH Path to look for the pictures. If no output is + specified, will be used too for outputing the dynamic- + wallpaper.xml file. Default value is the current + directory (.) + -o OUTPUT, --output OUTPUT + Output filename. If no filename is specified, a + dynamic-wallpaper.xml file will be generated in the + path containing the pictures. You can also use &quot;-&quot; to + display the xml in the stdout. + -t TRANSITION_TIME, --transition-time TRANSITION_TIME + Time (in seconds) transitions must last (default value + is 2 seconds) + -d DISPLAY_TIME, --display-time DISPLAY_TIME + Time (in seconds) a picture must be displayed. Default + value is 900 (15mn) + -s, --set-background &#39;&#39;&#39;try to set the background using gnome-appearance- + properties + -b, --debug +</pre></div> +Pelican, a simple static blog generator in python2010-10-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html/<p>Those days, I've wrote a little python application to fit my blogging needs. +I'm an occasional blogger, a vim lover, I like restructured text and DVCSes, so +I've made a little tool that makes good use of all that.</p> +<p><a class="reference external" href="http://alexis.notmyidea.org/pelican/">Pelican</a> (for calepin) is just a simple tool to generate your blog as static +files, letting you using your editor of choice (vim!). It's easy to extend, +and has a template support (via jinja2).</p> +<p>I've made it to fit <em>my</em> needs. I hope it will fit yours, but maybe it wont, and +it have not be designed to feet everyone's needs.</p> +<p>Need an example ? You're looking at it ! This weblog is using pelican to be +generated, also for the atom feeds.</p> +<p>I've released it under AGPL, since I want all the modifications to be profitable +to all the users.</p> +<p>You can find a mercurial repository to fork at <a class="reference external" href="http://hg.lolnet.org/pelican/">http://hg.lolnet.org/pelican/</a>, +feel free to hack it !</p> +<p>If you just want to get started, use your installer of choice (pip, easy_install, …) +And then have a look to the help (<cite>pelican --help</cite>)</p> +<div class="highlight"><pre><span class="nv">$ </span>pip install pelican +</pre></div> +<div class="section" id="usage"> +<h2>Usage</h2> +<p>Here's a sample usage of pelican</p> +<div class="highlight"><pre><span class="nv">$ </span>pelican . +writing /home/alexis/projets/notmyidea.org/output/index.html +writing /home/alexis/projets/notmyidea.org/output/tags.html +writing /home/alexis/projets/notmyidea.org/output/categories.html +writing /home/alexis/projets/notmyidea.org/output/archives.html +writing /home/alexis/projets/notmyidea.org/output/category/python.html +writing +/home/alexis/projets/notmyidea.org/output/pelican-a-simple-static-blog-generator-in-python.html +Done ! +</pre></div> +<p>You also can use the <cite>--help</cite> option for the command line to get more +informations</p> +<div class="highlight"><pre><span class="nv">$pelican</span> --help +usage: pelican <span class="o">[</span>-h<span class="o">]</span> <span class="o">[</span>-t TEMPLATES<span class="o">]</span> <span class="o">[</span>-o OUTPUT<span class="o">]</span> <span class="o">[</span>-m MARKUP<span class="o">]</span> <span class="o">[</span>-s SETTINGS<span class="o">]</span> <span class="o">[</span>-b<span class="o">]</span> + path + +A tool to generate a static blog, with restructured text input files. + +positional arguments: + path Path where to find the content files <span class="o">(</span>default is + <span class="s2">&quot;content&quot;</span><span class="o">)</span>. + +optional arguments: + -h, --help show this <span class="nb">help </span>message and <span class="nb">exit</span> + -t TEMPLATES, --templates-path TEMPLATES + Path where to find the templates. If not specified, + will uses the ones included with pelican. + -o OUTPUT, --output OUTPUT + Where to output the generated files. If not specified, + a directory will be created, named <span class="s2">&quot;output&quot;</span> in the + current path. + -m MARKUP, --markup MARKUP + the markup language to use. Currently only + ReSTreucturedtext is available. + -s SETTINGS, --settings SETTINGS + the settings of the application. Default to None. + -b, --debug +</pre></div> +<p>Enjoy :)</p> +</div> +An amazing summer of code working on distutils22010-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html/<p>The <a class="reference external" href="http://code.google.com/soc/">Google Summer of Code</a> I've +spent working on <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> +is over. It was a really amazing experience, for many reasons.</p> +<p>First of all, we had a very good team, we were 5 students working +on distutils2: <a class="reference external" href="http://zubin71.wordpress.com">Zubin</a>, +<a class="reference external" href="http://wokslog.wordpress.com/">Éric</a>, +<a class="reference external" href="http://gsoc.djolonga.com/">Josip</a>, +<a class="reference external" href="http://konryd.blogspot.com/">Konrad</a> and me. In addition, +<a class="reference external" href="http://mouadino.blogspot.com/">Mouad</a> have worked on the PyPI +testing infrastructure. You could find what each person have done +on +<a class="reference external" href="http://bitbucket.org/tarek/distutils2/wiki/GSoC_2010_teams">the wiki page of distutils2</a>.</p> +<p>We were in contact with each others really often, helping us when +possible (in #distutils), and were continuously aware of the state +of the work of each participant. This, in my opinion, have bring us +in a good shape.</p> +<p>Then, I've learned a lot. Python packaging was completely new to me +at the time of the GSoC start, and I was pretty unfamiliar with +python good practices too, as I've been introducing myself to +python in the late 2009.</p> +<p>I've recently looked at some python code I wrote just three months +ago, and I was amazed to think about many improvements to made on +it. I guess this is a good indicator of the path I've traveled +since I wrote it.</p> +<p>This summer was awesome because I've learned about python good +practices, now having some strong +<a class="reference external" href="http://mercurial.selenic.com/">mercurial</a> knowledge, and I've +seen a little how the python community works.</p> +<p>Then, I would like to say a big thanks to all the mentors that have +hanged around while needed, on IRC or via mail, and especially my +mentor for this summer, <a class="reference external" href="http://tarek.ziade.org">Tarek Ziadé</a>.</p> +<p>Thanks a lot for your motivation, your leadership and your +cheerfulness, even with a new-born and a new work!</p> +<div class="section" id="why"> +<h2>Why ?</h2> +<p>I wanted to work on python packaging because, as the time pass, we +were having a sort of complex tools in this field. Each one wanted +to add features to distutils, but not in a standard way.</p> +<p>Now, we have PEPs that describes some format we agreed on (see PEP +345), and we wanted to have a tool on which users can base their +code on, that's <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a>.</p> +</div> +<div class="section" id="my-job"> +<h2>My job</h2> +<p>I had to provides a way to crawl the PyPI indexes in a simple way, +and do some installation / uninstallation scripts.</p> +<p>All the work done is available in +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/">my bitbucket repository</a>.</p> +<div class="section" id="crawling-the-pypi-indexes"> +<h3>Crawling the PyPI indexes</h3> +<p>There are two ways of requesting informations from the indexes: +using the &quot;simple&quot; index, that is a kind of REST index, and using +XML-RPC.</p> +<p>I've done the two implementations, and a high level API to query +those twos. Basically, this supports the mirroring infrastructure +defined in PEP 381. So far, the work I've done is gonna be used in +pip (they've basically copy/paste the code, but this will change as +soon as we get something completely stable for distutils2), and +that's a good news, as it was the main reason for what I've done +that.</p> +<p>I've tried to have an unified API for the clients, to switch from +one to another implementation easily. I'm already thinking of +adding others crawlers to this stuff, and it was made to be +extensible.</p> +<p>If you want to get more informations about the crawlers/PyPI +clients, please refer to the distutils2 documentation, especially +<a class="reference external" href="http://distutils2.notmyidea.org/library/distutils2.index.html">the pages about indexes</a>.</p> +<p>You can find the changes I made about this in the +<a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> source code .</p> +</div> +<div class="section" id="installation-uninstallation-scripts"> +<h3>Installation / Uninstallation scripts</h3> +<p>Next step was to think about an installation script, and an +uninstaller. I've not done the uninstaller part, and it's a smart +part, as it's basically removing some files from the system, so +I'll probably do it in a near future.</p> +<p><a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> provides a way to +install distributions, and to handle dependencies between releases. +For now, this support is only about the last version of the +METADATA (1.2) (See, the PEP 345), but I'm working on a +compatibility layer for the old metadata, and for the informations +provided via PIP requires.txt, for instance.</p> +</div> +<div class="section" id="extra-work"> +<h3>Extra work</h3> +<p>Also, I've done some extra work. this includes:</p> +<ul class="simple"> +<li>working on the PEP 345, and having some discussion about it +(about the names of some fields).</li> +<li>writing a PyPI server mock, useful for tests. you can find more +information about it on the +<a class="reference external" href="http://distutils.notmyidea.org">documentation</a>.</li> +</ul> +</div> +</div> +<div class="section" id="futures-plans"> +<h2>Futures plans</h2> +<p>As I said, I've enjoyed working on distutils2, and the people I've +met here are really pleasant to work with. So I <em>want</em> to continue +contributing on python, and especially on python packaging, because +there is still a lot of things to do in this scope, to get +something really usable.</p> +<p>I'm not plainly satisfied by the work I've done, so I'll probably +tweak it a bit: the installer part is not yet completely finished, +and I want to add support for a real +<a class="reference external" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a> +index in the future.</p> +<p>We'll talk again of this in the next months, probably, but we +definitely need a real +<a class="reference external" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a> +API for <a class="reference external" href="http://pypi.python.org">PyPI</a>, as the &quot;simple&quot; index +<em>is</em> an ugly hack, in my opinion. I'll work on a serious +proposition about this, maybe involving +<a class="reference external" href="http://couchdb.org">CouchDB</a>, as it seems to be a good option +for what we want here.</p> +</div> +<div class="section" id="issues"> +<h2>Issues</h2> +<p>I've encountered some issues during this summer. The main one is +that's hard to work remotely, especially being in the same room +that we live, with others. I like to just think about a project +with other people, a paper and a pencil, no computers. This have +been not so possible at the start of the project, as I needed to +read a lot of code to understand the codebase, and then to +read/write emails.</p> +<p>I've finally managed to work in an office, so good point for +home/office separation.</p> +<p>I'd not planned there will be so a high number of emails to read, +in order to follow what's up in the python world, and be a part of +the community seems to takes some times to read/write emails, +especially for those (like me) that arent so confortable with +english (but this had brought me some english fu !).</p> +</div> +<div class="section" id="thanks"> +<h2>Thanks !</h2> +<p>A big thanks to <a class="reference external" href="http://www.graine-libre.fr/">Graine Libre</a> and +<a class="reference external" href="http://www.makina-corpus.com/">Makina Corpus</a>, which has offered +me to come into their offices from time to time, to share they +cheerfulness ! Many thanks too to the Google Summer of Code program +for setting up such an initiative. If you're a student, if you're +interested about FOSS, dont hesitate any second, it's a really good +opportunity to work on interesting projects!</p> +</div> +Introducing the distutils2 index crawlers2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html/<p>I'm working for about a month for distutils2, even if I was being a +bit busy (as I had some class courses and exams to work on)</p> +<p>I'll try do sum-up my general feelings here, and the work I've made +so far. You can also find, if you're interested, my weekly +summaries in +<a class="reference external" href="http://wiki.notmyidea.org/distutils2_schedule">a dedicated wiki page</a>.</p> +<div class="section" id="general-feelings"> +<h2>General feelings</h2> +<p>First, and it's a really important point, the GSoC is going very +well, for me as for other students, at least from my perspective. +It's a pleasure to work with such enthusiast people, as this make +the global atmosphere very pleasant to live.</p> +<p>First of all, I've spent time to read the existing codebase, and to +understand what we're going to do, and what's the rationale to do +so.</p> +<p>It's really clear for me now: what we're building is the +foundations of a packaging infrastructure in python. The fact is +that many projects co-exists, and comes all with their good +concepts. Distutils2 tries to take the interesting parts of all, +and to provide it in the python standard libs, respecting the +recently written PEP about packaging.</p> +<p>With distutils2, it will be simpler to make &quot;things&quot; compatible. So +if you think about a new way to deal with distributions and +packaging in python, you can use the Distutils2 APIs to do so.</p> +</div> +<div class="section" id="tasks"> +<h2>Tasks</h2> +<p>My main task while working on distutils2 is to provide an +installation and an un-installation command, as described in PEP +376. For this, I first need to get informations about the existing +distributions (what's their version, name, metadata, dependencies, +etc.)</p> +<p>The main index, you probably know and use, is PyPI. You can access +it at <a class="reference external" href="http://pypi.python.org">http://pypi.python.org</a>.</p> +</div> +<div class="section" id="pypi-index-crawling"> +<h2>PyPI index crawling</h2> +<p>There is two ways to get these informations from PyPI: using the +simple API, or via xml-rpc calls.</p> +<p>A goal was to use the version specifiers defined +in`PEP 345 &lt;<a class="reference external" href="http://www.python.org/dev/peps/pep-0345/">http://www.python.org/dev/peps/pep-0345/</a>&gt;`_ and to +provides a way to sort the grabbed distributions depending our +needs, to pick the version we want/need.</p> +<div class="section" id="using-the-simple-api"> +<h3>Using the simple API</h3> +<p>The simple API is composed of HTML pages you can access at +<a class="reference external" href="http://pypi.python.org/simple/">http://pypi.python.org/simple/</a>.</p> +<p>Distribute and Setuptools already provides a crawler for that, but +it deals with their internal mechanisms, and I found that the code +was not so clear as I want, that's why I've preferred to pick up +the good ideas, and some implementation details, plus re-thinking +the global architecture.</p> +<p>The rules are simple: each project have a dedicated page, which +allows us to get informations about:</p> +<ul class="simple"> +<li>the distribution download locations (for some versions)</li> +<li>homepage links</li> +<li>some other useful informations, as the bugtracker address, for +instance.</li> +</ul> +<p>If you want to find all the distributions of the &quot;EggsAndSpam&quot; +project, you could do the following (do not take so attention to +the names here, as the API will probably change a bit):</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">index</span> <span class="o">=</span> <span class="n">SimpleIndex</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">index</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;EggsAndSpam&quot;</span><span class="p">)</span> +<span class="p">[</span><span class="n">EggsAndSpam</span> <span class="mf">1.1</span><span class="p">,</span> <span class="n">EggsAndSpam</span> <span class="mf">1.2</span><span class="p">,</span> <span class="n">EggsAndSpam</span> <span class="mf">1.3</span><span class="p">]</span> +</pre></div> +<p>We also could use version specifiers:</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">index</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;EggsAndSpam (&lt; =1.2)&quot;</span><span class="p">)</span> +<span class="p">[</span><span class="n">EggsAndSpam</span> <span class="mf">1.1</span><span class="p">,</span> <span class="n">EggsAndSpam</span> <span class="mf">1.2</span><span class="p">]</span> +</pre></div> +<p>Internally, what's done here is the following:</p> +<ul class="simple"> +<li>it process the +<a class="reference external" href="http://pypi.python.org/simple/FooBar/">http://pypi.python.org/simple/FooBar/</a> +page, searching for download URLs.</li> +<li>for each found distribution download URL, it creates an object, +containing informations about the project name, the version and the +URL where the archive remains.</li> +<li>it sort the found distributions, using version numbers. The +default behavior here is to prefer source distributions (over +binary ones), and to rely on the last &quot;final&quot; distribution (rather +than beta, alpha etc. ones)</li> +</ul> +<p>So, nothing hard or difficult here.</p> +<p>We provides a bunch of other features, like relying on the new PyPI +mirroring infrastructure or filter the found distributions by some +criterias. If you're curious, please browse the +<a class="reference external" href="http://distutils2.notmyidea.org/">distutils2 documentation</a>.</p> +</div> +<div class="section" id="using-xml-rpc"> +<h3>Using xml-rpc</h3> +<p>We also can make some xmlrpc calls to retreive informations from +PyPI. It's a really more reliable way to get informations from from +the index (as it's just the index that provides the informations), +but cost processes on the PyPI distant server.</p> +<p>For now, this way of querying the xmlrpc client is not available on +Distutils2, as I'm working on it. The main pieces are already +present (I'll reuse some work I've made from the SimpleIndex +querying, and +<a class="reference external" href="http://github.com/ametaireau/pypiclient">some code already set up</a>), +what I need to do is to provide a xml-rpc PyPI mock server, and +that's on what I'm actually working on.</p> +</div> +</div> +<div class="section" id="processes"> +<h2>Processes</h2> +<p>For now, I'm trying to follow the &quot;documentation, then test, then +code&quot; path, and that seems to be really needed while working with a +community. Code is hard to read/understand, compared to +documentation, and it's easier to change.</p> +<p>While writing the simple index crawling work, I must have done this +to avoid some changes on the API, and some loss of time.</p> +<p>Also, I've set up +<a class="reference external" href="http://wiki.notmyidea.org/distutils2_schedule">a schedule</a>, and +the goal is to be sure everything will be ready in time, for the +end of the summer. (And now, I need to learn to follow schedules +...)</p> +</div> +Sprinting on distutils2 in Tours2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html/<p>Yesterday, as I was traveling to Tours, I've took some time to +visit Éric, another student who's working on distutils2 this +summer, as a part of the GSoC. Basically, it was to take a drink, +discuss a bit about distutils2, our respective tasks and general +feelings, and to put a face on a pseudonym. I'd really enjoyed this +time, because Éric knows a lot of things about mercurial and python +good practices, and I'm eager to learn about those. So, we have +discussed about things, have not wrote so much code, but have some +things to propose so far, about documentation, and I also provides +here some bribes of conversations we had.</p> +<div class="section" id="documentation"> +<h2>Documentation</h2> +<p>While writing the PyPI simple index crawler documentation, I +realized that we miss some structure, or how-to about the +documentation. Yep, you read well. We lack documentation on how to +make documentation. Heh. We're missing some rules to follow, and +this lead to a not-so-structured final documentation. We probably +target three type of publics, and we can split the documentation +regarding those:</p> +<ul class="simple"> +<li><strong>Packagers</strong> who want to distribute their softwares.</li> +<li><strong>End users</strong> who need to understand how to use end user +commands, like the installer/uninstaller</li> +<li><strong>packaging coders</strong> who <em>use</em> distutils2, as a base for +building a package manager.</li> +</ul> +<p>We also need to discuss about a pattern to follow while writing +documentation. How many parts do we need ? Where to put the API +description ? etc. That's maybe seems to be not so important, but I +guess the readers would appreciate to have the same structure all +along distutils2 documentation.</p> +</div> +<div class="section" id="mercurial"> +<h2>Mercurial</h2> +<p>I'm really <em>not</em> a mercurial power user. I use it on daily basis, +but I lack of basic knowledge about it. Big thanks Éric for sharing +yours with me, you're of a great help. We have talked about some +mercurial extensions that seems to make the life simpler, while +used the right way. I've not used them so far, so consider this as +a personal note.</p> +<ul class="simple"> +<li>hg histedit, to edit the history</li> +<li>hg crecord, to select the changes to commit</li> +</ul> +<p>We have spent some time to review a merge I made sunday, to +re-merge it, and commit the changes as a new changeset. Awesome. +These things make me say I <strong>need</strong> to read +<a class="reference external" href="http://hgbook.red-bean.com/read/">the hg book</a>, and will do as +soon as I got some spare time: mercurial seems to be simply great. +So ... Great. I'm a powerful merger now !</p> +</div> +<div class="section" id="on-using-tools"> +<h2>On using tools</h2> +<p>Because we <em>also</em> are <em>hackers</em>, we have shared a bit our ways to +code, the tools we use, etc. Both of us were using vim, and I've +discovered vimdiff and hgtk, which will completely change the way I +navigate into the mercurial history. We aren't &quot;power users&quot;, so we +have learned from each other about vim tips. You can find +<a class="reference external" href="http://github.com/ametaireau/dotfiles">my dotfiles on github</a>, +if it could help. They're not perfect, and not intended to be, +because changing all the time, as I learn. Don't hesitate to have a +look, and to propose enhancements if you have !</p> +</div> +<div class="section" id="on-being-pythonic"> +<h2>On being pythonic</h2> +<p>My background as an old Java user disserves me so far, as the +paradigms are not the same while coding in python. Hard to find the +more pythonic way to do, and sometimes hard to unlearn my way to +think about software engineering. Well, it seems that the only +solution is to read code, and to re-read import this from times to +times ! +<a class="reference external" href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html">Coding like a pythonista</a> +seems to be a must-read, so, I know what to do.</p> +</div> +<div class="section" id="conclusion"> +<h2>Conclusion</h2> +<p>It was really great. Next time, we'll need to focus a bit more on +distutils2, and to have a bullet list of things to do, but days +like this one are opportunities to catch ! We'll probably do +another sprint in a few weeks, stay tuned !</p> +</div> +Use Restructured Text (ReST) to power your presentations2010-06-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html/<p>Wednesday, we give a presentation, with some friends, about the +CouchDB Database, to +<a class="reference external" href="http://www.toulibre.org">the Toulouse local LUG</a>. Thanks a lot +to all the presents for being there, it was a pleasure to talk +about this topic with you. Too bad the season is over now an I quit +Toulouse next year.</p> +<p>During our brainstorming about the topic, we +used some paper, and we wanted to make a presentation the simpler +way. First thing that come to my mind was using +<a class="reference external" href="http://docutils.sourceforge.net/rst.html">restructured text</a>, so +I've wrote a simple file containing our different bullet points. In +fact, there is quite nothing to do then, to have a working +presentation.</p> +<p>So far, I've used +<a class="reference external" href="http://code.google.com/p/rst2pdf/">the rst2pdf program</a>, and a +simple template, to generate output. It's probably simple to have +similar results using latex + beamer, I'll try this next time, but +as I'm not familiar with latex syntax, restructured text was a +great option.</p> +<p>Here are +<a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.pdf">the final PDF output</a>, +<a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.rst">Rhe ReST source</a>, +<a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/slides.style">the theme used</a>, +and the command line to generate the PDF:</p> +<pre class="literal-block"> +rst2pdf couchdb.rst -b1 -s ../slides.style +</pre> +first week working on distutils22010-06-04T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html/<p>As I've been working on +<a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a> during the past +week, taking part of the +<a class="reference external" href="http://code.google.com/intl/fr/soc/">GSOC</a> program, here is a +short summary of what I've done so far.</p> +<p>As my courses are not over yet, I've not worked as much as I +wanted, and this will continues until the end of June. My main +tasks are about making installation and uninstallation commands, to +have a simple way to install distributions via +<a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a>.</p> +<p>To do this, we need to rely on informations provided by the Python +Package Index (<a class="reference external" href="http://pypi.python.org/">PyPI</a>), and there is at +least two ways to retreive informations from here: XML-RPC and the +&quot;simple&quot; API.</p> +<p>So, I've been working on porting some +<a class="reference external" href="http://bitbucket.org/tarek/distribute/">Distribute</a> related +stuff to <a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a>, cutting +off all non distutils' things, as we do not want to depend from +Distribute's internals. My main work has been about reading the +whole code, writing tests about this and making those tests +possible.</p> +<p>In fact, there was a need of a pypi mocked server, and, after +reading and introducing myself to the distutils behaviors and code, +I've taken some time to improve the work +<a class="reference external" href="http://bitbucket.org/konrad">Konrad</a> makes about this mock.</p> +<div class="section" id="a-pypi-server-mock"> +<h2>A PyPI Server mock</h2> +<p>The mock is embeded in a thread, to make it available during the +tests, in a non blocking way. We first used +<a class="reference external" href="http://wsgi.org">WSGI</a> and +<a class="reference external" href="http://docs.python.org/library/wsgiref.html">wsgiref</a> in order +control what to serve, and to log the requests made to the server, +but finally realised that +<a class="reference external" href="http://docs.python.org/library/wsgiref.html">wsgiref</a> is not +python 2.4 compatible (and we <em>need</em> to be python 2.4 compatible in +Distutils2).</p> +<p>So, we switched to +<a class="reference external" href="http://docs.python.org/library/basehttpserver.html">BaseHTTPServer</a> +and +<a class="reference external" href="http://docs.python.org/library/simplehttpserver.html">SimpleHTTPServer</a>, +and updated our tests accordingly. It's been an opportunity to +realize that <a class="reference external" href="http://wsgi.org">WSGI</a> has been a great step +forward for making HTTP servers, and expose a really simplest way +to discuss with HTTP !</p> +<p>You can find +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/changesets">the modifications I made</a>, +and the +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/src/tip/docs/source/test_framework.rst">related docs</a> +about this on +<a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/">my bitbucket distutils2 clone</a>.</p> +</div> +<div class="section" id="the-pypi-simple-api"> +<h2>The PyPI Simple API</h2> +<p>So, back to the main problematic: make a python library to access +and request information stored on PyPI, via the simple API. As I +said, I've just grabbed the work made from +<a class="reference external" href="http://bitbucket.org/tarek/distribute/">Distribute</a>, and played +a bit with, in order to view what are the different use cases, and +started to write the related tests.</p> +</div> +<div class="section" id="the-work-to-come"> +<h2>The work to come</h2> +<p>So, once all use cases covered with tests, I'll rewrite a bit the +grabbed code, and do some software design work (to not expose all +things as privates methods, have a clear API, and other things like +this), then update the tests accordingly and write a documentation +to make this clear.</p> +<p>Next step is to a little client, as I've +<a class="reference external" href="http://github.com/ametaireau/pypiclient">already started here</a> +I'll take you updated !</p> +</div> +A Distutils2 GSoC2010-05-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html/<p>WOW. I've been accepted to be a part of the +<a class="reference external" href="http://code.google.com/intl/fr/soc/">Google Summer Of Code</a> +program, and will work on <a class="reference external" href="http://python.org/">python</a> +<a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a>, with +<a class="reference external" href="http://pygsoc.wordpress.com/">a</a> +<a class="reference external" href="http://konryd.blogspot.com/">lot</a> <a class="reference external" href="http://ziade.org/">of</a> +(intersting!) <a class="reference external" href="http://zubin71.wordpress.com/">people</a>.</p> +<blockquote> +So, it's about building the successor of Distutils2, ie. &quot;the +python package manager&quot;. Today, there is too&nbsp;many ways to package a +python application (pip, setuptools, distribute, distutils, etc.) +so&nbsp;there is a huge effort to make in order to make all this +packaging stuff interoperable, as pointed out by +the&nbsp;<a class="reference external" href="http://www.python.org/dev/peps/pep-0376/">PEP 376</a>.</blockquote> +<p>In more details, I'm going to work on the Installer / Uninstaller +features of Distutils2, and on a PyPI XML-RPC client for distutils2. +Here are the already defined tasks:</p> +<ul class="simple"> +<li>Implement Distutils2 APIs described in PEP 376.</li> +<li>Add the uninstall command.</li> +<li>think about a basic installer / uninstaller script. (with deps) +-- similar to pip/easy_install</li> +<li>in a pypi subpackage;</li> +<li>Integrate a module similar to setuptools' package_index'</li> +<li>PyPI XML-RPC client for distutils 2: +<a class="reference external" href="http://bugs.python.org/issue8190">http://bugs.python.org/issue8190</a></li> +</ul> +<p>As I'm relatively new to python, I'll need some extra work in order +to apply all good practice, among other things that can make a +developper-life joyful. I'll post here, each week, my advancement, +and my tought about python and especialy python packaging world.</p> +Python ? go !2009-12-17T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-12-17:/python-go.html/<p>Cela fait maintenant un peu plus d'un mois que je travaille sur un +projet en <a class="reference external" href="http://www.djangoproject.org">django</a>, et que, +nécessairement, je me forme à <a class="reference external" href="http://python.org/">Python</a>. Je +prends un plaisir non dissimulé à découvrir ce langage (et à +l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui +me viennent à l'esprit à propos de Python, sont &quot;logique&quot; et +&quot;simple&quot;. Et pourtant puissant pour autant. Je ne manque d'ailleurs +pas une occasion pour faire un peu d'<em>évangélisation</em> auprès des +quelques personnes qui veulent bien m'écouter.</p> +<div class="section" id="the-zen-of-python"> +<h2>The Zen of Python</h2> +<p>Avant toute autre chose, je pense utile de citer Tim Peters, et +<a class="reference external" href="http://www.python.org/dev/peps/pep-0020/">le PEP20</a>, qui +constituent une très bonne introduction au langage, qui prends la +forme d'un <em>easter egg</em> présent dans python</p> +<div class="highlight"><pre>&gt;&gt;&gt; import this +The Zen of Python, by Tim Peters + +Beautiful is better than ugly. +Explicit is better than implicit. +Simple is better than complex. +Complex is better than complicated. +Flat is better than nested. +Sparse is better than dense. +Readability counts. +Special cases aren<span class="s1">&#39;t special enough to break the rules.</span> +<span class="s1">Although practicality beats purity.</span> +<span class="s1">Errors should never pass silently.</span> +<span class="s1">Unless explicitly silenced.</span> +<span class="s1">In the face of ambiguity, refuse the temptation to guess.</span> +<span class="s1">There should be one-- and preferably only one --obvious way to do it.</span> +<span class="s1">Although that way may not be obvious at first unless you&#39;</span>re Dutch. +Now is better than never. +Although never is often better than *right* now. +If the implementation is hard to explain, it<span class="s1">&#39;s a bad idea.</span> +<span class="s1">If the implementation is easy to explain, it may be a good idea.</span> +<span class="s1">Namespaces are one honking great idea -- let&#39;</span>s <span class="k">do </span>more of those! +</pre></div> +<p>J'ai la vague impression que c'est ce que j'ai toujours cherché à +faire en PHP, et particulièrement dans +<a class="reference external" href="http://www.spiral-project.org">le framework Spiral</a>, mais en +ajoutant ces concepts dans une sur-couche au langage. Ici, c'est +directement de <em>l'esprit</em> de python qu'il s'agit, ce qui signifie +que la plupart des bibliothèques python suivent ces concepts. Elle +est pas belle la vie ?</p> +</div> +<div class="section" id="comment-commencer-et-par-ou"> +<h2>Comment commencer, et par ou ?</h2> +<p>Pour ma part, j'ai commencé par la lecture de quelques livres et +articles intéressants, qui constituent une bonne entrée en matière +sur le sujet (La liste n'est bien évidemment pas exhaustive et vos +commentaires sont les bienvenus) :</p> +<ul class="simple"> +<li><a class="reference external" href="http://diveintopython.adrahon.org/">Dive into python</a></li> +<li><a class="reference external" href="http://www.swaroopch.com/notes/Python_fr:Table_des_Matières">A byte of python</a></li> +<li><a class="reference external" href="http://www.amazon.fr/Python-Petit-guide-lusage-développeur/dp/2100508830">Python: petit guide à l'usage du développeur agile</a> +de <a class="reference external" href="http://tarekziade.wordpress.com/">Tarek Ziadé</a></li> +<li><a class="reference external" href="http://docs.python.org/index.html">La documentation officielle python</a>, +bien sûr !</li> +<li><a class="reference external" href="http://video.pycon.fr/videos/pycon-fr-2009/">Les vidéos du pyconfr 2009</a>!</li> +<li>Un peu de temps, et une console python ouverte :)</li> +</ul> +<p>J'essaye par ailleurs de partager au maximum les ressources que je +trouve de temps à autres, que ce soit +<a class="reference external" href="http://www.twitter.com/ametaireau">via twitter</a> ou +<a class="reference external" href="http://delicious.com/ametaireau">via mon compte delicious</a>. +Allez jeter un œil +<a class="reference external" href="http://delicious.com/ametaireau/python">au tag python</a> sur mon +profil, peut être que vous trouverez des choses intéressantes, qui +sait!</p> +</div> +<div class="section" id="un-python-sexy"> +<h2>Un python sexy</h2> +<p>Quelques fonctionnalités qui devraient vous mettre l'eau à la +bouche:</p> +<ul class="simple"> +<li><a class="reference external" href="http://docs.python.org/library/stdtypes.html#comparisons">Le chaînage des opérateurs de comparaison</a> +est possible (a&lt;b &lt;c dans une condition)</li> +<li>Assignation de valeurs multiples (il est possible de faire a,b,c += 1,2,3 par exemple)</li> +<li><a class="reference external" href="http://docs.python.org/tutorial/datastructures.html">Les listes</a> +sont simples à manipuler !</li> +<li>Les <a class="reference external" href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions">list comprehension</a>, +ou comment faire des opérations complexes sur les listes, de +manière simple.</li> +<li>Les +<a class="reference external" href="http://docs.python.org/library/doctest.html?highlight=doctest">doctests</a>: +ou comment faire des tests directement dans la documentation de vos +classes, tout en la documentant avec de vrais exemples.</li> +<li>Les +<a class="reference external" href="http://www.python.org/doc/essays/metaclasses/meta-vladimir.txt">métaclasses</a>, +ou comment contrôler la manière dont les classes se construisent</li> +<li>Python est +<a class="reference external" href="http://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language">un langage à typage fort dynamique</a>: +c'est ce qui m'agaçait avec PHP qui est un langage à typage faible +dynamique.</li> +</ul> +<p>Cous pouvez également aller regarder +<a class="reference external" href="http://video.pycon.fr/videos/free/53/">l'atelier donné par Victor Stinner durant le Pyconfr 09</a>. +Have fun !</p> +</div> + \ No newline at end of file diff --git a/feeds/python.atom.xml b/feeds/python.atom.xml new file mode 100644 index 0000000..75e4679 --- /dev/null +++ b/feeds/python.atom.xml @@ -0,0 +1,41 @@ + +Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00ZUsing dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +influenced by python, and the languages that influenced python itself.</p> +<p>Well, that's kind of interesting to know which languages influenced others, +it could even be more interesting to have an overview of the connexion between +them, keeping python as the main focus.</p> +<p>This information is available on the wikipedia page, but not in a really +exploitable format. Hopefully, this information is provided into the +information box present on the majority of wikipedia pages. And… guess what? +there is project with the goal to scrap and index all this information in +a more queriable way, using the semantic web technologies.</p> +<p>Well, you may have guessed it, the project in question in dbpedia, and exposes +information in the form of RDF triples, which are way more easy to work with +than simple HTML.</p> +<p>For instance, let's take the page about python: +<a class="reference external" href="http://dbpedia.org/page/Python_%28programming_language%29">http://dbpedia.org/page/Python_%28programming_language%29</a></p> +<p>The interesting properties here are &quot;Influenced&quot; and &quot;InfluencedBy&quot;, which +allows us to get a list of languages. Unfortunately, they are not really using +all the power of the Semantic Web here, and the list is actually a string with +coma separated values in it.</p> +<p>Anyway, we can use a simple rule: All wikipedia pages of programming languages +are either named after the name of the language itself, or suffixed with &quot;( +programming language)&quot;, which is the case for python.</p> +<p>So I've built <a class="reference external" href="https://github.com/ametaireau/experiments/blob/master/influences/get_influences.py">a tiny script to extract the information from dbpedia</a> and transform them into a shiny graph using graphviz.</p> +<p>After a nice:</p> +<pre class="literal-block"> +$ python get_influences.py python dot | dot -Tpng &gt; influences.png +</pre> +<p>The result is the following graph (<a class="reference external" href="http://files.lolnet.org/alexis/influences.png">see it directly here</a>)</p> +<img alt="http://files.lolnet.org/alexis/influences.png" src="http://files.lolnet.org/alexis/influences.png" style="width: 800px;" /> +<p>While reading this diagram, keep in mind that it is a) not listing all the +languages and b) keeping a python perspective.</p> +<p>This means that you can trust the scheme by following the arrows from python to +something and from something to python, it is not trying to get the matching +between all the languages at the same time to keep stuff readable.</p> +<p>It would certainly be possible to have all the connections between all +languages (and the resulting script would be easier) to do so, but the resulting +graph would probably be way less readable.</p> +<p>You can find the script <a class="reference external" href="https://github.com/ametaireau/experiments">on my github account</a>. Feel free to adapt it for +whatever you want if you feel hackish.</p> + \ No newline at end of file diff --git a/feeds/system.atom.xml b/feeds/system.atom.xml new file mode 100644 index 0000000..c0d7840 --- /dev/null +++ b/feeds/system.atom.xml @@ -0,0 +1,200 @@ + +Alexis' loghttp://blog.notmyidea.org2011-03-16T00:00:00ZWorking directly on your server? How to backup and sync your dev environment with unison2011-03-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html/<p>I have a server running freebsd since some time now, and was wondering about +the possibility to directly have a development environment ready to use when +I get a internet connexion, even if I'm not on my computer.</p> +<p>Since I use vim to code, and spend most of my time in a console while +developing, it's possible to work via ssh, from everywhere.</p> +<p>The only problem is the synchronisation of the source code, config files etc. +from my machine to the server.</p> +<p>Unison provides an interesting way to synchronise two folders, even over +a network. So let's do it !</p> +<div class="section" id="creating-the-jail"> +<h2>Creating the jail</h2> +<p>In case you don't use FreeBSD, you can skip this section.</p> +<div class="highlight"><pre><span class="c"># I have a flavour jail named default</span> +<span class="nv">$ </span>ezjail-admin -f default workspace.notmyidea.org 172.19.1.6 +<span class="nv">$ </span>ezjail-admin start workspace.notmyidea.org +</pre></div> +<p>In my case, because the &quot;default&quot; flavour contains already a lot of interesting +things, my jail come already setup with ssh, bash and vim for instance, but +maybe you'll need it in your case.</p> +<p>I want to be redirected to the ssh of the jail when I connect to the host with +the 20006 port. Add lines in <cite>/etc/pf.conf</cite>:</p> +<pre class="literal-block"> +workspace_jail=&quot;172.19.1.6&quot; +rdr on $ext_if proto tcp from any to $ext_ip port 20006 -&gt; $workspace_jail port 22 +</pre> +<p>Reload packet filter rules</p> +<div class="highlight"><pre><span class="nv">$ </span>/etc/rc.d/pf reload +</pre></div> +</div> +<div class="section" id="working-with-unison"> +<h2>Working with unison</h2> +<p>Now that we've set up the jail. Set up unison on the server and on your client. +Unison is available on the freebsd ports so just install it</p> +<div class="highlight"><pre><span class="nv">$ </span>ssh notmyidea.org -p 20006 +<span class="nv">$ </span>make -C /usr/ports/net/unison-nox11 config-recursive +<span class="nv">$ </span>make -C /usr/ports/net/unison-nox11 package-recursive +</pre></div> +<p>Install as well unison on your local machine. Double check to install the same +version on the client and on the server. Ubuntu contains the 2.27.57 as well as +the 2.32.52.</p> +<p>Check that unison is installed and reachable via ssh from your machine</p> +<div class="highlight"><pre><span class="nv">$ </span>ssh notmyidea.org -p 20006 unison -version +unison version 2.27.157 +<span class="nv">$ </span>unison -version +unison version 2.27.57 +</pre></div> +</div> +<div class="section" id="let-sync-our-folders"> +<h2>Let sync our folders</h2> +<p>The first thing I want to sync is my vim configuration. Well, it's already <a class="reference external" href="http://github.com/ametaireau/dotfiles/">in +a git repository</a> but let's try to use +unison for it right now.</p> +<p>I have two machines then: <cite>workspace</cite>, the jail, and <cite>ecureuil</cite> my laptop.</p> +<div class="highlight"><pre>unison .vim ssh://notmyidea.org:20006/.vim +unison .vimrc ssh://notmyidea.org:20006/.vimrc +</pre></div> +<p>It is also possible to put all the informations in a config file, and then to +only run <cite>unison</cite>. (fire up <cite>vim ~/.unison/default.prf</cite>.</p> +<p>Here is my config:</p> +<pre class="literal-block"> +root = /home/alexis +root = ssh://notmyidea.org:20006 + +path = .vimrc +path = dotfiles +path = dev + +follow = Name * +</pre> +<p>My vimrc is in fact a symbolic link on my laptop, but I don't want to specify +each of the links to unison. That's why the <cite>follow = Name *</cite> is for.</p> +<p>The folders you want to synchronize are maybe a bit large. If so, considering +others options such as rsync for the first import may be a good idea (I enjoyed +my university huge upload bandwith to upload 2GB in 20mn ;)</p> +</div> +<div class="section" id="run-the-script-frequently"> +<h2>Run the script frequently</h2> +<p>Once that done, you just need to run the unison command line some times when +you want to sync your two machines. I've wrote a tiny script to get some +feedback from the sync:</p> +<div class="highlight"><pre><span class="kn">import</span> <span class="nn">os</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span> + +<span class="n">DEFAULT_LOGFILE</span> <span class="o">=</span> <span class="s">&quot;~/unison.log&quot;</span> +<span class="n">PROGRAM_NAME</span> <span class="o">=</span> <span class="s">&quot;Unison syncer&quot;</span> + +<span class="k">def</span> <span class="nf">sync</span><span class="p">(</span><span class="n">logfile</span><span class="o">=</span><span class="n">DEFAULT_LOGFILE</span><span class="p">,</span> <span class="n">program_name</span><span class="o">=</span><span class="n">PROGRAM_NAME</span><span class="p">):</span> + <span class="c"># init</span> + <span class="n">display_message</span> <span class="o">=</span> <span class="bp">True</span> + <span class="n">error</span> <span class="o">=</span> <span class="bp">False</span> + + <span class="n">before</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> + <span class="c"># call unison to make the sync</span> + <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">&#39;unison -batch &gt; {0}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">logfile</span><span class="p">))</span> + + <span class="c"># get the duration of the operation</span> + <span class="n">td</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="o">-</span> <span class="n">before</span> + <span class="n">delta</span> <span class="o">=</span> <span class="p">(</span><span class="n">td</span><span class="o">.</span><span class="n">microseconds</span> <span class="o">+</span> <span class="p">(</span><span class="n">td</span><span class="o">.</span><span class="n">seconds</span> <span class="o">+</span> <span class="n">td</span><span class="o">.</span><span class="n">days</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">3600</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="o">**</span><span class="mi">6</span><span class="p">)</span> <span class="o">/</span> <span class="mi">10</span><span class="o">**</span><span class="mi">6</span> + + <span class="c"># check what was the last entry in the log</span> + <span class="n">log</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">logfile</span><span class="p">))</span> + <span class="n">lines</span> <span class="o">=</span> <span class="n">log</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span> + <span class="k">if</span> <span class="s">&#39;No updates to propagate&#39;</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span> + <span class="n">display_message</span> <span class="o">=</span> <span class="bp">False</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">output</span> <span class="o">=</span> <span class="p">[</span><span class="n">l</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">lines</span> <span class="k">if</span> <span class="s">&quot;Synchronization&quot;</span> <span class="ow">in</span> <span class="n">l</span><span class="p">]</span> + + <span class="n">message</span> <span class="o">=</span> <span class="n">output</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> + <span class="n">message</span> <span class="o">+=</span> <span class="s">&quot; It took {0}s.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">display_message</span><span class="p">:</span> + <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">&#39;notify-send -i {2} &quot;{0}&quot; &quot;{1}&quot;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">program_name</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> + <span class="s">&#39;error&#39;</span> <span class="k">if</span> <span class="n">error</span> <span class="k">else</span> <span class="s">&#39;info&#39;</span><span class="p">))</span> + +<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> + <span class="n">sync</span><span class="p">()</span> +</pre></div> +<p>This is probably perfectible, but that does the job.</p> +<p>Last step is to tell you machine to run that frequently. That's what <cite>crontab</cite> +is made for, so let's <cite>crontab -e</cite>:</p> +<pre class="literal-block"> +$ * */3 * * * . ~/.Xdbus; /usr/bin/python /home/alexis/dev/python/unison-syncer/sync.py +</pre> +<p>The <cite>~/.Xdbus</cite> allows cron to communicate with your X11 session. Here is its +content.</p> +<div class="highlight"><pre><span class="c">#!/bin/bash</span> + +<span class="c"># Get the pid of nautilus</span> +<span class="nv">nautilus_pid</span><span class="o">=</span><span class="k">$(</span>pgrep -u <span class="nv">$LOGNAME</span> -n nautilus<span class="k">)</span> + +<span class="c"># If nautilus isn&#39;t running, just exit silently</span> +<span class="k">if</span> <span class="o">[</span> -z <span class="s2">&quot;$nautilus_pid&quot;</span> <span class="o">]</span>; <span class="k">then</span> +<span class="nb">exit </span>0 +<span class="k">fi</span> + +<span class="c"># Grab the DBUS_SESSION_BUS_ADDRESS variable from nautilus&#39;s environment</span> +<span class="nb">eval</span> <span class="k">$(</span>tr <span class="s1">&#39;\0&#39;</span> <span class="s1">&#39;\n&#39;</span> &lt; /proc/<span class="nv">$nautilus_pid</span>/environ | grep <span class="s1">&#39;^DBUS_SESSION_BUS_ADDRESS=&#39;</span><span class="k">)</span> + +<span class="c"># Check that we actually found it</span> +<span class="k">if</span> <span class="o">[</span> -z <span class="s2">&quot;$DBUS_SESSION_BUS_ADDRESS&quot;</span> <span class="o">]</span>; <span class="k">then</span> +<span class="nb">echo</span> <span class="s2">&quot;Failed to find bus address&quot;</span> &gt;&amp;2 +<span class="nb">exit </span>1 +<span class="k">fi</span> + +<span class="c"># export it so that child processes will inherit it</span> +<span class="nb">export </span>DBUS_SESSION_BUS_ADDRESS +</pre></div> +<p>And it comes from <a class="reference external" href="http://ubuntuforums.org/showthread.php?p=10148738#post10148738">here</a>.</p> +<p>A sync takes about 20s + the upload time on my machine, which stay acceptable for +all of my developments.</p> +</div> +How to install NGINX + PHP 5.3 on FreeBSD.2010-10-10T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html/<p>I've not managed so far to get completely rid of php, so here's a simple +reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but +that's worse to have the piece of configuration somewhere !</p> +<pre class="literal-block"> +# update the ports +$ portsnap fetch update + +# install php5 port +$ make config-recursive -C /usr/ports/lang/php5-extensions +$ make package-recursive -C /usr/ports/lang/php5-extensions + +# install nginx +$ make config-recursive -C /usr/ports/www/nginx-devel +$ make package-recursive -C /usr/ports/www/nginx-devel +</pre> +<p>Now we have all the dependencies installed, we need to configure a bit the +server.</p> +<p>That's a simple thing in fact, but it could be good to have something that will +work without effort over time.</p> +<p>Here's a sample of my configuration:</p> +<pre class="literal-block"> +server { + server_name ndd; + set $path /path/to/your/files; + root $path; + + location / { + index index.php; + } + + location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { + access_log off; + expires 30d; + } + + location ~ .php$ { + fastcgi_param SCRIPT_FILENAME $path$fastcgi_script_name; + fastcgi_pass backend; + include fastcgi_params; + } +} + +upstream backend { + server 127.0.0.1:9000; +} +</pre> +<p>And that's it !</p> + \ No newline at end of file diff --git a/feeds/thoughts.atom.xml b/feeds/thoughts.atom.xml new file mode 100644 index 0000000..7fbf671 --- /dev/null +++ b/feeds/thoughts.atom.xml @@ -0,0 +1,146 @@ + +Alexis' loghttp://blog.notmyidea.org2011-05-19T00:00:00ZTravailler moins pour mieux travailler ?2011-05-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +je suis assez impressionné du résultat: je suis de retour chez mes parents pour +le &quot;easter break&quot; et j'en ai profité pour donner un coup aux travaux de la +maison (et pour me reposer un brin!).</p> +<p>Bosser en extérieur est un réel plaisir et faire quelque chose de manuel +également. Je n'ai pas pour habitude de bricoler autre chose que du logiciel et +c'est vraiment quelque chose que j'apprécie.</p> +<p>J'avoue, je mens un peu quand je dis que j'étais complètement déconnecté: +j'ai vérifié mes mails assez régulièrement en utilisant mon téléphone +(merci Arnaud pour le prêt du gadget!) et j'ai limité ma présence web au strict +minimum. Je veux dire par là pas de twitter, pas d'IRC et autres mailing-lists.</p> +<p>Quand je dis hors-ligne, je ne dis pas que je n'ai pas travaillé sur mon +ordinateur. J'ai à fournir beaucoup plus de travail que ce que je ne pensait en +premier lieu pour la rédaction de mon mémoire et j'ai passé quelques heures par +ci par là à lire des articles et livres sur le sujet ainsi que rédigé une bonne +partie de mon mémoire durant ces 10 jours. Résultat ? Les heures que j'ai passées à travailler ont +été étonnement plus productives que celles que j'ai l'habitude de passer derrière +un écran. Je ne parles pas uniquement du fait de procrastiner; évidemment c'est +une des causes principales de ma perte de productivité, mais je pense également +au fait de laisser le cerveau reposer, au moins en ce qui concerne la partie +informatique. Bricoler demande de la concentration et de la réflexion mais +permet également de laisser son esprit vagabonder. J'ai pu donc avancer mes +sur certaines parties de mon mémoire alors que j'étais en train de poser le +bardage sur la garage par exemple.</p> +<p>Passer du temps sur autre chose (qui demandait également de la concentration +par ailleurs) m'a permis d'être réellement plus efficace lors de mes phases de +rédaction et de lecture.</p> +<p>Je me demande depuis quelques temps quel sera mon futur travail et quelle forme +il prendra. Éééh oui, la fin des études arrive pour la fin de l'année, c'est +pas une blague. Et je me pose sérieusement la question du travail aux 3/4 +temps. La raison principale étant que je ne souhaites pas passer la majeure +partie de mon temps à travailler derrière un écran et que la formation que j'ai +m'y rattache beaucoup. Ne me comprenez pas de travers: j'aime ce que je fais; +mais j'aime aussi ce que je fais à coté de l'informatique: associatif, projets +alternatifs, permaculture et autres.</p> +<p>Viens s'ajouter à ça le fait d'avoir une qualité de vie qui me semble pouvoir +passer par le fait de travailler moins (&quot;il est marant ce gamin, il à pas encore commencé +à travailler qu'il veut bosser moins, regarde moi cette feignasse!&quot;) et +travailler plus efficacement. Bien sur, on n'est jamais 100% productif et c'est +d'autant plus vrai pour moi, alors si gagner en productivité peut passer par +travailler moins, pourquoi pas s'y essayer !</p> +<p>Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez des +retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée ?</p> +Fork you ! or how the social coding can help you2010-11-05T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html/<p>With <a class="reference external" href="http://github.com">github</a> and <a class="reference external" href="http://www.bitbucket.org">bitbucket</a> coming around, a lot of new usages appears for the +developpers: it's now easy to get feedback on your code/modifications, and to get +help from others by, for instance, forking repositories.</p> +<p>Eeach time I see people helping others, I'm amazed by how we like to share +our knowledge.</p> +<p>I say github, because it seems to be the more mainstream, but I think it's +something strongly related to the <a class="reference external" href="http://en.wikipedia.org/wiki/Distributed_revision_control">DVCS</a> principles: the &quot;only&quot; thing github have +made is to turn that into a social network, and to reveal the awesomeness of the +DVCSes to the masses.</p> +<p>What is really interesting is to see how this platform is addictive: it's +automatically updating a webpages with the more accurate informations about the +projects you're involved in, and add a bit of magic to that using webhooks, +allowing you to update your website each time you push to you repository, for +instance.</p> +<p>Quite nothing, indeed, but, I don't know why, I find this fascinating.</p> +<p>I haven't had the privilege to see my projects forked from github by strangers, +but I've forked others repository to give an hand some times, when I wanted to, +and the main reason is &quot;because it's <strong>fun</strong>&quot; to do so.</p> +<p>Yeah, you're probably right, you have to be a nerd to find fun to fork others. +The good point is that geeks are a kind of nerds, and some geeks are coders :)</p> +<div class="section" id="new-ways-to-contribute"> +<h2>New ways to contribute</h2> +<p>In addition, it seems that he community, or the communities, are there, on those +new social networks for coders. It's really handy to drop an eye on interesting +projects, to report bugs, propose new features, and check what new projects this +or this person have made.</p> +<p>Well, &quot;it's not new&quot;, you may think. That's true, because it's been a while that +SVN was there and even CVS before that. But, it was a bit messy to &quot;fork&quot; a +project, isn't it ? And I'm not talking about all the hell SVN involved with it +(who have not had issues with those messy .svn folders raises an hand !).</p> +<p>It have not been so easy to share code and thoughts about code, to propose +changes on existing code, than now. You think it's better to implement this or +that in a different way ? Clone it (fork it), make your changes and publish +them, and then ask projects owners about it. For sure you'll have answers.</p> +<p>Even if they don't want it, you can easily keep your changes, and keep getting +their updates!</p> +<p>Also, lot of <em>fashionables</em> projects tend to move on DVCS. +Personally, if I know I can fork on a DVCS instead of from a &quot;simple&quot; VCS, +I'll probably be quicker to fork/clone, and to publish changes on my own copy, +than if I had to do so on the upstream repository (and I'll likely dont have +the rights to push to it), because I will not be afraid to break things.</p> +<p>DVCSes makes the contribution easier.</p> +</div> +<div class="section" id="release-early-release-often"> +<h2>Release early, release often</h2> +<p>Maybe have you read <a class="reference external" href="http://www.catb.org/~esr/writings/cathedral-bazaar/">The cathedral and the bazaar</a>, by Eric Steven Raymond ? +(If not, consider doing so, it's a really interesting reading)</p> +<p>Among a lot of others interesting things, one hint he gives is <em>release early, +release often</em>.</p> +<p>I understand it as: if you want to get contributors, release your code early, +even if it's not perfect, and don't be afraid to publish your changes each +time it's needed.</p> +<p>Without notifying it, that's basically what I was doing for my own projects. +I guess that's because Social coding platforms encourages those practices, +partially cause of the possible impact publishing each of your changes can have +on your final solution.</p> +<p>If you have considered publishing your projects, code snippets, or whatever +(code related) but did not done it, considering them not yet ready, maybe +should you think about it twice: you can get feedback and probably start some +interesting discussions about it, if you write code that's readable, of course!</p> +</div> +<div class="section" id="a-step-further-for-open-source-softwares"> +<h2>A step further for open source softwares</h2> +<p>Well, DVCSes are a honking great idea, and they're starting to be really +powerful when applied to free softwares. I mean: if you can't see a project, +it will be hard to contribute to it. And, I don't think anyone wants to +contribute to something closed/proprietary, <em>just for fun</em>. Or maybe am I +missing something.</p> +<p>Maybe it's a kind of revolution, about free and open source softwares (<a class="reference external" href="http://en.wikipedia.org/wiki/Free_and_open_source_software">FOSS</a>), +that is going on. I really like to know I have my word to say about the changes +in the tools I use, and to know that I can make them evolve.</p> +<p>Let's take an example. Imagine I'm using a web framework on daily basis, as a +part of my job as a web developer. I do like using an open source software +because I know how it's working, and because I know that I can interact with the +authors of the framework while they're doing the changes on it.</p> +<p>That's communication, nothing more, and of course I can do that with an internal +proprietary solution, but it will cost me <strong>a lot</strong> more time, for a dead-simple +reason: a company is not as big and powerful as a community can be: it will cost +time to work on this framework, resources to maintain it, fix bugs etc.</p> +<p>Well, I'm starting advocating here about Free and Open Source Softwares use on +companies, what is a bit beyond the scope of this article, so let's back to +our DVCSes and new social related tools.</p> +<p>If I find a bug in this framework, while working, I have the possibility to +go and talk with the creators of the framework, to open a ticket, and even to +make a fix for it, because I've access to the source code. If I want to create a +new feature, I just have to fork it, hack it, and then publish my code to have +feedback of the community.</p> +<p>My fix/work will benefit to all the people (and maybe others companies) working +with this framework, and it's a way to prove the community that my company is +enough skilled to make code-fixes to the framework, so that's all good !</p> +</div> +<div class="section" id="what-s-next"> +<h2>What's next ?</h2> +<p>I hope those social coding platforms are only the begining of a new area. I hope +they will make people realize what the power of the community is, and how easily +they can becomes part of it.</p> +<p>If you're not using them right now, maybe you should do so: have a +look on how the programs you're using are made, consider publishing your +experimentations, and share them with others, you will see, it's kind of +addictive !</p> +</div> + \ No newline at end of file diff --git a/first-week-working-on-distutils2.html b/first-week-working-on-distutils2.html new file mode 100644 index 0000000..038c44f --- /dev/null +++ b/first-week-working-on-distutils2.html @@ -0,0 +1,226 @@ + + + + first week working on distutils2 + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

first week working on distutils2

+
+ +

As I've been working on +Distutils2 during the past +week, taking part of the +GSOC program, here is a +short summary of what I've done so far.

+

As my courses are not over yet, I've not worked as much as I +wanted, and this will continues until the end of June. My main +tasks are about making installation and uninstallation commands, to +have a simple way to install distributions via +Distutils2.

+

To do this, we need to rely on informations provided by the Python +Package Index (PyPI), and there is at +least two ways to retreive informations from here: XML-RPC and the +"simple" API.

+

So, I've been working on porting some +Distribute related +stuff to Distutils2, cutting +off all non distutils' things, as we do not want to depend from +Distribute's internals. My main work has been about reading the +whole code, writing tests about this and making those tests +possible.

+

In fact, there was a need of a pypi mocked server, and, after +reading and introducing myself to the distutils behaviors and code, +I've taken some time to improve the work +Konrad makes about this mock.

+
+

A PyPI Server mock

+

The mock is embeded in a thread, to make it available during the +tests, in a non blocking way. We first used +WSGI and +wsgiref in order +control what to serve, and to log the requests made to the server, +but finally realised that +wsgiref is not +python 2.4 compatible (and we need to be python 2.4 compatible in +Distutils2).

+

So, we switched to +BaseHTTPServer +and +SimpleHTTPServer, +and updated our tests accordingly. It's been an opportunity to +realize that WSGI has been a great step +forward for making HTTP servers, and expose a really simplest way +to discuss with HTTP !

+

You can find +the modifications I made, +and the +related docs +about this on +my bitbucket distutils2 clone.

+
+
+

The PyPI Simple API

+

So, back to the main problematic: make a python library to access +and request information stored on PyPI, via the simple API. As I +said, I've just grabbed the work made from +Distribute, and played +a bit with, in order to view what are the different use cases, and +started to write the related tests.

+
+
+

The work to come

+

So, once all use cases covered with tests, I'll rewrite a bit the +grabbed code, and do some software design work (to not expose all +things as privates methods, have a clear API, and other things like +this), then update the tests accordingly and write a documentation +to make this clear.

+

Next step is to a little client, as I've +already started here +I'll take you updated !

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/fork-you-or-how-the-social-coding-can-help-you.html b/fork-you-or-how-the-social-coding-can-help-you.html new file mode 100644 index 0000000..eda0557 --- /dev/null +++ b/fork-you-or-how-the-social-coding-can-help-you.html @@ -0,0 +1,256 @@ + + + + Fork you ! or how the social coding can help you + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Fork you ! or how the social coding can help you

+
+ +

With github and bitbucket coming around, a lot of new usages appears for the +developpers: it's now easy to get feedback on your code/modifications, and to get +help from others by, for instance, forking repositories.

+

Eeach time I see people helping others, I'm amazed by how we like to share +our knowledge.

+

I say github, because it seems to be the more mainstream, but I think it's +something strongly related to the DVCS principles: the "only" thing github have +made is to turn that into a social network, and to reveal the awesomeness of the +DVCSes to the masses.

+

What is really interesting is to see how this platform is addictive: it's +automatically updating a webpages with the more accurate informations about the +projects you're involved in, and add a bit of magic to that using webhooks, +allowing you to update your website each time you push to you repository, for +instance.

+

Quite nothing, indeed, but, I don't know why, I find this fascinating.

+

I haven't had the privilege to see my projects forked from github by strangers, +but I've forked others repository to give an hand some times, when I wanted to, +and the main reason is "because it's fun" to do so.

+

Yeah, you're probably right, you have to be a nerd to find fun to fork others. +The good point is that geeks are a kind of nerds, and some geeks are coders :)

+
+

New ways to contribute

+

In addition, it seems that he community, or the communities, are there, on those +new social networks for coders. It's really handy to drop an eye on interesting +projects, to report bugs, propose new features, and check what new projects this +or this person have made.

+

Well, "it's not new", you may think. That's true, because it's been a while that +SVN was there and even CVS before that. But, it was a bit messy to "fork" a +project, isn't it ? And I'm not talking about all the hell SVN involved with it +(who have not had issues with those messy .svn folders raises an hand !).

+

It have not been so easy to share code and thoughts about code, to propose +changes on existing code, than now. You think it's better to implement this or +that in a different way ? Clone it (fork it), make your changes and publish +them, and then ask projects owners about it. For sure you'll have answers.

+

Even if they don't want it, you can easily keep your changes, and keep getting +their updates!

+

Also, lot of fashionables projects tend to move on DVCS. +Personally, if I know I can fork on a DVCS instead of from a "simple" VCS, +I'll probably be quicker to fork/clone, and to publish changes on my own copy, +than if I had to do so on the upstream repository (and I'll likely dont have +the rights to push to it), because I will not be afraid to break things.

+

DVCSes makes the contribution easier.

+
+
+

Release early, release often

+

Maybe have you read The cathedral and the bazaar, by Eric Steven Raymond ? +(If not, consider doing so, it's a really interesting reading)

+

Among a lot of others interesting things, one hint he gives is release early, +release often.

+

I understand it as: if you want to get contributors, release your code early, +even if it's not perfect, and don't be afraid to publish your changes each +time it's needed.

+

Without notifying it, that's basically what I was doing for my own projects. +I guess that's because Social coding platforms encourages those practices, +partially cause of the possible impact publishing each of your changes can have +on your final solution.

+

If you have considered publishing your projects, code snippets, or whatever +(code related) but did not done it, considering them not yet ready, maybe +should you think about it twice: you can get feedback and probably start some +interesting discussions about it, if you write code that's readable, of course!

+
+
+

A step further for open source softwares

+

Well, DVCSes are a honking great idea, and they're starting to be really +powerful when applied to free softwares. I mean: if you can't see a project, +it will be hard to contribute to it. And, I don't think anyone wants to +contribute to something closed/proprietary, just for fun. Or maybe am I +missing something.

+

Maybe it's a kind of revolution, about free and open source softwares (FOSS), +that is going on. I really like to know I have my word to say about the changes +in the tools I use, and to know that I can make them evolve.

+

Let's take an example. Imagine I'm using a web framework on daily basis, as a +part of my job as a web developer. I do like using an open source software +because I know how it's working, and because I know that I can interact with the +authors of the framework while they're doing the changes on it.

+

That's communication, nothing more, and of course I can do that with an internal +proprietary solution, but it will cost me a lot more time, for a dead-simple +reason: a company is not as big and powerful as a community can be: it will cost +time to work on this framework, resources to maintain it, fix bugs etc.

+

Well, I'm starting advocating here about Free and Open Source Softwares use on +companies, what is a bit beyond the scope of this article, so let's back to +our DVCSes and new social related tools.

+

If I find a bug in this framework, while working, I have the possibility to +go and talk with the creators of the framework, to open a ticket, and even to +make a fix for it, because I've access to the source code. If I want to create a +new feature, I just have to fork it, hack it, and then publish my code to have +feedback of the community.

+

My fix/work will benefit to all the people (and maybe others companies) working +with this framework, and it's a way to prove the community that my company is +enough skilled to make code-fixes to the framework, so that's all good !

+
+
+

What's next ?

+

I hope those social coding platforms are only the begining of a new area. I hope +they will make people realize what the power of the community is, and how easily +they can becomes part of it.

+

If you're not using them right now, maybe you should do so: have a +look on how the programs you're using are made, consider publishing your +experimentations, and share them with others, you will see, it's kind of +addictive !

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/help-me-to-go-to-the-distutils2-paris-sprint.html b/help-me-to-go-to-the-distutils2-paris-sprint.html new file mode 100644 index 0000000..02f6a7c --- /dev/null +++ b/help-me-to-go-to-the-distutils2-paris-sprint.html @@ -0,0 +1,173 @@ + + + + Help me to go to the distutils2 paris' sprint + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Help me to go to the distutils2 paris' sprint

+
+ +

Edit: Thanks to logilab and some amazing people, I can make it to paris for the +sprint. Many thanks to them for the support!

+

There will be a distutils2 sprint from the 27th to the 30th of january, thanks +to logilab which will host the event.

+

You can find more informations about the sprint on the wiki page of the event +(http://wiki.python.org/moin/Distutils/SprintParis).

+

I really want to go there but I'm unfortunately blocked in UK for money reasons. +The cheapest two ways I've found is about £80, which I can't afford. +Following some advices on #distutils, I've set up a ChipIn account for that, so +if some people want to help me making it to go there, they can give me some +money that way.

+

I'll probably work on the installer (to support old distutils and +setuptools distributions) and on the uninstaller (depending on the first +task). If I can't make it to paris, I'll hang around on IRC to give some help +while needed.

+

If you want to contribute some money to help me go there, feel free to use this +chipin page: http://ametaireau.chipin.com/distutils2-sprint-in-paris

+

Thanks for your support !

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/how-to-install-nginx-php-53-on-freebsd.html b/how-to-install-nginx-php-53-on-freebsd.html new file mode 100644 index 0000000..0db11d2 --- /dev/null +++ b/how-to-install-nginx-php-53-on-freebsd.html @@ -0,0 +1,202 @@ + + + + How to install NGINX + PHP 5.3 on FreeBSD. + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

How to install NGINX + PHP 5.3 on FreeBSD.

+
+ +

I've not managed so far to get completely rid of php, so here's a simple +reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but +that's worse to have the piece of configuration somewhere !

+
+# update the ports
+$ portsnap fetch update
+
+# install php5 port
+$ make config-recursive -C /usr/ports/lang/php5-extensions
+$ make package-recursive -C /usr/ports/lang/php5-extensions
+
+# install nginx
+$ make config-recursive -C /usr/ports/www/nginx-devel
+$ make package-recursive -C /usr/ports/www/nginx-devel
+
+

Now we have all the dependencies installed, we need to configure a bit the +server.

+

That's a simple thing in fact, but it could be good to have something that will +work without effort over time.

+

Here's a sample of my configuration:

+
+server {
+    server_name ndd;
+    set $path /path/to/your/files;
+    root   $path;
+
+    location / {
+        index  index.php;
+    }
+
+    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
+      access_log        off;
+      expires           30d;
+    }
+
+    location ~ .php$ {
+        fastcgi_param  SCRIPT_FILENAME  $path$fastcgi_script_name;
+        fastcgi_pass   backend;
+        include fastcgi_params;
+    }
+}
+
+upstream backend {
+        server 127.0.0.1:9000;
+}
+
+

And that's it !

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/how-to-reboot-your-bebox-using-the-cli.html b/how-to-reboot-your-bebox-using-the-cli.html new file mode 100644 index 0000000..b2c01ec --- /dev/null +++ b/how-to-reboot-your-bebox-using-the-cli.html @@ -0,0 +1,204 @@ + + + + How to reboot your bebox using the CLI + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

How to reboot your bebox using the CLI

+
+ +

I've an internet connection which, for some obscure reasons, tend to be very +slow from time to time. After rebooting the box (yes, that's a hard solution), +all the things seems to go fine again.

+
+

EDIT : Using grep

+

After a bit of reflexion, that's also really easy to do using directly the +command line tools curl, grep and tail (but really harder to read).

+
curl -X POST -u joel:joel http://bebox.config/cgi/b/info/restart/\?be\=0\&l0\=1\&l1\=0\&tid\=RESTART -d "0=17&2=`curl -u joel:joel http://bebox.config/cgi/b/info/restart/\?be\=0\&l0\=1\&l1\=0\&tid\=RESTART | grep -o "name='2' value='[0-9]\+" | grep -o "[0-9]\+" | tail -n 1`&1"
+
+
+
+

The Python version

+

Well, that's not the optimal solution, that's a bit "gruik", but it works.

+
import urllib2
+import urlparse
+import re
+import argparse
+
+REBOOT_URL = '/b/info/restart/?be=0&l0=1&l1=0&tid=RESTART'
+BOX_URL = 'http://bebox.config/cgi'
+
+def open_url(url, username, password):
+    passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
+    passman.add_password(None, url, username, password)
+    authhandler = urllib2.HTTPBasicAuthHandler(passman)
+
+    opener = urllib2.build_opener(authhandler)
+
+    urllib2.install_opener(opener)
+
+    return urllib2.urlopen(url).read()
+
+def reboot(url, username, password):
+    data = open_url(url, username, password)
+    token = re.findall("name\=\\'2\\' value=\\'([0-9]+)\\'", data)[1]
+    urllib2.urlopen(urllib2.Request(url=url, data='0=17&2=%s&1' % token))
+
+if __file__ == '__main__':
+    parser = argparse.ArgumentParser(description="""Reboot your bebox !""")
+
+    parser.add_argument(dest='user', help='username')
+    parser.add_argument(dest='password', help='password')
+    parser.add_argument(boxurl='boxurl', default=BOX_URL, help='Base box url.  Default is %s' % BOX_URL)
+
+    args = parser.parse_args()
+    url = urlparse.urljoin(args.boxurl, REBOOT_URL)
+    reboot(url, args.username, args.password)
+
+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..122fa43 --- /dev/null +++ b/index.html @@ -0,0 +1,1097 @@ + + + + Alexis' log + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + +
+

Other articles

+
+
    + + + + + + + + + +
  1. + + + + + + + +
  2. +
    +

    Using JPype to bridge python and Java

    +
    + +
    + +

    Java provides some interesting libraries that have no exact equivalent in +python. In my case, the awesome boilerpipe library allows me to remove +uninteresting parts of HTML pages, like menus, footers and other "boilerplate" +contents.

    +

    Boilerpipe is written in Java. Two solutions then: using java from python or +reimplement boilerpipe ...

    + read more +

    There are comments.

    +
    +
  3. + + + + + + + +
  4. +
    +

    Un coup de main pour mon mémoire!

    +
    + +
    + +

    Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit +coup de main.

    +

    Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent ...

    + read more +

    There are comments.

    +
    +
  5. + + + + + + + +
  6. +
    +

    Travailler moins pour mieux travailler ?

    +
    + +
    + +

    Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +je suis assez impressionné du résultat: je suis de retour chez mes parents pour +le "easter break" et j'en ai profité pour donner un coup aux travaux de la +maison (et pour me reposer ...

    + read more +

    There are comments.

    +
    +
  7. + + + + + + + +
  8. + + + + + + + +
  9. +
    +

    Working directly on your server? How to backup and sync your dev environment with unison

    +
    + +
    + +

    I have a server running freebsd since some time now, and was wondering about +the possibility to directly have a development environment ready to use when +I get a internet connexion, even if I'm not on my computer.

    +

    Since I use vim to code, and spend most of my ...

    + read more +

    There are comments.

    +
    +
  10. + + + + + + + +
  11. +
    +

    Wrap up of the distutils2 paris' sprint

    +
    + +
    + +

    Finally, thanks to a bunch of people that helped me to pay my train and bus +tickets, I've made it to paris for the distutils2 sprint.

    +

    They have been a bit more than 10 people to come during the sprint, and it was +very productive. Here's a taste ...

    + read more +

    There are comments.

    +
    +
  12. + + + + + + + +
  13. +
    +

    PyPI on CouchDB

    +
    + +
    + +

    By now, there are two ways to retrieve data from PyPI (the Python Package +Index). You can both rely on xml/rpc or on the "simple" API. The simple +API is not so simple to use as the name suggest, and have several existing +drawbacks.

    +

    Basically, if you want to ...

    + read more +

    There are comments.

    +
    +
  14. + + + + + + + +
  15. +
    +

    Help me to go to the distutils2 paris' sprint

    +
    + +
    + +

    Edit: Thanks to logilab and some amazing people, I can make it to paris for the +sprint. Many thanks to them for the support!

    +

    There will be a distutils2 sprint from the 27th to the 30th of january, thanks +to logilab which will host the event.

    +

    You can find more ...

    + read more +

    There are comments.

    +
    +
  16. + + + + + + + +
  17. + + + + + + + +
  18. +
    +

    How to reboot your bebox using the CLI

    +
    + +
    + +

    I've an internet connection which, for some obscure reasons, tend to be very +slow from time to time. After rebooting the box (yes, that's a hard solution), +all the things seems to go fine again.

    +
    +

    EDIT : Using grep

    +

    After a bit of reflexion, that's also really easy ...

    + read more +

    There are comments.

    +
    +
  19. + + + + + + + +
  20. + + + + + + + +
  21. +
    +

    How to install NGINX + PHP 5.3 on FreeBSD.

    +
    + +
    + +

    I've not managed so far to get completely rid of php, so here's a simple +reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but +that's worse to have the piece of configuration somewhere !

    +
    +# update the ports
    +$ portsnap fetch update
    +
    +# install php5 port
    +$ make ...
    + read more +

    There are comments.

    +
    +
  22. + + + + + + + +
  23. + + + + + + + +
  24. + + + + + + + +
  25. +
    +

    Introducing the distutils2 index crawlers

    +
    + +
    + +

    I'm working for about a month for distutils2, even if I was being a +bit busy (as I had some class courses and exams to work on)

    +

    I'll try do sum-up my general feelings here, and the work I've made +so far. You can also find, if ...

    + read more +

    There are comments.

    +
    +
  26. + + + + + + + +
  27. +
    +

    Sprinting on distutils2 in Tours

    +
    + +
    + +

    Yesterday, as I was traveling to Tours, I've took some time to +visit Éric, another student who's working on distutils2 this +summer, as a part of the GSoC. Basically, it was to take a drink, +discuss a bit about distutils2, our respective tasks and general +feelings, and to ...

    + read more +

    There are comments.

    +
    +
  28. + + + + + + + +
  29. + + + + + + + +
  30. + + + + + + + +
  31. + + + + + + + +
  32. + + + + + + + +
  33. + + + + + + + +
  34. +
    +

    Python ? go !

    +
    + +
    + +

    Cela fait maintenant un peu plus d'un mois que je travaille sur un +projet en django, et que, +nécessairement, je me forme à Python. Je +prends un plaisir non dissimulé à découvrir ce langage (et à +l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui +me ...

    + read more +

    There are comments.

    +
    +
  35. + + + + + + + +
  36. + + + + + + +
+
+ + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/introducing-the-distutils2-index-crawlers.html b/introducing-the-distutils2-index-crawlers.html new file mode 100644 index 0000000..570aa2b --- /dev/null +++ b/introducing-the-distutils2-index-crawlers.html @@ -0,0 +1,274 @@ + + + + Introducing the distutils2 index crawlers + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Introducing the distutils2 index crawlers

+
+ +

I'm working for about a month for distutils2, even if I was being a +bit busy (as I had some class courses and exams to work on)

+

I'll try do sum-up my general feelings here, and the work I've made +so far. You can also find, if you're interested, my weekly +summaries in +a dedicated wiki page.

+
+

General feelings

+

First, and it's a really important point, the GSoC is going very +well, for me as for other students, at least from my perspective. +It's a pleasure to work with such enthusiast people, as this make +the global atmosphere very pleasant to live.

+

First of all, I've spent time to read the existing codebase, and to +understand what we're going to do, and what's the rationale to do +so.

+

It's really clear for me now: what we're building is the +foundations of a packaging infrastructure in python. The fact is +that many projects co-exists, and comes all with their good +concepts. Distutils2 tries to take the interesting parts of all, +and to provide it in the python standard libs, respecting the +recently written PEP about packaging.

+

With distutils2, it will be simpler to make "things" compatible. So +if you think about a new way to deal with distributions and +packaging in python, you can use the Distutils2 APIs to do so.

+
+
+

Tasks

+

My main task while working on distutils2 is to provide an +installation and an un-installation command, as described in PEP +376. For this, I first need to get informations about the existing +distributions (what's their version, name, metadata, dependencies, +etc.)

+

The main index, you probably know and use, is PyPI. You can access +it at http://pypi.python.org.

+
+
+

PyPI index crawling

+

There is two ways to get these informations from PyPI: using the +simple API, or via xml-rpc calls.

+

A goal was to use the version specifiers defined +in`PEP 345 <http://www.python.org/dev/peps/pep-0345/>`_ and to +provides a way to sort the grabbed distributions depending our +needs, to pick the version we want/need.

+
+

Using the simple API

+

The simple API is composed of HTML pages you can access at +http://pypi.python.org/simple/.

+

Distribute and Setuptools already provides a crawler for that, but +it deals with their internal mechanisms, and I found that the code +was not so clear as I want, that's why I've preferred to pick up +the good ideas, and some implementation details, plus re-thinking +the global architecture.

+

The rules are simple: each project have a dedicated page, which +allows us to get informations about:

+
    +
  • the distribution download locations (for some versions)
  • +
  • homepage links
  • +
  • some other useful informations, as the bugtracker address, for +instance.
  • +
+

If you want to find all the distributions of the "EggsAndSpam" +project, you could do the following (do not take so attention to +the names here, as the API will probably change a bit):

+
>>> index = SimpleIndex()
+>>> index.find("EggsAndSpam")
+[EggsAndSpam 1.1, EggsAndSpam 1.2, EggsAndSpam 1.3]
+
+

We also could use version specifiers:

+
>>> index.find("EggsAndSpam (< =1.2)")
+[EggsAndSpam 1.1, EggsAndSpam 1.2]
+
+

Internally, what's done here is the following:

+
    +
  • it process the +http://pypi.python.org/simple/FooBar/ +page, searching for download URLs.
  • +
  • for each found distribution download URL, it creates an object, +containing informations about the project name, the version and the +URL where the archive remains.
  • +
  • it sort the found distributions, using version numbers. The +default behavior here is to prefer source distributions (over +binary ones), and to rely on the last "final" distribution (rather +than beta, alpha etc. ones)
  • +
+

So, nothing hard or difficult here.

+

We provides a bunch of other features, like relying on the new PyPI +mirroring infrastructure or filter the found distributions by some +criterias. If you're curious, please browse the +distutils2 documentation.

+
+
+

Using xml-rpc

+

We also can make some xmlrpc calls to retreive informations from +PyPI. It's a really more reliable way to get informations from from +the index (as it's just the index that provides the informations), +but cost processes on the PyPI distant server.

+

For now, this way of querying the xmlrpc client is not available on +Distutils2, as I'm working on it. The main pieces are already +present (I'll reuse some work I've made from the SimpleIndex +querying, and +some code already set up), +what I need to do is to provide a xml-rpc PyPI mock server, and +that's on what I'm actually working on.

+
+
+
+

Processes

+

For now, I'm trying to follow the "documentation, then test, then +code" path, and that seems to be really needed while working with a +community. Code is hard to read/understand, compared to +documentation, and it's easier to change.

+

While writing the simple index crawling work, I must have done this +to avoid some changes on the API, and some loss of time.

+

Also, I've set up +a schedule, and +the goal is to be sure everything will be ready in time, for the +end of the summer. (And now, I need to learn to follow schedules +...)

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/le-temps-des-graces-courrez-y.html b/le-temps-des-graces-courrez-y.html new file mode 100644 index 0000000..b6e0361 --- /dev/null +++ b/le-temps-des-graces-courrez-y.html @@ -0,0 +1,215 @@ + + + + Le temps des grâces, courrez-y ! + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Le temps des grâces, courrez-y !

+
+ +

Ouf, notre +semaine de l'environnement s'est +terminée, après un peu de neige et un brin de soleil quand il en +fallait.

+

Ce fut l'occasion de rencontrer beaucoup de gens biens, et +de regarder d'un peu plus près toutes ces problématiques qui +mériteraient à elles seules, chacune un billet. Après un répis +d'une semaine, pour récupérer des folies organisatrices (c'est ça +qui fait du bien, ceci dit -- les folies, pas le repos), je me +retrouve de nouveau sur ces mêms réflexions, grâce aux journées +organisées par +France Nature Environnement, qui +proposaient ce jeudi soir une projection de "Le temps des grâces", +un documentaire sur l'agriculture.

+

Parce que depuis 60 ans, il est pratiqué le remembrement des +parcelles à gogo, parce que nos sols deviennent completement morts +à cause des tonnes d'intrants qu'on leur fait absorber, et parce +que les exploitations s'agrandissent sans en finir pour tenter de +réagir façe à un marché financier toujours plus insaisissable, mené +de très loin par la PAC, il fallait un film pour en parler. C'est +ce que fait "le temps des grâçes", avec un bon sens et une facilité +à faire passer des messages, qu'on ne peut qu'applaudir.

+

Malheureusement il s'agissait de la dernière diffusion à +L'Utopia de Toulouse... +Si vous en avez l'occasion, sautez dessus et profitez le temps de +ces 2 heures, ou vous pourrez écouter à la fois des discours +d'agronomes, d'agriculteurs, de chercheurs et bien d'autres, qui +dressent un constat pas si brillant de notre agriculture. On n'est +pas sorti de l'auberge, enfin, c'est l'expression.

+

Je vous laisse avec le synopsis et une bande annonce.

+
+Une enquête documentaire sur +le monde agricole français aujourd'hui à travers de nombreux récits +: agriculteurs, chercheurs, agronomes, écrivains... Un monde qui +parvient à résister aux bouleversements qui le frappent - +économiques, scientifiques, sociaux - et qui, bon gré mal gré, +continue d'entretenir les liens entre générations. Un monde au +centre d'interrogations majeures sur l'avenir.
+

Ainsi qu'un commentaire que je ne peux m'empécher de relayer, +trouvé sur allocine.fr (oui, vous savez, ce site rempli de pubs).

+
+Le temps des grâces c'est je pense le plus grand film traitant de +l'écologie en tant que documentaire ou en sujet principal, on y +apprend une multitude de choses, on en ressort en colère contre le +système, le film propose différents points de vues, ici on a pas de +voix off moralisatrice à deux balles avec des gros titres bien +surlignés pour que même les beaufs matant TF1 puissent comprendre, +ici même si ça reste accessible au citoyen lambda, le film ne fait +pas de compromis avec le monde agroalimentaire, il ose dénoncer les +filière d'agronomie qui apprennent pas les bonnes choses à leurs +étudiants, aux lobbys de cette agro-industrie qui n'en fait qu'à sa +tête pour amasser de l'argent, cette tendance à tout uniformiser et +détruire… Franchement j'ai trouvé ça génial de bout en bout, +captivant, on explore cette campagne française, on comprend les +dilemmes des paysants. Le film n'étant pas opposé à la modernité, +ni même réactionnaire, il propose juste un constat alarmant du +monde agricole français, tout en proposant des alternatives qui +pourraient être utilisée, si les pouvoirs publics lâchaient un peu +la main des lobbys. Passionnant, vraiment.
+

Courrez-y, je vous dis.

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/pages/projects.html b/pages/projects.html new file mode 100644 index 0000000..8b94c51 --- /dev/null +++ b/pages/projects.html @@ -0,0 +1,163 @@ + + + + projects + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+

projects

+ +

On my spare time, I contribute to open source projets, and hack a bit python, +django and php.

+

You can find all the projects I am involoved (sic!) with +on my github page

+
+

Python

+

Since I've discovered python in the late 2009, I really like the simplicity it +brings to the development. Here are some of the projects I've done using it:

+
    +
  • pelican, A simple static blog +generator, which is used to see this page.
  • +
  • gnome-background-generator A set of tools to +dynamically switch your background wallpaper on GNOME.
  • +
  • I've done a Google Summer of Code on distutils2, +the packaging tool for python, and try to use some of my spare time to contribute. +Packaging is a really useful thing, and distutils2 tries to make it simpler +and to build a framework every python packaging tool can use.
  • +
+
+
+

Django

+

Django is a web framework written in python. I've been working on it while in +internship at makina corpus. And also tries to +use them for my web related projects.

+
    +
  • bison vert, a carpooling system.
  • +
  • dropit, a note management project, using the +power if CouchDB.
  • +
  • django-oauth-client , +a django application to simplify the tree-legged-authentication process.
  • +
+
+
+

PHP

+

I've started programming with PHP, it was my third first language +(the first two ones being pascal and visual basic).

+

I've written a dependency injection container and +spiral, a web framework in PHP 5.3, with +a friend.

+

I've also contributed (a bit) to jelix, another PHP +framework.

+
+ +
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/pelican-9-months-later.html b/pelican-9-months-later.html new file mode 100644 index 0000000..88ca8c6 --- /dev/null +++ b/pelican-9-months-later.html @@ -0,0 +1,172 @@ + + + + Pelican, 9 months later + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Pelican, 9 months later

+
+ +

Back in October, I released pelican, +a little piece of code I wrote to power this weblog. I had simple needs: I wanted +to be able to use my text editor of choice (vim), a vcs (mercurial) and +restructured text. I started to write a really simple blog engine +in something like a hundred python lines and released it on github.

+

And people started contributing. I wasn't at all expecting to see people +interested in such a little piece of code, but it turned out that they were. +I refactored the code to make it evolve a bit more by two times and eventually, +in 9 months, got 49 forks, 139 issues and 73 pull requests.

+

Which is clearly awesome.

+

I pulled features such as translations, tag +clouds, integration with different services such as twitter or piwik, import +from dotclear and rss, fixed +a number of mistakes and improved a lot the codebase. This was a proof that +there is a bunch of people that are willing to make better softwares just for +the sake of fun.

+

Thank you, guys, you're why I like open source so much.

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/pelican-a-simple-static-blog-generator-in-python.html b/pelican-a-simple-static-blog-generator-in-python.html new file mode 100644 index 0000000..0950509 --- /dev/null +++ b/pelican-a-simple-static-blog-generator-in-python.html @@ -0,0 +1,216 @@ + + + + Pelican, a simple static blog generator in python + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Pelican, a simple static blog generator in python

+
+ +

Those days, I've wrote a little python application to fit my blogging needs. +I'm an occasional blogger, a vim lover, I like restructured text and DVCSes, so +I've made a little tool that makes good use of all that.

+

Pelican (for calepin) is just a simple tool to generate your blog as static +files, letting you using your editor of choice (vim!). It's easy to extend, +and has a template support (via jinja2).

+

I've made it to fit my needs. I hope it will fit yours, but maybe it wont, and +it have not be designed to feet everyone's needs.

+

Need an example ? You're looking at it ! This weblog is using pelican to be +generated, also for the atom feeds.

+

I've released it under AGPL, since I want all the modifications to be profitable +to all the users.

+

You can find a mercurial repository to fork at http://hg.lolnet.org/pelican/, +feel free to hack it !

+

If you just want to get started, use your installer of choice (pip, easy_install, …) +And then have a look to the help (pelican --help)

+
$ pip install pelican
+
+
+

Usage

+

Here's a sample usage of pelican

+
$ pelican .
+writing /home/alexis/projets/notmyidea.org/output/index.html
+writing /home/alexis/projets/notmyidea.org/output/tags.html
+writing /home/alexis/projets/notmyidea.org/output/categories.html
+writing /home/alexis/projets/notmyidea.org/output/archives.html
+writing /home/alexis/projets/notmyidea.org/output/category/python.html
+writing
+/home/alexis/projets/notmyidea.org/output/pelican-a-simple-static-blog-generator-in-python.html
+Done !
+
+

You also can use the --help option for the command line to get more +informations

+
$pelican --help
+usage: pelican [-h] [-t TEMPLATES] [-o OUTPUT] [-m MARKUP] [-s SETTINGS] [-b]
+               path
+
+A tool to generate a static blog, with restructured text input files.
+
+positional arguments:
+  path                  Path where to find the content files (default is
+                        "content").
+
+optional arguments:
+  -h, --help            show this help message and exit
+  -t TEMPLATES, --templates-path TEMPLATES
+                        Path where to find the templates. If not specified,
+                        will uses the ones included with pelican.
+  -o OUTPUT, --output OUTPUT
+                        Where to output the generated files. If not specified,
+                        a directory will be created, named "output" in the
+                        current path.
+  -m MARKUP, --markup MARKUP
+                        the markup language to use. Currently only
+                        ReSTreucturedtext is available.
+  -s SETTINGS, --settings SETTINGS
+                        the settings of the application. Default to None.
+  -b, --debug
+
+

Enjoy :)

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/pypi-on-couchdb.html b/pypi-on-couchdb.html new file mode 100644 index 0000000..a3ab283 --- /dev/null +++ b/pypi-on-couchdb.html @@ -0,0 +1,248 @@ + + + + PyPI on CouchDB + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

PyPI on CouchDB

+
+ +

By now, there are two ways to retrieve data from PyPI (the Python Package +Index). You can both rely on xml/rpc or on the "simple" API. The simple +API is not so simple to use as the name suggest, and have several existing +drawbacks.

+

Basically, if you want to use informations coming from the simple API, you will +have to parse web pages manually, to extract informations using some black +vodoo magic. Badly, magic have a price, and it's sometimes impossible to get +exactly the informations you want to get from this index. That's the technique +currently being used by distutils2, setuptools and pip.

+

On the other side, while XML/RPC is working fine, it's requiring extra work +to the python servers each time you request something, which can lead to +some outages from time to time. Also, it's important to point out that, even if +PyPI have a mirroring infrastructure, it's only for the so-called simple API, +and not for the XML/RPC.

+
+

CouchDB

+

Here comes CouchDB. CouchDB is a document oriented database, that +knows how to speak REST and JSON. It's easy to use, and provides out of the box +a replication mechanism.

+
+
+

So, what ?

+

Hmm, I'm sure you got it. I've wrote a piece of software to link informations from +PyPI to a CouchDB instance. Then you can replicate all the PyPI index with only +one HTTP request on the CouchDB server. You can also access the informations +from the index directly using a REST API, speaking json. Handy.

+

So PyPIonCouch is using the PyPI XML/RPC API to get data from PyPI, and +generate records in the CouchDB instance.

+

The final goal is to avoid to rely on this "simple" API, and rely on a REST +insterface instead. I have set up a couchdb server on my server, which is +available at http://couchdb.notmyidea.org/_utils/database.html?pypi.

+

There is not a lot to +see there for now, but I've done the first import from PyPI yesterday and all +went fine: it's possible to access the metadata of all PyPI projects via a REST +interface. Next step is to write a client for this REST interface in +distutils2.

+
+
+

Example

+

For now, you can use pypioncouch via the command line, or via the python API.

+
+

Using the command line

+

You can do something like that for a full import. This will take long, +because it's fetching all the projects at pypi and importing their metadata:

+
+$ pypioncouch --fullimport http://your.couchdb.instance/
+
+

If you already have the data on your couchdb instance, you can just update it +with the last informations from pypi. However, I recommend to just replicate +the principal node, hosted at http://couchdb.notmyidea.org/pypi/, to avoid +the duplication of nodes:

+
+$ pypioncouch --update http://your.couchdb.instance/
+
+

The principal node is updated once a day by now, I'll try to see if it's +enough, and ajust with the time.

+
+
+

Using the python API

+

You can also use the python API to interact with pypioncouch:

+
+>>> from pypioncouch import XmlRpcImporter, import_all, update
+>>> full_import()
+>>> update()
+
+
+
+
+

What's next ?

+

I want to make a couchapp, in order to navigate PyPI easily. Here are some of +the features I want to propose:

+
    +
  • List all the available projects
  • +
  • List all the projects, filtered by specifiers
  • +
  • List all the projects by author/maintainer
  • +
  • List all the projects by keywords
  • +
  • Page for each project.
  • +
  • Provide a PyPI "Simple" API equivalent, even if I want to replace it, I do +think it will be really easy to setup mirrors that way, with the out of the +box couchdb replication
  • +
+

I also still need to polish the import mechanism, so I can directly store in +couchdb:

+
    +
  • The OPML files for each project
  • +
  • The upload_time as couchdb friendly format (list of int)
  • +
  • The tags as lists (currently it's only a string separated by spaces
  • +
+

The work I've done by now is available on +https://bitbucket.org/ametaireau/pypioncouch/. Keep in mind that it's still +a work in progress, and everything can break at any time. However, any feedback +will be appreciated !

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/python-go.html b/python-go.html new file mode 100644 index 0000000..ac81c99 --- /dev/null +++ b/python-go.html @@ -0,0 +1,256 @@ + + + + Python ? go ! + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Python ? go !

+
+ +

Cela fait maintenant un peu plus d'un mois que je travaille sur un +projet en django, et que, +nécessairement, je me forme à Python. Je +prends un plaisir non dissimulé à découvrir ce langage (et à +l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui +me viennent à l'esprit à propos de Python, sont "logique" et +"simple". Et pourtant puissant pour autant. Je ne manque d'ailleurs +pas une occasion pour faire un peu d'évangélisation auprès des +quelques personnes qui veulent bien m'écouter.

+
+

The Zen of Python

+

Avant toute autre chose, je pense utile de citer Tim Peters, et +le PEP20, qui +constituent une très bonne introduction au langage, qui prends la +forme d'un easter egg présent dans python

+
>>> import this
+The Zen of Python, by Tim Peters
+
+Beautiful is better than ugly.
+Explicit is better than implicit.
+Simple is better than complex.
+Complex is better than complicated.
+Flat is better than nested.
+Sparse is better than dense.
+Readability counts.
+Special cases aren't special enough to break the rules.
+Although practicality beats purity.
+Errors should never pass silently.
+Unless explicitly silenced.
+In the face of ambiguity, refuse the temptation to guess.
+There should be one-- and preferably only one --obvious way to do it.
+Although that way may not be obvious at first unless you're Dutch.
+Now is better than never.
+Although never is often better than *right* now.
+If the implementation is hard to explain, it's a bad idea.
+If the implementation is easy to explain, it may be a good idea.
+Namespaces are one honking great idea -- let's do more of those!
+
+

J'ai la vague impression que c'est ce que j'ai toujours cherché à +faire en PHP, et particulièrement dans +le framework Spiral, mais en +ajoutant ces concepts dans une sur-couche au langage. Ici, c'est +directement de l'esprit de python qu'il s'agit, ce qui signifie +que la plupart des bibliothèques python suivent ces concepts. Elle +est pas belle la vie ?

+
+
+

Comment commencer, et par ou ?

+

Pour ma part, j'ai commencé par la lecture de quelques livres et +articles intéressants, qui constituent une bonne entrée en matière +sur le sujet (La liste n'est bien évidemment pas exhaustive et vos +commentaires sont les bienvenus) :

+ +

J'essaye par ailleurs de partager au maximum les ressources que je +trouve de temps à autres, que ce soit +via twitter ou +via mon compte delicious. +Allez jeter un œil +au tag python sur mon +profil, peut être que vous trouverez des choses intéressantes, qui +sait!

+
+
+

Un python sexy

+

Quelques fonctionnalités qui devraient vous mettre l'eau à la +bouche:

+
    +
  • Le chaînage des opérateurs de comparaison +est possible (a<b <c dans une condition)
  • +
  • Assignation de valeurs multiples (il est possible de faire a,b,c += 1,2,3 par exemple)
  • +
  • Les listes +sont simples à manipuler !
  • +
  • Les list comprehension, +ou comment faire des opérations complexes sur les listes, de +manière simple.
  • +
  • Les +doctests: +ou comment faire des tests directement dans la documentation de vos +classes, tout en la documentant avec de vrais exemples.
  • +
  • Les +métaclasses, +ou comment contrôler la manière dont les classes se construisent
  • +
  • Python est +un langage à typage fort dynamique: +c'est ce qui m'agaçait avec PHP qui est un langage à typage faible +dynamique.
  • +
+

Cous pouvez également aller regarder +l'atelier donné par Victor Stinner durant le Pyconfr 09. +Have fun !

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/semaine-de-lenvironnement-la-consommation-etudiante.html b/semaine-de-lenvironnement-la-consommation-etudiante.html new file mode 100644 index 0000000..cb16d51 --- /dev/null +++ b/semaine-de-lenvironnement-la-consommation-etudiante.html @@ -0,0 +1,195 @@ + + + + Semaine de l’environnement: La consommation étudiante + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Semaine de l’environnement: La consommation étudiante

+
+ +

Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à Framasoft, à la Quadrature du net ou à Ars Industrialis (dans le domaine de la science et de l'informatique), mais aussi aux Amis de la Terre, à ATTAC (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.

+

Dans cette optique, depuis près de 3 ans (déjà !), au sein du +réseau GRAPPE, on essaye +d'aborder des thématiques qui touchent de près ou de loin à +l'environnement, parce que c'est un sujet qui nous importe et nous +passionne. L'année dernière, c'était l'alimentation étudiante, ce +qui à abouti à la publication de +la revue "les étudiants se mettent à table". +Cette année c'est la consommation étudiante qui est au programme.

+
+

La consommation étudiante ?

+

L'idée principale de cette étude est de tenter de faire une analyse +de la "société de consommation", souvent questionnée par les +étudiants et par d'autres, et de jeter un œil sur le rapport des +étudiants à cette société: Quoi et comment consomment-ils ? Les +universités et les écoles ne poussent-elles pas d’une certaine +manière les étudiants à la consommation ? Quelles sont les +alternatives face aux dérives de surconsommation ?

+
+Analyse des pratiques, réflexions et mobilisations des étudiants en +termes de consommation seront réalisés pour comprendre leur modes +de vie, mais aussi leurs attentes, leurs propositions sur cette +thématique
+
+
+

La semaine de l'environnement !

+

A travers l'ensemble des villes du réseau, +des projections de films et des débats auront donc lieu sur ce +thème, lors de la semaine de l'environnement 2010, qui se déroulera +d'ailleurs durant le mois de Mars +partout en france, +et du 6 au 14 Mars sur Toulouse. +Jetez un oeil au programme +! Avec pour objectif de sonder un peu le ressenti des étudiants en +terme de consommation, nous avons mis en place +un questionnaire en ligne, +que vous pouvez compléter en une petite 10aine de minutes, +n'hésitez pas ! +La page sur la consommation étudiante sur le site du GRAPPE

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/sprinting-on-distutils2-in-tours.html b/sprinting-on-distutils2-in-tours.html new file mode 100644 index 0000000..ad63445 --- /dev/null +++ b/sprinting-on-distutils2-in-tours.html @@ -0,0 +1,236 @@ + + + + Sprinting on distutils2 in Tours + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Sprinting on distutils2 in Tours

+
+ +

Yesterday, as I was traveling to Tours, I've took some time to +visit Éric, another student who's working on distutils2 this +summer, as a part of the GSoC. Basically, it was to take a drink, +discuss a bit about distutils2, our respective tasks and general +feelings, and to put a face on a pseudonym. I'd really enjoyed this +time, because Éric knows a lot of things about mercurial and python +good practices, and I'm eager to learn about those. So, we have +discussed about things, have not wrote so much code, but have some +things to propose so far, about documentation, and I also provides +here some bribes of conversations we had.

+
+

Documentation

+

While writing the PyPI simple index crawler documentation, I +realized that we miss some structure, or how-to about the +documentation. Yep, you read well. We lack documentation on how to +make documentation. Heh. We're missing some rules to follow, and +this lead to a not-so-structured final documentation. We probably +target three type of publics, and we can split the documentation +regarding those:

+
    +
  • Packagers who want to distribute their softwares.
  • +
  • End users who need to understand how to use end user +commands, like the installer/uninstaller
  • +
  • packaging coders who use distutils2, as a base for +building a package manager.
  • +
+

We also need to discuss about a pattern to follow while writing +documentation. How many parts do we need ? Where to put the API +description ? etc. That's maybe seems to be not so important, but I +guess the readers would appreciate to have the same structure all +along distutils2 documentation.

+
+
+

Mercurial

+

I'm really not a mercurial power user. I use it on daily basis, +but I lack of basic knowledge about it. Big thanks Éric for sharing +yours with me, you're of a great help. We have talked about some +mercurial extensions that seems to make the life simpler, while +used the right way. I've not used them so far, so consider this as +a personal note.

+
    +
  • hg histedit, to edit the history
  • +
  • hg crecord, to select the changes to commit
  • +
+

We have spent some time to review a merge I made sunday, to +re-merge it, and commit the changes as a new changeset. Awesome. +These things make me say I need to read +the hg book, and will do as +soon as I got some spare time: mercurial seems to be simply great. +So ... Great. I'm a powerful merger now !

+
+
+

On using tools

+

Because we also are hackers, we have shared a bit our ways to +code, the tools we use, etc. Both of us were using vim, and I've +discovered vimdiff and hgtk, which will completely change the way I +navigate into the mercurial history. We aren't "power users", so we +have learned from each other about vim tips. You can find +my dotfiles on github, +if it could help. They're not perfect, and not intended to be, +because changing all the time, as I learn. Don't hesitate to have a +look, and to propose enhancements if you have !

+
+
+

On being pythonic

+

My background as an old Java user disserves me so far, as the +paradigms are not the same while coding in python. Hard to find the +more pythonic way to do, and sometimes hard to unlearn my way to +think about software engineering. Well, it seems that the only +solution is to read code, and to re-read import this from times to +times ! +Coding like a pythonista +seems to be a must-read, so, I know what to do.

+
+
+

Conclusion

+

It was really great. Next time, we'll need to focus a bit more on +distutils2, and to have a bullet list of things to do, but days +like this one are opportunities to catch ! We'll probably do +another sprint in a few weeks, stay tuned !

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/static/images/unison.png b/static/images/unison.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf467a27d1a35681871f9634aa9d20eee8a5c8c GIT binary patch literal 12100 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 ajqDCYJ$?8U_Ij2IAS + + + Alexis' log - browsers + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/dbpedia.html b/tag/dbpedia.html new file mode 100644 index 0000000..2370a9f --- /dev/null +++ b/tag/dbpedia.html @@ -0,0 +1,190 @@ + + + + Alexis' log - dbpedia + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/freebsd.html b/tag/freebsd.html new file mode 100644 index 0000000..2466109 --- /dev/null +++ b/tag/freebsd.html @@ -0,0 +1,302 @@ + + + + Alexis' log - freebsd + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/java.html b/tag/java.html new file mode 100644 index 0000000..1e460d0 --- /dev/null +++ b/tag/java.html @@ -0,0 +1,221 @@ + + + + Alexis' log - java + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/nice story.html b/tag/nice story.html new file mode 100644 index 0000000..a599069 --- /dev/null +++ b/tag/nice story.html @@ -0,0 +1,168 @@ + + + + Alexis' log - nice story + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/open source.html b/tag/open source.html new file mode 100644 index 0000000..69970c7 --- /dev/null +++ b/tag/open source.html @@ -0,0 +1,168 @@ + + + + Alexis' log - open source + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/pelican.html b/tag/pelican.html new file mode 100644 index 0000000..dca5636 --- /dev/null +++ b/tag/pelican.html @@ -0,0 +1,168 @@ + + + + Alexis' log - pelican + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/python.html b/tag/python.html new file mode 100644 index 0000000..f4b7f97 --- /dev/null +++ b/tag/python.html @@ -0,0 +1,273 @@ + + + + Alexis' log - python + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + +
+

Other articles

+
+
    + + + + + + + + + +
  1. + + + + + + + +
  2. +
    +

    Using JPype to bridge python and Java

    +
    + +
    + +

    Java provides some interesting libraries that have no exact equivalent in +python. In my case, the awesome boilerpipe library allows me to remove +uninteresting parts of HTML pages, like menus, footers and other "boilerplate" +contents.

    +

    Boilerpipe is written in Java. Two solutions then: using java from python or +reimplement boilerpipe ...

    + read more +

    There are comments.

    +
    +
  3. + + + + + + +
+
+ + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/recommendations.html b/tag/recommendations.html new file mode 100644 index 0000000..7011b0b --- /dev/null +++ b/tag/recommendations.html @@ -0,0 +1,329 @@ + + + + Alexis' log - recommendations + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/sparql.html b/tag/sparql.html new file mode 100644 index 0000000..cd85938 --- /dev/null +++ b/tag/sparql.html @@ -0,0 +1,190 @@ + + + + Alexis' log - sparql + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/unison.html b/tag/unison.html new file mode 100644 index 0000000..c97ae55 --- /dev/null +++ b/tag/unison.html @@ -0,0 +1,302 @@ + + + + Alexis' log - unison + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/users.html b/tag/users.html new file mode 100644 index 0000000..0a98283 --- /dev/null +++ b/tag/users.html @@ -0,0 +1,329 @@ + + + + Alexis' log - users + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/tags.html b/tags.html new file mode 100644 index 0000000..e69de29 diff --git a/theme/css/main.css b/theme/css/main.css new file mode 100644 index 0000000..d416aaf --- /dev/null +++ b/theme/css/main.css @@ -0,0 +1,424 @@ +/* + Name: Smashing HTML5 + Date: July 2009 + Description: Sample layout for HTML5 and CSS3 goodness. + Version: 1.0 + Author: Enrique Ramírez + Autor URI: http://enrique-ramirez.com +*/ + +/* Imports */ +@import url("reset.css"); +@import url("pygment.css"); +@import url(http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz&subset=latin); + +/***** Global *****/ +/* Body */ +body { + background: #F5F4EF url('../images/bg.png'); + color: #000305; + font-size: 87.5%; /* Base font size: 14px */ + font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; + line-height: 1.429; + margin: 0; + padding: 0; + text-align: left; +} + + + +/* Headings */ +h1 {font-size: 2em } +h2 {font-size: 1.571em} /* 22px */ +h3 {font-size: 1.429em} /* 20px */ +h4 {font-size: 1.286em} /* 18px */ +h5 {font-size: 1.143em} /* 16px */ +h6 {font-size: 1em} /* 14px */ + +h1, h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.1; + margin-bottom: .8em; + font-family: 'Yanone Kaffeesatz', arial, serif; +} + +h3, h4, h5, h6 { margin-top: .8em; } + +hr { border: 2px solid #EEEEEE; } + +/* Anchors */ +a {outline: 0;} +a img {border: 0px; text-decoration: none;} +a:link, a:visited { + color: #C74350; + padding: 0 1px; + text-decoration: underline; +} +a:hover, a:active { + background-color: #C74350; + color: #fff; + text-decoration: none; + text-shadow: 1px 1px 1px #333; +} + +h1 a:hover { + background-color: inherit +} + +/* Paragraphs */ +p {margin-bottom: 1.143em;} + +strong, b {font-weight: bold;} +em, i {font-style: italic;} + +::-moz-selection {background: #F6CF74; color: #fff;} +::selection {background: #F6CF74; color: #fff;} + +/* Lists */ +ul { + list-style: outside disc; + margin: 1em 0 1.5em 1.5em; +} + +ol { + list-style: outside decimal; + margin: 1em 0 1.5em 1.5em; +} + +.post-info { + float:right; + margin:10px; + padding:5px; +} + +.post-info p{ + margin-bottom: 1px; +} + +.readmore { float: right } + +dl {margin: 0 0 1.5em 0;} +dt {font-weight: bold;} +dd {margin-left: 1.5em;} + +pre{background-color: #000; padding: 10px; color: #fff; margin: 10px; overflow: auto;} + +/* Quotes */ +blockquote { + margin: 20px; + font-style: italic; +} +cite {} + +q {} + +/* Tables */ +table {margin: .5em auto 1.5em auto; width: 98%;} + + /* Thead */ + thead th {padding: .5em .4em; text-align: left;} + thead td {} + + /* Tbody */ + tbody td {padding: .5em .4em;} + tbody th {} + + tbody .alt td {} + tbody .alt th {} + + /* Tfoot */ + tfoot th {} + tfoot td {} + +/* HTML5 tags */ +header, section, footer, +aside, nav, article, figure { + display: block; +} + +/***** Layout *****/ +.body {clear: both; margin: 0 auto; width: 800px;} +img.right figure.right {float: right; margin: 0 0 2em 2em;} +img.left, figure.left {float: right; margin: 0 0 2em 2em;} + +/* + Header +*****************/ +#banner { + margin: 0 auto; + padding: 2.5em 0 0 0; +} + + /* Banner */ + #banner h1 {font-size: 3.571em; line-height: 0;} + #banner h1 a:link, #banner h1 a:visited { + color: #000305; + display: block; + font-weight: bold; + margin: 0 0 .6em .2em; + text-decoration: none; + width: 427px; + } + #banner h1 a:hover, #banner h1 a:active { + background: none; + color: #C74350; + text-shadow: none; + } + + #banner h1 strong {font-size: 0.36em; font-weight: normal;} + + /* Main Nav */ + #banner nav { + background: #000305; + font-size: 1.143em; + height: 40px; + line-height: 30px; + margin: 0 auto 2em auto; + padding: 0; + text-align: center; + width: 800px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + + #banner nav ul {list-style: none; margin: 0 auto; width: 800px;} + #banner nav li {float: left; display: inline; margin: 0;} + + #banner nav a:link, #banner nav a:visited { + color: #fff; + display: inline-block; + height: 30px; + padding: 5px 1.5em; + text-decoration: none; + } + #banner nav a:hover, #banner nav a:active, + #banner nav .active a:link, #banner nav .active a:visited { + background: #C74451; + color: #fff; + text-shadow: none !important; + } + + #banner nav li:first-child a { + border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + -webkit-border-top-left-radius: 5px; + + border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; + -webkit-border-bottom-left-radius: 5px; + } + +/* + Featured +*****************/ +#featured { + background: #fff; + margin-bottom: 2em; + overflow: hidden; + padding: 20px; + width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +#featured figure { + border: 2px solid #eee; + float: right; + margin: 0.786em 2em 0 5em; + width: 248px; +} +#featured figure img {display: block; float: right;} + +#featured h2 {color: #C74451; font-size: 1.714em; margin-bottom: 0.333em;} +#featured h3 {font-size: 1.429em; margin-bottom: .5em;} + +#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;} +#featured h3 a:hover, #featured h3 a:active {color: #fff;} + +/* + Body +*****************/ +#content { + background: #fff; + margin-bottom: 2em; + overflow: hidden; + padding: 20px 20px; + width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +/* + Extras +*****************/ +#extras {margin: 0 auto 3em auto; overflow: hidden;} + +#extras ul {list-style: none; margin: 0;} +#extras li {border-bottom: 1px solid #fff;} +#extras h2 { + color: #C74350; + font-size: 1.429em; + margin-bottom: .25em; + padding: 0 3px; +} + +#extras a:link, #extras a:visited { + color: #444; + display: block; + border-bottom: 1px solid #F4E3E3; + text-decoration: none; + padding: .3em .25em; +} + +#extras a:hover, #extras a:active {color: #fff;} + + /* Blogroll */ + #extras .blogroll { + float: left; + width: 615px; + } + + #extras .blogroll li {float: left; margin: 0 20px 0 0; width: 185px;} + + /* Social */ + #extras .social { + float: right; + width: 175px; + } + + #extras div[class='social'] a { + background-repeat: no-repeat; + background-position: 3px 6px; + padding-left: 25px; + } + + /* Icons */ + .social a[href*='delicious.com'] {background-image: url('../images/icons/delicious.png');} + .social a[href*='digg.com'] {background-image: url('../images/icons/digg.png');} + .social a[href*='facebook.com'] {background-image: url('../images/icons/facebook.png');} + .social a[href*='last.fm'], .social a[href*='lastfm.'] {background-image: url('../images/icons/lastfm.png');} + .social a[href*='atom.xml'] {background-image: url('../images/icons/rss.png');} + .social a[href*='twitter.com'] {background-image: url('../images/icons/twitter.png');} + .social a[href*='linkedin.com'] {background-image: url('../images/icons/linkedin.png');} + +/* + About +*****************/ +#about { + background: #fff; + font-style: normal; + margin-bottom: 2em; + overflow: hidden; + padding: 20px; + text-align: left; + width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +#about .primary {float: left; width: 165px;} +#about .primary strong {color: #C64350; display: block; font-size: 1.286em;} +#about .photo {float: left; margin: 5px 20px;} + +#about .url:link, #about .url:visited {text-decoration: none;} + +#about .bio {float: right; width: 500px;} + +/* + Footer +*****************/ +#contentinfo {padding-bottom: 2em; text-align: right;} + +/***** Sections *****/ +/* Blog */ +.hentry { + display: block; + clear: both; + border-bottom: 1px solid #eee; + padding: 1.5em 0; +} +li:last-child .hentry, #content > .hentry {border: 0; margin: 0;} +#content > .hentry {padding: 1em 0;} +.hentry img{display : none ;} +.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;} +.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #333;} +.entry-title a:visited {background-color: #fff;} + +.hentry .post-info * {font-style: normal;} + + /* Content */ + .hentry footer {margin-bottom: 2em;} + .hentry footer address {display: inline;} + #posts-list footer address {display: block;} + + /* Blog Index */ + #posts-list {list-style: none; margin: 0;} + #posts-list .hentry {padding-left: 10px; position: relative;} + + #posts-list footer { + left: 10px; + position: relative; + float: left; + top: 0.5em; + width: 190px; + } + + /* About the Author */ + #about-author { + background: #f9f9f9; + clear: both; + font-style: normal; + margin: 2em 0; + padding: 10px 20px 15px 20px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + + #about-author strong { + color: #C64350; + clear: both; + display: block; + font-size: 1.429em; + } + + #about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;} + + /* Comments */ + #comments-list {list-style: none; margin: 0 1em;} + #comments-list blockquote { + background: #f8f8f8; + clear: both; + font-style: normal; + margin: 0; + padding: 15px 20px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + #comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;} + + #comments-list li:nth-child(2n) blockquote {background: #F5f5f5;} + + /* Add a Comment */ + #add-comment label {clear: left; float: left; text-align: left; width: 150px;} + #add-comment input[type='text'], + #add-comment input[type='email'], + #add-comment input[type='url'] {float: left; width: 200px;} + + #add-comment textarea {float: left; height: 150px; width: 495px;} + + #add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;} + + #add-comment input[type='submit'] {float: right; margin: 0 .5em;} + #add-comment * {margin-bottom: .5em;} diff --git a/theme/css/pygment.css b/theme/css/pygment.css new file mode 100644 index 0000000..594b0fa --- /dev/null +++ b/theme/css/pygment.css @@ -0,0 +1,205 @@ +.hll { +background-color:#FFFFCC; +} +.c { +color:#408090; +font-style:italic; +} +.err { +border:1px solid #FF0000; +} +.k { +color:#007020; +font-weight:bold; +} +.o { +color:#666666; +} +.cm { +color:#408090; +font-style:italic; +} +.cp { +color:#007020; +} +.c1 { +color:#408090; +font-style:italic; +} +.cs { +background-color:#FFF0F0; +color:#408090; +} +.gd { +color:#A00000; +} +.ge { +font-style:italic; +} +.gr { +color:#FF0000; +} +.gh { +color:#000080; +font-weight:bold; +} +.gi { +color:#00A000; +} +.go { +color:#303030; +} +.gp { +color:#C65D09; +font-weight:bold; +} +.gs { +font-weight:bold; +} +.gu { +color:#800080; +font-weight:bold; +} +.gt { +color:#0040D0; +} +.kc { +color:#007020; +font-weight:bold; +} +.kd { +color:#007020; +font-weight:bold; +} +.kn { +color:#007020; +font-weight:bold; +} +.kp { +color:#007020; +} +.kr { +color:#007020; +font-weight:bold; +} +.kt { +color:#902000; +} +.m { +color:#208050; +} +.s { +color:#4070A0; +} +.na { +color:#4070A0; +} +.nb { +color:#007020; +} +.nc { +color:#0E84B5; +font-weight:bold; +} +.no { +color:#60ADD5; +} +.nd { +color:#555555; +font-weight:bold; +} +.ni { +color:#D55537; +font-weight:bold; +} +.ne { +color:#007020; +} +.nf { +color:#06287E; +} +.nl { +color:#002070; +font-weight:bold; +} +.nn { +color:#0E84B5; +font-weight:bold; +} +.nt { +color:#062873; +font-weight:bold; +} +.nv { +color:#BB60D5; +} +.ow { +color:#007020; +font-weight:bold; +} +.w { +color:#BBBBBB; +} +.mf { +color:#208050; +} +.mh { +color:#208050; +} +.mi { +color:#208050; +} +.mo { +color:#208050; +} +.sb { +color:#4070A0; +} +.sc { +color:#4070A0; +} +.sd { +color:#4070A0; +font-style:italic; +} +.s2 { +color:#4070A0; +} +.se { +color:#4070A0; +font-weight:bold; +} +.sh { +color:#4070A0; +} +.si { +color:#70A0D0; +font-style:italic; +} +.sx { +color:#C65D09; +} +.sr { +color:#235388; +} +.s1 { +color:#4070A0; +} +.ss { +color:#517918; +} +.bp { +color:#007020; +} +.vc { +color:#BB60D5; +} +.vg { +color:#BB60D5; +} +.vi { +color:#BB60D5; +} +.il { +color:#208050; +} diff --git a/theme/css/reset.css b/theme/css/reset.css new file mode 100644 index 0000000..1e21756 --- /dev/null +++ b/theme/css/reset.css @@ -0,0 +1,52 @@ +/* + Name: Reset Stylesheet + Description: Resets browser's default CSS + Author: Eric Meyer + Author URI: http://meyerweb.com/eric/tools/css/reset/ +*/ + +/* v1.0 | 20080212 */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + background: transparent; + border: 0; + font-size: 100%; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; +} + +body {line-height: 1;} + +ol, ul {list-style: none;} + +blockquote, q {quotes: none;} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins {text-decoration: none;} +del {text-decoration: line-through;} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/theme/css/wide.css b/theme/css/wide.css new file mode 100644 index 0000000..3376f4c --- /dev/null +++ b/theme/css/wide.css @@ -0,0 +1,43 @@ +@import url("main.css"); + +body { + font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif; +} + +.body, #banner nav, #banner nav ul, #about, #featured, #content{ + width: inherit; +} + +#banner nav { + -moz-border-radius: 0px; + margin-bottom: 0px; +} + +#banner nav ul{ + padding-right: 50px; +} + +#banner nav li{ + float: right; +} + +#banner nav li:first-child a { + -moz-border-radius: 0px; +} + +#banner h1 { + margin-bottom: -18px; +} + +#featured, #extras { + padding: 50px; +} + +#featured { + padding-top: 20px; +} + +#extras { + padding-top: 0px; + padding-bottom: 0px; +} diff --git a/theme/images/icons/delicious.png b/theme/images/icons/delicious.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ce246a4602f8f74e75ea8cfe9f5a00daceeb33 GIT binary patch literal 963 zcmV;!13dhRP)6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH0~|?2 zK~y-6Ws<#bTV))DpZogtjeX;f*md33No`1zmc&$+7>H1WP&XnFV&q?F7ZxN~K zI2_i~X=|=poxD)3){1kpXG^wzH)G`%n@9Vdqh@z9)$_-#O6KsOno1r{oLaey`u-PV zY3aS2^Ye4>S8M03dc96IlcH2Q#q{(nf8K*{zJqcRIvv=4D%`zi;68GBwb9|D4{t8% zQt846H*S2cctHWJrs7#s6F7hZ$1zC814fk;8_#?Ee8=nS(J0;psU1TjL;w;PhJ&dS zcwv_A5bPl|cU(qMn}nGpl^95_wD?4urU3{L6GZ|*A^{MSNeiu3NEiu6?GVBy>72{R z(Kx-dQ9hHO)y3kN1By5f00YASh=3wSyiN0ggEI42*?m;bfk;Ru6|SFT?Qivt&gGJQ z0HsndtkBwf2K^~wWnd3HkV6P8z=FJZQ)jk*(+39!_g7b!7rI@Kjg2Qfe6WUX2W&q4 zm9>AbkbdcF>N7oxr3%(~flSKebasN)?kzQL-rD7rOZ6X4m**v)zbsG|$Ot3_kjmLb z+1wTp2}Q&gk?16geEG#E(r7f^)S2wL*J3H-dM%>JLs0-C`u2c&Bg;%J0usOo2#^>I zm0)jQv%0!&tLpjbAH&e6-`@j?5F;iO4{)(<;{=8!1ufW_vcb=v!nPbNJk4W$4M$C0YlrpA5WMQe>ngouCATHtwiggqDn zpmhqZO_X5*2EA^#c=hTvOYiJF4zk%iesGAXz;)Y1(Gb{&Foo+MH+!CqX`1x=E(6=a z3xd+QN_kS(Y8UUXtUSecY!cc9!)0ttVJ6b(WQk8d`&MSAEB5Bru8L#b@jU;Z?d_F* zp^)0Ue*NR7wk&I_ae3~mrMKUTm;bu6ve#ZeSa|(Px7SYvp68Eg6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH11(8J zK~y-6J&{dpR8<^D&%N)?o9`l>DI;xZLzt*k2_&L4MiM1NNsIxFtWXmdy1`? zT?efJc?>@Vo&nf_bKo2(1#tonNMf9Fw@oHa9%ZBgewzP>ae_Dt&Y_e70Fh1Pawy}$ zgGB;k2Q^V2@>xK^dK)%+5L*ai5cQu}LEnNlD5W7~ke~zY?x<0Z6aqFnkjcVC6{_Qq z%b*tPaAOXF9t;#p`dWwBh@GP(GxNkhUPq-2wz)=f;d|VTS>(_pozKqU?$^1Owke!?hd2rd&Yas!y5|W3+lTtY z!z}DSdabr?Qi6+9A|etm)g_qyLlP1B=gm)K`S?d7BI4Eq5fQOrB!9hrQs&YV^7qRp z7QGM0p8UXThn4QPSBP)lMHdUGR-5+ev-GB}(w$#GXS3*$Av)h&Vdd0mg5PeU%O!HV zMiS5;aca`gZ*9{qBCi% zwUAF?iaAuy$I}{@62$Y6SYsQj=uRIhTT$bq7frj6{xp7O*Nmx-Io0hc+Y3_?M%yHe z262>Cw^!CiWpLK0R3;#J&y{nbj~!kB0000Wd_Fj7M_G{R}1CBkLw_JJn z>DQmab*CL>?Ok)>!PFzy{Acg}|Np;3*ZSPGC!W6l5w&pt&tHEg9=P)1$FJ6%7tcO? zWxgW&B*^ZPAirP+hi5m^K%69RcNc~ZR#^`qhqJ&VvY3H^TNs2H8D`Cq01C2~c>21s z-{R(FQ&rw_X(1C(sL|8KF+}2W>G_L%hZJ~NFD#lIs%=oPMZxdy|Meo%9>~ox&zv>K zB$L~r*j87(8A5T-G@yGywqOA)@^N literal 0 HcmV?d00001 diff --git a/theme/images/icons/rss.png b/theme/images/icons/rss.png new file mode 100644 index 0000000000000000000000000000000000000000..7d4e85d981cbecb04b76dab5a234dc4690bd15ab GIT binary patch literal 896 zcmV-`1AqL9P)6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH0@+DK zK~y-6O_EE9990yCzjLd)r^ifBchXK`gN{uSqd0=7kbqhEAc*5eg)D?1#7z(k=t4x? zNsw9SGD{(noh~9MD2X6K0zO7JK4L<2NIQAV^f*1~?yBm#RrlWGqBZ!h4jlgP{QMl@ zU+I@e9$=>SEYtNmqqUus!wx3gi-~73je=sdif|T*ZW7`utw+wuWACgAfSy0TMEK!t zYE6(SC>(?md;vs&h4d<9>k!o-OF=;&Jh2#spFTJsviuSC-JmTPu0b(`Yz>m@kp2nd zRUig43#A1DSVeq#S1i(h1~UbNA&f4<@Dez{166^UU6a|4zzqNaQ-P|7a=jCiUOUL} z3N#kr{$pS>NV;Hq6WHcusMH{MFwq3?pM*wCy57Y0p#2u?K8oJnF^Tc@i}3sB(5is` z&ujoKf??Y|8_dk3zrBZk^(0()1>IOi0VRT`KZE-Y!JwQ_MM0Ec!G-#oQ7S8B*C&m) z9zsUnBA@O@&vekimC3b3XJKv+*c=oPA>^RdcGocO^|4z>a{(Sb35%DIBflaWUCfz> zQFjZBp}hMA+!o*!5JCWhI3vLdv-@E4JLJM)^p8{Mwgoua!=+>7`_};|cRh#oK;+Rv zNi2+$zuQKub16jv51d?zwBNAdUx{4b}$ji|JrAT%0~d0eJ=2e~(~foQ~_ z3)4H%r@nxfGD;Ie?>uh)WzrN#E)!KFN;5~c1saqnf>_HU26K%7Xh1@OH8YI!nC9}k z*h+``4uL_Jq~Ax=P1JxOhzFJ0Nc_*I=gq}q-H_#oZ;@++WIbxRAxOY6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH0-Q-i zK~y-6Es{%XT~!=M*MIMQ?lVnH1Zip;AE}^N>OiSOJF#OyKaDf}3{E=hP(;vSr6A%! z5Wx-#wfF#SX!^KKyzg_*IeY(q4&wR%YqFNzI?kWA&ec)m@>XRpwrI3)JeW}#)`N^$ zgVab`nX}wD^EPw$;!wBji+^(4RI1+HGY+Cqifm)dfX5O&g8?8xD-m7bu)#Q5+Am>K zbbr(X4~2j+mazpK0*CI@F6M$oE^LZu1-)J*_5x2f+6k>wc@UivucXMs7C!nDzMjE; z3=E3%ye&*SXI-2u=zzx^tZE%6qIz5AoHqjk-%sJY6S%empJ2RS1!|0%$WeBt3M3#G zFg&L$`Hnf~Lqx#66>Rt6-wad1-%a3A1F!esonhoR7bh-UMhL{z7O9nRg9ebng#bU# z;Nvw+3OsFL4BS41H;2ZZ0(B9q!fr5m>oS%_Oo}+okbsoo!4jS|5KNp%OdJf@HmDsy zO&V1c3undz6o&%L9d2yF2fOez8*dN9dt-6WjkSOxqI8lZby8$e#HGsFt|IeRjDqpm zML6j5KgJ&}?sjk?L0=gaEkZEWxnu^x*ouKGV-T<%#5XgzvxIM_;z0uk!Pqr1>k3VF z%#~A>m=_FUVuf*a1bYTq;^qW4X5)ydX*`^pjC>R_4c + + + Travailler moins pour mieux travailler ? + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Travailler moins pour mieux travailler ?

+
+ +

Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +je suis assez impressionné du résultat: je suis de retour chez mes parents pour +le "easter break" et j'en ai profité pour donner un coup aux travaux de la +maison (et pour me reposer un brin!).

+

Bosser en extérieur est un réel plaisir et faire quelque chose de manuel +également. Je n'ai pas pour habitude de bricoler autre chose que du logiciel et +c'est vraiment quelque chose que j'apprécie.

+

J'avoue, je mens un peu quand je dis que j'étais complètement déconnecté: +j'ai vérifié mes mails assez régulièrement en utilisant mon téléphone +(merci Arnaud pour le prêt du gadget!) et j'ai limité ma présence web au strict +minimum. Je veux dire par là pas de twitter, pas d'IRC et autres mailing-lists.

+

Quand je dis hors-ligne, je ne dis pas que je n'ai pas travaillé sur mon +ordinateur. J'ai à fournir beaucoup plus de travail que ce que je ne pensait en +premier lieu pour la rédaction de mon mémoire et j'ai passé quelques heures par +ci par là à lire des articles et livres sur le sujet ainsi que rédigé une bonne +partie de mon mémoire durant ces 10 jours. Résultat ? Les heures que j'ai passées à travailler ont +été étonnement plus productives que celles que j'ai l'habitude de passer derrière +un écran. Je ne parles pas uniquement du fait de procrastiner; évidemment c'est +une des causes principales de ma perte de productivité, mais je pense également +au fait de laisser le cerveau reposer, au moins en ce qui concerne la partie +informatique. Bricoler demande de la concentration et de la réflexion mais +permet également de laisser son esprit vagabonder. J'ai pu donc avancer mes +sur certaines parties de mon mémoire alors que j'étais en train de poser le +bardage sur la garage par exemple.

+

Passer du temps sur autre chose (qui demandait également de la concentration +par ailleurs) m'a permis d'être réellement plus efficace lors de mes phases de +rédaction et de lecture.

+

Je me demande depuis quelques temps quel sera mon futur travail et quelle forme +il prendra. Éééh oui, la fin des études arrive pour la fin de l'année, c'est +pas une blague. Et je me pose sérieusement la question du travail aux 3/4 +temps. La raison principale étant que je ne souhaites pas passer la majeure +partie de mon temps à travailler derrière un écran et que la formation que j'ai +m'y rattache beaucoup. Ne me comprenez pas de travers: j'aime ce que je fais; +mais j'aime aussi ce que je fais à coté de l'informatique: associatif, projets +alternatifs, permaculture et autres.

+

Viens s'ajouter à ça le fait d'avoir une qualité de vie qui me semble pouvoir +passer par le fait de travailler moins ("il est marant ce gamin, il à pas encore commencé +à travailler qu'il veut bosser moins, regarde moi cette feignasse!") et +travailler plus efficacement. Bien sur, on n'est jamais 100% productif et c'est +d'autant plus vrai pour moi, alors si gagner en productivité peut passer par +travailler moins, pourquoi pas s'y essayer !

+

Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez des +retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée ?

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/un-coup-de-main-pour-mon-memoire.html b/un-coup-de-main-pour-mon-memoire.html new file mode 100644 index 0000000..fb1298a --- /dev/null +++ b/un-coup-de-main-pour-mon-memoire.html @@ -0,0 +1,181 @@ + + + + Un coup de main pour mon mémoire! + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Un coup de main pour mon mémoire!

+
+ +

Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit +coup de main.

+

Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent +last.fm, je fais quelque chose de similaire mais pour les sites internet: en me +basant sur ce que vous visitez quotidiennement et comment vous le visitez (quelles +horaires, quelle emplacement géographique, etc.) je souhaites proposer des liens +qui vous intéresseront potentiellement, en me basant sur l'avis des personnes qui +ont des profils similaires au votre.

+

Le projet est loin d'être terminé, mais la première étape est de récupérer des +données de navigation, idéalement beaucoup de données de navigation. Donc si +vous pouvez me filer un coup de main je vous en serais éternellement +reconnaissant (pour ceux qui font semblant de pas comprendre, entendez "tournée +générale").

+

J'ai créé un petit site web (en anglais) qui résume un peu le concept, qui vous +propose de vous inscrire et de télécharger un plugin firefox qui m'enverra des +information sur les sites que vous visitez (si vous avez l'habitude d'utiliser +chrome vous pouvez considérer de switcher à firefox4 pour les deux prochains +mois pour me filer un coup de main). Il est possible de désactiver le plugin +d'un simple clic si vous souhaitez garder votre vie privée privée ;-)

+

Le site est par là: http://infuse.notmyidea.org. Une fois le plugin téléchargé +et le compte créé il faut renseigner vos identifiants dans le plugin en +question, et c'est tout!

+

A votre bon cœur ! Je récupérerais probablement des données durant les 2 +prochains mois pour ensuite les analyser correctement.

+

Merci pour votre aide !

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/use-restructured-text-rest-to-power-your-presentations.html b/use-restructured-text-rest-to-power-your-presentations.html new file mode 100644 index 0000000..4b02b01 --- /dev/null +++ b/use-restructured-text-rest-to-power-your-presentations.html @@ -0,0 +1,182 @@ + + + + Use Restructured Text (ReST) to power your presentations + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Use Restructured Text (ReST) to power your presentations

+
+ +

Wednesday, we give a presentation, with some friends, about the +CouchDB Database, to +the Toulouse local LUG. Thanks a lot +to all the presents for being there, it was a pleasure to talk +about this topic with you. Too bad the season is over now an I quit +Toulouse next year.

+

During our brainstorming about the topic, we +used some paper, and we wanted to make a presentation the simpler +way. First thing that come to my mind was using +restructured text, so +I've wrote a simple file containing our different bullet points. In +fact, there is quite nothing to do then, to have a working +presentation.

+

So far, I've used +the rst2pdf program, and a +simple template, to generate output. It's probably simple to have +similar results using latex + beamer, I'll try this next time, but +as I'm not familiar with latex syntax, restructured text was a +great option.

+

Here are +the final PDF output, +Rhe ReST source, +the theme used, +and the command line to generate the PDF:

+
+rst2pdf couchdb.rst -b1 -s ../slides.style
+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/using-dbpedia-to-get-languages-influences.html b/using-dbpedia-to-get-languages-influences.html new file mode 100644 index 0000000..103f5a4 --- /dev/null +++ b/using-dbpedia-to-get-languages-influences.html @@ -0,0 +1,194 @@ + + + + Using dbpedia to get languages influences + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Using dbpedia to get languages influences

+
+ +

While browsing the Python's wikipedia page, I found information about the languages +influenced by python, and the languages that influenced python itself.

+

Well, that's kind of interesting to know which languages influenced others, +it could even be more interesting to have an overview of the connexion between +them, keeping python as the main focus.

+

This information is available on the wikipedia page, but not in a really +exploitable format. Hopefully, this information is provided into the +information box present on the majority of wikipedia pages. And… guess what? +there is project with the goal to scrap and index all this information in +a more queriable way, using the semantic web technologies.

+

Well, you may have guessed it, the project in question in dbpedia, and exposes +information in the form of RDF triples, which are way more easy to work with +than simple HTML.

+

For instance, let's take the page about python: +http://dbpedia.org/page/Python_%28programming_language%29

+

The interesting properties here are "Influenced" and "InfluencedBy", which +allows us to get a list of languages. Unfortunately, they are not really using +all the power of the Semantic Web here, and the list is actually a string with +coma separated values in it.

+

Anyway, we can use a simple rule: All wikipedia pages of programming languages +are either named after the name of the language itself, or suffixed with "( +programming language)", which is the case for python.

+

So I've built a tiny script to extract the information from dbpedia and transform them into a shiny graph using graphviz.

+

After a nice:

+
+$ python get_influences.py python dot | dot -Tpng > influences.png
+
+

The result is the following graph (see it directly here)

+http://files.lolnet.org/alexis/influences.png +

While reading this diagram, keep in mind that it is a) not listing all the +languages and b) keeping a python perspective.

+

This means that you can trust the scheme by following the arrows from python to +something and from something to python, it is not trying to get the matching +between all the languages at the same time to keep stuff readable.

+

It would certainly be possible to have all the connections between all +languages (and the resulting script would be easier) to do so, but the resulting +graph would probably be way less readable.

+

You can find the script on my github account. Feel free to adapt it for +whatever you want if you feel hackish.

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/using-jpype-to-bridge-python-and-java.html b/using-jpype-to-bridge-python-and-java.html new file mode 100644 index 0000000..6b5376b --- /dev/null +++ b/using-jpype-to-bridge-python-and-java.html @@ -0,0 +1,225 @@ + + + + Using JPype to bridge python and Java + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Using JPype to bridge python and Java

+
+ +

Java provides some interesting libraries that have no exact equivalent in +python. In my case, the awesome boilerpipe library allows me to remove +uninteresting parts of HTML pages, like menus, footers and other "boilerplate" +contents.

+

Boilerpipe is written in Java. Two solutions then: using java from python or +reimplement boilerpipe in python. I will let you guess which one I chosen, meh.

+

JPype allows to bridge python project with java libraries. It takes another +point of view than Jython: rather than reimplementing python in Java, both +languages are interfacing at the VM level. This means you need to start a VM +from your python script, but it does the job and stay fully compatible with +Cpython and its C extensions.

+
+

First steps with JPype

+

Once JPype installed (you'll have to hack a bit some files to integrate +seamlessly with your system) you can access java classes by doing something +like that:

+
import jpype
+jpype.startJVM(jpype.getDefaultJVMPath())
+
+# you can then access to the basic java functions
+jpype.java.lang.System.out.println("hello world")
+
+# and you have to shutdown the VM at the end
+jpype.shutdownJVM()
+
+

Okay, now we have a hello world, but what we want seems somehow more complex. +We want to interact with java classes, so we will have to load them.

+
+
+

Interfacing with Boilerpipe

+

To install boilerpipe, you just have to run an ant script:

+
+$ cd boilerpipe
+$ ant
+
+

Here is a simple example of how to use boilerpipe in Java, from their sources

+
package de.l3s.boilerpipe.demo;
+import java.net.URL;
+import de.l3s.boilerpipe.extractors.ArticleExtractor;
+
+public class Oneliner {
+    public static void main(final String[] args) throws Exception {
+        final URL url = new URL("http://notmyidea.org");
+        System.out.println(ArticleExtractor.INSTANCE.getText(url));
+    }
+}
+
+

To run it:

+
$ javac -cp dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar src/demo/de/l3s/boilerpipe/demo/Oneliner.java
+$ java -cp src/demo:dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar de.l3s.boilerpipe.demo.Oneliner
+
+

Yes, this is kind of ugly, sorry for your eyes. +Let's try something similar, but from python

+
import jpype
+
+# start the JVM with the good classpaths
+classpath = "dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar"
+jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.class.path=%s" % classpath)
+
+# get the Java classes we want to use
+DefaultExtractor = jpype.JPackage("de").l3s.boilerpipe.extractors.DefaultExtractor
+
+# call them !
+print DefaultExtractor.INSTANCE.getText(jpype.java.net.URL("http://blog.notmyidea.org"))
+
+

And you get what you want.

+

I must say I didn't thought it could work so easily. This will allow me to +extract text content from URLs and remove the boilerplate text easily +for infuse (my master thesis project), without having to write java code, nice!

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html b/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html new file mode 100644 index 0000000..76c80ab --- /dev/null +++ b/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html @@ -0,0 +1,306 @@ + + + + Working directly on your server? How to backup and sync your dev environment with unison + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Working directly on your server? How to backup and sync your dev environment with unison

+
+ +

I have a server running freebsd since some time now, and was wondering about +the possibility to directly have a development environment ready to use when +I get a internet connexion, even if I'm not on my computer.

+

Since I use vim to code, and spend most of my time in a console while +developing, it's possible to work via ssh, from everywhere.

+

The only problem is the synchronisation of the source code, config files etc. +from my machine to the server.

+

Unison provides an interesting way to synchronise two folders, even over +a network. So let's do it !

+
+

Creating the jail

+

In case you don't use FreeBSD, you can skip this section.

+
# I have a flavour jail named default
+$ ezjail-admin -f default workspace.notmyidea.org 172.19.1.6
+$ ezjail-admin start workspace.notmyidea.org
+
+

In my case, because the "default" flavour contains already a lot of interesting +things, my jail come already setup with ssh, bash and vim for instance, but +maybe you'll need it in your case.

+

I want to be redirected to the ssh of the jail when I connect to the host with +the 20006 port. Add lines in /etc/pf.conf:

+
+workspace_jail="172.19.1.6"
+rdr on $ext_if proto tcp from any to $ext_ip port 20006 -> $workspace_jail port 22
+
+

Reload packet filter rules

+
$ /etc/rc.d/pf reload
+
+
+
+

Working with unison

+

Now that we've set up the jail. Set up unison on the server and on your client. +Unison is available on the freebsd ports so just install it

+
$ ssh notmyidea.org -p 20006
+$ make -C /usr/ports/net/unison-nox11 config-recursive
+$ make -C /usr/ports/net/unison-nox11 package-recursive
+
+

Install as well unison on your local machine. Double check to install the same +version on the client and on the server. Ubuntu contains the 2.27.57 as well as +the 2.32.52.

+

Check that unison is installed and reachable via ssh from your machine

+
$ ssh notmyidea.org -p 20006 unison -version
+unison version 2.27.157
+$ unison -version
+unison version 2.27.57
+
+
+
+

Let sync our folders

+

The first thing I want to sync is my vim configuration. Well, it's already in +a git repository but let's try to use +unison for it right now.

+

I have two machines then: workspace, the jail, and ecureuil my laptop.

+
unison .vim ssh://notmyidea.org:20006/.vim
+unison .vimrc ssh://notmyidea.org:20006/.vimrc
+
+

It is also possible to put all the informations in a config file, and then to +only run unison. (fire up vim ~/.unison/default.prf.

+

Here is my config:

+
+root = /home/alexis
+root = ssh://notmyidea.org:20006
+
+path = .vimrc
+path = dotfiles
+path = dev
+
+follow = Name *
+
+

My vimrc is in fact a symbolic link on my laptop, but I don't want to specify +each of the links to unison. That's why the follow = Name * is for.

+

The folders you want to synchronize are maybe a bit large. If so, considering +others options such as rsync for the first import may be a good idea (I enjoyed +my university huge upload bandwith to upload 2GB in 20mn ;)

+
+
+

Run the script frequently

+

Once that done, you just need to run the unison command line some times when +you want to sync your two machines. I've wrote a tiny script to get some +feedback from the sync:

+
import os
+from datetime import datetime
+
+DEFAULT_LOGFILE = "~/unison.log"
+PROGRAM_NAME = "Unison syncer"
+
+def sync(logfile=DEFAULT_LOGFILE, program_name=PROGRAM_NAME):
+    # init
+    display_message = True
+    error = False
+
+    before = datetime.now()
+    # call unison to make the sync
+    os.system('unison -batch > {0}'.format(logfile))
+
+    # get the duration of the operation
+    td = datetime.now() - before
+    delta = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
+
+    # check what was the last entry in the log
+    log = open(os.path.expanduser(logfile))
+    lines = log.readlines()
+    if 'No updates to propagate' in lines[-1]:
+        display_message = False
+    else:
+        output = [l for l in lines if "Synchronization" in l]
+
+        message = output[-1]
+        message += " It took {0}s.".format(delta)
+
+    if display_message:
+        os.system('notify-send -i {2} "{0}" "{1}"'.format(program_name, message,
+            'error' if error else 'info'))
+
+if __name__ == "__main__":
+    sync()
+
+

This is probably perfectible, but that does the job.

+

Last step is to tell you machine to run that frequently. That's what crontab +is made for, so let's crontab -e:

+
+$ * */3 * * * . ~/.Xdbus; /usr/bin/python /home/alexis/dev/python/unison-syncer/sync.py
+
+

The ~/.Xdbus allows cron to communicate with your X11 session. Here is its +content.

+
#!/bin/bash
+
+# Get the pid of nautilus
+nautilus_pid=$(pgrep -u $LOGNAME -n nautilus)
+
+# If nautilus isn't running, just exit silently
+if [ -z "$nautilus_pid" ]; then
+exit 0
+fi
+
+# Grab the DBUS_SESSION_BUS_ADDRESS variable from nautilus's environment
+eval $(tr '\0' '\n' < /proc/$nautilus_pid/environ | grep '^DBUS_SESSION_BUS_ADDRESS=')
+
+# Check that we actually found it
+if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
+echo "Failed to find bus address" >&2
+exit 1
+fi
+
+# export it so that child processes will inherit it
+export DBUS_SESSION_BUS_ADDRESS
+
+

And it comes from here.

+

A sync takes about 20s + the upload time on my machine, which stay acceptable for +all of my developments.

+
+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/wrap-up-of-the-distutils2-paris-sprint.html b/wrap-up-of-the-distutils2-paris-sprint.html new file mode 100644 index 0000000..18eac42 --- /dev/null +++ b/wrap-up-of-the-distutils2-paris-sprint.html @@ -0,0 +1,192 @@ + + + + Wrap up of the distutils2 paris' sprint + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
+
+

Wrap up of the distutils2 paris' sprint

+
+ +

Finally, thanks to a bunch of people that helped me to pay my train and bus +tickets, I've made it to paris for the distutils2 sprint.

+

They have been a bit more than 10 people to come during the sprint, and it was +very productive. Here's a taste of what we've been working on:

+
    +
  • the datafiles, a way to specify and to handle the installation of files which +are not python-related (pictures, manpages and so on).
  • +
  • mkgcfg, a tool to help you to create a setup.cfg in minutes (and with funny +examples)
  • +
  • converters from setup.py scripts. We do now have a piece of code which +reads your current setup.py file and fill in some fields in the setup.cfg +for you.
  • +
  • a compatibility layer for distutils1, so it can read the setup.cfg you will +wrote for distutils2 :-)
  • +
  • the uninstaller, so it's now possible to uninstall what have been installed +by distutils2 (see PEP 376)
  • +
  • the installer, and the setuptools compatibility layer, which will allow you +to rely on setuptools' based distributions (and there are plenty of them!)
  • +
  • The compilers, so they are more flexible than they were. Since that's an +obscure part of the code for distutils2 commiters (it comes directly from the +distutils1 ages), having some guys who understood the problematics here was +a must.
  • +
+

Some people have also tried to port their packaging from distutils1 to +distutils2. They have spotted a number of bugs and made some improvements +to the code, to make it more friendly to use.

+

I'm really pleased to see how newcomers went trough the code, and started +hacking so fast. I must say it wasn't the case when we started to work on +distutils1 so that's a very good point: people now can hack the code quicker +than they could before.

+

Some of the features here are not completely finished yet, but are on the +tubes, and will be ready for a release (hopefully) at the end of the week.

+

Big thanks to logilab for hosting (and sponsoring my train ticket) and +providing us food, and to bearstech for providing some money for breakfast and +bears^Wbeers.

+

Again, a big thanks to all the people who gave me money to pay the transport, +I really wasn't expecting such thing to happen :-)

+ +
+ +
+

Comments !

+
+ +
+ + +
+
+ +
+ +
+

blogroll

+ +
+ + + + +
+ + + + + + + + + + \ No newline at end of file From f1518f2fb90028a028d090702b146ab507fd9f73 Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Fri, 19 Aug 2011 19:49:17 -0100 Subject: [PATCH 2/8] Update documentation --- archives.html | 3 + author/Alexis Métaireau.html | 35 ++++++++ category/python.html | 98 ++++++++++++---------- feeds/all-en.atom.xml | 4 +- feeds/all.atom.xml | 4 +- feeds/python.atom.xml | 4 +- index.html | 96 ++++++++++----------- simple-test-page.html | 157 +++++++++++++++++++++++++++++++++++ tag/bleh.html | 153 ++++++++++++++++++++++++++++++++++ 9 files changed, 458 insertions(+), 96 deletions(-) create mode 100644 simple-test-page.html create mode 100644 tag/bleh.html diff --git a/archives.html b/archives.html index cebf423..f3963f1 100644 --- a/archives.html +++ b/archives.html @@ -130,6 +130,9 @@
Tue 16 August 2011
Using dbpedia to get languages influences
+
Fri 19 August 2011
+
Simple test page
+ diff --git a/author/Alexis Métaireau.html b/author/Alexis Métaireau.html index 2cc12f2..07fa493 100644 --- a/author/Alexis Métaireau.html +++ b/author/Alexis Métaireau.html @@ -721,6 +721,41 @@ me ...

+
  • + + + + + + +
  • Sprinting on distutils2 in Tours

    diff --git a/category/python.html b/category/python.html index 348d984..b8eb6a4 100644 --- a/category/python.html +++ b/category/python.html @@ -57,8 +57,48 @@ + +
    +

    Other articles

    +
    +
      + + + + + + + + + +
    1. +
      +

      Using dbpedia to get languages influences

      +
      + +
      +

      While browsing the Python's wikipedia page, I found information about the languages + +

      While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.

      Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between -them, keeping python as the main focus.

      -

      This information is available on the wikipedia page, but not in a really -exploitable format. Hopefully, this information is provided into the -information box present on the majority of wikipedia pages. And… guess what? -there is project with the goal to scrap and index all this information in -a more queriable way, using the semantic web technologies.

      -

      Well, you may have guessed it, the project in question in dbpedia, and exposes -information in the form of RDF triples, which are way more easy to work with -than simple HTML.

      -

      For instance, let's take the page about python: -http://dbpedia.org/page/Python_%28programming_language%29

      -

      The interesting properties here are "Influenced" and "InfluencedBy", which -allows us to get a list of languages. Unfortunately, they are not really using -all the power of the Semantic Web here, and the list is actually a string with -coma separated values in it.

      -

      Anyway, we can use a simple rule: All wikipedia pages of programming languages -are either named after the name of the language itself, or suffixed with "( -programming language)", which is the case for python.

      -

      So I've built a tiny script to extract the information from dbpedia and transform them into a shiny graph using graphviz.

      -

      After a nice:

      -
      -$ python get_influences.py python dot | dot -Tpng > influences.png
      -
      -

      The result is the following graph (see it directly here)

      -http://files.lolnet.org/alexis/influences.png -

      While reading this diagram, keep in mind that it is a) not listing all the -languages and b) keeping a python perspective.

      -

      This means that you can trust the scheme by following the arrows from python to -something and from something to python, it is not trying to get the matching -between all the languages at the same time to keep stuff readable.

      -

      It would certainly be possible to have all the connections between all -languages (and the resulting script would be easier) to do so, but the resulting -graph would probably be way less readable.

      -

      You can find the script on my github account. Feel free to adapt it for -whatever you want if you feel hackish.

      -

      There are comments.

      -
      - - - - +them ...

      + read more +

      There are comments.

      + +
  • + + - - + + +
    diff --git a/feeds/all-en.atom.xml b/feeds/all-en.atom.xml index 720562d..347b4f0 100644 --- a/feeds/all-en.atom.xml +++ b/feeds/all-en.atom.xml @@ -1,5 +1,7 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00ZUsing dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00ZSimple test page2011-08-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook +Yeah ?</p> +Using dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index 4e1f5f6..a9457b3 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -1,5 +1,7 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00ZUsing dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00ZSimple test page2011-08-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook +Yeah ?</p> +Using dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/feeds/python.atom.xml b/feeds/python.atom.xml index 75e4679..d2dec34 100644 --- a/feeds/python.atom.xml +++ b/feeds/python.atom.xml @@ -1,5 +1,7 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00ZUsing dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00ZSimple test page2011-08-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook +Yeah ?</p> +Using dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/index.html b/index.html index 122fa43..e479afc 100644 --- a/index.html +++ b/index.html @@ -57,8 +57,48 @@ + +
    +

    Other articles

    +
    +
      + + + + + + + + + +
    1. +
      +

      Using dbpedia to get languages influences

      +
      + +
      +

      While browsing the Python's wikipedia page, I found information about the languages + +

      While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.

      Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between -them, keeping python as the main focus.

      -

      This information is available on the wikipedia page, but not in a really -exploitable format. Hopefully, this information is provided into the -information box present on the majority of wikipedia pages. And… guess what? -there is project with the goal to scrap and index all this information in -a more queriable way, using the semantic web technologies.

      -

      Well, you may have guessed it, the project in question in dbpedia, and exposes -information in the form of RDF triples, which are way more easy to work with -than simple HTML.

      -

      For instance, let's take the page about python: -http://dbpedia.org/page/Python_%28programming_language%29

      -

      The interesting properties here are "Influenced" and "InfluencedBy", which -allows us to get a list of languages. Unfortunately, they are not really using -all the power of the Semantic Web here, and the list is actually a string with -coma separated values in it.

      -

      Anyway, we can use a simple rule: All wikipedia pages of programming languages -are either named after the name of the language itself, or suffixed with "( -programming language)", which is the case for python.

      -

      So I've built a tiny script to extract the information from dbpedia and transform them into a shiny graph using graphviz.

      -

      After a nice:

      -
      -$ python get_influences.py python dot | dot -Tpng > influences.png
      -
      -

      The result is the following graph (see it directly here)

      -http://files.lolnet.org/alexis/influences.png -

      While reading this diagram, keep in mind that it is a) not listing all the -languages and b) keeping a python perspective.

      -

      This means that you can trust the scheme by following the arrows from python to -something and from something to python, it is not trying to get the matching -between all the languages at the same time to keep stuff readable.

      -

      It would certainly be possible to have all the connections between all -languages (and the resulting script would be easier) to do so, but the resulting -graph would probably be way less readable.

      -

      You can find the script on my github account. Feel free to adapt it for -whatever you want if you feel hackish.

      -

      There are comments.

      -
      - - - -
      -

      Other articles

      -
      -
        - - +them ...

        + read more +

        There are comments.

        + + diff --git a/simple-test-page.html b/simple-test-page.html new file mode 100644 index 0000000..0f2fefa --- /dev/null +++ b/simple-test-page.html @@ -0,0 +1,157 @@ + + + + Simple test page + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + +
        +
        +

        Simple test page

        +
        + +

        Simple test for ghp-import + post commit hook +Yeah ?

        + +
        + +
        +

        Comments !

        +
        + +
        + + +
        +
        + +
        + +
        +

        blogroll

        + +
        + + + + +
        + + + + + + + + + + \ No newline at end of file diff --git a/tag/bleh.html b/tag/bleh.html new file mode 100644 index 0000000..fb85eb3 --- /dev/null +++ b/tag/bleh.html @@ -0,0 +1,153 @@ + + + + Alexis' log - bleh + + + + + + + + + + + + + + + + + +Fork me on GitHub + + + + + + + + + + + + + + + + + + + +
        + +
        +

        blogroll

        + +
        + + + + +
        + + + + + + + + + + \ No newline at end of file From bb8e5c812d01fd6ffebc14be56097d458cbaf30a Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Fri, 19 Aug 2011 20:08:04 -0100 Subject: [PATCH 3/8] Update documentation --- a-distutils2-gsoc.html | 167 +-- amap-media-paniers-bio-a-5e.html | 167 +-- ...-summer-of-code-working-on-distutils2.html | 167 +-- ...context-to-build-up-a-web-recommender.html | 167 +-- archives.html | 127 +- author/Alexis Métaireau.html | 1228 ++--------------- categories.html | 123 +- category/asso.html | 309 +---- category/dev.html | 850 ++---------- category/python.html | 211 +-- category/system.html | 364 +---- category/thoughts.html | 251 +--- ...y-change-your-gnome-desktop-wallpaper.html | 167 +-- feeds/all-en.atom.xml | 52 +- feeds/all.atom.xml | 52 +- feeds/asso.atom.xml | 6 +- feeds/dev.atom.xml | 34 +- feeds/python.atom.xml | 4 +- feeds/system.atom.xml | 4 +- feeds/thoughts.atom.xml | 4 +- first-week-working-on-distutils2.html | 167 +-- ...or-how-the-social-coding-can-help-you.html | 167 +-- ...-to-go-to-the-distutils2-paris-sprint.html | 167 +-- how-to-install-nginx-php-53-on-freebsd.html | 167 +-- how-to-reboot-your-bebox-using-the-cli.html | 167 +-- index.html | 1206 ++-------------- ...oducing-the-distutils2-index-crawlers.html | 167 +-- le-temps-des-graces-courrez-y.html | 167 +-- pages/projects.html | 128 +- pelican-9-months-later.html | 167 +-- ...imple-static-blog-generator-in-python.html | 167 +-- pypi-on-couchdb.html | 167 +-- python-go.html | 167 +-- ...vironnement-la-consommation-etudiante.html | 167 +-- simple-test-page.html | 167 +-- sprinting-on-distutils2-in-tours.html | 167 +-- tag/bleh.html | 153 -- tag/browsers.html | 329 ----- tag/dbpedia.html | 190 --- tag/freebsd.html | 302 ---- tag/java.html | 221 --- tag/nice story.html | 168 --- tag/open source.html | 168 --- tag/pelican.html | 168 --- tag/python.html | 273 ---- tag/recommendations.html | 329 ----- tag/sparql.html | 190 --- tag/unison.html | 302 ---- tag/users.html | 329 ----- theme/css/main.css | 497 ++----- theme/css/pygment.css | 205 --- theme/css/reset.css | 52 - theme/css/wide.css | 43 - theme/images/icons/delicious.png | Bin 963 -> 0 bytes theme/images/icons/lastfm.png | Bin 980 -> 0 bytes theme/images/icons/linkedin.png | Bin 376 -> 0 bytes theme/images/icons/rss.png | Bin 896 -> 0 bytes theme/images/icons/twitter.png | Bin 835 -> 0 bytes travailler-moins-pour-mieux-travailler.html | 167 +-- un-coup-de-main-pour-mon-memoire.html | 167 +-- ...text-rest-to-power-your-presentations.html | 167 +-- ...g-dbpedia-to-get-languages-influences.html | 167 +-- using-jpype-to-bridge-python-and-java.html | 167 +-- ...sync-your-dev-environment-with-unison.html | 167 +-- wrap-up-of-the-distutils2-paris-sprint.html | 167 +-- 65 files changed, 1031 insertions(+), 12183 deletions(-) delete mode 100644 theme/css/pygment.css delete mode 100644 theme/css/reset.css delete mode 100644 theme/css/wide.css delete mode 100644 theme/images/icons/delicious.png delete mode 100644 theme/images/icons/lastfm.png delete mode 100644 theme/images/icons/linkedin.png delete mode 100644 theme/images/icons/rss.png delete mode 100644 theme/images/icons/twitter.png diff --git a/a-distutils2-gsoc.html b/a-distutils2-gsoc.html index 89d90de..e3e7018 100644 --- a/a-distutils2-gsoc.html +++ b/a-distutils2-gsoc.html @@ -1,76 +1,22 @@ - - + + - A Distutils2 GSoC - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        A Distutils2 GSoC

        -
        - -

        WOW. I've been accepted to be a part of the + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        A Distutils2 GSoC

        +

        Published on Sat 01 May 2010

        +

        WOW. I've been accepted to be a part of the Google Summer Of Code program, and will work on python distutils2, with @@ -102,85 +48,6 @@ to apply all good practice, among other things that can make a developper-life joyful. I'll post here, each week, my advancement, and my tought about python and especialy python packaging world.

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/amap-media-paniers-bio-a-5e.html b/amap-media-paniers-bio-a-5e.html index 41d3f85..ec26a4e 100644 --- a/amap-media-paniers-bio-a-5e.html +++ b/amap-media-paniers-bio-a-5e.html @@ -1,76 +1,22 @@ - - + + - AMAP + Média = Paniers bio à 5e ?! - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        AMAP + Média = Paniers bio à 5e ?!

        -
        - -

        Le raccourci me semble un peu rapide. Et pourtant, il est emprunté + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        AMAP + Média = Paniers bio à 5e ?!

        +

        Published on Wed 11 November 2009

        +

        Le raccourci me semble un peu rapide. Et pourtant, il est emprunté bien trop souvent. La dernière mes-utilisation que j'ai à décrier est celle d'un reportage télé, passé sur France 2 vendredi 23 Octobre @@ -104,85 +50,6 @@ bien réel, et qu'il est possible de sortir du tout, tout de suite.

        Mais bon, apparemment, ça passe pas bien à la télé.

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/an-amazing-summer-of-code-working-on-distutils2.html b/an-amazing-summer-of-code-working-on-distutils2.html index 2e3cc23..af928c3 100644 --- a/an-amazing-summer-of-code-working-on-distutils2.html +++ b/an-amazing-summer-of-code-working-on-distutils2.html @@ -1,76 +1,22 @@ - - + + - An amazing summer of code working on distutils2 - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        An amazing summer of code working on distutils2

        -
        - -

        The Google Summer of Code I've + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        An amazing summer of code working on distutils2

        +

        Published on Mon 16 August 2010

        +

        The Google Summer of Code I've spent working on distutils2 is over. It was a really amazing experience, for many reasons.

        First of all, we had a very good team, we were 5 students working @@ -214,85 +160,6 @@ interested about FOSS, dont hesitate any second, it's a really good opportunity to work on interesting projects!

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/analyse-users-browsing-context-to-build-up-a-web-recommender.html b/analyse-users-browsing-context-to-build-up-a-web-recommender.html index ec118bf..2243200 100644 --- a/analyse-users-browsing-context-to-build-up-a-web-recommender.html +++ b/analyse-users-browsing-context-to-build-up-a-web-recommender.html @@ -1,76 +1,22 @@ - - + + - Analyse users' browsing context to build up a web recommender - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Analyse users' browsing context to build up a web recommender

        -
        - -

        No, this is not an april's fool ;)

        + +
        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Analyse users' browsing context to build up a web recommender

        +

        Published on Fri 01 April 2011

        +

        No, this is not an april's fool ;)

        Wow, it's been a long time. My year in Oxford is going really well. I realized few days ago that the end of the year is approaching really quickly. Exams are coming in one month or such and then I'll be working full time on my dissertation topic.

        @@ -249,85 +195,6 @@ contents as well, to do some keyword based classification will be done.

        Lot of work on its way, yay !

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/archives.html b/archives.html index f3963f1..63218dc 100644 --- a/archives.html +++ b/archives.html @@ -1,57 +1,18 @@ - - + + - Alexis' log - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -

        Archives for Alexis' log

        + +
        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Archives for Alexis' log

        @@ -134,68 +95,6 @@
        Simple test page
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/author/Alexis Métaireau.html b/author/Alexis Métaireau.html index 07fa493..763bbe2 100644 --- a/author/Alexis Métaireau.html +++ b/author/Alexis Métaireau.html @@ -1,1119 +1,123 @@ - - + + - Alexis' log - Alexis Métaireau - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - - - - - - - - -
        -

        Other articles

        -
        -
          - - - - - - - - - -
        1. - - - - - - - -
        2. - - - - - - - -
        3. - - - - - - - -
        4. - - - - - - - -
        5. - - - - - - - -
        6. - - - - - - - -
        7. -
          -

          Help me to go to the distutils2 paris' sprint

          -
          - -
          - -

          Edit: Thanks to logilab and some amazing people, I can make it to paris for the -sprint. Many thanks to them for the support!

          -

          There will be a distutils2 sprint from the 27th to the 30th of january, thanks -to logilab which will host the event.

          -

          You can find more ...

          - read more -

          There are comments.

          -
          -
        8. - - - - - - - -
        9. -
          -

          How to install NGINX + PHP 5.3 on FreeBSD.

          -
          - -
          - -

          I've not managed so far to get completely rid of php, so here's a simple -reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but -that's worse to have the piece of configuration somewhere !

          -
          -# update the ports
          -$ portsnap fetch update
          -
          -# install php5 port
          -$ make ...
          - read more -

          There are comments.

          -
          -
        10. - - - - - - - -
        11. -
          -

          How to reboot your bebox using the CLI

          -
          - -
          - -

          I've an internet connection which, for some obscure reasons, tend to be very -slow from time to time. After rebooting the box (yes, that's a hard solution), -all the things seems to go fine again.

          -
          -

          EDIT : Using grep

          -

          After a bit of reflexion, that's also really easy ...

          - read more -

          There are comments.

          -
          -
        12. - - - - - - - -
        13. -
          -

          Introducing the distutils2 index crawlers

          -
          - -
          - -

          I'm working for about a month for distutils2, even if I was being a -bit busy (as I had some class courses and exams to work on)

          -

          I'll try do sum-up my general feelings here, and the work I've made -so far. You can also find, if ...

          - read more -

          There are comments.

          -
          -
        14. - - - - - - - -
        15. - - - - - - - -
        16. - - - - - - - -
        17. - - - - - - - -
        18. -
          -

          PyPI on CouchDB

          -
          - -
          - -

          By now, there are two ways to retrieve data from PyPI (the Python Package -Index). You can both rely on xml/rpc or on the "simple" API. The simple -API is not so simple to use as the name suggest, and have several existing -drawbacks.

          -

          Basically, if you want to ...

          - read more -

          There are comments.

          -
          -
        19. - - - - - - - -
        20. -
          -

          Python ? go !

          -
          - -
          - -

          Cela fait maintenant un peu plus d'un mois que je travaille sur un -projet en django, et que, -nécessairement, je me forme à Python. Je -prends un plaisir non dissimulé à découvrir ce langage (et à -l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui -me ...

          - read more -

          There are comments.

          -
          -
        21. - - - - - - - -
        22. - - - - - - - -
        23. - - - - - - - -
        24. -
          -

          Sprinting on distutils2 in Tours

          -
          - -
          - -

          Yesterday, as I was traveling to Tours, I've took some time to -visit Éric, another student who's working on distutils2 this -summer, as a part of the GSoC. Basically, it was to take a drink, -discuss a bit about distutils2, our respective tasks and general -feelings, and to ...

          - read more -

          There are comments.

          -
          -
        25. - - - - - - - -
        26. -
          -

          Travailler moins pour mieux travailler ?

          -
          - -
          - -

          Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que -je suis assez impressionné du résultat: je suis de retour chez mes parents pour -le "easter break" et j'en ai profité pour donner un coup aux travaux de la -maison (et pour me reposer ...

          - read more -

          There are comments.

          -
          -
        27. - - - - - - - -
        28. -
          -

          Un coup de main pour mon mémoire!

          -
          - -
          - -

          Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. -En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit -coup de main.

          -

          Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent ...

          - read more -

          There are comments.

          -
          -
        29. - - - - - - - -
        30. - - - - - - - -
        31. -
          -

          Using dbpedia to get languages influences

          -
          - -
          - -

          While browsing the Python's wikipedia page, I found information about the languages -influenced by python, and the languages that influenced python itself.

          -

          Well, that's kind of interesting to know which languages influenced others, -it could even be more interesting to have an overview of the connexion between -them ...

          - read more -

          There are comments.

          -
          -
        32. - - - - - - - -
        33. -
          -

          Using JPype to bridge python and Java

          -
          - -
          - -

          Java provides some interesting libraries that have no exact equivalent in -python. In my case, the awesome boilerpipe library allows me to remove -uninteresting parts of HTML pages, like menus, footers and other "boilerplate" -contents.

          -

          Boilerpipe is written in Java. Two solutions then: using java from python or -reimplement boilerpipe ...

          - read more -

          There are comments.

          -
          -
        34. - - - - - - - -
        35. -
          -

          Working directly on your server? How to backup and sync your dev environment with unison

          -
          - -
          - -

          I have a server running freebsd since some time now, and was wondering about -the possibility to directly have a development environment ready to use when -I get a internet connexion, even if I'm not on my computer.

          -

          Since I use vim to code, and spend most of my ...

          - read more -

          There are comments.

          -
          -
        36. - - - - - - - -
        37. -
          -

          Wrap up of the distutils2 paris' sprint

          -
          - -
          - -

          Finally, thanks to a bunch of people that helped me to pay my train and bus -tickets, I've made it to paris for the distutils2 sprint.

          -

          They have been a bit more than 10 people to come during the sprint, and it was -very productive. Here's a taste ...

          - read more -

          There are comments.

          -
          -
        38. - - - - + +
          +

          Alexis Métaireau's thoughs

          + +
          +
          -
        -
        - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - +

        A Distutils2 GSoC

        +

        +

        Published on Sat 01 May 2010

        + +

        AMAP + Média = Paniers bio à 5e ?!

        +

        +

        Published on Wed 11 November 2009

        + +

        An amazing summer of code working on distutils2

        +

        +

        Published on Mon 16 August 2010

        + +

        Analyse users' browsing context to build up a web recommender

        +

        +

        Published on Fri 01 April 2011

        + +

        Dynamically change your gnome desktop wallpaper

        +

        +

        Published on Mon 11 October 2010

        + +

        first week working on distutils2

        +

        +

        Published on Fri 04 June 2010

        + +

        Fork you ! or how the social coding can help you

        +

        +

        Published on Fri 05 November 2010

        + +

        Help me to go to the distutils2 paris' sprint

        +

        +

        Published on Sat 15 January 2011

        + +

        How to install NGINX + PHP 5.3 on FreeBSD.

        +

        +

        Published on Sun 10 October 2010

        + +

        How to reboot your bebox using the CLI

        +

        +

        Published on Thu 21 October 2010

        + +

        Introducing the distutils2 index crawlers

        +

        +

        Published on Tue 06 July 2010

        + +

        Le temps des grâces, courrez-y !

        +

        +

        Published on Sun 28 March 2010

        + +

        Pelican, 9 months later

        +

        or why I like opensource so much

        +

        Published on Mon 25 July 2011

        + +

        Pelican, a simple static blog generator in python

        +

        +

        Published on Wed 06 October 2010

        + +

        PyPI on CouchDB

        +

        +

        Published on Thu 20 January 2011

        + +

        Python ? go !

        +

        +

        Published on Thu 17 December 2009

        + +

        Semaine de l’environnement: La consommation étudiante

        +

        +

        Published on Wed 24 February 2010

        + +

        Simple test page

        +

        +

        Published on Fri 19 August 2011

        + +

        Sprinting on distutils2 in Tours

        +

        +

        Published on Tue 06 July 2010

        + +

        Travailler moins pour mieux travailler ?

        +

        +

        Published on Thu 19 May 2011

        + +

        Un coup de main pour mon mémoire!

        +

        +

        Published on Wed 25 May 2011

        + +

        Use Restructured Text (ReST) to power your presentations

        +

        +

        Published on Fri 25 June 2010

        + +

        Using dbpedia to get languages influences

        +

        +

        Published on Tue 16 August 2011

        + +

        Using JPype to bridge python and Java

        +

        +

        Published on Sat 11 June 2011

        + +

        Working directly on your server? How to backup and sync your dev environment with unison

        +

        +

        Published on Wed 16 March 2011

        + +

        Wrap up of the distutils2 paris' sprint

        +

        +

        Published on Tue 08 February 2011

        + + \ No newline at end of file diff --git a/categories.html b/categories.html index a1b8ad9..f0c3735 100644 --- a/categories.html +++ b/categories.html @@ -1,55 +1,17 @@ - - + + - Alexis' log - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - + +
        +

        Alexis Métaireau's thoughs

        + +
        +
        • asso
        • @@ -63,67 +25,6 @@
        • thoughts
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - +
        \ No newline at end of file diff --git a/category/asso.html b/category/asso.html index 984caed..d89d88f 100644 --- a/category/asso.html +++ b/category/asso.html @@ -1,292 +1,31 @@ - - + + - Alexis' log - asso - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - - - - - - - - -
        -

        Other articles

        -
        -
          - - - - - - - - - -
        1. - - - - - - - -
        2. - - - - + +
          +

          Alexis Métaireau's thoughs

          + +
          +
          -
        -
        - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - +

        Le temps des grâces, courrez-y !

        +

        +

        Published on Sun 28 March 2010

        + +

        Semaine de l’environnement: La consommation étudiante

        +

        +

        Published on Wed 24 February 2010

        + +

        AMAP + Média = Paniers bio à 5e ?!

        +

        +

        Published on Wed 11 November 2009

        + + \ No newline at end of file diff --git a/category/dev.html b/category/dev.html index 4348d7c..5770c41 100644 --- a/category/dev.html +++ b/category/dev.html @@ -1,777 +1,87 @@ - - + + - Alexis' log - dev - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - - - - - - - - -
        -

        Other articles

        -
        -
          - - - - - - - - - -
        1. -
          -

          Using JPype to bridge python and Java

          -
          - -
          - -

          Java provides some interesting libraries that have no exact equivalent in -python. In my case, the awesome boilerpipe library allows me to remove -uninteresting parts of HTML pages, like menus, footers and other "boilerplate" -contents.

          -

          Boilerpipe is written in Java. Two solutions then: using java from python or -reimplement boilerpipe ...

          - read more -

          There are comments.

          -
          -
        2. - - - - - - - -
        3. -
          -

          Un coup de main pour mon mémoire!

          -
          - -
          - -

          Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. -En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit -coup de main.

          -

          Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent ...

          - read more -

          There are comments.

          -
          -
        4. - - - - - - - -
        5. - - - - - - - -
        6. -
          -

          Wrap up of the distutils2 paris' sprint

          -
          - -
          - -

          Finally, thanks to a bunch of people that helped me to pay my train and bus -tickets, I've made it to paris for the distutils2 sprint.

          -

          They have been a bit more than 10 people to come during the sprint, and it was -very productive. Here's a taste ...

          - read more -

          There are comments.

          -
          -
        7. - - - - - - - -
        8. -
          -

          PyPI on CouchDB

          -
          - -
          - -

          By now, there are two ways to retrieve data from PyPI (the Python Package -Index). You can both rely on xml/rpc or on the "simple" API. The simple -API is not so simple to use as the name suggest, and have several existing -drawbacks.

          -

          Basically, if you want to ...

          - read more -

          There are comments.

          -
          -
        9. - - - - - - - -
        10. -
          -

          Help me to go to the distutils2 paris' sprint

          -
          - -
          - -

          Edit: Thanks to logilab and some amazing people, I can make it to paris for the -sprint. Many thanks to them for the support!

          -

          There will be a distutils2 sprint from the 27th to the 30th of january, thanks -to logilab which will host the event.

          -

          You can find more ...

          - read more -

          There are comments.

          -
          -
        11. - - - - - - - -
        12. -
          -

          How to reboot your bebox using the CLI

          -
          - -
          - -

          I've an internet connection which, for some obscure reasons, tend to be very -slow from time to time. After rebooting the box (yes, that's a hard solution), -all the things seems to go fine again.

          -
          -

          EDIT : Using grep

          -

          After a bit of reflexion, that's also really easy ...

          - read more -

          There are comments.

          -
          -
        13. - - - - - - - -
        14. - - - - - - - -
        15. - - - - - - - -
        16. - - - - - - - -
        17. -
          -

          Introducing the distutils2 index crawlers

          -
          - -
          - -

          I'm working for about a month for distutils2, even if I was being a -bit busy (as I had some class courses and exams to work on)

          -

          I'll try do sum-up my general feelings here, and the work I've made -so far. You can also find, if ...

          - read more -

          There are comments.

          -
          -
        18. - - - - - - - -
        19. -
          -

          Sprinting on distutils2 in Tours

          -
          - -
          - -

          Yesterday, as I was traveling to Tours, I've took some time to -visit Éric, another student who's working on distutils2 this -summer, as a part of the GSoC. Basically, it was to take a drink, -discuss a bit about distutils2, our respective tasks and general -feelings, and to ...

          - read more -

          There are comments.

          -
          -
        20. - - - - - - - -
        21. - - - - - - - -
        22. - - - - - - - -
        23. - - - - - - - -
        24. -
          -

          Python ? go !

          -
          - -
          - -

          Cela fait maintenant un peu plus d'un mois que je travaille sur un -projet en django, et que, -nécessairement, je me forme à Python. Je -prends un plaisir non dissimulé à découvrir ce langage (et à -l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui -me ...

          - read more -

          There are comments.

          -
          -
        25. - - - - + +
          +

          Alexis Métaireau's thoughs

          + +
          +
          -
        -
        - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - +

        Pelican, 9 months later

        +

        or why I like opensource so much

        +

        Published on Mon 25 July 2011

        + +

        Using JPype to bridge python and Java

        +

        +

        Published on Sat 11 June 2011

        + +

        Un coup de main pour mon mémoire!

        +

        +

        Published on Wed 25 May 2011

        + +

        Analyse users' browsing context to build up a web recommender

        +

        +

        Published on Fri 01 April 2011

        + +

        Wrap up of the distutils2 paris' sprint

        +

        +

        Published on Tue 08 February 2011

        + +

        PyPI on CouchDB

        +

        +

        Published on Thu 20 January 2011

        + +

        Help me to go to the distutils2 paris' sprint

        +

        +

        Published on Sat 15 January 2011

        + +

        How to reboot your bebox using the CLI

        +

        +

        Published on Thu 21 October 2010

        + +

        Dynamically change your gnome desktop wallpaper

        +

        +

        Published on Mon 11 October 2010

        + +

        Pelican, a simple static blog generator in python

        +

        +

        Published on Wed 06 October 2010

        + +

        An amazing summer of code working on distutils2

        +

        +

        Published on Mon 16 August 2010

        + +

        Introducing the distutils2 index crawlers

        +

        +

        Published on Tue 06 July 2010

        + +

        Sprinting on distutils2 in Tours

        +

        +

        Published on Tue 06 July 2010

        + +

        Use Restructured Text (ReST) to power your presentations

        +

        +

        Published on Fri 25 June 2010

        + +

        first week working on distutils2

        +

        +

        Published on Fri 04 June 2010

        + +

        A Distutils2 GSoC

        +

        +

        Published on Sat 01 May 2010

        + +

        Python ? go !

        +

        +

        Published on Thu 17 December 2009

        + + \ No newline at end of file diff --git a/category/python.html b/category/python.html index b8eb6a4..88b74ef 100644 --- a/category/python.html +++ b/category/python.html @@ -1,198 +1,27 @@ - - + + - Alexis' log - python - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - - - - - - - - -
        -

        Other articles

        -
        -
          - - - - - - - - - -
        1. -
          -

          Using dbpedia to get languages influences

          -
          - -
          - -

          While browsing the Python's wikipedia page, I found information about the languages -influenced by python, and the languages that influenced python itself.

          -

          Well, that's kind of interesting to know which languages influenced others, -it could even be more interesting to have an overview of the connexion between -them ...

          - read more -

          There are comments.

          -
          -
        2. - - - - + +
          +

          Alexis Métaireau's thoughs

          + +
          +
          -
        -
        - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - +

        Simple test page

        +

        +

        Published on Fri 19 August 2011

        + +

        Using dbpedia to get languages influences

        +

        +

        Published on Tue 16 August 2011

        + + \ No newline at end of file diff --git a/category/system.html b/category/system.html index cfaec8f..5ed22ab 100644 --- a/category/system.html +++ b/category/system.html @@ -1,351 +1,27 @@ - - + + - Alexis' log - system - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - - - - - - - - -
        -

        Other articles

        -
        -
          - - - - - - - - - -
        1. -
          -

          How to install NGINX + PHP 5.3 on FreeBSD.

          -
          - -
          - -

          I've not managed so far to get completely rid of php, so here's a simple -reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but -that's worse to have the piece of configuration somewhere !

          -
          -# update the ports
          -$ portsnap fetch update
          -
          -# install php5 port
          -$ make ...
          - read more -

          There are comments.

          -
          -
        2. - - - - + +
          +

          Alexis Métaireau's thoughs

          + +
          +
          -
        -
        - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - +

        Working directly on your server? How to backup and sync your dev environment with unison

        +

        +

        Published on Wed 16 March 2011

        + +

        How to install NGINX + PHP 5.3 on FreeBSD.

        +

        +

        Published on Sun 10 October 2010

        + + \ No newline at end of file diff --git a/category/thoughts.html b/category/thoughts.html index fd2f272..87eba87 100644 --- a/category/thoughts.html +++ b/category/thoughts.html @@ -1,238 +1,27 @@ - - + + - Alexis' log - thoughts - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - - - - - - - - -
        -

        Other articles

        -
        -
          - - - - - - - - - -
        1. - - - - + +
          +

          Alexis Métaireau's thoughs

          + +
          +
          -
        -
        - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - +

        Travailler moins pour mieux travailler ?

        +

        +

        Published on Thu 19 May 2011

        + +

        Fork you ! or how the social coding can help you

        +

        +

        Published on Fri 05 November 2010

        + + \ No newline at end of file diff --git a/dynamically-change-your-gnome-desktop-wallpaper.html b/dynamically-change-your-gnome-desktop-wallpaper.html index b0cbdac..9972094 100644 --- a/dynamically-change-your-gnome-desktop-wallpaper.html +++ b/dynamically-change-your-gnome-desktop-wallpaper.html @@ -1,76 +1,22 @@ - - + + - Dynamically change your gnome desktop wallpaper - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Dynamically change your gnome desktop wallpaper

        -
        - -

        In gnome, you can can use a XML file to have a dynamic wallpaper. + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Dynamically change your gnome desktop wallpaper

        +

        Published on Mon 11 October 2010

        +

        In gnome, you can can use a XML file to have a dynamic wallpaper. It's not so easy, and you can't just tell: use the pictures in this folder to do so.

        You can have a look to the git repository if you want: http://github.com/ametaireau/gnome-background-generator

        @@ -114,85 +60,6 @@ optional arguments: -b, --debug
        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/feeds/all-en.atom.xml b/feeds/all-en.atom.xml index 347b4f0..f2c31a7 100644 --- a/feeds/all-en.atom.xml +++ b/feeds/all-en.atom.xml @@ -1,7 +1,7 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00ZSimple test page2011-08-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook +Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00+02:00Simple test page2011-08-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook Yeah ?</p> -Using dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between @@ -40,7 +40,7 @@ languages (and the resulting script would be easier) to do so, but the resulting graph would probably be way less readable.</p> <p>You can find the script <a class="reference external" href="https://github.com/ametaireau/experiments">on my github account</a>. Feel free to adapt it for whatever you want if you feel hackish.</p> -Pelican, 9 months later2011-07-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html/<p>Back in October, I released <a class="reference external" href="http://docs.notmyidea.org/alexis/pelican">pelican</a>, +Pelican, 9 months later2011-07-25T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html/<p>Back in October, I released <a class="reference external" href="http://docs.notmyidea.org/alexis/pelican">pelican</a>, a little piece of code I wrote to power this weblog. I had simple needs: I wanted to be able to use my text editor of choice (vim), a vcs (mercurial) and restructured text. I started to write a really simple blog engine @@ -57,7 +57,7 @@ a number of mistakes and improved a lot the codebase. This was a proof that there is a bunch of people that are willing to make better softwares just for the sake of fun.</p> <p>Thank you, guys, you're why I like open source so much.</p> -Using JPype to bridge python and Java2011-06-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html/<p>Java provides some interesting libraries that have no exact equivalent in +Using JPype to bridge python and Java2011-06-11T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html/<p>Java provides some interesting libraries that have no exact equivalent in python. In my case, the awesome boilerpipe library allows me to remove uninteresting parts of HTML pages, like menus, footers and other &quot;boilerplate&quot; contents.</p> @@ -127,7 +127,7 @@ Let's try something similar, but from python</p> extract text content from URLs and remove the <em>boilerplate</em> text easily for infuse (my master thesis project), without having to write java code, nice!</p> </div> -Un coup de main pour mon mémoire!2011-05-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html/<p>Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +Un coup de main pour mon mémoire!2011-05-25T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html/<p>Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit coup de main.</p> <p>Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent @@ -153,7 +153,7 @@ question, et c'est tout!</p> <p>A votre bon cœur ! Je récupérerais probablement des données durant les 2 prochains mois pour ensuite les analyser correctement.</p> <p>Merci pour votre aide !</p> -Travailler moins pour mieux travailler ?2011-05-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +Travailler moins pour mieux travailler ?2011-05-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que je suis assez impressionné du résultat: je suis de retour chez mes parents pour le &quot;easter break&quot; et j'en ai profité pour donner un coup aux travaux de la maison (et pour me reposer un brin!).</p> @@ -196,7 +196,7 @@ d'autant plus vrai pour moi, alors si gagner en productivité peut passer par travailler moins, pourquoi pas s'y essayer !</p> <p>Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez des retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée ?</p> -Analyse users' browsing context to build up a web recommender2011-04-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html/<p>No, this is not an april's fool ;)</p> +Analyse users' browsing context to build up a web recommender2011-04-01T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html/<p>No, this is not an april's fool ;)</p> <p>Wow, it's been a long time. My year in Oxford is going really well. I realized few days ago that the end of the year is approaching really quickly. Exams are coming in one month or such and then I'll be working full time on my dissertation topic.</p> @@ -374,7 +374,7 @@ contents as well, to do some keyword based classification will be done.</li&g </ul> <p>Lot of work on its way, yay !</p> </div> -Working directly on your server? How to backup and sync your dev environment with unison2011-03-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html/<p>I have a server running freebsd since some time now, and was wondering about +Working directly on your server? How to backup and sync your dev environment with unison2011-03-16T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html/<p>I have a server running freebsd since some time now, and was wondering about the possibility to directly have a development environment ready to use when I get a internet connexion, even if I'm not on my computer.</p> <p>Since I use vim to code, and spend most of my time in a console while @@ -525,7 +525,7 @@ content.</p> <p>A sync takes about 20s + the upload time on my machine, which stay acceptable for all of my developments.</p> </div> -Wrap up of the distutils2 paris' sprint2011-02-08T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html/<p>Finally, thanks to a bunch of people that helped me to pay my train and bus +Wrap up of the distutils2 paris' sprint2011-02-08T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html/<p>Finally, thanks to a bunch of people that helped me to pay my train and bus tickets, I've made it to paris for the distutils2 sprint.</p> <p>They have been a bit more than 10 people to come during the sprint, and it was very productive. Here's a taste of what we've been working on:</p> @@ -562,7 +562,7 @@ providing us food, and to bearstech for providing some money for breakfast and bears^Wbeers.</p> <p>Again, a big thanks to all the people who gave me money to pay the transport, I really wasn't expecting such thing to happen :-)</p> -PyPI on CouchDB2011-01-20T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html/<p>By now, there are two ways to retrieve data from PyPI (the Python Package +PyPI on CouchDB2011-01-20T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html/<p>By now, there are two ways to retrieve data from PyPI (the Python Package Index). You can both rely on xml/rpc or on the &quot;simple&quot; API. The simple API is not so simple to use as the name suggest, and have several existing drawbacks.</p> @@ -655,7 +655,7 @@ couchdb:</p> a work in progress, and everything can break at any time. However, any feedback will be appreciated !</p> </div> -Help me to go to the distutils2 paris' sprint2011-01-15T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html/<p><strong>Edit: Thanks to logilab and some amazing people, I can make it to paris for the +Help me to go to the distutils2 paris' sprint2011-01-15T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html/<p><strong>Edit: Thanks to logilab and some amazing people, I can make it to paris for the sprint. Many thanks to them for the support!</strong></p> <p>There will be a distutils2 sprint from the 27th to the 30th of january, thanks to logilab which will host the event.</p> @@ -673,7 +673,7 @@ while needed.</p> <p>If you want to contribute some money to help me go there, feel free to use this chipin page: <a class="reference external" href="http://ametaireau.chipin.com/distutils2-sprint-in-paris">http://ametaireau.chipin.com/distutils2-sprint-in-paris</a></p> <p>Thanks for your support !</p> -Fork you ! or how the social coding can help you2010-11-05T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html/<p>With <a class="reference external" href="http://github.com">github</a> and <a class="reference external" href="http://www.bitbucket.org">bitbucket</a> coming around, a lot of new usages appears for the +Fork you ! or how the social coding can help you2010-11-05T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html/<p>With <a class="reference external" href="http://github.com">github</a> and <a class="reference external" href="http://www.bitbucket.org">bitbucket</a> coming around, a lot of new usages appears for the developpers: it's now easy to get feedback on your code/modifications, and to get help from others by, for instance, forking repositories.</p> <p>Eeach time I see people helping others, I'm amazed by how we like to share @@ -774,7 +774,7 @@ look on how the programs you're using are made, consider publishing your experimentations, and share them with others, you will see, it's kind of addictive !</p> </div> -How to reboot your bebox using the CLI2010-10-21T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html/<p>I've an internet connection which, for some obscure reasons, tend to be very +How to reboot your bebox using the CLI2010-10-21T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html/<p>I've an internet connection which, for some obscure reasons, tend to be very slow from time to time. After rebooting the box (yes, that's a hard solution), all the things seems to go fine again.</p> <div class="section" id="edit-using-grep"> @@ -823,7 +823,7 @@ command line tools curl, grep and tail (but really harder to read).</p> <span class="n">reboot</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">password</span><span class="p">)</span> </pre></div> </div> -Dynamically change your gnome desktop wallpaper2010-10-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html/<p>In gnome, you can can use a XML file to have a dynamic wallpaper. +Dynamically change your gnome desktop wallpaper2010-10-11T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html/<p>In gnome, you can can use a XML file to have a dynamic wallpaper. It's not so easy, and you can't just tell: use the pictures in this folder to do so.</p> <p>You can have a look to the git repository if you want: <a class="reference external" href="http://github.com/ametaireau/gnome-background-generator">http://github.com/ametaireau/gnome-background-generator</a></p> @@ -866,7 +866,7 @@ optional arguments: properties -b, --debug </pre></div> -How to install NGINX + PHP 5.3 on FreeBSD.2010-10-10T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html/<p>I've not managed so far to get completely rid of php, so here's a simple +How to install NGINX + PHP 5.3 on FreeBSD.2010-10-10T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html/<p>I've not managed so far to get completely rid of php, so here's a simple reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but that's worse to have the piece of configuration somewhere !</p> <pre class="literal-block"> @@ -913,7 +913,7 @@ upstream backend { } </pre> <p>And that's it !</p> -Pelican, a simple static blog generator in python2010-10-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html/<p>Those days, I've wrote a little python application to fit my blogging needs. +Pelican, a simple static blog generator in python2010-10-06T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html/<p>Those days, I've wrote a little python application to fit my blogging needs. I'm an occasional blogger, a vim lover, I like restructured text and DVCSes, so I've made a little tool that makes good use of all that.</p> <p><a class="reference external" href="http://alexis.notmyidea.org/pelican/">Pelican</a> (for calepin) is just a simple tool to generate your blog as static @@ -974,7 +974,7 @@ optional arguments: </pre></div> <p>Enjoy :)</p> </div> -An amazing summer of code working on distutils22010-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html/<p>The <a class="reference external" href="http://code.google.com/soc/">Google Summer of Code</a> I've +An amazing summer of code working on distutils22010-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html/<p>The <a class="reference external" href="http://code.google.com/soc/">Google Summer of Code</a> I've spent working on <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> is over. It was a really amazing experience, for many reasons.</p> <p>First of all, we had a very good team, we were 5 students working @@ -1117,7 +1117,7 @@ for setting up such an initiative. If you're a student, if you're interested about FOSS, dont hesitate any second, it's a really good opportunity to work on interesting projects!</p> </div> -Introducing the distutils2 index crawlers2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html/<p>I'm working for about a month for distutils2, even if I was being a +Introducing the distutils2 index crawlers2010-07-06T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html/<p>I'm working for about a month for distutils2, even if I was being a bit busy (as I had some class courses and exams to work on)</p> <p>I'll try do sum-up my general feelings here, and the work I've made so far. You can also find, if you're interested, my weekly @@ -1236,7 +1236,7 @@ the goal is to be sure everything will be ready in time, for the end of the summer. (And now, I need to learn to follow schedules ...)</p> </div> -Sprinting on distutils2 in Tours2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html/<p>Yesterday, as I was traveling to Tours, I've took some time to +Sprinting on distutils2 in Tours2010-07-06T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html/<p>Yesterday, as I was traveling to Tours, I've took some time to visit Éric, another student who's working on distutils2 this summer, as a part of the GSoC. Basically, it was to take a drink, discuss a bit about distutils2, our respective tasks and general @@ -1317,7 +1317,7 @@ distutils2, and to have a bullet list of things to do, but days like this one are opportunities to catch ! We'll probably do another sprint in a few weeks, stay tuned !</p> </div> -Use Restructured Text (ReST) to power your presentations2010-06-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html/<p>Wednesday, we give a presentation, with some friends, about the +Use Restructured Text (ReST) to power your presentations2010-06-25T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html/<p>Wednesday, we give a presentation, with some friends, about the CouchDB Database, to <a class="reference external" href="http://www.toulibre.org">the Toulouse local LUG</a>. Thanks a lot to all the presents for being there, it was a pleasure to talk @@ -1344,7 +1344,7 @@ and the command line to generate the PDF:</p> <pre class="literal-block"> rst2pdf couchdb.rst -b1 -s ../slides.style </pre> -first week working on distutils22010-06-04T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html/<p>As I've been working on +first week working on distutils22010-06-04T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html/<p>As I've been working on <a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a> during the past week, taking part of the <a class="reference external" href="http://code.google.com/intl/fr/soc/">GSOC</a> program, here is a @@ -1415,7 +1415,7 @@ to make this clear.</p> <a class="reference external" href="http://github.com/ametaireau/pypiclient">already started here</a> I'll take you updated !</p> </div> -A Distutils2 GSoC2010-05-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html/<p>WOW. I've been accepted to be a part of the +A Distutils2 GSoC2010-05-01T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html/<p>WOW. I've been accepted to be a part of the <a class="reference external" href="http://code.google.com/intl/fr/soc/">Google Summer Of Code</a> program, and will work on <a class="reference external" href="http://python.org/">python</a> <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a>, with @@ -1446,7 +1446,7 @@ Here are the already defined tasks:</p> to apply all good practice, among other things that can make a developper-life joyful. I'll post here, each week, my advancement, and my tought about python and especialy python packaging world.</p> -Le temps des grâces, courrez-y !2010-03-28T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html/<p>Ouf, notre +Le temps des grâces, courrez-y !2010-03-28T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html/<p>Ouf, notre <a class="reference external" href="http://www.reseaugrappe.org">semaine de l'environnement</a> s'est terminée, après un peu de neige et un brin de soleil quand il en fallait.</p> @@ -1506,7 +1506,7 @@ monde agricole français, tout en proposant des alternatives qui pourraient être utilisée, si les pouvoirs publics lâchaient un peu la main des lobbys. Passionnant, vraiment.</blockquote> <p>Courrez-y, je vous dis.</p> -Semaine de l’environnement: La consommation étudiante2010-02-24T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html/<p>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a class="reference external" href="http://www.framasoft.net/">Framasoft</a>, à <a class="reference external" href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a class="reference external" href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l'informatique), mais aussi <a class="reference external" href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a class="reference external" href="http://www.attac.org/">ATTAC</a> (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.</p> +Semaine de l’environnement: La consommation étudiante2010-02-24T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html/<p>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a class="reference external" href="http://www.framasoft.net/">Framasoft</a>, à <a class="reference external" href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a class="reference external" href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l'informatique), mais aussi <a class="reference external" href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a class="reference external" href="http://www.attac.org/">ATTAC</a> (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.</p> <p>Dans cette optique, depuis près de 3 ans (déjà !), au sein du <a class="reference external" href="http://www.reseaugrappe.org">réseau GRAPPE</a>, on <em>essaye</em> d'aborder des thématiques qui touchent de près ou de loin à @@ -1546,7 +1546,7 @@ que vous pouvez compléter en une petite 10aine de minutes, n'hésitez pas ! <a class="reference external" href="http://www.reseaugrappe.org/consommation/">La page sur la consommation étudiante sur le site du GRAPPE</a></p> </div> -Python ? go !2009-12-17T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-12-17:/python-go.html/<p>Cela fait maintenant un peu plus d'un mois que je travaille sur un +Python ? go !2009-12-17T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2009-12-17:/python-go.html/<p>Cela fait maintenant un peu plus d'un mois que je travaille sur un projet en <a class="reference external" href="http://www.djangoproject.org">django</a>, et que, nécessairement, je me forme à <a class="reference external" href="http://python.org/">Python</a>. Je prends un plaisir non dissimulé à découvrir ce langage (et à @@ -1647,7 +1647,7 @@ dynamique.</li> <a class="reference external" href="http://video.pycon.fr/videos/free/53/">l'atelier donné par Victor Stinner durant le Pyconfr 09</a>. Have fun !</p> </div> -AMAP + Média = Paniers bio à 5e ?!2009-11-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html/<p>Le raccourci me semble un peu rapide. Et pourtant, il est emprunté +AMAP + Média = Paniers bio à 5e ?!2009-11-11T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html/<p>Le raccourci me semble un peu rapide. Et pourtant, il est emprunté bien trop souvent. La dernière <em>mes-utilisation</em> que j'ai à décrier est celle d'un reportage télé, passé sur France 2 vendredi 23 Octobre diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index a9457b3..18fa1a3 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -1,7 +1,7 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00ZSimple test page2011-08-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook +Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00+02:00Simple test page2011-08-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook Yeah ?</p> -Using dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between @@ -40,7 +40,7 @@ languages (and the resulting script would be easier) to do so, but the resulting graph would probably be way less readable.</p> <p>You can find the script <a class="reference external" href="https://github.com/ametaireau/experiments">on my github account</a>. Feel free to adapt it for whatever you want if you feel hackish.</p> -Pelican, 9 months later2011-07-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html/<p>Back in October, I released <a class="reference external" href="http://docs.notmyidea.org/alexis/pelican">pelican</a>, +Pelican, 9 months later2011-07-25T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html/<p>Back in October, I released <a class="reference external" href="http://docs.notmyidea.org/alexis/pelican">pelican</a>, a little piece of code I wrote to power this weblog. I had simple needs: I wanted to be able to use my text editor of choice (vim), a vcs (mercurial) and restructured text. I started to write a really simple blog engine @@ -57,7 +57,7 @@ a number of mistakes and improved a lot the codebase. This was a proof that there is a bunch of people that are willing to make better softwares just for the sake of fun.</p> <p>Thank you, guys, you're why I like open source so much.</p> -Using JPype to bridge python and Java2011-06-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html/<p>Java provides some interesting libraries that have no exact equivalent in +Using JPype to bridge python and Java2011-06-11T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html/<p>Java provides some interesting libraries that have no exact equivalent in python. In my case, the awesome boilerpipe library allows me to remove uninteresting parts of HTML pages, like menus, footers and other &quot;boilerplate&quot; contents.</p> @@ -127,7 +127,7 @@ Let's try something similar, but from python</p> extract text content from URLs and remove the <em>boilerplate</em> text easily for infuse (my master thesis project), without having to write java code, nice!</p> </div> -Un coup de main pour mon mémoire!2011-05-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html/<p>Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +Un coup de main pour mon mémoire!2011-05-25T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html/<p>Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit coup de main.</p> <p>Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent @@ -153,7 +153,7 @@ question, et c'est tout!</p> <p>A votre bon cœur ! Je récupérerais probablement des données durant les 2 prochains mois pour ensuite les analyser correctement.</p> <p>Merci pour votre aide !</p> -Travailler moins pour mieux travailler ?2011-05-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +Travailler moins pour mieux travailler ?2011-05-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que je suis assez impressionné du résultat: je suis de retour chez mes parents pour le &quot;easter break&quot; et j'en ai profité pour donner un coup aux travaux de la maison (et pour me reposer un brin!).</p> @@ -196,7 +196,7 @@ d'autant plus vrai pour moi, alors si gagner en productivité peut passer par travailler moins, pourquoi pas s'y essayer !</p> <p>Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez des retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée ?</p> -Analyse users' browsing context to build up a web recommender2011-04-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html/<p>No, this is not an april's fool ;)</p> +Analyse users' browsing context to build up a web recommender2011-04-01T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html/<p>No, this is not an april's fool ;)</p> <p>Wow, it's been a long time. My year in Oxford is going really well. I realized few days ago that the end of the year is approaching really quickly. Exams are coming in one month or such and then I'll be working full time on my dissertation topic.</p> @@ -374,7 +374,7 @@ contents as well, to do some keyword based classification will be done.</li&g </ul> <p>Lot of work on its way, yay !</p> </div> -Working directly on your server? How to backup and sync your dev environment with unison2011-03-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html/<p>I have a server running freebsd since some time now, and was wondering about +Working directly on your server? How to backup and sync your dev environment with unison2011-03-16T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html/<p>I have a server running freebsd since some time now, and was wondering about the possibility to directly have a development environment ready to use when I get a internet connexion, even if I'm not on my computer.</p> <p>Since I use vim to code, and spend most of my time in a console while @@ -525,7 +525,7 @@ content.</p> <p>A sync takes about 20s + the upload time on my machine, which stay acceptable for all of my developments.</p> </div> -Wrap up of the distutils2 paris' sprint2011-02-08T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html/<p>Finally, thanks to a bunch of people that helped me to pay my train and bus +Wrap up of the distutils2 paris' sprint2011-02-08T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html/<p>Finally, thanks to a bunch of people that helped me to pay my train and bus tickets, I've made it to paris for the distutils2 sprint.</p> <p>They have been a bit more than 10 people to come during the sprint, and it was very productive. Here's a taste of what we've been working on:</p> @@ -562,7 +562,7 @@ providing us food, and to bearstech for providing some money for breakfast and bears^Wbeers.</p> <p>Again, a big thanks to all the people who gave me money to pay the transport, I really wasn't expecting such thing to happen :-)</p> -PyPI on CouchDB2011-01-20T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html/<p>By now, there are two ways to retrieve data from PyPI (the Python Package +PyPI on CouchDB2011-01-20T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html/<p>By now, there are two ways to retrieve data from PyPI (the Python Package Index). You can both rely on xml/rpc or on the &quot;simple&quot; API. The simple API is not so simple to use as the name suggest, and have several existing drawbacks.</p> @@ -655,7 +655,7 @@ couchdb:</p> a work in progress, and everything can break at any time. However, any feedback will be appreciated !</p> </div> -Help me to go to the distutils2 paris' sprint2011-01-15T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html/<p><strong>Edit: Thanks to logilab and some amazing people, I can make it to paris for the +Help me to go to the distutils2 paris' sprint2011-01-15T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html/<p><strong>Edit: Thanks to logilab and some amazing people, I can make it to paris for the sprint. Many thanks to them for the support!</strong></p> <p>There will be a distutils2 sprint from the 27th to the 30th of january, thanks to logilab which will host the event.</p> @@ -673,7 +673,7 @@ while needed.</p> <p>If you want to contribute some money to help me go there, feel free to use this chipin page: <a class="reference external" href="http://ametaireau.chipin.com/distutils2-sprint-in-paris">http://ametaireau.chipin.com/distutils2-sprint-in-paris</a></p> <p>Thanks for your support !</p> -Fork you ! or how the social coding can help you2010-11-05T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html/<p>With <a class="reference external" href="http://github.com">github</a> and <a class="reference external" href="http://www.bitbucket.org">bitbucket</a> coming around, a lot of new usages appears for the +Fork you ! or how the social coding can help you2010-11-05T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html/<p>With <a class="reference external" href="http://github.com">github</a> and <a class="reference external" href="http://www.bitbucket.org">bitbucket</a> coming around, a lot of new usages appears for the developpers: it's now easy to get feedback on your code/modifications, and to get help from others by, for instance, forking repositories.</p> <p>Eeach time I see people helping others, I'm amazed by how we like to share @@ -774,7 +774,7 @@ look on how the programs you're using are made, consider publishing your experimentations, and share them with others, you will see, it's kind of addictive !</p> </div> -How to reboot your bebox using the CLI2010-10-21T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html/<p>I've an internet connection which, for some obscure reasons, tend to be very +How to reboot your bebox using the CLI2010-10-21T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html/<p>I've an internet connection which, for some obscure reasons, tend to be very slow from time to time. After rebooting the box (yes, that's a hard solution), all the things seems to go fine again.</p> <div class="section" id="edit-using-grep"> @@ -823,7 +823,7 @@ command line tools curl, grep and tail (but really harder to read).</p> <span class="n">reboot</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">password</span><span class="p">)</span> </pre></div> </div> -Dynamically change your gnome desktop wallpaper2010-10-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html/<p>In gnome, you can can use a XML file to have a dynamic wallpaper. +Dynamically change your gnome desktop wallpaper2010-10-11T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html/<p>In gnome, you can can use a XML file to have a dynamic wallpaper. It's not so easy, and you can't just tell: use the pictures in this folder to do so.</p> <p>You can have a look to the git repository if you want: <a class="reference external" href="http://github.com/ametaireau/gnome-background-generator">http://github.com/ametaireau/gnome-background-generator</a></p> @@ -866,7 +866,7 @@ optional arguments: properties -b, --debug </pre></div> -How to install NGINX + PHP 5.3 on FreeBSD.2010-10-10T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html/<p>I've not managed so far to get completely rid of php, so here's a simple +How to install NGINX + PHP 5.3 on FreeBSD.2010-10-10T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html/<p>I've not managed so far to get completely rid of php, so here's a simple reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but that's worse to have the piece of configuration somewhere !</p> <pre class="literal-block"> @@ -913,7 +913,7 @@ upstream backend { } </pre> <p>And that's it !</p> -Pelican, a simple static blog generator in python2010-10-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html/<p>Those days, I've wrote a little python application to fit my blogging needs. +Pelican, a simple static blog generator in python2010-10-06T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html/<p>Those days, I've wrote a little python application to fit my blogging needs. I'm an occasional blogger, a vim lover, I like restructured text and DVCSes, so I've made a little tool that makes good use of all that.</p> <p><a class="reference external" href="http://alexis.notmyidea.org/pelican/">Pelican</a> (for calepin) is just a simple tool to generate your blog as static @@ -974,7 +974,7 @@ optional arguments: </pre></div> <p>Enjoy :)</p> </div> -An amazing summer of code working on distutils22010-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html/<p>The <a class="reference external" href="http://code.google.com/soc/">Google Summer of Code</a> I've +An amazing summer of code working on distutils22010-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html/<p>The <a class="reference external" href="http://code.google.com/soc/">Google Summer of Code</a> I've spent working on <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> is over. It was a really amazing experience, for many reasons.</p> <p>First of all, we had a very good team, we were 5 students working @@ -1117,7 +1117,7 @@ for setting up such an initiative. If you're a student, if you're interested about FOSS, dont hesitate any second, it's a really good opportunity to work on interesting projects!</p> </div> -Introducing the distutils2 index crawlers2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html/<p>I'm working for about a month for distutils2, even if I was being a +Introducing the distutils2 index crawlers2010-07-06T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html/<p>I'm working for about a month for distutils2, even if I was being a bit busy (as I had some class courses and exams to work on)</p> <p>I'll try do sum-up my general feelings here, and the work I've made so far. You can also find, if you're interested, my weekly @@ -1236,7 +1236,7 @@ the goal is to be sure everything will be ready in time, for the end of the summer. (And now, I need to learn to follow schedules ...)</p> </div> -Sprinting on distutils2 in Tours2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html/<p>Yesterday, as I was traveling to Tours, I've took some time to +Sprinting on distutils2 in Tours2010-07-06T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html/<p>Yesterday, as I was traveling to Tours, I've took some time to visit Éric, another student who's working on distutils2 this summer, as a part of the GSoC. Basically, it was to take a drink, discuss a bit about distutils2, our respective tasks and general @@ -1317,7 +1317,7 @@ distutils2, and to have a bullet list of things to do, but days like this one are opportunities to catch ! We'll probably do another sprint in a few weeks, stay tuned !</p> </div> -Use Restructured Text (ReST) to power your presentations2010-06-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html/<p>Wednesday, we give a presentation, with some friends, about the +Use Restructured Text (ReST) to power your presentations2010-06-25T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html/<p>Wednesday, we give a presentation, with some friends, about the CouchDB Database, to <a class="reference external" href="http://www.toulibre.org">the Toulouse local LUG</a>. Thanks a lot to all the presents for being there, it was a pleasure to talk @@ -1344,7 +1344,7 @@ and the command line to generate the PDF:</p> <pre class="literal-block"> rst2pdf couchdb.rst -b1 -s ../slides.style </pre> -first week working on distutils22010-06-04T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html/<p>As I've been working on +first week working on distutils22010-06-04T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html/<p>As I've been working on <a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a> during the past week, taking part of the <a class="reference external" href="http://code.google.com/intl/fr/soc/">GSOC</a> program, here is a @@ -1415,7 +1415,7 @@ to make this clear.</p> <a class="reference external" href="http://github.com/ametaireau/pypiclient">already started here</a> I'll take you updated !</p> </div> -A Distutils2 GSoC2010-05-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html/<p>WOW. I've been accepted to be a part of the +A Distutils2 GSoC2010-05-01T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html/<p>WOW. I've been accepted to be a part of the <a class="reference external" href="http://code.google.com/intl/fr/soc/">Google Summer Of Code</a> program, and will work on <a class="reference external" href="http://python.org/">python</a> <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a>, with @@ -1446,7 +1446,7 @@ Here are the already defined tasks:</p> to apply all good practice, among other things that can make a developper-life joyful. I'll post here, each week, my advancement, and my tought about python and especialy python packaging world.</p> -Le temps des grâces, courrez-y !2010-03-28T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html/<p>Ouf, notre +Le temps des grâces, courrez-y !2010-03-28T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html/<p>Ouf, notre <a class="reference external" href="http://www.reseaugrappe.org">semaine de l'environnement</a> s'est terminée, après un peu de neige et un brin de soleil quand il en fallait.</p> @@ -1506,7 +1506,7 @@ monde agricole français, tout en proposant des alternatives qui pourraient être utilisée, si les pouvoirs publics lâchaient un peu la main des lobbys. Passionnant, vraiment.</blockquote> <p>Courrez-y, je vous dis.</p> -Semaine de l’environnement: La consommation étudiante2010-02-24T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html/<p>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a class="reference external" href="http://www.framasoft.net/">Framasoft</a>, à <a class="reference external" href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a class="reference external" href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l'informatique), mais aussi <a class="reference external" href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a class="reference external" href="http://www.attac.org/">ATTAC</a> (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.</p> +Semaine de l’environnement: La consommation étudiante2010-02-24T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html/<p>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a class="reference external" href="http://www.framasoft.net/">Framasoft</a>, à <a class="reference external" href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a class="reference external" href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l'informatique), mais aussi <a class="reference external" href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a class="reference external" href="http://www.attac.org/">ATTAC</a> (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.</p> <p>Dans cette optique, depuis près de 3 ans (déjà !), au sein du <a class="reference external" href="http://www.reseaugrappe.org">réseau GRAPPE</a>, on <em>essaye</em> d'aborder des thématiques qui touchent de près ou de loin à @@ -1546,7 +1546,7 @@ que vous pouvez compléter en une petite 10aine de minutes, n'hésitez pas ! <a class="reference external" href="http://www.reseaugrappe.org/consommation/">La page sur la consommation étudiante sur le site du GRAPPE</a></p> </div> -Python ? go !2009-12-17T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-12-17:/python-go.html/<p>Cela fait maintenant un peu plus d'un mois que je travaille sur un +Python ? go !2009-12-17T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2009-12-17:/python-go.html/<p>Cela fait maintenant un peu plus d'un mois que je travaille sur un projet en <a class="reference external" href="http://www.djangoproject.org">django</a>, et que, nécessairement, je me forme à <a class="reference external" href="http://python.org/">Python</a>. Je prends un plaisir non dissimulé à découvrir ce langage (et à @@ -1647,7 +1647,7 @@ dynamique.</li> <a class="reference external" href="http://video.pycon.fr/videos/free/53/">l'atelier donné par Victor Stinner durant le Pyconfr 09</a>. Have fun !</p> </div> -AMAP + Média = Paniers bio à 5e ?!2009-11-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html/<p>Le raccourci me semble un peu rapide. Et pourtant, il est emprunté +AMAP + Média = Paniers bio à 5e ?!2009-11-11T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html/<p>Le raccourci me semble un peu rapide. Et pourtant, il est emprunté bien trop souvent. La dernière <em>mes-utilisation</em> que j'ai à décrier est celle d'un reportage télé, passé sur France 2 vendredi 23 Octobre diff --git a/feeds/asso.atom.xml b/feeds/asso.atom.xml index 7e4621c..7117966 100644 --- a/feeds/asso.atom.xml +++ b/feeds/asso.atom.xml @@ -1,5 +1,5 @@ -Alexis' loghttp://blog.notmyidea.org2010-03-28T00:00:00ZLe temps des grâces, courrez-y !2010-03-28T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html/<p>Ouf, notre +Alexis' loghttp://blog.notmyidea.org2010-03-28T00:00:00+01:00Le temps des grâces, courrez-y !2010-03-28T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html/<p>Ouf, notre <a class="reference external" href="http://www.reseaugrappe.org">semaine de l'environnement</a> s'est terminée, après un peu de neige et un brin de soleil quand il en fallait.</p> @@ -59,7 +59,7 @@ monde agricole français, tout en proposant des alternatives qui pourraient être utilisée, si les pouvoirs publics lâchaient un peu la main des lobbys. Passionnant, vraiment.</blockquote> <p>Courrez-y, je vous dis.</p> -Semaine de l’environnement: La consommation étudiante2010-02-24T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html/<p>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a class="reference external" href="http://www.framasoft.net/">Framasoft</a>, à <a class="reference external" href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a class="reference external" href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l'informatique), mais aussi <a class="reference external" href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a class="reference external" href="http://www.attac.org/">ATTAC</a> (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.</p> +Semaine de l’environnement: La consommation étudiante2010-02-24T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html/<p>Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à <a class="reference external" href="http://www.framasoft.net/">Framasoft</a>, à <a class="reference external" href="http://www.laquadrature.net/">la Quadrature du net</a> ou à <a class="reference external" href="http://www.arsindustrialis.org/">Ars Industrialis</a> (dans le domaine de la science et de l'informatique), mais aussi <a class="reference external" href="http://www.amisdelaterre.org/">aux Amis de la Terre</a>, à <a class="reference external" href="http://www.attac.org/">ATTAC</a> (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.</p> <p>Dans cette optique, depuis près de 3 ans (déjà !), au sein du <a class="reference external" href="http://www.reseaugrappe.org">réseau GRAPPE</a>, on <em>essaye</em> d'aborder des thématiques qui touchent de près ou de loin à @@ -99,7 +99,7 @@ que vous pouvez compléter en une petite 10aine de minutes, n'hésitez pas ! <a class="reference external" href="http://www.reseaugrappe.org/consommation/">La page sur la consommation étudiante sur le site du GRAPPE</a></p> </div> -AMAP + Média = Paniers bio à 5e ?!2009-11-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html/<p>Le raccourci me semble un peu rapide. Et pourtant, il est emprunté +AMAP + Média = Paniers bio à 5e ?!2009-11-11T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html/<p>Le raccourci me semble un peu rapide. Et pourtant, il est emprunté bien trop souvent. La dernière <em>mes-utilisation</em> que j'ai à décrier est celle d'un reportage télé, passé sur France 2 vendredi 23 Octobre diff --git a/feeds/dev.atom.xml b/feeds/dev.atom.xml index 20be302..24e722f 100644 --- a/feeds/dev.atom.xml +++ b/feeds/dev.atom.xml @@ -1,5 +1,5 @@ -Alexis' loghttp://blog.notmyidea.org2011-07-25T00:00:00ZPelican, 9 months later2011-07-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html/<p>Back in October, I released <a class="reference external" href="http://docs.notmyidea.org/alexis/pelican">pelican</a>, +Alexis' loghttp://blog.notmyidea.org2011-07-25T00:00:00+02:00Pelican, 9 months later2011-07-25T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html/<p>Back in October, I released <a class="reference external" href="http://docs.notmyidea.org/alexis/pelican">pelican</a>, a little piece of code I wrote to power this weblog. I had simple needs: I wanted to be able to use my text editor of choice (vim), a vcs (mercurial) and restructured text. I started to write a really simple blog engine @@ -16,7 +16,7 @@ a number of mistakes and improved a lot the codebase. This was a proof that there is a bunch of people that are willing to make better softwares just for the sake of fun.</p> <p>Thank you, guys, you're why I like open source so much.</p> -Using JPype to bridge python and Java2011-06-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html/<p>Java provides some interesting libraries that have no exact equivalent in +Using JPype to bridge python and Java2011-06-11T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html/<p>Java provides some interesting libraries that have no exact equivalent in python. In my case, the awesome boilerpipe library allows me to remove uninteresting parts of HTML pages, like menus, footers and other &quot;boilerplate&quot; contents.</p> @@ -86,7 +86,7 @@ Let's try something similar, but from python</p> extract text content from URLs and remove the <em>boilerplate</em> text easily for infuse (my master thesis project), without having to write java code, nice!</p> </div> -Un coup de main pour mon mémoire!2011-05-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html/<p>Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. +Un coup de main pour mon mémoire!2011-05-25T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html/<p>Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit coup de main.</p> <p>Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent @@ -112,7 +112,7 @@ question, et c'est tout!</p> <p>A votre bon cœur ! Je récupérerais probablement des données durant les 2 prochains mois pour ensuite les analyser correctement.</p> <p>Merci pour votre aide !</p> -Analyse users' browsing context to build up a web recommender2011-04-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html/<p>No, this is not an april's fool ;)</p> +Analyse users' browsing context to build up a web recommender2011-04-01T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html/<p>No, this is not an april's fool ;)</p> <p>Wow, it's been a long time. My year in Oxford is going really well. I realized few days ago that the end of the year is approaching really quickly. Exams are coming in one month or such and then I'll be working full time on my dissertation topic.</p> @@ -290,7 +290,7 @@ contents as well, to do some keyword based classification will be done.</li&g </ul> <p>Lot of work on its way, yay !</p> </div> -Wrap up of the distutils2 paris' sprint2011-02-08T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html/<p>Finally, thanks to a bunch of people that helped me to pay my train and bus +Wrap up of the distutils2 paris' sprint2011-02-08T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html/<p>Finally, thanks to a bunch of people that helped me to pay my train and bus tickets, I've made it to paris for the distutils2 sprint.</p> <p>They have been a bit more than 10 people to come during the sprint, and it was very productive. Here's a taste of what we've been working on:</p> @@ -327,7 +327,7 @@ providing us food, and to bearstech for providing some money for breakfast and bears^Wbeers.</p> <p>Again, a big thanks to all the people who gave me money to pay the transport, I really wasn't expecting such thing to happen :-)</p> -PyPI on CouchDB2011-01-20T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html/<p>By now, there are two ways to retrieve data from PyPI (the Python Package +PyPI on CouchDB2011-01-20T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html/<p>By now, there are two ways to retrieve data from PyPI (the Python Package Index). You can both rely on xml/rpc or on the &quot;simple&quot; API. The simple API is not so simple to use as the name suggest, and have several existing drawbacks.</p> @@ -420,7 +420,7 @@ couchdb:</p> a work in progress, and everything can break at any time. However, any feedback will be appreciated !</p> </div> -Help me to go to the distutils2 paris' sprint2011-01-15T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html/<p><strong>Edit: Thanks to logilab and some amazing people, I can make it to paris for the +Help me to go to the distutils2 paris' sprint2011-01-15T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html/<p><strong>Edit: Thanks to logilab and some amazing people, I can make it to paris for the sprint. Many thanks to them for the support!</strong></p> <p>There will be a distutils2 sprint from the 27th to the 30th of january, thanks to logilab which will host the event.</p> @@ -438,7 +438,7 @@ while needed.</p> <p>If you want to contribute some money to help me go there, feel free to use this chipin page: <a class="reference external" href="http://ametaireau.chipin.com/distutils2-sprint-in-paris">http://ametaireau.chipin.com/distutils2-sprint-in-paris</a></p> <p>Thanks for your support !</p> -How to reboot your bebox using the CLI2010-10-21T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html/<p>I've an internet connection which, for some obscure reasons, tend to be very +How to reboot your bebox using the CLI2010-10-21T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html/<p>I've an internet connection which, for some obscure reasons, tend to be very slow from time to time. After rebooting the box (yes, that's a hard solution), all the things seems to go fine again.</p> <div class="section" id="edit-using-grep"> @@ -487,7 +487,7 @@ command line tools curl, grep and tail (but really harder to read).</p> <span class="n">reboot</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">password</span><span class="p">)</span> </pre></div> </div> -Dynamically change your gnome desktop wallpaper2010-10-11T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html/<p>In gnome, you can can use a XML file to have a dynamic wallpaper. +Dynamically change your gnome desktop wallpaper2010-10-11T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html/<p>In gnome, you can can use a XML file to have a dynamic wallpaper. It's not so easy, and you can't just tell: use the pictures in this folder to do so.</p> <p>You can have a look to the git repository if you want: <a class="reference external" href="http://github.com/ametaireau/gnome-background-generator">http://github.com/ametaireau/gnome-background-generator</a></p> @@ -530,7 +530,7 @@ optional arguments: properties -b, --debug </pre></div> -Pelican, a simple static blog generator in python2010-10-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html/<p>Those days, I've wrote a little python application to fit my blogging needs. +Pelican, a simple static blog generator in python2010-10-06T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html/<p>Those days, I've wrote a little python application to fit my blogging needs. I'm an occasional blogger, a vim lover, I like restructured text and DVCSes, so I've made a little tool that makes good use of all that.</p> <p><a class="reference external" href="http://alexis.notmyidea.org/pelican/">Pelican</a> (for calepin) is just a simple tool to generate your blog as static @@ -591,7 +591,7 @@ optional arguments: </pre></div> <p>Enjoy :)</p> </div> -An amazing summer of code working on distutils22010-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html/<p>The <a class="reference external" href="http://code.google.com/soc/">Google Summer of Code</a> I've +An amazing summer of code working on distutils22010-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html/<p>The <a class="reference external" href="http://code.google.com/soc/">Google Summer of Code</a> I've spent working on <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a> is over. It was a really amazing experience, for many reasons.</p> <p>First of all, we had a very good team, we were 5 students working @@ -734,7 +734,7 @@ for setting up such an initiative. If you're a student, if you're interested about FOSS, dont hesitate any second, it's a really good opportunity to work on interesting projects!</p> </div> -Introducing the distutils2 index crawlers2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html/<p>I'm working for about a month for distutils2, even if I was being a +Introducing the distutils2 index crawlers2010-07-06T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html/<p>I'm working for about a month for distutils2, even if I was being a bit busy (as I had some class courses and exams to work on)</p> <p>I'll try do sum-up my general feelings here, and the work I've made so far. You can also find, if you're interested, my weekly @@ -853,7 +853,7 @@ the goal is to be sure everything will be ready in time, for the end of the summer. (And now, I need to learn to follow schedules ...)</p> </div> -Sprinting on distutils2 in Tours2010-07-06T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html/<p>Yesterday, as I was traveling to Tours, I've took some time to +Sprinting on distutils2 in Tours2010-07-06T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html/<p>Yesterday, as I was traveling to Tours, I've took some time to visit Éric, another student who's working on distutils2 this summer, as a part of the GSoC. Basically, it was to take a drink, discuss a bit about distutils2, our respective tasks and general @@ -934,7 +934,7 @@ distutils2, and to have a bullet list of things to do, but days like this one are opportunities to catch ! We'll probably do another sprint in a few weeks, stay tuned !</p> </div> -Use Restructured Text (ReST) to power your presentations2010-06-25T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html/<p>Wednesday, we give a presentation, with some friends, about the +Use Restructured Text (ReST) to power your presentations2010-06-25T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html/<p>Wednesday, we give a presentation, with some friends, about the CouchDB Database, to <a class="reference external" href="http://www.toulibre.org">the Toulouse local LUG</a>. Thanks a lot to all the presents for being there, it was a pleasure to talk @@ -961,7 +961,7 @@ and the command line to generate the PDF:</p> <pre class="literal-block"> rst2pdf couchdb.rst -b1 -s ../slides.style </pre> -first week working on distutils22010-06-04T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html/<p>As I've been working on +first week working on distutils22010-06-04T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html/<p>As I've been working on <a class="reference external" href="http://hg.python.org/distutils2/">Distutils2</a> during the past week, taking part of the <a class="reference external" href="http://code.google.com/intl/fr/soc/">GSOC</a> program, here is a @@ -1032,7 +1032,7 @@ to make this clear.</p> <a class="reference external" href="http://github.com/ametaireau/pypiclient">already started here</a> I'll take you updated !</p> </div> -A Distutils2 GSoC2010-05-01T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html/<p>WOW. I've been accepted to be a part of the +A Distutils2 GSoC2010-05-01T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html/<p>WOW. I've been accepted to be a part of the <a class="reference external" href="http://code.google.com/intl/fr/soc/">Google Summer Of Code</a> program, and will work on <a class="reference external" href="http://python.org/">python</a> <a class="reference external" href="http://hg.python.org/distutils2/">distutils2</a>, with @@ -1063,7 +1063,7 @@ Here are the already defined tasks:</p> to apply all good practice, among other things that can make a developper-life joyful. I'll post here, each week, my advancement, and my tought about python and especialy python packaging world.</p> -Python ? go !2009-12-17T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2009-12-17:/python-go.html/<p>Cela fait maintenant un peu plus d'un mois que je travaille sur un +Python ? go !2009-12-17T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2009-12-17:/python-go.html/<p>Cela fait maintenant un peu plus d'un mois que je travaille sur un projet en <a class="reference external" href="http://www.djangoproject.org">django</a>, et que, nécessairement, je me forme à <a class="reference external" href="http://python.org/">Python</a>. Je prends un plaisir non dissimulé à découvrir ce langage (et à diff --git a/feeds/python.atom.xml b/feeds/python.atom.xml index d2dec34..fd7b163 100644 --- a/feeds/python.atom.xml +++ b/feeds/python.atom.xml @@ -1,7 +1,7 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00ZSimple test page2011-08-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook +Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00+02:00Simple test page2011-08-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook Yeah ?</p> -Using dbpedia to get languages influences2011-08-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/feeds/system.atom.xml b/feeds/system.atom.xml index c0d7840..2742fbf 100644 --- a/feeds/system.atom.xml +++ b/feeds/system.atom.xml @@ -1,5 +1,5 @@ -Alexis' loghttp://blog.notmyidea.org2011-03-16T00:00:00ZWorking directly on your server? How to backup and sync your dev environment with unison2011-03-16T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html/<p>I have a server running freebsd since some time now, and was wondering about +Alexis' loghttp://blog.notmyidea.org2011-03-16T00:00:00+01:00Working directly on your server? How to backup and sync your dev environment with unison2011-03-16T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html/<p>I have a server running freebsd since some time now, and was wondering about the possibility to directly have a development environment ready to use when I get a internet connexion, even if I'm not on my computer.</p> <p>Since I use vim to code, and spend most of my time in a console while @@ -150,7 +150,7 @@ content.</p> <p>A sync takes about 20s + the upload time on my machine, which stay acceptable for all of my developments.</p> </div> -How to install NGINX + PHP 5.3 on FreeBSD.2010-10-10T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html/<p>I've not managed so far to get completely rid of php, so here's a simple +How to install NGINX + PHP 5.3 on FreeBSD.2010-10-10T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html/<p>I've not managed so far to get completely rid of php, so here's a simple reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but that's worse to have the piece of configuration somewhere !</p> <pre class="literal-block"> diff --git a/feeds/thoughts.atom.xml b/feeds/thoughts.atom.xml index 7fbf671..935a957 100644 --- a/feeds/thoughts.atom.xml +++ b/feeds/thoughts.atom.xml @@ -1,5 +1,5 @@ -Alexis' loghttp://blog.notmyidea.org2011-05-19T00:00:00ZTravailler moins pour mieux travailler ?2011-05-19T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +Alexis' loghttp://blog.notmyidea.org2011-05-19T00:00:00+02:00Travailler moins pour mieux travailler ?2011-05-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que je suis assez impressionné du résultat: je suis de retour chez mes parents pour le &quot;easter break&quot; et j'en ai profité pour donner un coup aux travaux de la maison (et pour me reposer un brin!).</p> @@ -42,7 +42,7 @@ d'autant plus vrai pour moi, alors si gagner en productivité peut passer par travailler moins, pourquoi pas s'y essayer !</p> <p>Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez des retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée ?</p> -Fork you ! or how the social coding can help you2010-11-05T00:00:00ZAlexis Métaireautag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html/<p>With <a class="reference external" href="http://github.com">github</a> and <a class="reference external" href="http://www.bitbucket.org">bitbucket</a> coming around, a lot of new usages appears for the +Fork you ! or how the social coding can help you2010-11-05T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html/<p>With <a class="reference external" href="http://github.com">github</a> and <a class="reference external" href="http://www.bitbucket.org">bitbucket</a> coming around, a lot of new usages appears for the developpers: it's now easy to get feedback on your code/modifications, and to get help from others by, for instance, forking repositories.</p> <p>Eeach time I see people helping others, I'm amazed by how we like to share diff --git a/first-week-working-on-distutils2.html b/first-week-working-on-distutils2.html index 038c44f..0eb3715 100644 --- a/first-week-working-on-distutils2.html +++ b/first-week-working-on-distutils2.html @@ -1,76 +1,22 @@ - - + + - first week working on distutils2 - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        first week working on distutils2

        -
        - -

        As I've been working on + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        first week working on distutils2

        +

        Published on Fri 04 June 2010

        +

        As I've been working on Distutils2 during the past week, taking part of the GSOC program, here is a @@ -142,85 +88,6 @@ to make this clear.

        I'll take you updated !

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/fork-you-or-how-the-social-coding-can-help-you.html b/fork-you-or-how-the-social-coding-can-help-you.html index eda0557..d6ea6df 100644 --- a/fork-you-or-how-the-social-coding-can-help-you.html +++ b/fork-you-or-how-the-social-coding-can-help-you.html @@ -1,76 +1,22 @@ - - + + - Fork you ! or how the social coding can help you - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Fork you ! or how the social coding can help you

        -
        - -

        With github and bitbucket coming around, a lot of new usages appears for the + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Fork you ! or how the social coding can help you

        +

        Published on Fri 05 November 2010

        +

        With github and bitbucket coming around, a lot of new usages appears for the developpers: it's now easy to get feedback on your code/modifications, and to get help from others by, for instance, forking repositories.

        Eeach time I see people helping others, I'm amazed by how we like to share @@ -172,85 +118,6 @@ experimentations, and share them with others, you will see, it's kind of addictive !

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/help-me-to-go-to-the-distutils2-paris-sprint.html b/help-me-to-go-to-the-distutils2-paris-sprint.html index 02f6a7c..e9b3f5d 100644 --- a/help-me-to-go-to-the-distutils2-paris-sprint.html +++ b/help-me-to-go-to-the-distutils2-paris-sprint.html @@ -1,76 +1,22 @@ - - + + - Help me to go to the distutils2 paris' sprint - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Help me to go to the distutils2 paris' sprint

        -
        - -

        Edit: Thanks to logilab and some amazing people, I can make it to paris for the + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Help me to go to the distutils2 paris' sprint

        +

        Published on Sat 15 January 2011

        +

        Edit: Thanks to logilab and some amazing people, I can make it to paris for the sprint. Many thanks to them for the support!

        There will be a distutils2 sprint from the 27th to the 30th of january, thanks to logilab which will host the event.

        @@ -89,85 +35,6 @@ while needed.

        chipin page: http://ametaireau.chipin.com/distutils2-sprint-in-paris

        Thanks for your support !

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/how-to-install-nginx-php-53-on-freebsd.html b/how-to-install-nginx-php-53-on-freebsd.html index 0db11d2..bbee9e3 100644 --- a/how-to-install-nginx-php-53-on-freebsd.html +++ b/how-to-install-nginx-php-53-on-freebsd.html @@ -1,76 +1,22 @@ - - + + - How to install NGINX + PHP 5.3 on FreeBSD. - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        How to install NGINX + PHP 5.3 on FreeBSD.

        -
        - -

        I've not managed so far to get completely rid of php, so here's a simple + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        How to install NGINX + PHP 5.3 on FreeBSD.

        +

        Published on Sun 10 October 2010

        +

        I've not managed so far to get completely rid of php, so here's a simple reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but that's worse to have the piece of configuration somewhere !

        @@ -118,85 +64,6 @@ upstream backend {
         

        And that's it !

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/how-to-reboot-your-bebox-using-the-cli.html b/how-to-reboot-your-bebox-using-the-cli.html index b2c01ec..29153e4 100644 --- a/how-to-reboot-your-bebox-using-the-cli.html +++ b/how-to-reboot-your-bebox-using-the-cli.html @@ -1,76 +1,22 @@ - - + + - How to reboot your bebox using the CLI - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        How to reboot your bebox using the CLI

        -
        - -

        I've an internet connection which, for some obscure reasons, tend to be very + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        How to reboot your bebox using the CLI

        +

        Published on Thu 21 October 2010

        +

        I've an internet connection which, for some obscure reasons, tend to be very slow from time to time. After rebooting the box (yes, that's a hard solution), all the things seems to go fine again.

        @@ -120,85 +66,6 @@ command line tools curl, grep and tail (but really harder to read).

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/index.html b/index.html index e479afc..f0505ac 100644 --- a/index.html +++ b/index.html @@ -1,1097 +1,123 @@ - - + + - Alexis' log - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - - - - - - - - -
        -

        Other articles

        -
        -
          - - - - - - - - - -
        1. -
          -

          Using dbpedia to get languages influences

          -
          - -
          - -

          While browsing the Python's wikipedia page, I found information about the languages -influenced by python, and the languages that influenced python itself.

          -

          Well, that's kind of interesting to know which languages influenced others, -it could even be more interesting to have an overview of the connexion between -them ...

          - read more -

          There are comments.

          -
          -
        2. - - - - - - - -
        3. - - - - - - - -
        4. -
          -

          Using JPype to bridge python and Java

          -
          - -
          - -

          Java provides some interesting libraries that have no exact equivalent in -python. In my case, the awesome boilerpipe library allows me to remove -uninteresting parts of HTML pages, like menus, footers and other "boilerplate" -contents.

          -

          Boilerpipe is written in Java. Two solutions then: using java from python or -reimplement boilerpipe ...

          - read more -

          There are comments.

          -
          -
        5. - - - - - - - -
        6. -
          -

          Un coup de main pour mon mémoire!

          -
          - -
          - -

          Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. -En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit -coup de main.

          -

          Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent ...

          - read more -

          There are comments.

          -
          -
        7. - - - - - - - -
        8. -
          -

          Travailler moins pour mieux travailler ?

          -
          - -
          - -

          Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que -je suis assez impressionné du résultat: je suis de retour chez mes parents pour -le "easter break" et j'en ai profité pour donner un coup aux travaux de la -maison (et pour me reposer ...

          - read more -

          There are comments.

          -
          -
        9. - - - - - - - -
        10. - - - - - - - -
        11. -
          -

          Working directly on your server? How to backup and sync your dev environment with unison

          -
          - -
          - -

          I have a server running freebsd since some time now, and was wondering about -the possibility to directly have a development environment ready to use when -I get a internet connexion, even if I'm not on my computer.

          -

          Since I use vim to code, and spend most of my ...

          - read more -

          There are comments.

          -
          -
        12. - - - - - - - -
        13. -
          -

          Wrap up of the distutils2 paris' sprint

          -
          - -
          - -

          Finally, thanks to a bunch of people that helped me to pay my train and bus -tickets, I've made it to paris for the distutils2 sprint.

          -

          They have been a bit more than 10 people to come during the sprint, and it was -very productive. Here's a taste ...

          - read more -

          There are comments.

          -
          -
        14. - - - - - - - -
        15. -
          -

          PyPI on CouchDB

          -
          - -
          - -

          By now, there are two ways to retrieve data from PyPI (the Python Package -Index). You can both rely on xml/rpc or on the "simple" API. The simple -API is not so simple to use as the name suggest, and have several existing -drawbacks.

          -

          Basically, if you want to ...

          - read more -

          There are comments.

          -
          -
        16. - - - - - - - -
        17. -
          -

          Help me to go to the distutils2 paris' sprint

          -
          - -
          - -

          Edit: Thanks to logilab and some amazing people, I can make it to paris for the -sprint. Many thanks to them for the support!

          -

          There will be a distutils2 sprint from the 27th to the 30th of january, thanks -to logilab which will host the event.

          -

          You can find more ...

          - read more -

          There are comments.

          -
          -
        18. - - - - - - - -
        19. - - - - - - - -
        20. -
          -

          How to reboot your bebox using the CLI

          -
          - -
          - -

          I've an internet connection which, for some obscure reasons, tend to be very -slow from time to time. After rebooting the box (yes, that's a hard solution), -all the things seems to go fine again.

          -
          -

          EDIT : Using grep

          -

          After a bit of reflexion, that's also really easy ...

          - read more -

          There are comments.

          -
          -
        21. - - - - - - - -
        22. - - - - - - - -
        23. -
          -

          How to install NGINX + PHP 5.3 on FreeBSD.

          -
          - -
          - -

          I've not managed so far to get completely rid of php, so here's a simple -reminder about how to install php on NGINX, for FreeBSD. Nothing hard, but -that's worse to have the piece of configuration somewhere !

          -
          -# update the ports
          -$ portsnap fetch update
          -
          -# install php5 port
          -$ make ...
          - read more -

          There are comments.

          -
          -
        24. - - - - - - - -
        25. - - - - - - - -
        26. - - - - - - - -
        27. -
          -

          Introducing the distutils2 index crawlers

          -
          - -
          - -

          I'm working for about a month for distutils2, even if I was being a -bit busy (as I had some class courses and exams to work on)

          -

          I'll try do sum-up my general feelings here, and the work I've made -so far. You can also find, if ...

          - read more -

          There are comments.

          -
          -
        28. - - - - - - - -
        29. -
          -

          Sprinting on distutils2 in Tours

          -
          - -
          - -

          Yesterday, as I was traveling to Tours, I've took some time to -visit Éric, another student who's working on distutils2 this -summer, as a part of the GSoC. Basically, it was to take a drink, -discuss a bit about distutils2, our respective tasks and general -feelings, and to ...

          - read more -

          There are comments.

          -
          -
        30. - - - - - - - -
        31. - - - - - - - -
        32. - - - - - - - -
        33. - - - - - - - -
        34. - - - - - - - -
        35. - - - - - - - -
        36. -
          -

          Python ? go !

          -
          - -
          - -

          Cela fait maintenant un peu plus d'un mois que je travaille sur un -projet en django, et que, -nécessairement, je me forme à Python. Je -prends un plaisir non dissimulé à découvrir ce langage (et à -l'utiliser), qui ne cesse de me surprendre. Les premiers mots qui -me ...

          - read more -

          There are comments.

          -
          -
        37. - - - - - - - -
        38. - - - - + +
          +

          Alexis Métaireau's thoughs

          + +
          +
          -
        -
        - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - +

        Simple test page

        +

        +

        Published on Fri 19 August 2011

        + +

        Using dbpedia to get languages influences

        +

        +

        Published on Tue 16 August 2011

        + +

        Pelican, 9 months later

        +

        or why I like opensource so much

        +

        Published on Mon 25 July 2011

        + +

        Using JPype to bridge python and Java

        +

        +

        Published on Sat 11 June 2011

        + +

        Un coup de main pour mon mémoire!

        +

        +

        Published on Wed 25 May 2011

        + +

        Travailler moins pour mieux travailler ?

        +

        +

        Published on Thu 19 May 2011

        + +

        Analyse users' browsing context to build up a web recommender

        +

        +

        Published on Fri 01 April 2011

        + +

        Working directly on your server? How to backup and sync your dev environment with unison

        +

        +

        Published on Wed 16 March 2011

        + +

        Wrap up of the distutils2 paris' sprint

        +

        +

        Published on Tue 08 February 2011

        + +

        PyPI on CouchDB

        +

        +

        Published on Thu 20 January 2011

        + +

        Help me to go to the distutils2 paris' sprint

        +

        +

        Published on Sat 15 January 2011

        + +

        Fork you ! or how the social coding can help you

        +

        +

        Published on Fri 05 November 2010

        + +

        How to reboot your bebox using the CLI

        +

        +

        Published on Thu 21 October 2010

        + +

        Dynamically change your gnome desktop wallpaper

        +

        +

        Published on Mon 11 October 2010

        + +

        How to install NGINX + PHP 5.3 on FreeBSD.

        +

        +

        Published on Sun 10 October 2010

        + +

        Pelican, a simple static blog generator in python

        +

        +

        Published on Wed 06 October 2010

        + +

        An amazing summer of code working on distutils2

        +

        +

        Published on Mon 16 August 2010

        + +

        Introducing the distutils2 index crawlers

        +

        +

        Published on Tue 06 July 2010

        + +

        Sprinting on distutils2 in Tours

        +

        +

        Published on Tue 06 July 2010

        + +

        Use Restructured Text (ReST) to power your presentations

        +

        +

        Published on Fri 25 June 2010

        + +

        first week working on distutils2

        +

        +

        Published on Fri 04 June 2010

        + +

        A Distutils2 GSoC

        +

        +

        Published on Sat 01 May 2010

        + +

        Le temps des grâces, courrez-y !

        +

        +

        Published on Sun 28 March 2010

        + +

        Semaine de l’environnement: La consommation étudiante

        +

        +

        Published on Wed 24 February 2010

        + +

        Python ? go !

        +

        +

        Published on Thu 17 December 2009

        + +

        AMAP + Média = Paniers bio à 5e ?!

        +

        +

        Published on Wed 11 November 2009

        + + \ No newline at end of file diff --git a/introducing-the-distutils2-index-crawlers.html b/introducing-the-distutils2-index-crawlers.html index 570aa2b..9cf7f9b 100644 --- a/introducing-the-distutils2-index-crawlers.html +++ b/introducing-the-distutils2-index-crawlers.html @@ -1,76 +1,22 @@ - - + + - Introducing the distutils2 index crawlers - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Introducing the distutils2 index crawlers

        -
        - -

        I'm working for about a month for distutils2, even if I was being a + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Introducing the distutils2 index crawlers

        +

        Published on Tue 06 July 2010

        +

        I'm working for about a month for distutils2, even if I was being a bit busy (as I had some class courses and exams to work on)

        I'll try do sum-up my general feelings here, and the work I've made so far. You can also find, if you're interested, my weekly @@ -190,85 +136,6 @@ end of the summer. (And now, I need to learn to follow schedules ...)

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/le-temps-des-graces-courrez-y.html b/le-temps-des-graces-courrez-y.html index b6e0361..8bef026 100644 --- a/le-temps-des-graces-courrez-y.html +++ b/le-temps-des-graces-courrez-y.html @@ -1,76 +1,22 @@ - - + + - Le temps des grâces, courrez-y ! - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Le temps des grâces, courrez-y !

        -
        - -

        Ouf, notre + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Le temps des grâces, courrez-y !

        +

        Published on Sun 28 March 2010

        +

        Ouf, notre semaine de l'environnement s'est terminée, après un peu de neige et un brin de soleil quand il en fallait.

        @@ -131,85 +77,6 @@ pourraient être utilisée, si les pouvoirs publics lâchaient un peu la main des lobbys. Passionnant, vraiment.

        Courrez-y, je vous dis.

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/pages/projects.html b/pages/projects.html index 8b94c51..5c6054a 100644 --- a/pages/projects.html +++ b/pages/projects.html @@ -1,58 +1,18 @@ - - + + - projects - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -

        projects

        - + +
        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        projects

        On my spare time, I contribute to open source projets, and hack a bit python, django and php.

        You can find all the projects I am involoved (sic!) with @@ -96,68 +56,6 @@ a friend.

        framework.

        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/pelican-9-months-later.html b/pelican-9-months-later.html index 88ca8c6..51dfd7a 100644 --- a/pelican-9-months-later.html +++ b/pelican-9-months-later.html @@ -1,76 +1,22 @@ - - + + - Pelican, 9 months later - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Pelican, 9 months later

        -
        - -

        Back in October, I released pelican, + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Pelican, 9 months later

        +

        Published on Mon 25 July 2011

        +

        Back in October, I released pelican, a little piece of code I wrote to power this weblog. I had simple needs: I wanted to be able to use my text editor of choice (vim), a vcs (mercurial) and restructured text. I started to write a really simple blog engine @@ -88,85 +34,6 @@ there is a bunch of people that are willing to make better softwares just for the sake of fun.

        Thank you, guys, you're why I like open source so much.

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/pelican-a-simple-static-blog-generator-in-python.html b/pelican-a-simple-static-blog-generator-in-python.html index 0950509..eb7340b 100644 --- a/pelican-a-simple-static-blog-generator-in-python.html +++ b/pelican-a-simple-static-blog-generator-in-python.html @@ -1,76 +1,22 @@ - - + + - Pelican, a simple static blog generator in python - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Pelican, a simple static blog generator in python

        -
        - -

        Those days, I've wrote a little python application to fit my blogging needs. + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Pelican, a simple static blog generator in python

        +

        Published on Wed 06 October 2010

        +

        Those days, I've wrote a little python application to fit my blogging needs. I'm an occasional blogger, a vim lover, I like restructured text and DVCSes, so I've made a little tool that makes good use of all that.

        Pelican (for calepin) is just a simple tool to generate your blog as static @@ -132,85 +78,6 @@ optional arguments:

        Enjoy :)

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/pypi-on-couchdb.html b/pypi-on-couchdb.html index a3ab283..2577241 100644 --- a/pypi-on-couchdb.html +++ b/pypi-on-couchdb.html @@ -1,76 +1,22 @@ - - + + - PyPI on CouchDB - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        PyPI on CouchDB

        -
        - -

        By now, there are two ways to retrieve data from PyPI (the Python Package + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        PyPI on CouchDB

        +

        Published on Thu 20 January 2011

        +

        By now, there are two ways to retrieve data from PyPI (the Python Package Index). You can both rely on xml/rpc or on the "simple" API. The simple API is not so simple to use as the name suggest, and have several existing drawbacks.

        @@ -164,85 +110,6 @@ a work in progress, and everything can break at any time. However, any feedback will be appreciated !

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/python-go.html b/python-go.html index ac81c99..23893aa 100644 --- a/python-go.html +++ b/python-go.html @@ -1,76 +1,22 @@ - - + + - Python ? go ! - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Python ? go !

        -
        - -

        Cela fait maintenant un peu plus d'un mois que je travaille sur un + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Python ? go !

        +

        Published on Thu 17 December 2009

        +

        Cela fait maintenant un peu plus d'un mois que je travaille sur un projet en django, et que, nécessairement, je me forme à Python. Je prends un plaisir non dissimulé à découvrir ce langage (et à @@ -172,85 +118,6 @@ dynamique. Have fun !

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/semaine-de-lenvironnement-la-consommation-etudiante.html b/semaine-de-lenvironnement-la-consommation-etudiante.html index cb16d51..0bfecae 100644 --- a/semaine-de-lenvironnement-la-consommation-etudiante.html +++ b/semaine-de-lenvironnement-la-consommation-etudiante.html @@ -1,76 +1,22 @@ - - + + - Semaine de l’environnement: La consommation étudiante - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Semaine de l’environnement: La consommation étudiante

        -
        - -

        Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à Framasoft, à la Quadrature du net ou à Ars Industrialis (dans le domaine de la science et de l'informatique), mais aussi aux Amis de la Terre, à ATTAC (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.

        + +
        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Semaine de l’environnement: La consommation étudiante

        +

        Published on Wed 24 February 2010

        +

        Les acteurs associatifs sont bien souvent moteurs des critiques de nos sociétés. Je pense à Framasoft, à la Quadrature du net ou à Ars Industrialis (dans le domaine de la science et de l'informatique), mais aussi aux Amis de la Terre, à ATTAC (dans le domaine de l'environnement entres autres), et a tout un tas d'autres associations que je ne peux pas citer ici exhaustivement... Ce sont eux qui sont porteurs de messages alternatifs, et qui sont les initiateurs de débats publics, qui permettent de faire avancer des thématiques aussi importantes que le logiciel libre ou la protection de l'environnement.

        Dans cette optique, depuis près de 3 ans (déjà !), au sein du réseau GRAPPE, on essaye d'aborder des thématiques qui touchent de près ou de loin à @@ -111,85 +57,6 @@ n'hésitez pas ! La page sur la consommation étudiante sur le site du GRAPPE

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/simple-test-page.html b/simple-test-page.html index 0f2fefa..f1219c5 100644 --- a/simple-test-page.html +++ b/simple-test-page.html @@ -1,157 +1,24 @@ - - + + - Simple test page - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Simple test page

        -
        - -

        Simple test for ghp-import + post commit hook + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Simple test page

        +

        Published on Fri 19 August 2011

        +

        Simple test for ghp-import + post commit hook Yeah ?

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/sprinting-on-distutils2-in-tours.html b/sprinting-on-distutils2-in-tours.html index ad63445..5184449 100644 --- a/sprinting-on-distutils2-in-tours.html +++ b/sprinting-on-distutils2-in-tours.html @@ -1,76 +1,22 @@ - - + + - Sprinting on distutils2 in Tours - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Sprinting on distutils2 in Tours

        -
        - -

        Yesterday, as I was traveling to Tours, I've took some time to + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Sprinting on distutils2 in Tours

        +

        Published on Tue 06 July 2010

        +

        Yesterday, as I was traveling to Tours, I've took some time to visit Éric, another student who's working on distutils2 this summer, as a part of the GSoC. Basically, it was to take a drink, discuss a bit about distutils2, our respective tasks and general @@ -152,85 +98,6 @@ like this one are opportunities to catch ! We'll probably do another sprint in a few weeks, stay tuned !

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/tag/bleh.html b/tag/bleh.html index fb85eb3..e69de29 100644 --- a/tag/bleh.html +++ b/tag/bleh.html @@ -1,153 +0,0 @@ - - - - Alexis' log - bleh - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/browsers.html b/tag/browsers.html index 50fda06..e69de29 100644 --- a/tag/browsers.html +++ b/tag/browsers.html @@ -1,329 +0,0 @@ - - - - Alexis' log - browsers - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/dbpedia.html b/tag/dbpedia.html index 2370a9f..e69de29 100644 --- a/tag/dbpedia.html +++ b/tag/dbpedia.html @@ -1,190 +0,0 @@ - - - - Alexis' log - dbpedia - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/freebsd.html b/tag/freebsd.html index 2466109..e69de29 100644 --- a/tag/freebsd.html +++ b/tag/freebsd.html @@ -1,302 +0,0 @@ - - - - Alexis' log - freebsd - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/java.html b/tag/java.html index 1e460d0..e69de29 100644 --- a/tag/java.html +++ b/tag/java.html @@ -1,221 +0,0 @@ - - - - Alexis' log - java - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/nice story.html b/tag/nice story.html index a599069..e69de29 100644 --- a/tag/nice story.html +++ b/tag/nice story.html @@ -1,168 +0,0 @@ - - - - Alexis' log - nice story - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/open source.html b/tag/open source.html index 69970c7..e69de29 100644 --- a/tag/open source.html +++ b/tag/open source.html @@ -1,168 +0,0 @@ - - - - Alexis' log - open source - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/pelican.html b/tag/pelican.html index dca5636..e69de29 100644 --- a/tag/pelican.html +++ b/tag/pelican.html @@ -1,168 +0,0 @@ - - - - Alexis' log - pelican - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/python.html b/tag/python.html index f4b7f97..e69de29 100644 --- a/tag/python.html +++ b/tag/python.html @@ -1,273 +0,0 @@ - - - - Alexis' log - python - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - -
        -

        Other articles

        -
        -
          - - - - - - - - - -
        1. - - - - - - - -
        2. -
          -

          Using JPype to bridge python and Java

          -
          - -
          - -

          Java provides some interesting libraries that have no exact equivalent in -python. In my case, the awesome boilerpipe library allows me to remove -uninteresting parts of HTML pages, like menus, footers and other "boilerplate" -contents.

          -

          Boilerpipe is written in Java. Two solutions then: using java from python or -reimplement boilerpipe ...

          - read more -

          There are comments.

          -
          -
        3. - - - - - - -
        -
        - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/recommendations.html b/tag/recommendations.html index 7011b0b..e69de29 100644 --- a/tag/recommendations.html +++ b/tag/recommendations.html @@ -1,329 +0,0 @@ - - - - Alexis' log - recommendations - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/sparql.html b/tag/sparql.html index cd85938..e69de29 100644 --- a/tag/sparql.html +++ b/tag/sparql.html @@ -1,190 +0,0 @@ - - - - Alexis' log - sparql - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/unison.html b/tag/unison.html index c97ae55..e69de29 100644 --- a/tag/unison.html +++ b/tag/unison.html @@ -1,302 +0,0 @@ - - - - Alexis' log - unison - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/tag/users.html b/tag/users.html index 0a98283..e69de29 100644 --- a/tag/users.html +++ b/tag/users.html @@ -1,329 +0,0 @@ - - - - Alexis' log - users - - - - - - - - - - - - - - - - - -Fork me on GitHub - - - - - - - - - - - - - - - - - - - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - - - \ No newline at end of file diff --git a/theme/css/main.css b/theme/css/main.css index d416aaf..b4e34cb 100644 --- a/theme/css/main.css +++ b/theme/css/main.css @@ -1,424 +1,81 @@ -/* - Name: Smashing HTML5 - Date: July 2009 - Description: Sample layout for HTML5 and CSS3 goodness. - Version: 1.0 - Author: Enrique Ramírez - Autor URI: http://enrique-ramirez.com -*/ +@import url(http://fonts.googleapis.com/css?family=Rosario); -/* Imports */ -@import url("reset.css"); -@import url("pygment.css"); -@import url(http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz&subset=latin); - -/***** Global *****/ -/* Body */ -body { - background: #F5F4EF url('../images/bg.png'); - color: #000305; - font-size: 87.5%; /* Base font size: 14px */ - font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; - line-height: 1.429; - margin: 0; - padding: 0; - text-align: left; +body { + width: 800px; + margin: auto; + font-size: 1.3em; + background-color: #fffff0; + font-family: "Georgia", serif; } - - -/* Headings */ -h1 {font-size: 2em } -h2 {font-size: 1.571em} /* 22px */ -h3 {font-size: 1.429em} /* 20px */ -h4 {font-size: 1.286em} /* 18px */ -h5 {font-size: 1.143em} /* 16px */ -h6 {font-size: 1em} /* 14px */ - -h1, h2, h3, h4, h5, h6 { - font-weight: 400; - line-height: 1.1; - margin-bottom: .8em; - font-family: 'Yanone Kaffeesatz', arial, serif; -} - -h3, h4, h5, h6 { margin-top: .8em; } - -hr { border: 2px solid #EEEEEE; } - -/* Anchors */ -a {outline: 0;} -a img {border: 0px; text-decoration: none;} -a:link, a:visited { - color: #C74350; - padding: 0 1px; - text-decoration: underline; -} -a:hover, a:active { - background-color: #C74350; - color: #fff; - text-decoration: none; - text-shadow: 1px 1px 1px #333; -} - -h1 a:hover { - background-color: inherit -} - -/* Paragraphs */ -p {margin-bottom: 1.143em;} - -strong, b {font-weight: bold;} -em, i {font-style: italic;} - -::-moz-selection {background: #F6CF74; color: #fff;} -::selection {background: #F6CF74; color: #fff;} - -/* Lists */ -ul { - list-style: outside disc; - margin: 1em 0 1.5em 1.5em; -} - -ol { - list-style: outside decimal; - margin: 1em 0 1.5em 1.5em; -} - -.post-info { - float:right; - margin:10px; - padding:5px; -} - -.post-info p{ - margin-bottom: 1px; -} - -.readmore { float: right } - -dl {margin: 0 0 1.5em 0;} -dt {font-weight: bold;} -dd {margin-left: 1.5em;} - -pre{background-color: #000; padding: 10px; color: #fff; margin: 10px; overflow: auto;} - -/* Quotes */ -blockquote { - margin: 20px; - font-style: italic; -} -cite {} - -q {} - -/* Tables */ -table {margin: .5em auto 1.5em auto; width: 98%;} - - /* Thead */ - thead th {padding: .5em .4em; text-align: left;} - thead td {} - - /* Tbody */ - tbody td {padding: .5em .4em;} - tbody th {} - - tbody .alt td {} - tbody .alt th {} - - /* Tfoot */ - tfoot th {} - tfoot td {} - -/* HTML5 tags */ -header, section, footer, -aside, nav, article, figure { - display: block; -} - -/***** Layout *****/ -.body {clear: both; margin: 0 auto; width: 800px;} -img.right figure.right {float: right; margin: 0 0 2em 2em;} -img.left, figure.left {float: right; margin: 0 0 2em 2em;} - -/* - Header -*****************/ -#banner { - margin: 0 auto; - padding: 2.5em 0 0 0; -} - - /* Banner */ - #banner h1 {font-size: 3.571em; line-height: 0;} - #banner h1 a:link, #banner h1 a:visited { - color: #000305; - display: block; - font-weight: bold; - margin: 0 0 .6em .2em; - text-decoration: none; - width: 427px; - } - #banner h1 a:hover, #banner h1 a:active { - background: none; - color: #C74350; - text-shadow: none; - } - - #banner h1 strong {font-size: 0.36em; font-weight: normal;} - - /* Main Nav */ - #banner nav { - background: #000305; - font-size: 1.143em; - height: 40px; - line-height: 30px; - margin: 0 auto 2em auto; - padding: 0; - text-align: center; - width: 800px; - - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - } - - #banner nav ul {list-style: none; margin: 0 auto; width: 800px;} - #banner nav li {float: left; display: inline; margin: 0;} - - #banner nav a:link, #banner nav a:visited { - color: #fff; - display: inline-block; - height: 30px; - padding: 5px 1.5em; - text-decoration: none; - } - #banner nav a:hover, #banner nav a:active, - #banner nav .active a:link, #banner nav .active a:visited { - background: #C74451; - color: #fff; - text-shadow: none !important; - } - - #banner nav li:first-child a { - border-top-left-radius: 5px; - -moz-border-radius-topleft: 5px; - -webkit-border-top-left-radius: 5px; - - border-bottom-left-radius: 5px; - -moz-border-radius-bottomleft: 5px; - -webkit-border-bottom-left-radius: 5px; - } - -/* - Featured -*****************/ -#featured { - background: #fff; - margin-bottom: 2em; - overflow: hidden; - padding: 20px; - width: 760px; - - border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; -} - -#featured figure { - border: 2px solid #eee; - float: right; - margin: 0.786em 2em 0 5em; - width: 248px; -} -#featured figure img {display: block; float: right;} - -#featured h2 {color: #C74451; font-size: 1.714em; margin-bottom: 0.333em;} -#featured h3 {font-size: 1.429em; margin-bottom: .5em;} - -#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;} -#featured h3 a:hover, #featured h3 a:active {color: #fff;} - -/* - Body -*****************/ -#content { - background: #fff; - margin-bottom: 2em; - overflow: hidden; - padding: 20px 20px; - width: 760px; - - border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; -} - -/* - Extras -*****************/ -#extras {margin: 0 auto 3em auto; overflow: hidden;} - -#extras ul {list-style: none; margin: 0;} -#extras li {border-bottom: 1px solid #fff;} -#extras h2 { - color: #C74350; - font-size: 1.429em; - margin-bottom: .25em; - padding: 0 3px; -} - -#extras a:link, #extras a:visited { - color: #444; - display: block; - border-bottom: 1px solid #F4E3E3; - text-decoration: none; - padding: .3em .25em; -} - -#extras a:hover, #extras a:active {color: #fff;} - - /* Blogroll */ - #extras .blogroll { - float: left; - width: 615px; - } - - #extras .blogroll li {float: left; margin: 0 20px 0 0; width: 185px;} - - /* Social */ - #extras .social { - float: right; - width: 175px; - } - - #extras div[class='social'] a { - background-repeat: no-repeat; - background-position: 3px 6px; - padding-left: 25px; - } - - /* Icons */ - .social a[href*='delicious.com'] {background-image: url('../images/icons/delicious.png');} - .social a[href*='digg.com'] {background-image: url('../images/icons/digg.png');} - .social a[href*='facebook.com'] {background-image: url('../images/icons/facebook.png');} - .social a[href*='last.fm'], .social a[href*='lastfm.'] {background-image: url('../images/icons/lastfm.png');} - .social a[href*='atom.xml'] {background-image: url('../images/icons/rss.png');} - .social a[href*='twitter.com'] {background-image: url('../images/icons/twitter.png');} - .social a[href*='linkedin.com'] {background-image: url('../images/icons/linkedin.png');} - -/* - About -*****************/ -#about { - background: #fff; - font-style: normal; - margin-bottom: 2em; - overflow: hidden; - padding: 20px; - text-align: left; - width: 760px; - - border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; -} - -#about .primary {float: left; width: 165px;} -#about .primary strong {color: #C64350; display: block; font-size: 1.286em;} -#about .photo {float: left; margin: 5px 20px;} - -#about .url:link, #about .url:visited {text-decoration: none;} - -#about .bio {float: right; width: 500px;} - -/* - Footer -*****************/ -#contentinfo {padding-bottom: 2em; text-align: right;} - -/***** Sections *****/ -/* Blog */ -.hentry { - display: block; - clear: both; - border-bottom: 1px solid #eee; - padding: 1.5em 0; -} -li:last-child .hentry, #content > .hentry {border: 0; margin: 0;} -#content > .hentry {padding: 1em 0;} -.hentry img{display : none ;} -.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;} -.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #333;} -.entry-title a:visited {background-color: #fff;} - -.hentry .post-info * {font-style: normal;} - - /* Content */ - .hentry footer {margin-bottom: 2em;} - .hentry footer address {display: inline;} - #posts-list footer address {display: block;} - - /* Blog Index */ - #posts-list {list-style: none; margin: 0;} - #posts-list .hentry {padding-left: 10px; position: relative;} - - #posts-list footer { - left: 10px; - position: relative; +#top {} + #top .author { float: left; - top: 0.5em; - width: 190px; - } - - /* About the Author */ - #about-author { - background: #f9f9f9; - clear: both; - font-style: normal; - margin: 2em 0; - padding: 10px 20px 15px 20px; - - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - } - - #about-author strong { - color: #C64350; - clear: both; - display: block; - font-size: 1.429em; - } - - #about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;} - - /* Comments */ - #comments-list {list-style: none; margin: 0 1em;} - #comments-list blockquote { - background: #f8f8f8; - clear: both; - font-style: normal; - margin: 0; - padding: 15px 20px; - - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - } - #comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;} - - #comments-list li:nth-child(2n) blockquote {background: #F5f5f5;} - - /* Add a Comment */ - #add-comment label {clear: left; float: left; text-align: left; width: 150px;} - #add-comment input[type='text'], - #add-comment input[type='email'], - #add-comment input[type='url'] {float: left; width: 200px;} - - #add-comment textarea {float: left; height: 150px; width: 495px;} - - #add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;} - - #add-comment input[type='submit'] {float: right; margin: 0 .5em;} - #add-comment * {margin-bottom: .5em;} + } + + #top .links { + float: right; + list-style-type: none; + } + + #top .links, #top .links li{ + display: inline; + } + + #top .links li{ + margin-left: 10px; + } + +.content { + clear: both; +} + + .content h1, h2, h3, h4, h5, h6{ + font-family: 'Rosario', arial, serif; + margin-left: -20px; + } + + .content h1{ + font-size: 2.5em; + } + + .content p{ + font-size: 1.1em; + text-align: justify; + text-justify: newspaper; + } + + .content .date{ + margin-top: -20px; + font-style: italic; + } + + .content h2{ + font-size: 1.5em; + } + + .content a{ + padding: 2px; + color: #0F0F0F; + } + + .content a:hover{ + background-color: #0F0F0F; + color: #eaeaea; + } + + .content .highlight pre{ + padding: 15px; + background-color: black; + color: white; + } + + .content blockquote { + margin: 0px; + margin-right: 40px; + padding-left: 20px; + text-align: left; + border-left: 3px black solid; + letter-spacing: 2px; + font-style: italic; + } diff --git a/theme/css/pygment.css b/theme/css/pygment.css deleted file mode 100644 index 594b0fa..0000000 --- a/theme/css/pygment.css +++ /dev/null @@ -1,205 +0,0 @@ -.hll { -background-color:#FFFFCC; -} -.c { -color:#408090; -font-style:italic; -} -.err { -border:1px solid #FF0000; -} -.k { -color:#007020; -font-weight:bold; -} -.o { -color:#666666; -} -.cm { -color:#408090; -font-style:italic; -} -.cp { -color:#007020; -} -.c1 { -color:#408090; -font-style:italic; -} -.cs { -background-color:#FFF0F0; -color:#408090; -} -.gd { -color:#A00000; -} -.ge { -font-style:italic; -} -.gr { -color:#FF0000; -} -.gh { -color:#000080; -font-weight:bold; -} -.gi { -color:#00A000; -} -.go { -color:#303030; -} -.gp { -color:#C65D09; -font-weight:bold; -} -.gs { -font-weight:bold; -} -.gu { -color:#800080; -font-weight:bold; -} -.gt { -color:#0040D0; -} -.kc { -color:#007020; -font-weight:bold; -} -.kd { -color:#007020; -font-weight:bold; -} -.kn { -color:#007020; -font-weight:bold; -} -.kp { -color:#007020; -} -.kr { -color:#007020; -font-weight:bold; -} -.kt { -color:#902000; -} -.m { -color:#208050; -} -.s { -color:#4070A0; -} -.na { -color:#4070A0; -} -.nb { -color:#007020; -} -.nc { -color:#0E84B5; -font-weight:bold; -} -.no { -color:#60ADD5; -} -.nd { -color:#555555; -font-weight:bold; -} -.ni { -color:#D55537; -font-weight:bold; -} -.ne { -color:#007020; -} -.nf { -color:#06287E; -} -.nl { -color:#002070; -font-weight:bold; -} -.nn { -color:#0E84B5; -font-weight:bold; -} -.nt { -color:#062873; -font-weight:bold; -} -.nv { -color:#BB60D5; -} -.ow { -color:#007020; -font-weight:bold; -} -.w { -color:#BBBBBB; -} -.mf { -color:#208050; -} -.mh { -color:#208050; -} -.mi { -color:#208050; -} -.mo { -color:#208050; -} -.sb { -color:#4070A0; -} -.sc { -color:#4070A0; -} -.sd { -color:#4070A0; -font-style:italic; -} -.s2 { -color:#4070A0; -} -.se { -color:#4070A0; -font-weight:bold; -} -.sh { -color:#4070A0; -} -.si { -color:#70A0D0; -font-style:italic; -} -.sx { -color:#C65D09; -} -.sr { -color:#235388; -} -.s1 { -color:#4070A0; -} -.ss { -color:#517918; -} -.bp { -color:#007020; -} -.vc { -color:#BB60D5; -} -.vg { -color:#BB60D5; -} -.vi { -color:#BB60D5; -} -.il { -color:#208050; -} diff --git a/theme/css/reset.css b/theme/css/reset.css deleted file mode 100644 index 1e21756..0000000 --- a/theme/css/reset.css +++ /dev/null @@ -1,52 +0,0 @@ -/* - Name: Reset Stylesheet - Description: Resets browser's default CSS - Author: Eric Meyer - Author URI: http://meyerweb.com/eric/tools/css/reset/ -*/ - -/* v1.0 | 20080212 */ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, font, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td { - background: transparent; - border: 0; - font-size: 100%; - margin: 0; - outline: 0; - padding: 0; - vertical-align: baseline; -} - -body {line-height: 1;} - -ol, ul {list-style: none;} - -blockquote, q {quotes: none;} - -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; -} - -/* remember to define focus styles! */ -:focus { - outline: 0; -} - -/* remember to highlight inserts somehow! */ -ins {text-decoration: none;} -del {text-decoration: line-through;} - -/* tables still need 'cellspacing="0"' in the markup */ -table { - border-collapse: collapse; - border-spacing: 0; -} \ No newline at end of file diff --git a/theme/css/wide.css b/theme/css/wide.css deleted file mode 100644 index 3376f4c..0000000 --- a/theme/css/wide.css +++ /dev/null @@ -1,43 +0,0 @@ -@import url("main.css"); - -body { - font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif; -} - -.body, #banner nav, #banner nav ul, #about, #featured, #content{ - width: inherit; -} - -#banner nav { - -moz-border-radius: 0px; - margin-bottom: 0px; -} - -#banner nav ul{ - padding-right: 50px; -} - -#banner nav li{ - float: right; -} - -#banner nav li:first-child a { - -moz-border-radius: 0px; -} - -#banner h1 { - margin-bottom: -18px; -} - -#featured, #extras { - padding: 50px; -} - -#featured { - padding-top: 20px; -} - -#extras { - padding-top: 0px; - padding-bottom: 0px; -} diff --git a/theme/images/icons/delicious.png b/theme/images/icons/delicious.png deleted file mode 100644 index c6ce246a4602f8f74e75ea8cfe9f5a00daceeb33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 963 zcmV;!13dhRP)6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH0~|?2 zK~y-6Ws<#bTV))DpZogtjeX;f*md33No`1zmc&$+7>H1WP&XnFV&q?F7ZxN~K zI2_i~X=|=poxD)3){1kpXG^wzH)G`%n@9Vdqh@z9)$_-#O6KsOno1r{oLaey`u-PV zY3aS2^Ye4>S8M03dc96IlcH2Q#q{(nf8K*{zJqcRIvv=4D%`zi;68GBwb9|D4{t8% zQt846H*S2cctHWJrs7#s6F7hZ$1zC814fk;8_#?Ee8=nS(J0;psU1TjL;w;PhJ&dS zcwv_A5bPl|cU(qMn}nGpl^95_wD?4urU3{L6GZ|*A^{MSNeiu3NEiu6?GVBy>72{R z(Kx-dQ9hHO)y3kN1By5f00YASh=3wSyiN0ggEI42*?m;bfk;Ru6|SFT?Qivt&gGJQ z0HsndtkBwf2K^~wWnd3HkV6P8z=FJZQ)jk*(+39!_g7b!7rI@Kjg2Qfe6WUX2W&q4 zm9>AbkbdcF>N7oxr3%(~flSKebasN)?kzQL-rD7rOZ6X4m**v)zbsG|$Ot3_kjmLb z+1wTp2}Q&gk?16geEG#E(r7f^)S2wL*J3H-dM%>JLs0-C`u2c&Bg;%J0usOo2#^>I zm0)jQv%0!&tLpjbAH&e6-`@j?5F;iO4{)(<;{=8!1ufW_vcb=v!nPbNJk4W$4M$C0YlrpA5WMQe>ngouCATHtwiggqDn zpmhqZO_X5*2EA^#c=hTvOYiJF4zk%iesGAXz;)Y1(Gb{&Foo+MH+!CqX`1x=E(6=a z3xd+QN_kS(Y8UUXtUSecY!cc9!)0ttVJ6b(WQk8d`&MSAEB5Bru8L#b@jU;Z?d_F* zp^)0Ue*NR7wk&I_ae3~mrMKUTm;bu6ve#ZeSa|(Px7SYvp68Eg6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH11(8J zK~y-6J&{dpR8<^D&%N)?o9`l>DI;xZLzt*k2_&L4MiM1NNsIxFtWXmdy1`? zT?efJc?>@Vo&nf_bKo2(1#tonNMf9Fw@oHa9%ZBgewzP>ae_Dt&Y_e70Fh1Pawy}$ zgGB;k2Q^V2@>xK^dK)%+5L*ai5cQu}LEnNlD5W7~ke~zY?x<0Z6aqFnkjcVC6{_Qq z%b*tPaAOXF9t;#p`dWwBh@GP(GxNkhUPq-2wz)=f;d|VTS>(_pozKqU?$^1Owke!?hd2rd&Yas!y5|W3+lTtY z!z}DSdabr?Qi6+9A|etm)g_qyLlP1B=gm)K`S?d7BI4Eq5fQOrB!9hrQs&YV^7qRp z7QGM0p8UXThn4QPSBP)lMHdUGR-5+ev-GB}(w$#GXS3*$Av)h&Vdd0mg5PeU%O!HV zMiS5;aca`gZ*9{qBCi% zwUAF?iaAuy$I}{@62$Y6SYsQj=uRIhTT$bq7frj6{xp7O*Nmx-Io0hc+Y3_?M%yHe z262>Cw^!CiWpLK0R3;#J&y{nbj~!kB0000Wd_Fj7M_G{R}1CBkLw_JJn z>DQmab*CL>?Ok)>!PFzy{Acg}|Np;3*ZSPGC!W6l5w&pt&tHEg9=P)1$FJ6%7tcO? zWxgW&B*^ZPAirP+hi5m^K%69RcNc~ZR#^`qhqJ&VvY3H^TNs2H8D`Cq01C2~c>21s z-{R(FQ&rw_X(1C(sL|8KF+}2W>G_L%hZJ~NFD#lIs%=oPMZxdy|Meo%9>~ox&zv>K zB$L~r*j87(8A5T-G@yGywqOA)@^N diff --git a/theme/images/icons/rss.png b/theme/images/icons/rss.png deleted file mode 100644 index 7d4e85d981cbecb04b76dab5a234dc4690bd15ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmV-`1AqL9P)6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH0@+DK zK~y-6O_EE9990yCzjLd)r^ifBchXK`gN{uSqd0=7kbqhEAc*5eg)D?1#7z(k=t4x? zNsw9SGD{(noh~9MD2X6K0zO7JK4L<2NIQAV^f*1~?yBm#RrlWGqBZ!h4jlgP{QMl@ zU+I@e9$=>SEYtNmqqUus!wx3gi-~73je=sdif|T*ZW7`utw+wuWACgAfSy0TMEK!t zYE6(SC>(?md;vs&h4d<9>k!o-OF=;&Jh2#spFTJsviuSC-JmTPu0b(`Yz>m@kp2nd zRUig43#A1DSVeq#S1i(h1~UbNA&f4<@Dez{166^UU6a|4zzqNaQ-P|7a=jCiUOUL} z3N#kr{$pS>NV;Hq6WHcusMH{MFwq3?pM*wCy57Y0p#2u?K8oJnF^Tc@i}3sB(5is` z&ujoKf??Y|8_dk3zrBZk^(0()1>IOi0VRT`KZE-Y!JwQ_MM0Ec!G-#oQ7S8B*C&m) z9zsUnBA@O@&vekimC3b3XJKv+*c=oPA>^RdcGocO^|4z>a{(Sb35%DIBflaWUCfz> zQFjZBp}hMA+!o*!5JCWhI3vLdv-@E4JLJM)^p8{Mwgoua!=+>7`_};|cRh#oK;+Rv zNi2+$zuQKub16jv51d?zwBNAdUx{4b}$ji|JrAT%0~d0eJ=2e~(~foQ~_ z3)4H%r@nxfGD;Ie?>uh)WzrN#E)!KFN;5~c1saqnf>_HU26K%7Xh1@OH8YI!nC9}k z*h+``4uL_Jq~Ax=P1JxOhzFJ0Nc_*I=gq}q-H_#oZ;@++WIbxRAxOY6?8>dbVG7wVRUJ4ZXi@?ZDjy5FfTVRFgbe517iRH0-Q-i zK~y-6Es{%XT~!=M*MIMQ?lVnH1Zip;AE}^N>OiSOJF#OyKaDf}3{E=hP(;vSr6A%! z5Wx-#wfF#SX!^KKyzg_*IeY(q4&wR%YqFNzI?kWA&ec)m@>XRpwrI3)JeW}#)`N^$ zgVab`nX}wD^EPw$;!wBji+^(4RI1+HGY+Cqifm)dfX5O&g8?8xD-m7bu)#Q5+Am>K zbbr(X4~2j+mazpK0*CI@F6M$oE^LZu1-)J*_5x2f+6k>wc@UivucXMs7C!nDzMjE; z3=E3%ye&*SXI-2u=zzx^tZE%6qIz5AoHqjk-%sJY6S%empJ2RS1!|0%$WeBt3M3#G zFg&L$`Hnf~Lqx#66>Rt6-wad1-%a3A1F!esonhoR7bh-UMhL{z7O9nRg9ebng#bU# z;Nvw+3OsFL4BS41H;2ZZ0(B9q!fr5m>oS%_Oo}+okbsoo!4jS|5KNp%OdJf@HmDsy zO&V1c3undz6o&%L9d2yF2fOez8*dN9dt-6WjkSOxqI8lZby8$e#HGsFt|IeRjDqpm zML6j5KgJ&}?sjk?L0=gaEkZEWxnu^x*ouKGV-T<%#5XgzvxIM_;z0uk!Pqr1>k3VF z%#~A>m=_FUVuf*a1bYTq;^qW4X5)ydX*`^pjC>R_4c - + + - Travailler moins pour mieux travailler ? - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Travailler moins pour mieux travailler ?

        -
        - -

        Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Travailler moins pour mieux travailler ?

        +

        Published on Thu 19 May 2011

        +

        Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que je suis assez impressionné du résultat: je suis de retour chez mes parents pour le "easter break" et j'en ai profité pour donner un coup aux travaux de la maison (et pour me reposer un brin!).

        @@ -114,85 +60,6 @@ travailler moins, pourquoi pas s'y essayer !

        Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez des retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée ?

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/un-coup-de-main-pour-mon-memoire.html b/un-coup-de-main-pour-mon-memoire.html index fb1298a..2dbb2b7 100644 --- a/un-coup-de-main-pour-mon-memoire.html +++ b/un-coup-de-main-pour-mon-memoire.html @@ -1,76 +1,22 @@ - - + + - Un coup de main pour mon mémoire! - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Un coup de main pour mon mémoire!

        -
        - -

        Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Un coup de main pour mon mémoire!

        +

        Published on Wed 25 May 2011

        +

        Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du reste. En attendant je bosse sur mon mémoire de fin d'études et j'aurais besoin d'un petit coup de main.

        Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui connaissent @@ -97,85 +43,6 @@ question, et c'est tout!

        prochains mois pour ensuite les analyser correctement.

        Merci pour votre aide !

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/use-restructured-text-rest-to-power-your-presentations.html b/use-restructured-text-rest-to-power-your-presentations.html index 4b02b01..cfd1fdd 100644 --- a/use-restructured-text-rest-to-power-your-presentations.html +++ b/use-restructured-text-rest-to-power-your-presentations.html @@ -1,76 +1,22 @@ - - + + - Use Restructured Text (ReST) to power your presentations - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Use Restructured Text (ReST) to power your presentations

        -
        - -

        Wednesday, we give a presentation, with some friends, about the + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Use Restructured Text (ReST) to power your presentations

        +

        Published on Fri 25 June 2010

        +

        Wednesday, we give a presentation, with some friends, about the CouchDB Database, to the Toulouse local LUG. Thanks a lot to all the presents for being there, it was a pleasure to talk @@ -98,85 +44,6 @@ and the command line to generate the PDF:

        rst2pdf couchdb.rst -b1 -s ../slides.style -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/using-dbpedia-to-get-languages-influences.html b/using-dbpedia-to-get-languages-influences.html index 103f5a4..66d1f40 100644 --- a/using-dbpedia-to-get-languages-influences.html +++ b/using-dbpedia-to-get-languages-influences.html @@ -1,76 +1,22 @@ - - + + - Using dbpedia to get languages influences - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Using dbpedia to get languages influences

        -
        - -

        While browsing the Python's wikipedia page, I found information about the languages + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Using dbpedia to get languages influences

        +

        Published on Tue 16 August 2011

        +

        While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.

        Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between @@ -110,85 +56,6 @@ graph would probably be way less readable.

        You can find the script on my github account. Feel free to adapt it for whatever you want if you feel hackish.

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/using-jpype-to-bridge-python-and-java.html b/using-jpype-to-bridge-python-and-java.html index 6b5376b..b964139 100644 --- a/using-jpype-to-bridge-python-and-java.html +++ b/using-jpype-to-bridge-python-and-java.html @@ -1,76 +1,22 @@ - - + + - Using JPype to bridge python and Java - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Using JPype to bridge python and Java

        -
        - -

        Java provides some interesting libraries that have no exact equivalent in + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Using JPype to bridge python and Java

        +

        Published on Sat 11 June 2011

        +

        Java provides some interesting libraries that have no exact equivalent in python. In my case, the awesome boilerpipe library allows me to remove uninteresting parts of HTML pages, like menus, footers and other "boilerplate" contents.

        @@ -141,85 +87,6 @@ extract text content from URLs and remove the boilerplate text easily for infuse (my master thesis project), without having to write java code, nice!

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html b/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html index 76c80ab..3fbf4fc 100644 --- a/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html +++ b/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html @@ -1,76 +1,22 @@ - - + + - Working directly on your server? How to backup and sync your dev environment with unison - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Working directly on your server? How to backup and sync your dev environment with unison

        -
        - -

        I have a server running freebsd since some time now, and was wondering about + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Working directly on your server? How to backup and sync your dev environment with unison

        +

        Published on Wed 16 March 2011

        +

        I have a server running freebsd since some time now, and was wondering about the possibility to directly have a development environment ready to use when I get a internet connexion, even if I'm not on my computer.

        Since I use vim to code, and spend most of my time in a console while @@ -222,85 +168,6 @@ content.

        all of my developments.

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file diff --git a/wrap-up-of-the-distutils2-paris-sprint.html b/wrap-up-of-the-distutils2-paris-sprint.html index 18eac42..8326619 100644 --- a/wrap-up-of-the-distutils2-paris-sprint.html +++ b/wrap-up-of-the-distutils2-paris-sprint.html @@ -1,76 +1,22 @@ - - + + - Wrap up of the distutils2 paris' sprint - - + + - - - - - - - - + Alexis Métaireau - - - - - -Fork me on GitHub - - - - - -
        -
        -

        Wrap up of the distutils2 paris' sprint

        -
        - -

        Finally, thanks to a bunch of people that helped me to pay my train and bus + +

        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        Wrap up of the distutils2 paris' sprint

        +

        Published on Tue 08 February 2011

        +

        Finally, thanks to a bunch of people that helped me to pay my train and bus tickets, I've made it to paris for the distutils2 sprint.

        They have been a bit more than 10 people to come during the sprint, and it was very productive. Here's a taste of what we've been working on:

        @@ -108,85 +54,6 @@ bears^Wbeers.

        Again, a big thanks to all the people who gave me money to pay the transport, I really wasn't expecting such thing to happen :-)

        -
        - -
        -

        Comments !

        -
        - -
        - - -
        -
        - -
        - -
        -

        blogroll

        - -
        - - - - -
        - - - - - - - - + \ No newline at end of file From d2c60b457ac992eed53e27119a4471f67b7485d1 Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Fri, 19 Aug 2011 20:08:40 -0100 Subject: [PATCH 4/8] Update documentation --- archives.html | 3 --- author/Alexis Métaireau.html | 4 ---- category/python.html | 4 ---- feeds/all-en.atom.xml | 4 +--- feeds/all.atom.xml | 4 +--- feeds/python.atom.xml | 4 +--- index.html | 4 ---- 7 files changed, 3 insertions(+), 24 deletions(-) diff --git a/archives.html b/archives.html index 63218dc..5b4ecb6 100644 --- a/archives.html +++ b/archives.html @@ -91,9 +91,6 @@
        Tue 16 August 2011
        Using dbpedia to get languages influences
        -
        Fri 19 August 2011
        -
        Simple test page
        - diff --git a/author/Alexis Métaireau.html b/author/Alexis Métaireau.html index 763bbe2..0eeff46 100644 --- a/author/Alexis Métaireau.html +++ b/author/Alexis Métaireau.html @@ -82,10 +82,6 @@

        Published on Wed 24 February 2010

        -

        Simple test page

        -

        -

        Published on Fri 19 August 2011

        -

        Sprinting on distutils2 in Tours

        Published on Tue 06 July 2010

        diff --git a/category/python.html b/category/python.html index 88b74ef..6bb6317 100644 --- a/category/python.html +++ b/category/python.html @@ -14,10 +14,6 @@
        -

        Simple test page

        -

        -

        Published on Fri 19 August 2011

        -

        Using dbpedia to get languages influences

        Published on Tue 16 August 2011

        diff --git a/feeds/all-en.atom.xml b/feeds/all-en.atom.xml index f2c31a7..b3311c7 100644 --- a/feeds/all-en.atom.xml +++ b/feeds/all-en.atom.xml @@ -1,7 +1,5 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00+02:00Simple test page2011-08-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook -Yeah ?</p> -Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00+02:00Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index 18fa1a3..4684b57 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -1,7 +1,5 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00+02:00Simple test page2011-08-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook -Yeah ?</p> -Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00+02:00Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/feeds/python.atom.xml b/feeds/python.atom.xml index fd7b163..50b05d9 100644 --- a/feeds/python.atom.xml +++ b/feeds/python.atom.xml @@ -1,7 +1,5 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-19T00:00:00+02:00Simple test page2011-08-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-19:/simple-test-page.html/<p>Simple test for ghp-import + post commit hook -Yeah ?</p> -Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00+02:00Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/index.html b/index.html index f0505ac..f831bad 100644 --- a/index.html +++ b/index.html @@ -14,10 +14,6 @@
        -

        Simple test page

        -

        -

        Published on Fri 19 August 2011

        -

        Using dbpedia to get languages influences

        Published on Tue 16 August 2011

        From 4f830aab9909b1c0622ef64b8880b4c9961090ec Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Tue, 6 Dec 2011 18:13:42 -0100 Subject: [PATCH 5/8] Update documentation --- a-distutils2-gsoc.html | 21 +- amap-media-paniers-bio-a-5e.html | 21 +- ...-summer-of-code-working-on-distutils2.html | 21 +- ...context-to-build-up-a-web-recommender.html | 21 +- archives.html | 11 +- author/Alexis Métaireau.html | 14 +- categories.html | 2 +- category/asso.html | 2 +- category/dev.html | 2 +- category/python.html | 6 +- category/system.html | 2 +- category/thoughts.html | 10 +- ...are-you-handling-your-shared-expenses.html | 111 ++++++++++ ...y-change-your-gnome-desktop-wallpaper.html | 21 +- ...n-en-fait-de-tout-ca-linformatique-fr.html | 60 ++++++ ...quon-en-fait-de-tout-ca-linformatique.html | 60 ++++++ feeds/all-en.atom.xml | 101 ++++++++- feeds/all-fr.atom.xml | 99 +++++++++ feeds/all.atom.xml | 198 +++++++++++++++++- feeds/python.atom.xml | 80 ++++++- feeds/thoughts.atom.xml | 120 ++++++++++- first-week-working-on-distutils2.html | 21 +- ...or-how-the-social-coding-can-help-you.html | 21 +- ...-to-go-to-the-distutils2-paris-sprint.html | 21 +- ...are-you-handling-your-shared-expenses.html | 113 ++++++++++ how-to-install-nginx-php-53-on-freebsd.html | 21 +- how-to-reboot-your-bebox-using-the-cli.html | 21 +- index.html | 14 +- ...oducing-the-distutils2-index-crawlers.html | 21 +- ...ontaire-contre-le-mythe-de-labondance.html | 56 +++++ le-temps-des-graces-courrez-y.html | 21 +- pages/projects.html | 61 ------ pelican-9-months-later.html | 21 +- ...imple-static-blog-generator-in-python.html | 21 +- pypi-on-couchdb.html | 21 +- python-go.html | 21 +- quels-usages-pour-linformatique-fr.html | 132 ++++++++++++ ...vironnement-la-consommation-etudiante.html | 21 +- simple-test-page.html | 24 --- sprinting-on-distutils2-in-tours.html | 21 +- static/images/ihatemoney-fr.png | Bin 0 -> 61513 bytes static/images/ihatemoney.png | Bin 0 -> 58140 bytes tag/bleh.html | 0 theme/css/.main.css.un~ | Bin 0 -> 5912 bytes theme/css/main.css | 15 ++ travailler-moins-pour-mieux-travailler.html | 21 +- un-coup-de-main-pour-mon-memoire.html | 21 +- ...text-rest-to-power-your-presentations.html | 21 +- ...g-dbpedia-to-get-languages-influences.html | 21 +- using-jpype-to-bridge-python-and-java.html | 21 +- ...sync-your-dev-environment-with-unison.html | 21 +- wrap-up-of-the-distutils2-paris-sprint.html | 21 +- 52 files changed, 1620 insertions(+), 198 deletions(-) create mode 100644 drafts/how-are-you-handling-your-shared-expenses.html create mode 100644 et-quest-ce-quon-en-fait-de-tout-ca-linformatique-fr.html create mode 100644 et-quest-ce-quon-en-fait-de-tout-ca-linformatique.html create mode 100644 feeds/all-fr.atom.xml create mode 100644 how-are-you-handling-your-shared-expenses.html create mode 100644 la-simplicite-volontaire-contre-le-mythe-de-labondance.html delete mode 100644 pages/projects.html create mode 100644 quels-usages-pour-linformatique-fr.html delete mode 100644 simple-test-page.html create mode 100644 static/images/ihatemoney-fr.png create mode 100644 static/images/ihatemoney.png delete mode 100644 tag/bleh.html create mode 100644 theme/css/.main.css.un~ diff --git a/a-distutils2-gsoc.html b/a-distutils2-gsoc.html index e3e7018..1c8aa7c 100644 --- a/a-distutils2-gsoc.html +++ b/a-distutils2-gsoc.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        A Distutils2 GSoC

        @@ -48,6 +46,21 @@ to apply all good practice, among other things that can make a developper-life joyful. I'll post here, each week, my advancement, and my tought about python and especialy python packaging world.

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/amap-media-paniers-bio-a-5e.html b/amap-media-paniers-bio-a-5e.html index ec26a4e..04f1ba6 100644 --- a/amap-media-paniers-bio-a-5e.html +++ b/amap-media-paniers-bio-a-5e.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        AMAP + Média = Paniers bio à 5e ?!

        @@ -50,6 +48,21 @@ bien réel, et qu'il est possible de sortir du tout, tout de suite.

        Mais bon, apparemment, ça passe pas bien à la télé.

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/an-amazing-summer-of-code-working-on-distutils2.html b/an-amazing-summer-of-code-working-on-distutils2.html index af928c3..1816ed6 100644 --- a/an-amazing-summer-of-code-working-on-distutils2.html +++ b/an-amazing-summer-of-code-working-on-distutils2.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        An amazing summer of code working on distutils2

        @@ -160,6 +158,21 @@ interested about FOSS, dont hesitate any second, it's a really good opportunity to work on interesting projects!

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/analyse-users-browsing-context-to-build-up-a-web-recommender.html b/analyse-users-browsing-context-to-build-up-a-web-recommender.html index 2243200..fe37c9f 100644 --- a/analyse-users-browsing-context-to-build-up-a-web-recommender.html +++ b/analyse-users-browsing-context-to-build-up-a-web-recommender.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Analyse users' browsing context to build up a web recommender

        @@ -195,6 +193,21 @@ contents as well, to do some keyword based classification will be done.

        Lot of work on its way, yay !

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/archives.html b/archives.html index 5b4ecb6..ae28864 100644 --- a/archives.html +++ b/archives.html @@ -8,7 +8,7 @@
        -

        Alexis Métaireau's thoughs

        +

        Alexis Métaireau's thougths

        @@ -91,6 +91,15 @@
        Tue 16 August 2011
        Using dbpedia to get languages influences
        +
        Fri 14 October 2011
        +
        La simplicité volontaire contre le mythe de l'abondance
        + +
        Sat 15 October 2011
        +
        How are you handling your shared expenses?
        + +
        Thu 01 December 2011
        +
        Quels usages pour l'informatique ?
        +
        diff --git a/author/Alexis Métaireau.html b/author/Alexis Métaireau.html index 0eeff46..77b3771 100644 --- a/author/Alexis Métaireau.html +++ b/author/Alexis Métaireau.html @@ -8,7 +8,7 @@
        -

        Alexis Métaireau's thoughs

        +

        Alexis Métaireau's thougths

        @@ -46,6 +46,10 @@

        Published on Sat 15 January 2011

        +

        How are you handling your shared expenses?

        +

        +

        Published on Sat 15 October 2011

        +

        How to install NGINX + PHP 5.3 on FreeBSD.

        Published on Sun 10 October 2010

        @@ -58,6 +62,10 @@

        Published on Tue 06 July 2010

        +

        La simplicité volontaire contre le mythe de l'abondance

        +

        +

        Published on Fri 14 October 2011

        +

        Le temps des grâces, courrez-y !

        Published on Sun 28 March 2010

        @@ -78,6 +86,10 @@

        Published on Thu 17 December 2009

        +

        Quels usages pour l'informatique ?

        +

        +

        Published on Thu 01 December 2011

        +

        Semaine de l’environnement: La consommation étudiante

        Published on Wed 24 February 2010

        diff --git a/categories.html b/categories.html index f0c3735..e01284f 100644 --- a/categories.html +++ b/categories.html @@ -8,7 +8,7 @@
        -

        Alexis Métaireau's thoughs

        +

        Alexis Métaireau's thougths

        diff --git a/category/asso.html b/category/asso.html index d89d88f..b6daf2f 100644 --- a/category/asso.html +++ b/category/asso.html @@ -8,7 +8,7 @@
        -

        Alexis Métaireau's thoughs

        +

        Alexis Métaireau's thougths

        diff --git a/category/dev.html b/category/dev.html index 5770c41..46196a6 100644 --- a/category/dev.html +++ b/category/dev.html @@ -8,7 +8,7 @@
        -

        Alexis Métaireau's thoughs

        +

        Alexis Métaireau's thougths

        diff --git a/category/python.html b/category/python.html index 6bb6317..5662b8d 100644 --- a/category/python.html +++ b/category/python.html @@ -8,12 +8,16 @@
        -

        Alexis Métaireau's thoughs

        +

        Alexis Métaireau's thougths

        +

        How are you handling your shared expenses?

        +

        +

        Published on Sat 15 October 2011

        +

        Using dbpedia to get languages influences

        Published on Tue 16 August 2011

        diff --git a/category/system.html b/category/system.html index 5ed22ab..4e931e1 100644 --- a/category/system.html +++ b/category/system.html @@ -8,7 +8,7 @@
        -

        Alexis Métaireau's thoughs

        +

        Alexis Métaireau's thougths

        diff --git a/category/thoughts.html b/category/thoughts.html index 87eba87..694125f 100644 --- a/category/thoughts.html +++ b/category/thoughts.html @@ -8,12 +8,20 @@
        -

        Alexis Métaireau's thoughs

        +

        Alexis Métaireau's thougths

        +

        Quels usages pour l'informatique ?

        +

        +

        Published on Thu 01 December 2011

        + +

        La simplicité volontaire contre le mythe de l'abondance

        +

        +

        Published on Fri 14 October 2011

        +

        Travailler moins pour mieux travailler ?

        Published on Thu 19 May 2011

        diff --git a/drafts/how-are-you-handling-your-shared-expenses.html b/drafts/how-are-you-handling-your-shared-expenses.html new file mode 100644 index 0000000..8bbdc00 --- /dev/null +++ b/drafts/how-are-you-handling-your-shared-expenses.html @@ -0,0 +1,111 @@ + + + + + + + Alexis Métaireau + + +
        +

        Alexis Métaireau's thoughs

        + +
        +
        +

        How are you handling your shared expenses?

        +

        Published on Sat 15 October 2011

        +

        As a student, I lived in a lot of different locations, and the majority of them +had something in common: I lived with others. It usually was a great experience +(and I think I will continue to live with others). Most of the time, we had to +spend some time each month to compute who had to pay what to the others.

        +

        I wanted to create a pet project using flask, so I wrote a little +(~150 lines) flask application to handle this. It worked out pretty well for my +housemates and me, and as we had to move into different locations, +one of them asked me if he could continue to use it for the year to come.

        +

        I said yes and gave it some more thoughts: We probably aren't the only ones +interested by such kind of software. I decided to extend a bit more the +software to have a concept of projects and persons (the list of persons was +hard-coded in the first time, boooh!).

        +

        I then discussed with a friend of mine, who was excited about it and wanted to learn +python. Great! That's a really nice way to get started. Some more friends were also +interested in it and contributed some features and provided feedback (thanks +Arnaud and Quentin!)

        +

        Since that, the project now support multiple languages and provides a REST API +(android and iphone apps in the tubes!), into other things. +There is no need to register for an account or whatnot, just enter a project name, +a secret code and a contact email, invite friends and that's it (this was inspired by +doodle)!

        +images/ihatemoney.png +

        You can try the project at http://ihatemoney.notmyidea.org for now, and the +code lives at https://github.com/ametaireau/budget-manager/.

        +
        +

        Features

        +

        In the wild, currently, there already are some implementations of this shared +budget manager thing. The fact is that most of them are either hard to use, with +a too much fancy design or simply trying to do too much things at once.

        +

        No, I don't want my budget manager to make my shopping list, or to run a blog for +me, thanks. I want it to let me focus on something else. Keep out of my way.

        +
        +

        No user registration

        +

        You don't need to register an account on the website to start using it. You +just have to create a project, set a secret code for it, and give both the url and +the code to the people you want to share it with (or the website can poke +them for you).

        +
        +
        +

        Keeping things simple

        +

        "Keep It Simple, Stupid" really matches our philosophy here: you want to add a +bill? Okay. Just do it. You just have to enter who paid, for who, how much, +and a description, like you would have done when you're back from the +farmer's market on raw paper.

        +
        +
        +

        No categories

        +

        Some people like to organise their stuff into different "categories": +leisure, work, eating, etc. That's not something I want (at least to begin +with).

        +

        I want things to be simple. Got that? Great. Just add your bills!

        +
        +
        +

        Balance

        +

        One of the most useful thing is to know what's your "balance" compared to +others. In other words, if you're negative, you owe money, if you're positive, +you have to receive money. This allows you to dispatch who has to pay for the +next thing, in order to re-equilibrate the balance.

        +

        Additionally, the system is able to compute for you who has to give how +much to who, in order to reduce the number of transactions needed to restore +the balance.

        +
        +
        +

        API

        +

        All of what's possible to do with the standard web interface is also available +through a REST API. I developed a simple REST toolkit for flask for this (and +I should release it!).

        +
        +
        +
        +

        Interested?

        +

        This project is open source. All of us like to share what we are doing and +would be happy to work with new people and implement new ideas. If you have +a nice idea about this, if you want to tweak it or to fill bugs. Don't hesitate +a second! The project lives at http://github.com/ametaireau/budget-manager/

        +
        + + + +
        +

        Comments

        +
        + +
        + +
        + + \ No newline at end of file diff --git a/dynamically-change-your-gnome-desktop-wallpaper.html b/dynamically-change-your-gnome-desktop-wallpaper.html index 9972094..d533412 100644 --- a/dynamically-change-your-gnome-desktop-wallpaper.html +++ b/dynamically-change-your-gnome-desktop-wallpaper.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Dynamically change your gnome desktop wallpaper

        @@ -60,6 +58,21 @@ optional arguments: -b, --debug
        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/et-quest-ce-quon-en-fait-de-tout-ca-linformatique-fr.html b/et-quest-ce-quon-en-fait-de-tout-ca-linformatique-fr.html new file mode 100644 index 0000000..28d3fa3 --- /dev/null +++ b/et-quest-ce-quon-en-fait-de-tout-ca-linformatique-fr.html @@ -0,0 +1,60 @@ + + + + + + + Alexis Métaireau + + +
        +

        Alexis Métaireau's thougths

        + +
        +
        +

        Et qu'est-ce qu'on en fait de tout ça ? (l'informatique)

        +

        Published on Thu 01 December 2011

        +

        Quand on termine ses études, on s'en pose un tas, des questions. Sur le metier que l'on veut faire, sur ce que ça signifie, sur le sens et la valeur du travail. Et j'en suis arrivé à faire un constat simple: l'informatique, c'est utile, tant que ça ne viens pas vous pourir la vie. Oui, parce que de l'informatique on en a partout, des "geeks" et des "accros" aussi, et que ça vient s'immisser dans nos vies même quand d'autres moyens ou medias sont plus utiles ou pertinents.

        +

        Certes, l'informatique nous permet de mieux communiquer et de mieux travailler. Mais à quel prix ? ce n'est pas parce qu'il est "possible" d'industrialiser l'éducation (ou l'agriculture !), que l'on doit le faire. Oui, ça me dérange d'être une des nombreuses personnes à l'oeuvre derrière cette soit disant "révolution", qui n'est pas toujours pour le meilleur. Attention, je ne remets pas l'informatique et son intérêt en cause: je me pose des questions quand à la place que je veux lui donner et la place que je souhaites occuper dans son évolution. Ce n'est pas parce qu'on peut tuer avec un marteau (avec un peu de volonté) qu'il s'agit d'un mauvais outil, mais si tout le monde se met à tuer avec des marteaux (y'à des malades partout, hein), alors se poser la question de son rôle, en tant que fabricant de marteaux me semble necessaire (oui, je vous l'accorde, on aura vu des comparaisons plus perspicaces).

        +

        Donc: à partir de quel moment l'informatique cesse d'être un outil utile pour transformer nos modes de vies d'une manière qui me dérange ? Peut être avec son arrivée sur des périphériques mobiles ? Peut être quand elle se fait l'instrument du consumérisme et de l'individualisme.

        +
        +

        Et alors, on fait quoi ?

        +

        Mais si je continue à faire de l'informatique, il y à bien des raison. J'ai d'ailleurs trouvé mon intérêt de par le coté collaboratif qui est permis et développé par l'outil informatique, et notemment par le réseau des réseaux (internet). Faisons ensemble, mes amis. Prouvons que la collaboration à de meilleurs jours à vivre que la compétition. Le web, notemment, est une avancée majeure en ce qui concerne la liberté d'expression et le partage de connaissances (oui, kipédia). Je vous conseille d'ailleurs à ce propos l'excellent discours tenu par Bernard Stiegler paru recemment sur owni.

        +

        Et c'est cet avenir qu'il me plait de défendre: l'ouverture d'esprit, la possibilité que chacun puisse contribuer et participer à une base de savoir commune, en apprennant des autres. Mais par pitié, n'imposons pas la technologie là ou elle n'est pas necessaire, et utilisons là avec tacte quand elle peut nous être profitable.

        +

        Il me plait de repenser l'informatique comme outil et non plus comme mode de vie. Faisons le l'outil de la collaboration. À l'école, apprenons à nos enfants à collaborer, à suciter le partage, pas uniquement avec l'outil informatique, mais aussi avec celui ci, tout en leurs apprenant à avoir un regard critique sur les informations qu'il reçoivent.

        +

        En bref, questionner le rôle que l'on souhaites avoir dans notre société par le biais de l'informatique est necessaire. Comme d'autres, je suis arrivé à l'informatique par le biais du premier ordinateur familial, il y a de ça une bonne quinzaine d'années. Ça intrigue, on touche un peu à tout (on en fait des conneries !) et on finit par apprendre/comprendre comment ça marche, petit à petit. Cette curiosité n'est d'ailleurs pas le propre de l'informatique puisqu'on la retrouve dans la cuisine, dans le bricolage et dans un tas de domaines de notre vie quotidienne.

        +

        Finalement, c'est aimer bidouiller, et comprendre comment ça fonctionne, quitte à sortir les compétances de leur domaine de prédilection (qui à dit que l'informatique ne pouvait être artistique ?) Le mouvement hacker (bidouilleurs) aime à sortir l'informatique de son carcan et l'appliquer ailleurs.

        +

        C'est de cette manière que j'ai envie de considérer mon métier, qui avant tout est une passion. Je suis un bidouilleur, j'aime découvrir comment les choses +fonctionnent et avoir une panoplie d'outils qui me permettent de répondre à des besoins réels.

        +
        +

        Favoriser la collaboration

        +

        Et donc, en tant qu'individu, pourquoi faire de l'informatique ? Qu'est-ce qui m'attire dans cet outil ?

        +

        Ce qu'on pourrait qualifier de "recherche fondamentale", l'écriture de bibliothèques logicielles, est important mais n'est pas tout. Ce qui importe ce sont les usages qui en découlent. Je souhaite savoir écrire des outils qui sont utiles, qui favorisent la collaboration et participent à l'ouverture des esprits.

        +

        Je choisis de faire de l'informatique pour créer les outils qui répondent à des problématiques réelles, pour trouver de meilleures manières de communiquer et de travailler ensemble. Mais, comme me le disait David, d'Outils-Réseaux, on ne crée pas de la coopération: rien ne sert d'essayer de faire coopérer des gens qui ne veulent pas. On peut, cependant, la faciliter, en utilisant les bons outils et en formant les gens à leur utilisation, ainsi qu'aux pratiques collaboratives (qui, je le repette, ne s'arettent pas du tout aux frontières informatique).

        +
        +
        +

        Décloisonner le logiciel libre

        +

        Le logiciel libre, avant d'être une force pour le marché logiciel, est une application du partage. Une démonstration qu'il est possible de travailler ensemble pour fabriquer quelque chose de fonctionnel et d'utile pour tous. Une sorte d'antithèse de ce modèle capitaliste incarné par les brevets logiciel.

        +

        A plusieurs reprises, j'ai été bluffé par la réalité du logiciel libre. Oui, il est facile de collaborer lorsqu'on crée un logiciel, pour peu qu'on explique les tenants et les aboutissants aux participants. Les contributeurs sortent d'on ne sait ou, pour peu que le projet leur soit utile. Je ne parles pas d'outils "corpo compliant" (bien que ça soit probablement aussi le cas), mais d'outils que j'ai pu développer pour mon propre usage, et sur lesquels il à été possible de collaborer avec d'autres.

        +

        Parce que l'informatique est utile dans bien des milieux, parce qu'elle peut être (et elle l'est) un vecteur de participation et de collaboration, défendons les valeurs qui nous sont chères (logiciels libres et ouverts!) et construisons des ponts entre les initiatives qui nous parlent (dans mon cas ça parles de fermes autogérées, et d'initiatives d'éducation populaire) et l'informatique. Faisons en sorte de rendre l'informatique accessible et utile dans les milieux ou elle peut apporter quelque chose !

        +
        +
        + + + +
        +

        Comments

        +
        + +
        + +
        + + \ No newline at end of file diff --git a/et-quest-ce-quon-en-fait-de-tout-ca-linformatique.html b/et-quest-ce-quon-en-fait-de-tout-ca-linformatique.html new file mode 100644 index 0000000..c5aacb1 --- /dev/null +++ b/et-quest-ce-quon-en-fait-de-tout-ca-linformatique.html @@ -0,0 +1,60 @@ + + + + + + + Alexis Métaireau + + +
        +

        Alexis Métaireau's thougths

        + +
        +
        +

        Et qu'est-ce qu'on en fait de tout ça ? (l'informatique)

        +

        Published on Thu 01 December 2011

        +

        Quand on termine ses études, on s'en pose un tas, des questions. Sur le metier que l'on veut faire, sur ce que ça signifie, sur le sens et la valeur du travail. Et j'en suis arrivé à faire un constat simple: l'informatique, c'est utile, tant que ça ne viens pas vous pourir la vie. Oui, parce que de l'informatique on en a partout, des "geeks" et des "accros" aussi, et que ça vient s'immisser dans nos vies même quand d'autres moyens ou medias sont plus utiles ou pertinents.

        +

        Certes, l'informatique nous permet de mieux communiquer et de mieux travailler. Mais à quel prix ? ce n'est pas parce qu'il est "possible" d'industrialiser l'éducation (ou l'agriculture !), que l'on doit le faire. Oui, ça me dérange d'être une des nombreuses personnes à l'oeuvre derrière cette soit disant "révolution", qui n'est pas toujours pour le meilleur. Attention, je ne remets pas l'informatique et son intérêt en cause: je me pose des questions quand à la place que je veux lui donner et la place que je souhaites occuper dans son évolution. Ce n'est pas parce qu'on peut tuer avec un marteau (avec un peu de volonté) qu'il s'agit d'un mauvais outil, mais si tout le monde se met à tuer avec des marteaux (y'à des malades partout, hein), alors se poser la question de son rôle, en tant que fabricant de marteaux me semble necessaire (oui, je vous l'accorde, on aura vu des comparaisons plus perspicaces).

        +

        Donc: à partir de quel moment l'informatique cesse d'être un outil utile pour transformer nos modes de vies d'une manière qui me dérange ? Peut être avec son arrivée sur des périphériques mobiles ? Peut être quand elle se fait l'instrument du consumérisme et de l'individualisme.

        +
        +

        Et alors, on fait quoi ?

        +

        Mais si je continue à faire de l'informatique, il y à bien des raison. J'ai d'ailleurs trouvé mon intérêt de par le coté collaboratif qui est permis et développé par l'outil informatique, et notemment par le réseau des réseaux (internet). Faisons ensemble, mes amis. Prouvons que la collaboration à de meilleurs jours à vivre que la compétition. Le web, notemment, est une avancée majeure en ce qui concerne la liberté d'expression et le partage de connaissances (oui, kipédia). Je vous conseille d'ailleurs à ce propos l'excellent discours tenu par Bernard Stiegler paru recemment sur owni.

        +

        Et c'est cet avenir qu'il me plait de défendre: l'ouverture d'esprit, la possibilité que chacun puisse contribuer et participer à une base de savoir commune, en apprennant des autres. Mais par pitié, n'imposons pas la technologie là ou elle n'est pas necessaire, et utilisons là avec tacte quand elle peut nous être profitable.

        +

        Il me plait de repenser l'informatique comme outil et non plus comme mode de vie. Faisons le l'outil de la collaboration. À l'école, apprenons à nos enfants à collaborer, à suciter le partage, pas uniquement avec l'outil informatique, mais aussi avec celui ci, tout en leurs apprenant à avoir un regard critique sur les informations qu'il reçoivent.

        +

        En bref, questionner le rôle que l'on souhaites avoir dans notre société par le biais de l'informatique est necessaire. Comme d'autres, je suis arrivé à l'informatique par le biais du premier ordinateur familial, il y a de ça une bonne quinzaine d'années. Ça intrigue, on touche un peu à tout (on en fait des conneries !) et on finit par apprendre/comprendre comment ça marche, petit à petit. Cette curiosité n'est d'ailleurs pas le propre de l'informatique puisqu'on la retrouve dans la cuisine, dans le bricolage et dans un tas de domaines de notre vie quotidienne.

        +

        Finalement, c'est aimer bidouiller, et comprendre comment ça fonctionne, quitte à sortir les compétances de leur domaine de prédilection (qui à dit que l'informatique ne pouvait être artistique ?) Le mouvement hacker (bidouilleurs) aime à sortir l'informatique de son carcan et l'appliquer ailleurs.

        +

        C'est de cette manière que j'ai envie de considérer mon métier, qui avant tout est une passion. Je suis un bidouilleur, j'aime découvrir comment les choses +fonctionnent et avoir une panoplie d'outils qui me permettent de répondre à des besoins réels.

        +
        +

        Favoriser la collaboration

        +

        Et donc, en tant qu'individu, pourquoi faire de l'informatique ? Qu'est-ce qui m'attire dans cet outil ?

        +

        Ce qu'on pourrait qualifier de "recherche fondamentale", l'écriture de bibliothèques logicielles, est important mais n'est pas tout. Ce qui importe ce sont les usages qui en découlent. Je souhaite savoir écrire des outils qui sont utiles, qui favorisent la collaboration et participent à l'ouverture des esprits.

        +

        Je choisis de faire de l'informatique pour créer les outils qui répondent à des problématiques réelles, pour trouver de meilleures manières de communiquer et de travailler ensemble. Mais, comme me le disait David, d'Outils-Réseaux, on ne crée pas de la coopération: rien ne sert d'essayer de faire coopérer des gens qui ne veulent pas. On peut, cependant, la faciliter, en utilisant les bons outils et en formant les gens à leur utilisation, ainsi qu'aux pratiques collaboratives (qui, je le repette, ne s'arettent pas du tout aux frontières informatique).

        +
        +
        +

        Décloisonner le logiciel libre

        +

        Le logiciel libre, avant d'être une force pour le marché logiciel, est une application du partage. Une démonstration qu'il est possible de travailler ensemble pour fabriquer quelque chose de fonctionnel et d'utile pour tous. Une sorte d'antithèse de ce modèle capitaliste incarné par les brevets logiciel.

        +

        A plusieurs reprises, j'ai été bluffé par la réalité du logiciel libre. Oui, il est facile de collaborer lorsqu'on crée un logiciel, pour peu qu'on explique les tenants et les aboutissants aux participants. Les contributeurs sortent d'on ne sait ou, pour peu que le projet leur soit utile. Je ne parles pas d'outils "corpo compliant" (bien que ça soit probablement aussi le cas), mais d'outils que j'ai pu développer pour mon propre usage, et sur lesquels il à été possible de collaborer avec d'autres.

        +

        Parce que l'informatique est utile dans bien des milieux, parce qu'elle peut être (et elle l'est) un vecteur de participation et de collaboration, défendons les valeurs qui nous sont chères (logiciels libres et ouverts!) et construisons des ponts entre les initiatives qui nous parlent (dans mon cas ça parles de fermes autogérées, et d'initiatives d'éducation populaire) et l'informatique. Faisons en sorte de rendre l'informatique accessible et utile dans les milieux ou elle peut apporter quelque chose !

        +
        +
        + + + +
        +

        Comments

        +
        + +
        + +
        + + \ No newline at end of file diff --git a/feeds/all-en.atom.xml b/feeds/all-en.atom.xml index b3311c7..90099b4 100644 --- a/feeds/all-en.atom.xml +++ b/feeds/all-en.atom.xml @@ -1,5 +1,104 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00+02:00Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Alexis' loghttp://blog.notmyidea.org2011-10-15T00:00:00+02:00How are you handling your shared expenses?2011-10-15T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-15:/how-are-you-handling-your-shared-expenses.html/<p><strong>TL;DR:</strong> We're kick-starting a new application to manage your shared +expenses. Have a look at <a class="reference external" href="http://ihatemoney.notmyidea.org">http://ihatemoney.notmyidea.org</a></p> +<p>As a student, I lived in a lot of different locations, and the majority of them +had something in common: I lived with others. It usually was a great experience +(and I think I will continue to live with others). Most of the time, we had to +spend some time each month to compute who had to pay what to the others.</p> +<p>I wanted to create a pet project using flask, so I wrote a little +(~150 lines) flask application to handle this. It worked out pretty well for my +housemates and me, and as we had to move into different locations, +one of them asked me if he could continue to use it for the year to come.</p> +<p>I said yes and gave it some more thoughts: We probably aren't the only ones +interested by such kind of software. I decided to extend a bit more the +software to have a concept of projects and persons (the list of persons was +hard-coded in the first time, boooh!).</p> +<p>I then discussed with a friend of mine, who was excited about it and wanted to learn +python. Great! That's a really nice way to get started. Some more friends were also +interested in it and contributed some features and provided feedback (thanks +<a class="reference external" href="http://www.sneakernet.fr/">Arnaud</a> and Quentin!)</p> +<p>Since that, the project now support multiple languages and provides a REST API +(android and iphone apps in the tubes!), into other things. +There is no need to register for an account or whatnot, just enter a project name, +a secret code and a contact email, invite friends and that's it (this was inspired by +doodle)!</p> +<img alt="images/ihatemoney.png" src="images/ihatemoney.png" /> +<p>You can try the project at <a class="reference external" href="http://ihatemoney.notmyidea.org">http://ihatemoney.notmyidea.org</a> for now, and the +code lives at <a class="reference external" href="https://github.com/spiral-project/ihatemoney/">https://github.com/spiral-project/ihatemoney/</a>.</p> +<div class="section" id="features"> +<h2>Features</h2> +<p>In the wild, currently, there already are some implementations of this shared +budget manager thing. The fact is that most of them are either hard to use, with +a too much fancy design or simply trying to do too much things at once.</p> +<p>No, I don't want my budget manager to make my shopping list, or to run a blog for +me, thanks. I want it to let me focus on something else. Keep out of my way.</p> +<div class="section" id="no-user-registration"> +<h3>No user registration</h3> +<p>You don't need to register an account on the website to start using it. You +just have to create a project, set a secret code for it, and give both the url and +the code to the people you want to share it with (or the website can poke +them for you).</p> +</div> +<div class="section" id="keeping-things-simple"> +<h3>Keeping things simple</h3> +<p>&quot;Keep It Simple, Stupid&quot; really matches our philosophy here: you want to add a +bill? Okay. Just do it. You just have to enter who paid, for who, how much, +and a description, like you would have done when you're back from the +farmer's market on raw paper.</p> +</div> +<div class="section" id="no-categories"> +<h3>No categories</h3> +<p>Some people like to organise their stuff into different &quot;categories&quot;: +leisure, work, eating, etc. That's not something I want (at least to begin +with).</p> +<p>I want things to be simple. Got that? Great. Just add your bills!</p> +</div> +<div class="section" id="balance"> +<h3>Balance</h3> +<p>One of the most useful thing is to know what's your &quot;balance&quot; compared to +others. In other words, if you're negative, you owe money, if you're positive, +you have to receive money. This allows you to dispatch who has to pay for the +next thing, in order to re-equilibrate the balance.</p> +<p>Additionally, the system is able to compute for you who has to give how +much to who, in order to reduce the number of transactions needed to restore +the balance.</p> +</div> +<div class="section" id="api"> +<h3>API</h3> +<p>All of what's possible to do with the standard web interface is also available +through a REST API. I developed a simple REST toolkit for flask for this (and +I should release it!).</p> +</div> +</div> +<div class="section" id="interested"> +<h2>Interested?</h2> +<p>This project is open source. All of us like to share what we are doing and +would be happy to work with new people and implement new ideas. If you have +a nice idea about this, if you want to tweak it or to fill bugs. Don't hesitate +a second! The project lives at <a class="reference external" href="http://github.com/spiral-project/ihatemoney/">http://github.com/spiral-project/ihatemoney/</a></p> +</div> +La simplicité volontaire contre le mythe de l'abondance2011-10-14T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-14:/la-simplicite-volontaire-contre-le-mythe-de-labondance.html/<p>Paul Ariès dans la préface de &quot;<a class="reference external" href="http://www.editionsladecouverte.fr/catalogue/index.php?ean13=9782707169747">La simplicité volontaire contre le mythe de +l'abondance</a>&quot;</p> +<blockquote> +Je sais aussi qu'à force d'être seulement contre, nous finissons par être +&quot;tout contre&quot;, tout contre le système, ses débats pourris, ses pratiques +immondes, ses pervertions mentales. Cessons de porter notre adversaire sur +notre dos, car il finira par nous poignarder, au moment ou nous pensions +justement pouvoir le vaincre… Entendons-nous bien, il ne s'agit pas +d'apprendre à &quot;positiver&quot; sous prétexte que l'on pourrait &quot;moraliser&quot; ou +repeindre en vert le capitalisme, il s'agit, bien au contraire, d'être aussi +intraitables lorsque nous créons cet autre monde, que lorsque nous étions +ces militants purs mais un peu durs à jouir, il s'agit d'être aussi +indomptables mais sans oublier que le capitalisme ne pourra être arrété que +par du non-capitaliste… c'est-à-dire en multipliant les expérimentations +sociales, en acceptant de faire au maximum sécession, en inventant +(réinventant?) une gauche buissonière et maquisarde, en faisant, au +quotidien, la part belle à la dérive, à des modes de comportement +expérimentaux. Nous ne devons plus accepter de faire de la politique aux +conditions de nos adversaires, car c'est la seule façon d'éviter le +pessimisme, le ressentiment, une désensibilisation croissante et… la mort +lente.</blockquote> +Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/feeds/all-fr.atom.xml b/feeds/all-fr.atom.xml new file mode 100644 index 0000000..8f7ef10 --- /dev/null +++ b/feeds/all-fr.atom.xml @@ -0,0 +1,99 @@ + +Alexis' loghttp://blog.notmyidea.org2011-12-01T00:00:00+01:00Quels usages pour l'informatique ?2011-12-01T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-01:/quels-usages-pour-linformatique-fr.html/<p>Quand on termine ses études, on s'en pose un tas, des questions. Sur le métier +que l'on veut faire, sur ce que ça signifie, sur le sens et la valeur du +travail. Et j'en suis arrivé à faire un constat simple: l'informatique, c'est +utile, tant que ça ne viens pas vous pourrir la vie. Oui, parce que de +l'informatique on en a partout, des &quot;geeks&quot; et des &quot;accros&quot; aussi, et que ça +vient s'immiscer dans nos vies même quand d'autres moyens ou médias sont plus +utiles ou pertinents.</p> +<p>Certes, l'informatique nous permet de mieux communiquer et de mieux travailler. +Mais à quel prix ? ce n'est pas parce qu'il est &quot;possible&quot; d'<a class="reference external" href="http://retourdactu.fr/2011/11/07/la-non-communication-nouveau-modele-de-societe/">industrialiser +l'éducation</a> +(ou l'agriculture !), que l'on doit le faire. Oui, ça me dérange d'être une des +nombreuses personnes à l'œuvre derrière cette soit disant &quot;révolution&quot;, qui +n'est pas toujours pour le meilleur. Attention, je ne remets pas l'informatique +et son intérêt en cause: je me pose des questions quand à la place que je veux +lui donner et la place que je souhaites occuper dans son évolution. Ce n'est +pas parce qu'on peut tuer avec un marteau (avec un peu de volonté) qu'il s'agit +d'un mauvais outil, mais si tout le monde se met à tuer avec des marteaux (y a +des malades partout, hein), alors se poser la question de son rôle, en tant que +fabricant de marteaux me semble nécessaire (oui, je vous l'accorde, on aura vu +des comparaisons plus perspicaces).</p> +<p>Donc: à partir de quel moment l'informatique cesse d'être un outil utile pour +transformer nos modes de vies d'une manière qui me dérange ? Peut être avec son +arrivée sur des périphériques mobiles ? Peut être quand elle se fait +l'instrument du consumérisme et de l'individualisme.</p> +<div class="section" id="et-alors-on-fait-quoi"> +<h2>Et alors, on fait quoi ?</h2> +<p>Mais si je continue à faire de l'informatique, il y à bien des raison. J'ai +d'ailleurs trouvé mon intérêt de par le coté collaboratif qui est permis et +développé par l'outil informatique, et notamment par le réseau des réseaux +(internet). Faisons ensemble, mes amis. Prouvons que la collaboration à de +meilleurs jours à vivre que la compétition. Le web, notamment, est une avancée +majeure en ce qui concerne la liberté d'expression et le partage de +connaissances (oui, kipédia). Je vous conseille d'ailleurs à ce propos +<a class="reference external" href="http://owni.fr/2011/11/30/vers-une-economie-de-la-contribution/">l'excellent discours tenu par Bernard Stiegler</a> paru +recemment sur <a class="reference external" href="http://www.owni.fr">owni</a>.</p> +<p>Et c'est cet avenir qu'il me plait de défendre: l'ouverture d'esprit, la +possibilité que chacun puisse contribuer et participer à une base de savoir +commune, en apprenant des autres. Mais par pitié, n'imposons pas la +technologie là ou elle n'est pas nécessaire, et utilisons là avec tact quand +elle peut nous être profitable.</p> +<p>Il me plait de repenser l'informatique comme outil et non plus comme mode de +vie. Faisons le l'outil de la collaboration. À l'école, apprenons à nos enfants +à collaborer, à susciter le partage, pas uniquement avec l'outil informatique, +mais aussi avec celui ci, tout en leurs apprenant à avoir un regard critique +sur les informations qu'il reçoivent.</p> +<p>En bref, questionner le rôle que l'on souhaites avoir dans notre société par le +biais de l'informatique est nécessaire. Comme d'autres, je suis arrivé +à l'informatique par le biais du premier ordinateur familial, il y a de ça une +bonne quinzaine d'années. Ça intrigue, on touche un peu à tout (on en fait des +conneries !) et on finit par apprendre/comprendre comment ça marche, petit +à petit. Cette curiosité n'est d'ailleurs pas le propre de l'informatique +puisqu'on la retrouve dans la cuisine, dans le bricolage et dans un tas de +domaines de notre vie quotidienne.</p> +<p>Finalement, c'est aimer bidouiller, et comprendre comment ça fonctionne, quitte +à sortir les compétences de leur domaine de prédilection (qui à dit que +l'informatique ne pouvait être artistique ?) Le mouvement hacker (bidouilleurs) +aime à sortir l'informatique de son carcan et l'appliquer ailleurs.</p> +<p>C'est de cette manière que j'ai envie de considérer mon métier, qui avant tout +est une passion. Je suis un bidouilleur, j'aime découvrir comment les choses +fonctionnent et avoir une panoplie d'outils qui me permettent de répondre à des +besoins réels.</p> +</div> +<div class="section" id="favoriser-la-collaboration"> +<h2>Favoriser la collaboration</h2> +<p>Et donc, en tant qu'individu, pourquoi faire de l'informatique ? Qu'est-ce qui +m'attire dans cet outil ?</p> +<p>Ce qu'on pourrait qualifier de &quot;recherche fondamentale&quot;, l'écriture de +bibliothèques logicielles, est important mais n'est pas tout. Ce qui importe ce +sont les usages qui en découlent. Je souhaite <strong>savoir écrire des outils qui +sont utiles</strong>, <strong>qui favorisent la collaboration et participent à l'ouverture +des esprits</strong>.</p> +<p>Je choisis de faire de l'informatique pour créer les outils qui répondent à des +problématiques réelles, pour trouver de meilleures manières de communiquer et +de travailler ensemble. Mais, comme me le disait David, d'<a class="reference external" href="http://outils-reseaux.org/PresentationProjet">Outils-Réseaux</a>, on ne crée pas de la +coopération: rien ne sert d'essayer de faire coopérer des gens qui ne veulent +pas. On peut, cependant, la faciliter, en utilisant les bons outils et en +formant les gens à leur utilisation, ainsi qu'aux pratiques collaboratives +(qui, je le répète, ne s'arrêtent pas du tout aux frontières informatique).</p> +<p>Le logiciel libre, avant d'être une force pour le marché logiciel, est une +application du partage. Une démonstration qu'il est possible de travailler +ensemble pour fabriquer quelque chose de fonctionnel et d'utile pour tous. Une +sorte d'antithèse de ce modèle capitaliste incarné par les brevets logiciel.</p> +<p>A plusieurs reprises, j'ai été bluffé par la réalité du logiciel libre. Oui, il +est facile de collaborer lorsqu'on crée un logiciel, pour peu qu'on explique +les tenants et les aboutissants aux participants. Les contributeurs sortent +d'on ne sait ou, pour peu que le projet leur soit utile. Je ne parles pas +d'outils &quot;corpo compliant&quot; (bien que ça soit probablement aussi le cas), mais +d'outils que j'ai pu développer pour mon propre usage, et sur lesquels il à été +possible de collaborer avec d'autres.</p> +<p>Parce que l'informatique est utile dans bien des milieux, parce qu'elle peut +être (et elle l'est) un vecteur de participation et de collaboration, défendons +les valeurs qui nous sont chères (logiciels libres et ouverts!) et construisons +des ponts entre les initiatives qui nous parlent (dans mon cas ça parles de +fermes autogérées, et d'initiatives d'éducation populaire) et l'informatique. +Faisons en sorte de rendre l'informatique accessible et utile dans les milieux +ou elle peut apporter quelque chose !</p> +</div> + \ No newline at end of file diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index 4684b57..49ea784 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -1,5 +1,201 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00+02:00Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Alexis' loghttp://blog.notmyidea.org2011-12-01T00:00:00+01:00Quels usages pour l'informatique ?2011-12-01T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-01:/quels-usages-pour-linformatique-fr.html/<p>Quand on termine ses études, on s'en pose un tas, des questions. Sur le métier +que l'on veut faire, sur ce que ça signifie, sur le sens et la valeur du +travail. Et j'en suis arrivé à faire un constat simple: l'informatique, c'est +utile, tant que ça ne viens pas vous pourrir la vie. Oui, parce que de +l'informatique on en a partout, des &quot;geeks&quot; et des &quot;accros&quot; aussi, et que ça +vient s'immiscer dans nos vies même quand d'autres moyens ou médias sont plus +utiles ou pertinents.</p> +<p>Certes, l'informatique nous permet de mieux communiquer et de mieux travailler. +Mais à quel prix ? ce n'est pas parce qu'il est &quot;possible&quot; d'<a class="reference external" href="http://retourdactu.fr/2011/11/07/la-non-communication-nouveau-modele-de-societe/">industrialiser +l'éducation</a> +(ou l'agriculture !), que l'on doit le faire. Oui, ça me dérange d'être une des +nombreuses personnes à l'œuvre derrière cette soit disant &quot;révolution&quot;, qui +n'est pas toujours pour le meilleur. Attention, je ne remets pas l'informatique +et son intérêt en cause: je me pose des questions quand à la place que je veux +lui donner et la place que je souhaites occuper dans son évolution. Ce n'est +pas parce qu'on peut tuer avec un marteau (avec un peu de volonté) qu'il s'agit +d'un mauvais outil, mais si tout le monde se met à tuer avec des marteaux (y a +des malades partout, hein), alors se poser la question de son rôle, en tant que +fabricant de marteaux me semble nécessaire (oui, je vous l'accorde, on aura vu +des comparaisons plus perspicaces).</p> +<p>Donc: à partir de quel moment l'informatique cesse d'être un outil utile pour +transformer nos modes de vies d'une manière qui me dérange ? Peut être avec son +arrivée sur des périphériques mobiles ? Peut être quand elle se fait +l'instrument du consumérisme et de l'individualisme.</p> +<div class="section" id="et-alors-on-fait-quoi"> +<h2>Et alors, on fait quoi ?</h2> +<p>Mais si je continue à faire de l'informatique, il y à bien des raison. J'ai +d'ailleurs trouvé mon intérêt de par le coté collaboratif qui est permis et +développé par l'outil informatique, et notamment par le réseau des réseaux +(internet). Faisons ensemble, mes amis. Prouvons que la collaboration à de +meilleurs jours à vivre que la compétition. Le web, notamment, est une avancée +majeure en ce qui concerne la liberté d'expression et le partage de +connaissances (oui, kipédia). Je vous conseille d'ailleurs à ce propos +<a class="reference external" href="http://owni.fr/2011/11/30/vers-une-economie-de-la-contribution/">l'excellent discours tenu par Bernard Stiegler</a> paru +recemment sur <a class="reference external" href="http://www.owni.fr">owni</a>.</p> +<p>Et c'est cet avenir qu'il me plait de défendre: l'ouverture d'esprit, la +possibilité que chacun puisse contribuer et participer à une base de savoir +commune, en apprenant des autres. Mais par pitié, n'imposons pas la +technologie là ou elle n'est pas nécessaire, et utilisons là avec tact quand +elle peut nous être profitable.</p> +<p>Il me plait de repenser l'informatique comme outil et non plus comme mode de +vie. Faisons le l'outil de la collaboration. À l'école, apprenons à nos enfants +à collaborer, à susciter le partage, pas uniquement avec l'outil informatique, +mais aussi avec celui ci, tout en leurs apprenant à avoir un regard critique +sur les informations qu'il reçoivent.</p> +<p>En bref, questionner le rôle que l'on souhaites avoir dans notre société par le +biais de l'informatique est nécessaire. Comme d'autres, je suis arrivé +à l'informatique par le biais du premier ordinateur familial, il y a de ça une +bonne quinzaine d'années. Ça intrigue, on touche un peu à tout (on en fait des +conneries !) et on finit par apprendre/comprendre comment ça marche, petit +à petit. Cette curiosité n'est d'ailleurs pas le propre de l'informatique +puisqu'on la retrouve dans la cuisine, dans le bricolage et dans un tas de +domaines de notre vie quotidienne.</p> +<p>Finalement, c'est aimer bidouiller, et comprendre comment ça fonctionne, quitte +à sortir les compétences de leur domaine de prédilection (qui à dit que +l'informatique ne pouvait être artistique ?) Le mouvement hacker (bidouilleurs) +aime à sortir l'informatique de son carcan et l'appliquer ailleurs.</p> +<p>C'est de cette manière que j'ai envie de considérer mon métier, qui avant tout +est une passion. Je suis un bidouilleur, j'aime découvrir comment les choses +fonctionnent et avoir une panoplie d'outils qui me permettent de répondre à des +besoins réels.</p> +</div> +<div class="section" id="favoriser-la-collaboration"> +<h2>Favoriser la collaboration</h2> +<p>Et donc, en tant qu'individu, pourquoi faire de l'informatique ? Qu'est-ce qui +m'attire dans cet outil ?</p> +<p>Ce qu'on pourrait qualifier de &quot;recherche fondamentale&quot;, l'écriture de +bibliothèques logicielles, est important mais n'est pas tout. Ce qui importe ce +sont les usages qui en découlent. Je souhaite <strong>savoir écrire des outils qui +sont utiles</strong>, <strong>qui favorisent la collaboration et participent à l'ouverture +des esprits</strong>.</p> +<p>Je choisis de faire de l'informatique pour créer les outils qui répondent à des +problématiques réelles, pour trouver de meilleures manières de communiquer et +de travailler ensemble. Mais, comme me le disait David, d'<a class="reference external" href="http://outils-reseaux.org/PresentationProjet">Outils-Réseaux</a>, on ne crée pas de la +coopération: rien ne sert d'essayer de faire coopérer des gens qui ne veulent +pas. On peut, cependant, la faciliter, en utilisant les bons outils et en +formant les gens à leur utilisation, ainsi qu'aux pratiques collaboratives +(qui, je le répète, ne s'arrêtent pas du tout aux frontières informatique).</p> +<p>Le logiciel libre, avant d'être une force pour le marché logiciel, est une +application du partage. Une démonstration qu'il est possible de travailler +ensemble pour fabriquer quelque chose de fonctionnel et d'utile pour tous. Une +sorte d'antithèse de ce modèle capitaliste incarné par les brevets logiciel.</p> +<p>A plusieurs reprises, j'ai été bluffé par la réalité du logiciel libre. Oui, il +est facile de collaborer lorsqu'on crée un logiciel, pour peu qu'on explique +les tenants et les aboutissants aux participants. Les contributeurs sortent +d'on ne sait ou, pour peu que le projet leur soit utile. Je ne parles pas +d'outils &quot;corpo compliant&quot; (bien que ça soit probablement aussi le cas), mais +d'outils que j'ai pu développer pour mon propre usage, et sur lesquels il à été +possible de collaborer avec d'autres.</p> +<p>Parce que l'informatique est utile dans bien des milieux, parce qu'elle peut +être (et elle l'est) un vecteur de participation et de collaboration, défendons +les valeurs qui nous sont chères (logiciels libres et ouverts!) et construisons +des ponts entre les initiatives qui nous parlent (dans mon cas ça parles de +fermes autogérées, et d'initiatives d'éducation populaire) et l'informatique. +Faisons en sorte de rendre l'informatique accessible et utile dans les milieux +ou elle peut apporter quelque chose !</p> +</div> +How are you handling your shared expenses?2011-10-15T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-15:/how-are-you-handling-your-shared-expenses.html/<p><strong>TL;DR:</strong> We're kick-starting a new application to manage your shared +expenses. Have a look at <a class="reference external" href="http://ihatemoney.notmyidea.org">http://ihatemoney.notmyidea.org</a></p> +<p>As a student, I lived in a lot of different locations, and the majority of them +had something in common: I lived with others. It usually was a great experience +(and I think I will continue to live with others). Most of the time, we had to +spend some time each month to compute who had to pay what to the others.</p> +<p>I wanted to create a pet project using flask, so I wrote a little +(~150 lines) flask application to handle this. It worked out pretty well for my +housemates and me, and as we had to move into different locations, +one of them asked me if he could continue to use it for the year to come.</p> +<p>I said yes and gave it some more thoughts: We probably aren't the only ones +interested by such kind of software. I decided to extend a bit more the +software to have a concept of projects and persons (the list of persons was +hard-coded in the first time, boooh!).</p> +<p>I then discussed with a friend of mine, who was excited about it and wanted to learn +python. Great! That's a really nice way to get started. Some more friends were also +interested in it and contributed some features and provided feedback (thanks +<a class="reference external" href="http://www.sneakernet.fr/">Arnaud</a> and Quentin!)</p> +<p>Since that, the project now support multiple languages and provides a REST API +(android and iphone apps in the tubes!), into other things. +There is no need to register for an account or whatnot, just enter a project name, +a secret code and a contact email, invite friends and that's it (this was inspired by +doodle)!</p> +<img alt="images/ihatemoney.png" src="images/ihatemoney.png" /> +<p>You can try the project at <a class="reference external" href="http://ihatemoney.notmyidea.org">http://ihatemoney.notmyidea.org</a> for now, and the +code lives at <a class="reference external" href="https://github.com/spiral-project/ihatemoney/">https://github.com/spiral-project/ihatemoney/</a>.</p> +<div class="section" id="features"> +<h2>Features</h2> +<p>In the wild, currently, there already are some implementations of this shared +budget manager thing. The fact is that most of them are either hard to use, with +a too much fancy design or simply trying to do too much things at once.</p> +<p>No, I don't want my budget manager to make my shopping list, or to run a blog for +me, thanks. I want it to let me focus on something else. Keep out of my way.</p> +<div class="section" id="no-user-registration"> +<h3>No user registration</h3> +<p>You don't need to register an account on the website to start using it. You +just have to create a project, set a secret code for it, and give both the url and +the code to the people you want to share it with (or the website can poke +them for you).</p> +</div> +<div class="section" id="keeping-things-simple"> +<h3>Keeping things simple</h3> +<p>&quot;Keep It Simple, Stupid&quot; really matches our philosophy here: you want to add a +bill? Okay. Just do it. You just have to enter who paid, for who, how much, +and a description, like you would have done when you're back from the +farmer's market on raw paper.</p> +</div> +<div class="section" id="no-categories"> +<h3>No categories</h3> +<p>Some people like to organise their stuff into different &quot;categories&quot;: +leisure, work, eating, etc. That's not something I want (at least to begin +with).</p> +<p>I want things to be simple. Got that? Great. Just add your bills!</p> +</div> +<div class="section" id="balance"> +<h3>Balance</h3> +<p>One of the most useful thing is to know what's your &quot;balance&quot; compared to +others. In other words, if you're negative, you owe money, if you're positive, +you have to receive money. This allows you to dispatch who has to pay for the +next thing, in order to re-equilibrate the balance.</p> +<p>Additionally, the system is able to compute for you who has to give how +much to who, in order to reduce the number of transactions needed to restore +the balance.</p> +</div> +<div class="section" id="api"> +<h3>API</h3> +<p>All of what's possible to do with the standard web interface is also available +through a REST API. I developed a simple REST toolkit for flask for this (and +I should release it!).</p> +</div> +</div> +<div class="section" id="interested"> +<h2>Interested?</h2> +<p>This project is open source. All of us like to share what we are doing and +would be happy to work with new people and implement new ideas. If you have +a nice idea about this, if you want to tweak it or to fill bugs. Don't hesitate +a second! The project lives at <a class="reference external" href="http://github.com/spiral-project/ihatemoney/">http://github.com/spiral-project/ihatemoney/</a></p> +</div> +La simplicité volontaire contre le mythe de l'abondance2011-10-14T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-14:/la-simplicite-volontaire-contre-le-mythe-de-labondance.html/<p>Paul Ariès dans la préface de &quot;<a class="reference external" href="http://www.editionsladecouverte.fr/catalogue/index.php?ean13=9782707169747">La simplicité volontaire contre le mythe de +l'abondance</a>&quot;</p> +<blockquote> +Je sais aussi qu'à force d'être seulement contre, nous finissons par être +&quot;tout contre&quot;, tout contre le système, ses débats pourris, ses pratiques +immondes, ses pervertions mentales. Cessons de porter notre adversaire sur +notre dos, car il finira par nous poignarder, au moment ou nous pensions +justement pouvoir le vaincre… Entendons-nous bien, il ne s'agit pas +d'apprendre à &quot;positiver&quot; sous prétexte que l'on pourrait &quot;moraliser&quot; ou +repeindre en vert le capitalisme, il s'agit, bien au contraire, d'être aussi +intraitables lorsque nous créons cet autre monde, que lorsque nous étions +ces militants purs mais un peu durs à jouir, il s'agit d'être aussi +indomptables mais sans oublier que le capitalisme ne pourra être arrété que +par du non-capitaliste… c'est-à-dire en multipliant les expérimentations +sociales, en acceptant de faire au maximum sécession, en inventant +(réinventant?) une gauche buissonière et maquisarde, en faisant, au +quotidien, la part belle à la dérive, à des modes de comportement +expérimentaux. Nous ne devons plus accepter de faire de la politique aux +conditions de nos adversaires, car c'est la seule façon d'éviter le +pessimisme, le ressentiment, une désensibilisation croissante et… la mort +lente.</blockquote> +Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/feeds/python.atom.xml b/feeds/python.atom.xml index 50b05d9..afae331 100644 --- a/feeds/python.atom.xml +++ b/feeds/python.atom.xml @@ -1,5 +1,83 @@ -Alexis' loghttp://blog.notmyidea.org2011-08-16T00:00:00+02:00Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages +Alexis' loghttp://blog.notmyidea.org2011-10-15T00:00:00+02:00How are you handling your shared expenses?2011-10-15T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-15:/how-are-you-handling-your-shared-expenses.html/<p><strong>TL;DR:</strong> We're kick-starting a new application to manage your shared +expenses. Have a look at <a class="reference external" href="http://ihatemoney.notmyidea.org">http://ihatemoney.notmyidea.org</a></p> +<p>As a student, I lived in a lot of different locations, and the majority of them +had something in common: I lived with others. It usually was a great experience +(and I think I will continue to live with others). Most of the time, we had to +spend some time each month to compute who had to pay what to the others.</p> +<p>I wanted to create a pet project using flask, so I wrote a little +(~150 lines) flask application to handle this. It worked out pretty well for my +housemates and me, and as we had to move into different locations, +one of them asked me if he could continue to use it for the year to come.</p> +<p>I said yes and gave it some more thoughts: We probably aren't the only ones +interested by such kind of software. I decided to extend a bit more the +software to have a concept of projects and persons (the list of persons was +hard-coded in the first time, boooh!).</p> +<p>I then discussed with a friend of mine, who was excited about it and wanted to learn +python. Great! That's a really nice way to get started. Some more friends were also +interested in it and contributed some features and provided feedback (thanks +<a class="reference external" href="http://www.sneakernet.fr/">Arnaud</a> and Quentin!)</p> +<p>Since that, the project now support multiple languages and provides a REST API +(android and iphone apps in the tubes!), into other things. +There is no need to register for an account or whatnot, just enter a project name, +a secret code and a contact email, invite friends and that's it (this was inspired by +doodle)!</p> +<img alt="images/ihatemoney.png" src="images/ihatemoney.png" /> +<p>You can try the project at <a class="reference external" href="http://ihatemoney.notmyidea.org">http://ihatemoney.notmyidea.org</a> for now, and the +code lives at <a class="reference external" href="https://github.com/spiral-project/ihatemoney/">https://github.com/spiral-project/ihatemoney/</a>.</p> +<div class="section" id="features"> +<h2>Features</h2> +<p>In the wild, currently, there already are some implementations of this shared +budget manager thing. The fact is that most of them are either hard to use, with +a too much fancy design or simply trying to do too much things at once.</p> +<p>No, I don't want my budget manager to make my shopping list, or to run a blog for +me, thanks. I want it to let me focus on something else. Keep out of my way.</p> +<div class="section" id="no-user-registration"> +<h3>No user registration</h3> +<p>You don't need to register an account on the website to start using it. You +just have to create a project, set a secret code for it, and give both the url and +the code to the people you want to share it with (or the website can poke +them for you).</p> +</div> +<div class="section" id="keeping-things-simple"> +<h3>Keeping things simple</h3> +<p>&quot;Keep It Simple, Stupid&quot; really matches our philosophy here: you want to add a +bill? Okay. Just do it. You just have to enter who paid, for who, how much, +and a description, like you would have done when you're back from the +farmer's market on raw paper.</p> +</div> +<div class="section" id="no-categories"> +<h3>No categories</h3> +<p>Some people like to organise their stuff into different &quot;categories&quot;: +leisure, work, eating, etc. That's not something I want (at least to begin +with).</p> +<p>I want things to be simple. Got that? Great. Just add your bills!</p> +</div> +<div class="section" id="balance"> +<h3>Balance</h3> +<p>One of the most useful thing is to know what's your &quot;balance&quot; compared to +others. In other words, if you're negative, you owe money, if you're positive, +you have to receive money. This allows you to dispatch who has to pay for the +next thing, in order to re-equilibrate the balance.</p> +<p>Additionally, the system is able to compute for you who has to give how +much to who, in order to reduce the number of transactions needed to restore +the balance.</p> +</div> +<div class="section" id="api"> +<h3>API</h3> +<p>All of what's possible to do with the standard web interface is also available +through a REST API. I developed a simple REST toolkit for flask for this (and +I should release it!).</p> +</div> +</div> +<div class="section" id="interested"> +<h2>Interested?</h2> +<p>This project is open source. All of us like to share what we are doing and +would be happy to work with new people and implement new ideas. If you have +a nice idea about this, if you want to tweak it or to fill bugs. Don't hesitate +a second! The project lives at <a class="reference external" href="http://github.com/spiral-project/ihatemoney/">http://github.com/spiral-project/ihatemoney/</a></p> +</div> +Using dbpedia to get languages influences2011-08-16T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html/<p>While browsing the Python's wikipedia page, I found information about the languages influenced by python, and the languages that influenced python itself.</p> <p>Well, that's kind of interesting to know which languages influenced others, it could even be more interesting to have an overview of the connexion between diff --git a/feeds/thoughts.atom.xml b/feeds/thoughts.atom.xml index 935a957..d030860 100644 --- a/feeds/thoughts.atom.xml +++ b/feeds/thoughts.atom.xml @@ -1,5 +1,123 @@ -Alexis' loghttp://blog.notmyidea.org2011-05-19T00:00:00+02:00Travailler moins pour mieux travailler ?2011-05-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que +Alexis' loghttp://blog.notmyidea.org2011-12-01T00:00:00+01:00Quels usages pour l'informatique ?2011-12-01T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-01:/quels-usages-pour-linformatique-fr.html/<p>Quand on termine ses études, on s'en pose un tas, des questions. Sur le métier +que l'on veut faire, sur ce que ça signifie, sur le sens et la valeur du +travail. Et j'en suis arrivé à faire un constat simple: l'informatique, c'est +utile, tant que ça ne viens pas vous pourrir la vie. Oui, parce que de +l'informatique on en a partout, des &quot;geeks&quot; et des &quot;accros&quot; aussi, et que ça +vient s'immiscer dans nos vies même quand d'autres moyens ou médias sont plus +utiles ou pertinents.</p> +<p>Certes, l'informatique nous permet de mieux communiquer et de mieux travailler. +Mais à quel prix ? ce n'est pas parce qu'il est &quot;possible&quot; d'<a class="reference external" href="http://retourdactu.fr/2011/11/07/la-non-communication-nouveau-modele-de-societe/">industrialiser +l'éducation</a> +(ou l'agriculture !), que l'on doit le faire. Oui, ça me dérange d'être une des +nombreuses personnes à l'œuvre derrière cette soit disant &quot;révolution&quot;, qui +n'est pas toujours pour le meilleur. Attention, je ne remets pas l'informatique +et son intérêt en cause: je me pose des questions quand à la place que je veux +lui donner et la place que je souhaites occuper dans son évolution. Ce n'est +pas parce qu'on peut tuer avec un marteau (avec un peu de volonté) qu'il s'agit +d'un mauvais outil, mais si tout le monde se met à tuer avec des marteaux (y a +des malades partout, hein), alors se poser la question de son rôle, en tant que +fabricant de marteaux me semble nécessaire (oui, je vous l'accorde, on aura vu +des comparaisons plus perspicaces).</p> +<p>Donc: à partir de quel moment l'informatique cesse d'être un outil utile pour +transformer nos modes de vies d'une manière qui me dérange ? Peut être avec son +arrivée sur des périphériques mobiles ? Peut être quand elle se fait +l'instrument du consumérisme et de l'individualisme.</p> +<div class="section" id="et-alors-on-fait-quoi"> +<h2>Et alors, on fait quoi ?</h2> +<p>Mais si je continue à faire de l'informatique, il y à bien des raison. J'ai +d'ailleurs trouvé mon intérêt de par le coté collaboratif qui est permis et +développé par l'outil informatique, et notamment par le réseau des réseaux +(internet). Faisons ensemble, mes amis. Prouvons que la collaboration à de +meilleurs jours à vivre que la compétition. Le web, notamment, est une avancée +majeure en ce qui concerne la liberté d'expression et le partage de +connaissances (oui, kipédia). Je vous conseille d'ailleurs à ce propos +<a class="reference external" href="http://owni.fr/2011/11/30/vers-une-economie-de-la-contribution/">l'excellent discours tenu par Bernard Stiegler</a> paru +recemment sur <a class="reference external" href="http://www.owni.fr">owni</a>.</p> +<p>Et c'est cet avenir qu'il me plait de défendre: l'ouverture d'esprit, la +possibilité que chacun puisse contribuer et participer à une base de savoir +commune, en apprenant des autres. Mais par pitié, n'imposons pas la +technologie là ou elle n'est pas nécessaire, et utilisons là avec tact quand +elle peut nous être profitable.</p> +<p>Il me plait de repenser l'informatique comme outil et non plus comme mode de +vie. Faisons le l'outil de la collaboration. À l'école, apprenons à nos enfants +à collaborer, à susciter le partage, pas uniquement avec l'outil informatique, +mais aussi avec celui ci, tout en leurs apprenant à avoir un regard critique +sur les informations qu'il reçoivent.</p> +<p>En bref, questionner le rôle que l'on souhaites avoir dans notre société par le +biais de l'informatique est nécessaire. Comme d'autres, je suis arrivé +à l'informatique par le biais du premier ordinateur familial, il y a de ça une +bonne quinzaine d'années. Ça intrigue, on touche un peu à tout (on en fait des +conneries !) et on finit par apprendre/comprendre comment ça marche, petit +à petit. Cette curiosité n'est d'ailleurs pas le propre de l'informatique +puisqu'on la retrouve dans la cuisine, dans le bricolage et dans un tas de +domaines de notre vie quotidienne.</p> +<p>Finalement, c'est aimer bidouiller, et comprendre comment ça fonctionne, quitte +à sortir les compétences de leur domaine de prédilection (qui à dit que +l'informatique ne pouvait être artistique ?) Le mouvement hacker (bidouilleurs) +aime à sortir l'informatique de son carcan et l'appliquer ailleurs.</p> +<p>C'est de cette manière que j'ai envie de considérer mon métier, qui avant tout +est une passion. Je suis un bidouilleur, j'aime découvrir comment les choses +fonctionnent et avoir une panoplie d'outils qui me permettent de répondre à des +besoins réels.</p> +</div> +<div class="section" id="favoriser-la-collaboration"> +<h2>Favoriser la collaboration</h2> +<p>Et donc, en tant qu'individu, pourquoi faire de l'informatique ? Qu'est-ce qui +m'attire dans cet outil ?</p> +<p>Ce qu'on pourrait qualifier de &quot;recherche fondamentale&quot;, l'écriture de +bibliothèques logicielles, est important mais n'est pas tout. Ce qui importe ce +sont les usages qui en découlent. Je souhaite <strong>savoir écrire des outils qui +sont utiles</strong>, <strong>qui favorisent la collaboration et participent à l'ouverture +des esprits</strong>.</p> +<p>Je choisis de faire de l'informatique pour créer les outils qui répondent à des +problématiques réelles, pour trouver de meilleures manières de communiquer et +de travailler ensemble. Mais, comme me le disait David, d'<a class="reference external" href="http://outils-reseaux.org/PresentationProjet">Outils-Réseaux</a>, on ne crée pas de la +coopération: rien ne sert d'essayer de faire coopérer des gens qui ne veulent +pas. On peut, cependant, la faciliter, en utilisant les bons outils et en +formant les gens à leur utilisation, ainsi qu'aux pratiques collaboratives +(qui, je le répète, ne s'arrêtent pas du tout aux frontières informatique).</p> +<p>Le logiciel libre, avant d'être une force pour le marché logiciel, est une +application du partage. Une démonstration qu'il est possible de travailler +ensemble pour fabriquer quelque chose de fonctionnel et d'utile pour tous. Une +sorte d'antithèse de ce modèle capitaliste incarné par les brevets logiciel.</p> +<p>A plusieurs reprises, j'ai été bluffé par la réalité du logiciel libre. Oui, il +est facile de collaborer lorsqu'on crée un logiciel, pour peu qu'on explique +les tenants et les aboutissants aux participants. Les contributeurs sortent +d'on ne sait ou, pour peu que le projet leur soit utile. Je ne parles pas +d'outils &quot;corpo compliant&quot; (bien que ça soit probablement aussi le cas), mais +d'outils que j'ai pu développer pour mon propre usage, et sur lesquels il à été +possible de collaborer avec d'autres.</p> +<p>Parce que l'informatique est utile dans bien des milieux, parce qu'elle peut +être (et elle l'est) un vecteur de participation et de collaboration, défendons +les valeurs qui nous sont chères (logiciels libres et ouverts!) et construisons +des ponts entre les initiatives qui nous parlent (dans mon cas ça parles de +fermes autogérées, et d'initiatives d'éducation populaire) et l'informatique. +Faisons en sorte de rendre l'informatique accessible et utile dans les milieux +ou elle peut apporter quelque chose !</p> +</div> +La simplicité volontaire contre le mythe de l'abondance2011-10-14T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-14:/la-simplicite-volontaire-contre-le-mythe-de-labondance.html/<p>Paul Ariès dans la préface de &quot;<a class="reference external" href="http://www.editionsladecouverte.fr/catalogue/index.php?ean13=9782707169747">La simplicité volontaire contre le mythe de +l'abondance</a>&quot;</p> +<blockquote> +Je sais aussi qu'à force d'être seulement contre, nous finissons par être +&quot;tout contre&quot;, tout contre le système, ses débats pourris, ses pratiques +immondes, ses pervertions mentales. Cessons de porter notre adversaire sur +notre dos, car il finira par nous poignarder, au moment ou nous pensions +justement pouvoir le vaincre… Entendons-nous bien, il ne s'agit pas +d'apprendre à &quot;positiver&quot; sous prétexte que l'on pourrait &quot;moraliser&quot; ou +repeindre en vert le capitalisme, il s'agit, bien au contraire, d'être aussi +intraitables lorsque nous créons cet autre monde, que lorsque nous étions +ces militants purs mais un peu durs à jouir, il s'agit d'être aussi +indomptables mais sans oublier que le capitalisme ne pourra être arrété que +par du non-capitaliste… c'est-à-dire en multipliant les expérimentations +sociales, en acceptant de faire au maximum sécession, en inventant +(réinventant?) une gauche buissonière et maquisarde, en faisant, au +quotidien, la part belle à la dérive, à des modes de comportement +expérimentaux. Nous ne devons plus accepter de faire de la politique aux +conditions de nos adversaires, car c'est la seule façon d'éviter le +pessimisme, le ressentiment, une désensibilisation croissante et… la mort +lente.</blockquote> +Travailler moins pour mieux travailler ?2011-05-19T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html/<p>Je viens de passer une semaine et demi quasiment hors-ligne et je dois dire que je suis assez impressionné du résultat: je suis de retour chez mes parents pour le &quot;easter break&quot; et j'en ai profité pour donner un coup aux travaux de la maison (et pour me reposer un brin!).</p> diff --git a/first-week-working-on-distutils2.html b/first-week-working-on-distutils2.html index 0eb3715..1a04f7e 100644 --- a/first-week-working-on-distutils2.html +++ b/first-week-working-on-distutils2.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        first week working on distutils2

        @@ -88,6 +86,21 @@ to make this clear.

        I'll take you updated !

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/fork-you-or-how-the-social-coding-can-help-you.html b/fork-you-or-how-the-social-coding-can-help-you.html index d6ea6df..7923178 100644 --- a/fork-you-or-how-the-social-coding-can-help-you.html +++ b/fork-you-or-how-the-social-coding-can-help-you.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Fork you ! or how the social coding can help you

        @@ -118,6 +116,21 @@ experimentations, and share them with others, you will see, it's kind of addictive !

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/help-me-to-go-to-the-distutils2-paris-sprint.html b/help-me-to-go-to-the-distutils2-paris-sprint.html index e9b3f5d..4df1d2f 100644 --- a/help-me-to-go-to-the-distutils2-paris-sprint.html +++ b/help-me-to-go-to-the-distutils2-paris-sprint.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Help me to go to the distutils2 paris' sprint

        @@ -35,6 +33,21 @@ while needed.

        chipin page: http://ametaireau.chipin.com/distutils2-sprint-in-paris

        Thanks for your support !

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/how-are-you-handling-your-shared-expenses.html b/how-are-you-handling-your-shared-expenses.html new file mode 100644 index 0000000..5b88320 --- /dev/null +++ b/how-are-you-handling-your-shared-expenses.html @@ -0,0 +1,113 @@ + + + + + + + Alexis Métaireau + + +
        +

        Alexis Métaireau's thougths

        + +
        +
        +

        How are you handling your shared expenses?

        +

        Published on Sat 15 October 2011

        +

        TL;DR: We're kick-starting a new application to manage your shared +expenses. Have a look at http://ihatemoney.notmyidea.org

        +

        As a student, I lived in a lot of different locations, and the majority of them +had something in common: I lived with others. It usually was a great experience +(and I think I will continue to live with others). Most of the time, we had to +spend some time each month to compute who had to pay what to the others.

        +

        I wanted to create a pet project using flask, so I wrote a little +(~150 lines) flask application to handle this. It worked out pretty well for my +housemates and me, and as we had to move into different locations, +one of them asked me if he could continue to use it for the year to come.

        +

        I said yes and gave it some more thoughts: We probably aren't the only ones +interested by such kind of software. I decided to extend a bit more the +software to have a concept of projects and persons (the list of persons was +hard-coded in the first time, boooh!).

        +

        I then discussed with a friend of mine, who was excited about it and wanted to learn +python. Great! That's a really nice way to get started. Some more friends were also +interested in it and contributed some features and provided feedback (thanks +Arnaud and Quentin!)

        +

        Since that, the project now support multiple languages and provides a REST API +(android and iphone apps in the tubes!), into other things. +There is no need to register for an account or whatnot, just enter a project name, +a secret code and a contact email, invite friends and that's it (this was inspired by +doodle)!

        +images/ihatemoney.png +

        You can try the project at http://ihatemoney.notmyidea.org for now, and the +code lives at https://github.com/spiral-project/ihatemoney/.

        +
        +

        Features

        +

        In the wild, currently, there already are some implementations of this shared +budget manager thing. The fact is that most of them are either hard to use, with +a too much fancy design or simply trying to do too much things at once.

        +

        No, I don't want my budget manager to make my shopping list, or to run a blog for +me, thanks. I want it to let me focus on something else. Keep out of my way.

        +
        +

        No user registration

        +

        You don't need to register an account on the website to start using it. You +just have to create a project, set a secret code for it, and give both the url and +the code to the people you want to share it with (or the website can poke +them for you).

        +
        +
        +

        Keeping things simple

        +

        "Keep It Simple, Stupid" really matches our philosophy here: you want to add a +bill? Okay. Just do it. You just have to enter who paid, for who, how much, +and a description, like you would have done when you're back from the +farmer's market on raw paper.

        +
        +
        +

        No categories

        +

        Some people like to organise their stuff into different "categories": +leisure, work, eating, etc. That's not something I want (at least to begin +with).

        +

        I want things to be simple. Got that? Great. Just add your bills!

        +
        +
        +

        Balance

        +

        One of the most useful thing is to know what's your "balance" compared to +others. In other words, if you're negative, you owe money, if you're positive, +you have to receive money. This allows you to dispatch who has to pay for the +next thing, in order to re-equilibrate the balance.

        +

        Additionally, the system is able to compute for you who has to give how +much to who, in order to reduce the number of transactions needed to restore +the balance.

        +
        +
        +

        API

        +

        All of what's possible to do with the standard web interface is also available +through a REST API. I developed a simple REST toolkit for flask for this (and +I should release it!).

        +
        +
        +
        +

        Interested?

        +

        This project is open source. All of us like to share what we are doing and +would be happy to work with new people and implement new ideas. If you have +a nice idea about this, if you want to tweak it or to fill bugs. Don't hesitate +a second! The project lives at http://github.com/spiral-project/ihatemoney/

        +
        + + + +
        +

        Comments

        +
        + +
        + +
        + + \ No newline at end of file diff --git a/how-to-install-nginx-php-53-on-freebsd.html b/how-to-install-nginx-php-53-on-freebsd.html index bbee9e3..82a9a36 100644 --- a/how-to-install-nginx-php-53-on-freebsd.html +++ b/how-to-install-nginx-php-53-on-freebsd.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        How to install NGINX + PHP 5.3 on FreeBSD.

        @@ -64,6 +62,21 @@ upstream backend {

        And that's it !

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/how-to-reboot-your-bebox-using-the-cli.html b/how-to-reboot-your-bebox-using-the-cli.html index 29153e4..f06ee50 100644 --- a/how-to-reboot-your-bebox-using-the-cli.html +++ b/how-to-reboot-your-bebox-using-the-cli.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        How to reboot your bebox using the CLI

        @@ -66,6 +64,21 @@ command line tools curl, grep and tail (but really harder to read).

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/index.html b/index.html index f831bad..e058d88 100644 --- a/index.html +++ b/index.html @@ -8,12 +8,24 @@
        -

        Alexis Métaireau's thoughs

        +

        Alexis Métaireau's thougths

        +

        Quels usages pour l'informatique ?

        +

        +

        Published on Thu 01 December 2011

        + +

        How are you handling your shared expenses?

        +

        +

        Published on Sat 15 October 2011

        + +

        La simplicité volontaire contre le mythe de l'abondance

        +

        +

        Published on Fri 14 October 2011

        +

        Using dbpedia to get languages influences

        Published on Tue 16 August 2011

        diff --git a/introducing-the-distutils2-index-crawlers.html b/introducing-the-distutils2-index-crawlers.html index 9cf7f9b..8254e14 100644 --- a/introducing-the-distutils2-index-crawlers.html +++ b/introducing-the-distutils2-index-crawlers.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Introducing the distutils2 index crawlers

        @@ -136,6 +134,21 @@ end of the summer. (And now, I need to learn to follow schedules ...)

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/la-simplicite-volontaire-contre-le-mythe-de-labondance.html b/la-simplicite-volontaire-contre-le-mythe-de-labondance.html new file mode 100644 index 0000000..42ce3f1 --- /dev/null +++ b/la-simplicite-volontaire-contre-le-mythe-de-labondance.html @@ -0,0 +1,56 @@ + + + + + + + Alexis Métaireau + + +
        +

        Alexis Métaireau's thougths

        + +
        +
        +

        La simplicité volontaire contre le mythe de l'abondance

        +

        Published on Fri 14 October 2011

        +

        Paul Ariès dans la préface de "La simplicité volontaire contre le mythe de +l'abondance"

        +
        +Je sais aussi qu'à force d'être seulement contre, nous finissons par être +"tout contre", tout contre le système, ses débats pourris, ses pratiques +immondes, ses pervertions mentales. Cessons de porter notre adversaire sur +notre dos, car il finira par nous poignarder, au moment ou nous pensions +justement pouvoir le vaincre… Entendons-nous bien, il ne s'agit pas +d'apprendre à "positiver" sous prétexte que l'on pourrait "moraliser" ou +repeindre en vert le capitalisme, il s'agit, bien au contraire, d'être aussi +intraitables lorsque nous créons cet autre monde, que lorsque nous étions +ces militants purs mais un peu durs à jouir, il s'agit d'être aussi +indomptables mais sans oublier que le capitalisme ne pourra être arrété que +par du non-capitaliste… c'est-à-dire en multipliant les expérimentations +sociales, en acceptant de faire au maximum sécession, en inventant +(réinventant?) une gauche buissonière et maquisarde, en faisant, au +quotidien, la part belle à la dérive, à des modes de comportement +expérimentaux. Nous ne devons plus accepter de faire de la politique aux +conditions de nos adversaires, car c'est la seule façon d'éviter le +pessimisme, le ressentiment, une désensibilisation croissante et… la mort +lente.
        + + + +
        +

        Comments

        +
        + +
        + +
        + + \ No newline at end of file diff --git a/le-temps-des-graces-courrez-y.html b/le-temps-des-graces-courrez-y.html index 8bef026..160b067 100644 --- a/le-temps-des-graces-courrez-y.html +++ b/le-temps-des-graces-courrez-y.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Le temps des grâces, courrez-y !

        @@ -77,6 +75,21 @@ pourraient être utilisée, si les pouvoirs publics lâchaient un peu la main des lobbys. Passionnant, vraiment.

        Courrez-y, je vous dis.

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/pages/projects.html b/pages/projects.html deleted file mode 100644 index 5c6054a..0000000 --- a/pages/projects.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - Alexis Métaireau - - -
        -

        Alexis Métaireau's thoughs

        - -
        -
        -

        projects

        -

        On my spare time, I contribute to open source projets, and hack a bit python, -django and php.

        -

        You can find all the projects I am involoved (sic!) with -on my github page

        -
        -

        Python

        -

        Since I've discovered python in the late 2009, I really like the simplicity it -brings to the development. Here are some of the projects I've done using it:

        -
          -
        • pelican, A simple static blog -generator, which is used to see this page.
        • -
        • gnome-background-generator A set of tools to -dynamically switch your background wallpaper on GNOME.
        • -
        • I've done a Google Summer of Code on distutils2, -the packaging tool for python, and try to use some of my spare time to contribute. -Packaging is a really useful thing, and distutils2 tries to make it simpler -and to build a framework every python packaging tool can use.
        • -
        -
        -
        -

        Django

        -

        Django is a web framework written in python. I've been working on it while in -internship at makina corpus. And also tries to -use them for my web related projects.

        -
          -
        • bison vert, a carpooling system.
        • -
        • dropit, a note management project, using the -power if CouchDB.
        • -
        • django-oauth-client , -a django application to simplify the tree-legged-authentication process.
        • -
        -
        -
        -

        PHP

        -

        I've started programming with PHP, it was my third first language -(the first two ones being pascal and visual basic).

        -

        I've written a dependency injection container and -spiral, a web framework in PHP 5.3, with -a friend.

        -

        I've also contributed (a bit) to jelix, another PHP -framework.

        -
        - -
        - - \ No newline at end of file diff --git a/pelican-9-months-later.html b/pelican-9-months-later.html index 51dfd7a..fff3a89 100644 --- a/pelican-9-months-later.html +++ b/pelican-9-months-later.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Pelican, 9 months later

        @@ -34,6 +32,21 @@ there is a bunch of people that are willing to make better softwares just for the sake of fun.

        Thank you, guys, you're why I like open source so much.

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/pelican-a-simple-static-blog-generator-in-python.html b/pelican-a-simple-static-blog-generator-in-python.html index eb7340b..cf43231 100644 --- a/pelican-a-simple-static-blog-generator-in-python.html +++ b/pelican-a-simple-static-blog-generator-in-python.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Pelican, a simple static blog generator in python

        @@ -78,6 +76,21 @@ optional arguments:

        Enjoy :)

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/pypi-on-couchdb.html b/pypi-on-couchdb.html index 2577241..c169223 100644 --- a/pypi-on-couchdb.html +++ b/pypi-on-couchdb.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        PyPI on CouchDB

        @@ -110,6 +108,21 @@ a work in progress, and everything can break at any time. However, any feedback will be appreciated !

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/python-go.html b/python-go.html index 23893aa..5213ba7 100644 --- a/python-go.html +++ b/python-go.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Python ? go !

        @@ -118,6 +116,21 @@ dynamique. Have fun !

        + + +
        +

        Comments

        +
        + +
        + \ No newline at end of file diff --git a/quels-usages-pour-linformatique-fr.html b/quels-usages-pour-linformatique-fr.html new file mode 100644 index 0000000..3cf6ba1 --- /dev/null +++ b/quels-usages-pour-linformatique-fr.html @@ -0,0 +1,132 @@ + + + + + + + Alexis Métaireau + + +
        +

        Alexis Métaireau's thougths

        + +
        +
        +

        Quels usages pour l'informatique ?

        +

        Published on Thu 01 December 2011

        +

        Quand on termine ses études, on s'en pose un tas, des questions. Sur le métier +que l'on veut faire, sur ce que ça signifie, sur le sens et la valeur du +travail. Et j'en suis arrivé à faire un constat simple: l'informatique, c'est +utile, tant que ça ne viens pas vous pourrir la vie. Oui, parce que de +l'informatique on en a partout, des "geeks" et des "accros" aussi, et que ça +vient s'immiscer dans nos vies même quand d'autres moyens ou médias sont plus +utiles ou pertinents.

        +

        Certes, l'informatique nous permet de mieux communiquer et de mieux travailler. +Mais à quel prix ? ce n'est pas parce qu'il est "possible" d'industrialiser +l'éducation +(ou l'agriculture !), que l'on doit le faire. Oui, ça me dérange d'être une des +nombreuses personnes à l'œuvre derrière cette soit disant "révolution", qui +n'est pas toujours pour le meilleur. Attention, je ne remets pas l'informatique +et son intérêt en cause: je me pose des questions quand à la place que je veux +lui donner et la place que je souhaites occuper dans son évolution. Ce n'est +pas parce qu'on peut tuer avec un marteau (avec un peu de volonté) qu'il s'agit +d'un mauvais outil, mais si tout le monde se met à tuer avec des marteaux (y a +des malades partout, hein), alors se poser la question de son rôle, en tant que +fabricant de marteaux me semble nécessaire (oui, je vous l'accorde, on aura vu +des comparaisons plus perspicaces).

        +

        Donc: à partir de quel moment l'informatique cesse d'être un outil utile pour +transformer nos modes de vies d'une manière qui me dérange ? Peut être avec son +arrivée sur des périphériques mobiles ? Peut être quand elle se fait +l'instrument du consumérisme et de l'individualisme.

        +
        +

        Et alors, on fait quoi ?

        +

        Mais si je continue à faire de l'informatique, il y à bien des raison. J'ai +d'ailleurs trouvé mon intérêt de par le coté collaboratif qui est permis et +développé par l'outil informatique, et notamment par le réseau des réseaux +(internet). Faisons ensemble, mes amis. Prouvons que la collaboration à de +meilleurs jours à vivre que la compétition. Le web, notamment, est une avancée +majeure en ce qui concerne la liberté d'expression et le partage de +connaissances (oui, kipédia). Je vous conseille d'ailleurs à ce propos +l'excellent discours tenu par Bernard Stiegler paru +recemment sur owni.

        +

        Et c'est cet avenir qu'il me plait de défendre: l'ouverture d'esprit, la +possibilité que chacun puisse contribuer et participer à une base de savoir +commune, en apprenant des autres. Mais par pitié, n'imposons pas la +technologie là ou elle n'est pas nécessaire, et utilisons là avec tact quand +elle peut nous être profitable.

        +

        Il me plait de repenser l'informatique comme outil et non plus comme mode de +vie. Faisons le l'outil de la collaboration. À l'école, apprenons à nos enfants +à collaborer, à susciter le partage, pas uniquement avec l'outil informatique, +mais aussi avec celui ci, tout en leurs apprenant à avoir un regard critique +sur les informations qu'il reçoivent.

        +

        En bref, questionner le rôle que l'on souhaites avoir dans notre société par le +biais de l'informatique est nécessaire. Comme d'autres, je suis arrivé +à l'informatique par le biais du premier ordinateur familial, il y a de ça une +bonne quinzaine d'années. Ça intrigue, on touche un peu à tout (on en fait des +conneries !) et on finit par apprendre/comprendre comment ça marche, petit +à petit. Cette curiosité n'est d'ailleurs pas le propre de l'informatique +puisqu'on la retrouve dans la cuisine, dans le bricolage et dans un tas de +domaines de notre vie quotidienne.

        +

        Finalement, c'est aimer bidouiller, et comprendre comment ça fonctionne, quitte +à sortir les compétences de leur domaine de prédilection (qui à dit que +l'informatique ne pouvait être artistique ?) Le mouvement hacker (bidouilleurs) +aime à sortir l'informatique de son carcan et l'appliquer ailleurs.

        +

        C'est de cette manière que j'ai envie de considérer mon métier, qui avant tout +est une passion. Je suis un bidouilleur, j'aime découvrir comment les choses +fonctionnent et avoir une panoplie d'outils qui me permettent de répondre à des +besoins réels.

        +
        +
        +

        Favoriser la collaboration

        +

        Et donc, en tant qu'individu, pourquoi faire de l'informatique ? Qu'est-ce qui +m'attire dans cet outil ?

        +

        Ce qu'on pourrait qualifier de "recherche fondamentale", l'écriture de +bibliothèques logicielles, est important mais n'est pas tout. Ce qui importe ce +sont les usages qui en découlent. Je souhaite savoir écrire des outils qui +sont utiles, qui favorisent la collaboration et participent à l'ouverture +des esprits.

        +

        Je choisis de faire de l'informatique pour créer les outils qui répondent à des +problématiques réelles, pour trouver de meilleures manières de communiquer et +de travailler ensemble. Mais, comme me le disait David, d'Outils-Réseaux, on ne crée pas de la +coopération: rien ne sert d'essayer de faire coopérer des gens qui ne veulent +pas. On peut, cependant, la faciliter, en utilisant les bons outils et en +formant les gens à leur utilisation, ainsi qu'aux pratiques collaboratives +(qui, je le répète, ne s'arrêtent pas du tout aux frontières informatique).

        +

        Le logiciel libre, avant d'être une force pour le marché logiciel, est une +application du partage. Une démonstration qu'il est possible de travailler +ensemble pour fabriquer quelque chose de fonctionnel et d'utile pour tous. Une +sorte d'antithèse de ce modèle capitaliste incarné par les brevets logiciel.

        +

        A plusieurs reprises, j'ai été bluffé par la réalité du logiciel libre. Oui, il +est facile de collaborer lorsqu'on crée un logiciel, pour peu qu'on explique +les tenants et les aboutissants aux participants. Les contributeurs sortent +d'on ne sait ou, pour peu que le projet leur soit utile. Je ne parles pas +d'outils "corpo compliant" (bien que ça soit probablement aussi le cas), mais +d'outils que j'ai pu développer pour mon propre usage, et sur lesquels il à été +possible de collaborer avec d'autres.

        +

        Parce que l'informatique est utile dans bien des milieux, parce qu'elle peut +être (et elle l'est) un vecteur de participation et de collaboration, défendons +les valeurs qui nous sont chères (logiciels libres et ouverts!) et construisons +des ponts entre les initiatives qui nous parlent (dans mon cas ça parles de +fermes autogérées, et d'initiatives d'éducation populaire) et l'informatique. +Faisons en sorte de rendre l'informatique accessible et utile dans les milieux +ou elle peut apporter quelque chose !

        +
        + + + +
        +

        Comments

        +
        + +
        + +
        + + \ No newline at end of file diff --git a/semaine-de-lenvironnement-la-consommation-etudiante.html b/semaine-de-lenvironnement-la-consommation-etudiante.html index 0bfecae..7492b2e 100644 --- a/semaine-de-lenvironnement-la-consommation-etudiante.html +++ b/semaine-de-lenvironnement-la-consommation-etudiante.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Semaine de l’environnement: La consommation étudiante

        @@ -57,6 +55,21 @@ n'hésitez pas ! La page sur la consommation étudiante sur le site du GRAPPE

        + + +
        +

        Comments

        +
        + +
        + \ No newline at end of file diff --git a/simple-test-page.html b/simple-test-page.html deleted file mode 100644 index f1219c5..0000000 --- a/simple-test-page.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - Alexis Métaireau - - -
        -

        Alexis Métaireau's thoughs

        - -
        -
        -

        Simple test page

        -

        Published on Fri 19 August 2011

        -

        Simple test for ghp-import + post commit hook -Yeah ?

        - -
        - - \ No newline at end of file diff --git a/sprinting-on-distutils2-in-tours.html b/sprinting-on-distutils2-in-tours.html index 5184449..3aa23a1 100644 --- a/sprinting-on-distutils2-in-tours.html +++ b/sprinting-on-distutils2-in-tours.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Sprinting on distutils2 in Tours

        @@ -98,6 +96,21 @@ like this one are opportunities to catch ! We'll probably do another sprint in a few weeks, stay tuned !

        + + +
        +

        Comments

        +
        + +
        + \ No newline at end of file diff --git a/static/images/ihatemoney-fr.png b/static/images/ihatemoney-fr.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cad7191dc5bb3f423f842e92eda8f12a8bdd36 GIT binary patch literal 61513 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 literal 0 HcmV?d00001 diff --git a/tag/bleh.html b/tag/bleh.html deleted file mode 100644 index e69de29..0000000 diff --git a/theme/css/.main.css.un~ b/theme/css/.main.css.un~ new file mode 100644 index 0000000000000000000000000000000000000000..43b2b1929badfbc8b05dd4361a15bc4baa411069 GIT binary patch literal 5912 zcmeI0KTlIp7{;%)NTD^Ns3E%C;NXI8F8FtF(par%Q8a~8DG>19qyZLP`~pnIREaT> zN&N;6I=LI8AHle|Xrhkz{LZ~^X(OX|J5TfU?K$r)CGRiqIrrS^;{6vlql@v^AouoZ z{^;1HKl7WPUu{iZ_}N@|^LyjdhpWTie>|%^+<3em1i_4)4<*Gze3o1y9;FA|qzpK> zB|3PPscP2X0jt0`6(CFUKE@s%Rmf6;x8&gU?+kBMV}> z3__qgd2CjRtfKB7*B!P(f{oJemv712izT!45uIrL2B<;Csem|S0}swBkyRA9Cl1^| z0uDTYyCe55mX?{~UrD>pc0Z;NAo;eFhi8?@Dhl3n2X8QeN9j4}-Iceyj@e-uqy`R9 z>}n=$o9D#|)R4`OcZ z^u&^)WcMy&n~qp9X*Ehut4+(j>!f91Y3ZJqVx7U9G7F)^8 literal 0 HcmV?d00001 diff --git a/theme/css/main.css b/theme/css/main.css index b4e34cb..f42871f 100644 --- a/theme/css/main.css +++ b/theme/css/main.css @@ -8,6 +8,19 @@ body { font-family: "Georgia", serif; } +a{ + color: #000; +} + +nav ul { + list-style-type: none; +} + +nav ul li { + float: right; + margin-left: 10px; +} + #top {} #top .author { float: left; @@ -73,9 +86,11 @@ body { .content blockquote { margin: 0px; margin-right: 40px; + margin-left: 20px; padding-left: 20px; text-align: left; border-left: 3px black solid; letter-spacing: 2px; font-style: italic; + text-align: justify; } diff --git a/travailler-moins-pour-mieux-travailler.html b/travailler-moins-pour-mieux-travailler.html index f9fa08e..f8f4754 100644 --- a/travailler-moins-pour-mieux-travailler.html +++ b/travailler-moins-pour-mieux-travailler.html @@ -8,10 +8,8 @@

        Travailler moins pour mieux travailler ?

        @@ -60,6 +58,21 @@ travailler moins, pourquoi pas s'y essayer !

        Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez des retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée ?

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/un-coup-de-main-pour-mon-memoire.html b/un-coup-de-main-pour-mon-memoire.html index 2dbb2b7..3dec1ed 100644 --- a/un-coup-de-main-pour-mon-memoire.html +++ b/un-coup-de-main-pour-mon-memoire.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Un coup de main pour mon mémoire!

        @@ -43,6 +41,21 @@ question, et c'est tout!

        prochains mois pour ensuite les analyser correctement.

        Merci pour votre aide !

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/use-restructured-text-rest-to-power-your-presentations.html b/use-restructured-text-rest-to-power-your-presentations.html index cfd1fdd..124a583 100644 --- a/use-restructured-text-rest-to-power-your-presentations.html +++ b/use-restructured-text-rest-to-power-your-presentations.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Use Restructured Text (ReST) to power your presentations

        @@ -44,6 +42,21 @@ and the command line to generate the PDF:

        rst2pdf couchdb.rst -b1 -s ../slides.style + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/using-dbpedia-to-get-languages-influences.html b/using-dbpedia-to-get-languages-influences.html index 66d1f40..383a8a8 100644 --- a/using-dbpedia-to-get-languages-influences.html +++ b/using-dbpedia-to-get-languages-influences.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Using dbpedia to get languages influences

        @@ -56,6 +54,21 @@ graph would probably be way less readable.

        You can find the script on my github account. Feel free to adapt it for whatever you want if you feel hackish.

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file diff --git a/using-jpype-to-bridge-python-and-java.html b/using-jpype-to-bridge-python-and-java.html index b964139..1db9352 100644 --- a/using-jpype-to-bridge-python-and-java.html +++ b/using-jpype-to-bridge-python-and-java.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Using JPype to bridge python and Java

        @@ -87,6 +85,21 @@ extract text content from URLs and remove the boilerplate text easily for infuse (my master thesis project), without having to write java code, nice!

        + + +
        +

        Comments

        +
        + +
        + \ No newline at end of file diff --git a/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html b/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html index 3fbf4fc..7b41db6 100644 --- a/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html +++ b/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Working directly on your server? How to backup and sync your dev environment with unison

        @@ -168,6 +166,21 @@ content.

        all of my developments.

        + + +
        +

        Comments

        +
        + +
        + \ No newline at end of file diff --git a/wrap-up-of-the-distutils2-paris-sprint.html b/wrap-up-of-the-distutils2-paris-sprint.html index 8326619..2db52d9 100644 --- a/wrap-up-of-the-distutils2-paris-sprint.html +++ b/wrap-up-of-the-distutils2-paris-sprint.html @@ -8,10 +8,8 @@
        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +

        Wrap up of the distutils2 paris' sprint

        @@ -54,6 +52,21 @@ bears^Wbeers.

        Again, a big thanks to all the people who gave me money to pay the transport, I really wasn't expecting such thing to happen :-)

        + + +
        +

        Comments

        +
        + +
        +
        \ No newline at end of file From 19039912c7cbd081a6cd5f9ce422e56e2ea814f3 Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Tue, 6 Dec 2011 18:34:49 -0100 Subject: [PATCH 6/8] Update documentation --- archives.html | 3 +++ author/Alexis Métaireau.html | 4 +++ categories.html | 2 ++ category/mozilla.html | 23 +++++++++++++++++ feeds/all-en.atom.xml | 16 +++++++++++- feeds/all.atom.xml | 16 +++++++++++- feeds/mozilla.atom.xml | 16 ++++++++++++ index.html | 4 +++ introducing-cornice.html | 49 ++++++++++++++++++++++++++++++++++++ 9 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 category/mozilla.html create mode 100644 feeds/mozilla.atom.xml create mode 100644 introducing-cornice.html diff --git a/archives.html b/archives.html index ae28864..53cc896 100644 --- a/archives.html +++ b/archives.html @@ -100,6 +100,9 @@
        Thu 01 December 2011
        Quels usages pour l'informatique ?
        +
        Tue 06 December 2011
        +
        Introducing cornice
        + diff --git a/author/Alexis Métaireau.html b/author/Alexis Métaireau.html index 77b3771..669a5ce 100644 --- a/author/Alexis Métaireau.html +++ b/author/Alexis Métaireau.html @@ -58,6 +58,10 @@

        Published on Thu 21 October 2010

        +

        Introducing cornice

        +

        +

        Published on Tue 06 December 2011

        +

        Introducing the distutils2 index crawlers

        Published on Tue 06 July 2010

        diff --git a/categories.html b/categories.html index e01284f..e80f3f0 100644 --- a/categories.html +++ b/categories.html @@ -18,6 +18,8 @@
      1. dev
      2. +
      3. mozilla
      4. +
      5. python
      6. system
      7. diff --git a/category/mozilla.html b/category/mozilla.html new file mode 100644 index 0000000..89aa873 --- /dev/null +++ b/category/mozilla.html @@ -0,0 +1,23 @@ + + + + + + + Alexis Métaireau + + +
        +

        Alexis Métaireau's thougths

        + +
        +
        + + +

        Introducing cornice

        +

        +

        Published on Tue 06 December 2011

        + +
        + + \ No newline at end of file diff --git a/feeds/all-en.atom.xml b/feeds/all-en.atom.xml index 90099b4..41dee3f 100644 --- a/feeds/all-en.atom.xml +++ b/feeds/all-en.atom.xml @@ -1,5 +1,19 @@ -Alexis' loghttp://blog.notmyidea.org2011-10-15T00:00:00+02:00How are you handling your shared expenses?2011-10-15T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-15:/how-are-you-handling-your-shared-expenses.html/<p><strong>TL;DR:</strong> We're kick-starting a new application to manage your shared +Alexis' loghttp://blog.notmyidea.org2011-12-06T00:00:00+01:00Introducing cornice2011-12-06T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-06:/introducing-cornice.html/<p>Wow, this is my second working day at mozilla. I've been working, yesterday and +today, on a pyramid REST-ish toolkit, <a class="reference external" href="https://github.com/mozilla-services/cornice">cornice</a>.</p> +<p>Cornice allows you to take out from you all the repetitive stuff you do when +writing a web service. I'm mainly thinking about different kinds of validation.</p> +<p>To describe a web service in <em>cornice</em>, you have to write something like this</p> +<div class="system-message"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 14)</p> +<p>Content block expected for the &quot;code-block&quot; directive; none found.</p> +<pre class="literal-block"> +.. code-block:: python + + +</pre> +</div> +How are you handling your shared expenses?2011-10-15T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-15:/how-are-you-handling-your-shared-expenses.html/<p><strong>TL;DR:</strong> We're kick-starting a new application to manage your shared expenses. Have a look at <a class="reference external" href="http://ihatemoney.notmyidea.org">http://ihatemoney.notmyidea.org</a></p> <p>As a student, I lived in a lot of different locations, and the majority of them had something in common: I lived with others. It usually was a great experience diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index 49ea784..25b595b 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -1,5 +1,19 @@ -Alexis' loghttp://blog.notmyidea.org2011-12-01T00:00:00+01:00Quels usages pour l'informatique ?2011-12-01T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-01:/quels-usages-pour-linformatique-fr.html/<p>Quand on termine ses études, on s'en pose un tas, des questions. Sur le métier +Alexis' loghttp://blog.notmyidea.org2011-12-06T00:00:00+01:00Introducing cornice2011-12-06T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-06:/introducing-cornice.html/<p>Wow, this is my second working day at mozilla. I've been working, yesterday and +today, on a pyramid REST-ish toolkit, <a class="reference external" href="https://github.com/mozilla-services/cornice">cornice</a>.</p> +<p>Cornice allows you to take out from you all the repetitive stuff you do when +writing a web service. I'm mainly thinking about different kinds of validation.</p> +<p>To describe a web service in <em>cornice</em>, you have to write something like this</p> +<div class="system-message"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 14)</p> +<p>Content block expected for the &quot;code-block&quot; directive; none found.</p> +<pre class="literal-block"> +.. code-block:: python + + +</pre> +</div> +Quels usages pour l'informatique ?2011-12-01T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-01:/quels-usages-pour-linformatique-fr.html/<p>Quand on termine ses études, on s'en pose un tas, des questions. Sur le métier que l'on veut faire, sur ce que ça signifie, sur le sens et la valeur du travail. Et j'en suis arrivé à faire un constat simple: l'informatique, c'est utile, tant que ça ne viens pas vous pourrir la vie. Oui, parce que de diff --git a/feeds/mozilla.atom.xml b/feeds/mozilla.atom.xml new file mode 100644 index 0000000..6a63bb5 --- /dev/null +++ b/feeds/mozilla.atom.xml @@ -0,0 +1,16 @@ + +Alexis' loghttp://blog.notmyidea.org2011-12-06T00:00:00+01:00Introducing cornice2011-12-06T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-06:/introducing-cornice.html/<p>Wow, this is my second working day at mozilla. I've been working, yesterday and +today, on a pyramid REST-ish toolkit, <a class="reference external" href="https://github.com/mozilla-services/cornice">cornice</a>.</p> +<p>Cornice allows you to take out from you all the repetitive stuff you do when +writing a web service. I'm mainly thinking about different kinds of validation.</p> +<p>To describe a web service in <em>cornice</em>, you have to write something like this</p> +<div class="system-message"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 14)</p> +<p>Content block expected for the &quot;code-block&quot; directive; none found.</p> +<pre class="literal-block"> +.. code-block:: python + + +</pre> +</div> + \ No newline at end of file diff --git a/index.html b/index.html index e058d88..90f7bc9 100644 --- a/index.html +++ b/index.html @@ -14,6 +14,10 @@
        +

        Introducing cornice

        +

        +

        Published on Tue 06 December 2011

        +

        Quels usages pour l'informatique ?

        Published on Thu 01 December 2011

        diff --git a/introducing-cornice.html b/introducing-cornice.html new file mode 100644 index 0000000..02cd4d5 --- /dev/null +++ b/introducing-cornice.html @@ -0,0 +1,49 @@ + + + + + + + Alexis Métaireau + + +
        +

        Alexis Métaireau's thougths

        + +
        +
        +

        Introducing cornice

        +

        Published on Tue 06 December 2011

        +

        Wow, this is my second working day at mozilla. I've been working, yesterday and +today, on a pyramid REST-ish toolkit, cornice.

        +

        Cornice allows you to take out from you all the repetitive stuff you do when +writing a web service. I'm mainly thinking about different kinds of validation.

        +

        To describe a web service in cornice, you have to write something like this

        +
        +

        System Message: ERROR/3 (./content/mozilla/introducing-cornice.rst, line 14)

        +

        Content block expected for the "code-block" directive; none found.

        +
        +.. code-block:: python
        +
        +
        +
        +
        + + + +
        +

        Comments

        +
        + +
        + +
        + + \ No newline at end of file From d7bf092ae3e2326b9cba13512c905aa01d8a7754 Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Wed, 7 Dec 2011 08:06:15 -0100 Subject: [PATCH 7/8] Update documentation --- feeds/all-en.atom.xml | 43 ++++++++++++++++++++++++++++++++++------ feeds/all.atom.xml | 43 ++++++++++++++++++++++++++++++++++------ feeds/mozilla.atom.xml | 43 ++++++++++++++++++++++++++++++++++------ introducing-cornice.html | 43 ++++++++++++++++++++++++++++++++++------ 4 files changed, 148 insertions(+), 24 deletions(-) diff --git a/feeds/all-en.atom.xml b/feeds/all-en.atom.xml index 41dee3f..650ac53 100644 --- a/feeds/all-en.atom.xml +++ b/feeds/all-en.atom.xml @@ -1,18 +1,49 @@ -Alexis' loghttp://blog.notmyidea.org2011-12-06T00:00:00+01:00Introducing cornice2011-12-06T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-06:/introducing-cornice.html/<p>Wow, this is my second working day at mozilla. I've been working, yesterday and -today, on a pyramid REST-ish toolkit, <a class="reference external" href="https://github.com/mozilla-services/cornice">cornice</a>.</p> -<p>Cornice allows you to take out from you all the repetitive stuff you do when -writing a web service. I'm mainly thinking about different kinds of validation.</p> +Alexis' loghttp://blog.notmyidea.org2011-12-06T00:00:00+01:00Introducing cornice2011-12-06T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-06:/introducing-cornice.html/<p>Wow, already my third working day at mozilla. Since Monday, I've been working with +Tarek Ziadé, on a pyramid REST-ish toolkit named <a class="reference external" href="https://github.com/mozilla-services/cornice">cornice</a>.</p> +<p>Its goal is to take all the hard bits appart from you when implementing a web +service, so you can focus on what's important. Cornice provides you facilities +for validation of any kind.</p> +<p>The goal is to simplify your work, but we don't want to reinvent the wheel, so +it is easily pluggable with validations frameworks, such as Collander.</p> +<div class="section" id="handling-errors-and-validation"> +<h2>Handling errors and validation</h2> +<p>We have changed the way errors are handled. Here is how it works:</p> +<div class="highlight"><pre><span class="n">service</span> <span class="o">=</span> <span class="n">Service</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;service&quot;</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s">&quot;/service&quot;</span><span class="p">)</span> + + +<span class="k">def</span> <span class="nf">is_awesome</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;awesome&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">:</span> + <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> <span class="s">&#39;You lack awesomeness!&#39;</span><span class="p">)</span> + + +<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="p">(</span><span class="n">is_awesome</span><span class="p">))</span> +<span class="k">def</span> <span class="nf">get1</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="s">&quot;succeeded&quot;</span><span class="p">}</span> +</pre></div> +<p>All the errors collected during the validation process, or after, are collected +before returning the request. If any, a error 400 is fired up, with the list of +problems encoutred encoded as a nice json list (we plan to support multiple +formats in the future)</p> +<p>As you might have seen, <cite>request.errors.add</cite> takes three parameters: <strong>location</strong>, +<strong>name</strong> and <strong>description</strong>.</p> +<p><strong>location</strong> is where the error arised. It can either be &quot;body&quot;, &quot;query&quot;, &quot;headers&quot; +or &quot;path&quot;. <strong>name</strong> is the name of the variable causing problem, if any, and +<strong>description</strong> contains a more detailled message.</p> +<p>Here is an example of a malformed request:</p> +<pre class="literal-block"> +$ # run a demo app +</pre> <p>To describe a web service in <em>cornice</em>, you have to write something like this</p> <div class="system-message"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 14)</p> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 54)</p> <p>Content block expected for the &quot;code-block&quot; directive; none found.</p> <pre class="literal-block"> .. code-block:: python - </pre> </div> +</div> How are you handling your shared expenses?2011-10-15T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-15:/how-are-you-handling-your-shared-expenses.html/<p><strong>TL;DR:</strong> We're kick-starting a new application to manage your shared expenses. Have a look at <a class="reference external" href="http://ihatemoney.notmyidea.org">http://ihatemoney.notmyidea.org</a></p> <p>As a student, I lived in a lot of different locations, and the majority of them diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index 25b595b..2e4fdc1 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -1,18 +1,49 @@ -Alexis' loghttp://blog.notmyidea.org2011-12-06T00:00:00+01:00Introducing cornice2011-12-06T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-06:/introducing-cornice.html/<p>Wow, this is my second working day at mozilla. I've been working, yesterday and -today, on a pyramid REST-ish toolkit, <a class="reference external" href="https://github.com/mozilla-services/cornice">cornice</a>.</p> -<p>Cornice allows you to take out from you all the repetitive stuff you do when -writing a web service. I'm mainly thinking about different kinds of validation.</p> +Alexis' loghttp://blog.notmyidea.org2011-12-06T00:00:00+01:00Introducing cornice2011-12-06T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-06:/introducing-cornice.html/<p>Wow, already my third working day at mozilla. Since Monday, I've been working with +Tarek Ziadé, on a pyramid REST-ish toolkit named <a class="reference external" href="https://github.com/mozilla-services/cornice">cornice</a>.</p> +<p>Its goal is to take all the hard bits appart from you when implementing a web +service, so you can focus on what's important. Cornice provides you facilities +for validation of any kind.</p> +<p>The goal is to simplify your work, but we don't want to reinvent the wheel, so +it is easily pluggable with validations frameworks, such as Collander.</p> +<div class="section" id="handling-errors-and-validation"> +<h2>Handling errors and validation</h2> +<p>We have changed the way errors are handled. Here is how it works:</p> +<div class="highlight"><pre><span class="n">service</span> <span class="o">=</span> <span class="n">Service</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;service&quot;</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s">&quot;/service&quot;</span><span class="p">)</span> + + +<span class="k">def</span> <span class="nf">is_awesome</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;awesome&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">:</span> + <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> <span class="s">&#39;You lack awesomeness!&#39;</span><span class="p">)</span> + + +<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="p">(</span><span class="n">is_awesome</span><span class="p">))</span> +<span class="k">def</span> <span class="nf">get1</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="s">&quot;succeeded&quot;</span><span class="p">}</span> +</pre></div> +<p>All the errors collected during the validation process, or after, are collected +before returning the request. If any, a error 400 is fired up, with the list of +problems encoutred encoded as a nice json list (we plan to support multiple +formats in the future)</p> +<p>As you might have seen, <cite>request.errors.add</cite> takes three parameters: <strong>location</strong>, +<strong>name</strong> and <strong>description</strong>.</p> +<p><strong>location</strong> is where the error arised. It can either be &quot;body&quot;, &quot;query&quot;, &quot;headers&quot; +or &quot;path&quot;. <strong>name</strong> is the name of the variable causing problem, if any, and +<strong>description</strong> contains a more detailled message.</p> +<p>Here is an example of a malformed request:</p> +<pre class="literal-block"> +$ # run a demo app +</pre> <p>To describe a web service in <em>cornice</em>, you have to write something like this</p> <div class="system-message"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 14)</p> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 54)</p> <p>Content block expected for the &quot;code-block&quot; directive; none found.</p> <pre class="literal-block"> .. code-block:: python - </pre> </div> +</div> Quels usages pour l'informatique ?2011-12-01T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-01:/quels-usages-pour-linformatique-fr.html/<p>Quand on termine ses études, on s'en pose un tas, des questions. Sur le métier que l'on veut faire, sur ce que ça signifie, sur le sens et la valeur du travail. Et j'en suis arrivé à faire un constat simple: l'informatique, c'est diff --git a/feeds/mozilla.atom.xml b/feeds/mozilla.atom.xml index 6a63bb5..9669fc0 100644 --- a/feeds/mozilla.atom.xml +++ b/feeds/mozilla.atom.xml @@ -1,16 +1,47 @@ -Alexis' loghttp://blog.notmyidea.org2011-12-06T00:00:00+01:00Introducing cornice2011-12-06T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-06:/introducing-cornice.html/<p>Wow, this is my second working day at mozilla. I've been working, yesterday and -today, on a pyramid REST-ish toolkit, <a class="reference external" href="https://github.com/mozilla-services/cornice">cornice</a>.</p> -<p>Cornice allows you to take out from you all the repetitive stuff you do when -writing a web service. I'm mainly thinking about different kinds of validation.</p> +Alexis' loghttp://blog.notmyidea.org2011-12-06T00:00:00+01:00Introducing cornice2011-12-06T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-06:/introducing-cornice.html/<p>Wow, already my third working day at mozilla. Since Monday, I've been working with +Tarek Ziadé, on a pyramid REST-ish toolkit named <a class="reference external" href="https://github.com/mozilla-services/cornice">cornice</a>.</p> +<p>Its goal is to take all the hard bits appart from you when implementing a web +service, so you can focus on what's important. Cornice provides you facilities +for validation of any kind.</p> +<p>The goal is to simplify your work, but we don't want to reinvent the wheel, so +it is easily pluggable with validations frameworks, such as Collander.</p> +<div class="section" id="handling-errors-and-validation"> +<h2>Handling errors and validation</h2> +<p>We have changed the way errors are handled. Here is how it works:</p> +<div class="highlight"><pre><span class="n">service</span> <span class="o">=</span> <span class="n">Service</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;service&quot;</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s">&quot;/service&quot;</span><span class="p">)</span> + + +<span class="k">def</span> <span class="nf">is_awesome</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;awesome&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">:</span> + <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> <span class="s">&#39;You lack awesomeness!&#39;</span><span class="p">)</span> + + +<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="p">(</span><span class="n">is_awesome</span><span class="p">))</span> +<span class="k">def</span> <span class="nf">get1</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="s">&quot;succeeded&quot;</span><span class="p">}</span> +</pre></div> +<p>All the errors collected during the validation process, or after, are collected +before returning the request. If any, a error 400 is fired up, with the list of +problems encoutred encoded as a nice json list (we plan to support multiple +formats in the future)</p> +<p>As you might have seen, <cite>request.errors.add</cite> takes three parameters: <strong>location</strong>, +<strong>name</strong> and <strong>description</strong>.</p> +<p><strong>location</strong> is where the error arised. It can either be &quot;body&quot;, &quot;query&quot;, &quot;headers&quot; +or &quot;path&quot;. <strong>name</strong> is the name of the variable causing problem, if any, and +<strong>description</strong> contains a more detailled message.</p> +<p>Here is an example of a malformed request:</p> +<pre class="literal-block"> +$ # run a demo app +</pre> <p>To describe a web service in <em>cornice</em>, you have to write something like this</p> <div class="system-message"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 14)</p> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 54)</p> <p>Content block expected for the &quot;code-block&quot; directive; none found.</p> <pre class="literal-block"> .. code-block:: python - </pre> </div> +</div> \ No newline at end of file diff --git a/introducing-cornice.html b/introducing-cornice.html index 02cd4d5..3c1a3b2 100644 --- a/introducing-cornice.html +++ b/introducing-cornice.html @@ -14,20 +14,51 @@

        Introducing cornice

        Published on Tue 06 December 2011

        -

        Wow, this is my second working day at mozilla. I've been working, yesterday and -today, on a pyramid REST-ish toolkit, cornice.

        -

        Cornice allows you to take out from you all the repetitive stuff you do when -writing a web service. I'm mainly thinking about different kinds of validation.

        +

        Wow, already my third working day at mozilla. Since Monday, I've been working with +Tarek Ziadé, on a pyramid REST-ish toolkit named cornice.

        +

        Its goal is to take all the hard bits appart from you when implementing a web +service, so you can focus on what's important. Cornice provides you facilities +for validation of any kind.

        +

        The goal is to simplify your work, but we don't want to reinvent the wheel, so +it is easily pluggable with validations frameworks, such as Collander.

        +
        +

        Handling errors and validation

        +

        We have changed the way errors are handled. Here is how it works:

        +
        service = Service(name="service", path="/service")
        +
        +
        +def is_awesome(request):
        +    if not 'awesome' in request.GET:
        +        request.errors.add('body', 'awesome', 'You lack awesomeness!')
        +
        +
        +@service.get(validator=(is_awesome))
        +def get1(request):
        +    return {"test": "succeeded"}
        +
        +

        All the errors collected during the validation process, or after, are collected +before returning the request. If any, a error 400 is fired up, with the list of +problems encoutred encoded as a nice json list (we plan to support multiple +formats in the future)

        +

        As you might have seen, request.errors.add takes three parameters: location, +name and description.

        +

        location is where the error arised. It can either be "body", "query", "headers" +or "path". name is the name of the variable causing problem, if any, and +description contains a more detailled message.

        +

        Here is an example of a malformed request:

        +
        +$ # run a demo app
        +

        To describe a web service in cornice, you have to write something like this

        -

        System Message: ERROR/3 (./content/mozilla/introducing-cornice.rst, line 14)

        +

        System Message: ERROR/3 (./content/mozilla/introducing-cornice.rst, line 54)

        Content block expected for the "code-block" directive; none found.

         .. code-block:: python
         
        -
         
        +
        From 2a2a68395b374eca71b6d8f6a3df0bb43b895391 Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Wed, 7 Dec 2011 09:19:11 -0100 Subject: [PATCH 8/8] Update documentation --- feeds/all-en.atom.xml | 93 +++++++++++++++++++++++++++++++++++----- feeds/all.atom.xml | 93 +++++++++++++++++++++++++++++++++++----- feeds/mozilla.atom.xml | 93 +++++++++++++++++++++++++++++++++++----- introducing-cornice.html | 93 +++++++++++++++++++++++++++++++++++----- 4 files changed, 332 insertions(+), 40 deletions(-) diff --git a/feeds/all-en.atom.xml b/feeds/all-en.atom.xml index 650ac53..711e5bc 100644 --- a/feeds/all-en.atom.xml +++ b/feeds/all-en.atom.xml @@ -14,12 +14,13 @@ it is easily pluggable with validations frameworks, such as Collander.</p> <span class="k">def</span> <span class="nf">is_awesome</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;awesome&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">:</span> - <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> <span class="s">&#39;You lack awesomeness!&#39;</span><span class="p">)</span> + <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> + <span class="s">&#39;the awesome parameter is required&#39;</span><span class="p">)</span> -<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="p">(</span><span class="n">is_awesome</span><span class="p">))</span> +<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="n">is_awesome</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get1</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> - <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="s">&quot;succeeded&quot;</span><span class="p">}</span> + <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="s">&quot;yay!&quot;</span><span class="p">}</span> </pre></div> <p>All the errors collected during the validation process, or after, are collected before returning the request. If any, a error 400 is fired up, with the list of @@ -30,19 +31,91 @@ formats in the future)</p> <p><strong>location</strong> is where the error arised. It can either be &quot;body&quot;, &quot;query&quot;, &quot;headers&quot; or &quot;path&quot;. <strong>name</strong> is the name of the variable causing problem, if any, and <strong>description</strong> contains a more detailled message.</p> -<p>Here is an example of a malformed request:</p> +<p>Let's run this simple service, with <cite>bin/paster serve</cite> and send some queries to +it:</p> +<div class="highlight"><pre>$ curl -v http://127.0.0.1:5000/service +&gt; GET /service HTTP/1.1 +&gt; Host: 127.0.0.1:5000 +&gt; Accept: */* +&gt; +* HTTP 1.0, assume close after body +&lt; HTTP/1.0 400 Bad Request +&lt; Content-Type: application/json; charset=UTF-8 +[{&quot;location&quot;: &quot;body&quot;, &quot;name&quot;: &quot;awesome&quot;, &quot;description&quot;: &quot;You lack awesomeness!&quot;} +</pre></div> +<p>I've removed the extra clutter from the curl's output, but you got the general idea.</p> +<p>The content returned is in JSON, and I know exactly what I have to do: add an +&quot;awesome&quot; parameter in my query. Let's do it again:</p> <pre class="literal-block"> -$ # run a demo app +$ curl http://127.0.0.1:5000/service?awesome=yeah +{&quot;test&quot;: &quot;yay!&quot;} </pre> -<p>To describe a web service in <em>cornice</em>, you have to write something like this</p> -<div class="system-message"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 54)</p> -<p>Content block expected for the &quot;code-block&quot; directive; none found.</p> +<p>Validators can also attach extra information about validations to the request, +using <cite>request.validated</cite>. It is a standard dict automatically attached to the +requests.</p> +<p>For instance, in our validator, we can chose to validate the parameter passed +and use it in the body of the webservice:</p> +<div class="highlight"><pre><span class="n">service</span> <span class="o">=</span> <span class="n">Service</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;service&quot;</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s">&quot;/service&quot;</span><span class="p">)</span> + + +<span class="k">def</span> <span class="nf">is_awesome</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;awesome&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">:</span> + <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> + <span class="s">&#39;the awesome parameter is required&#39;</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">request</span><span class="o">.</span><span class="n">validated</span><span class="p">[</span><span class="s">&#39;awesome&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;awesome &#39;</span> <span class="o">+</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">[</span><span class="s">&#39;awesome&#39;</span><span class="p">]</span> + + +<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="n">is_awesome</span><span class="p">)</span> +<span class="k">def</span> <span class="nf">get1</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">validated</span><span class="p">[</span><span class="s">&#39;awesome&#39;</span><span class="p">]}</span> +</pre></div> <pre class="literal-block"> -.. code-block:: python +curl http://127.0.0.1:5000/service?awesome=yeah +{&quot;test&quot;: &quot;awesome yeah&quot;} +</pre> +</div> +<div class="section" id="dealing-with-accept-headers"> +<h2>Dealing with &quot;Accept&quot; headers</h2> +<p>The HTTP spec defines a <strong>Accept</strong> header the client can send so the response +is encoded the right way. A resource, available at an URL, can be available in +different formats. This is especially true for web services.</p> +<p>Cornice can help you to deal with this. The services you define can tell which +content-types they can deal with, and this will be checked against the +<strong>Accept</strong> headers sent by the client.</p> +<p>Let's refine a bit our previous example, by specifying which content-types are +supported, using the <cite>accept</cite> parameter:</p> +<div class="system-message"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 117)</p> +<p>Error in &quot;code-block&quot; directive: +1 argument(s) required, 0 supplied.</p> +<pre class="literal-block"> +.. code-block:: + + &#64;service.get(validator=is_awesome, accept=(&quot;application/json&quot;, &quot;text/json&quot;)) + def get1(request): + return {&quot;test&quot;: &quot;yay!&quot;} </pre> </div> +<p>Now, if you specifically ask for XML, for instance, cornice will throw a 406 +with the list of accepted content-types:</p> +<pre class="literal-block"> +$ curl -vH &quot;Accept: application/xml&quot; http://127.0.0.1:5000/service +&gt; GET /service HTTP/1.1 +&gt; Host: 127.0.0.1:5000 +&gt; Accept: application/xml +&gt; +&lt; HTTP/1.0 406 Not Acceptable +&lt; Content-Type: application/json; charset=UTF-8 +&lt; Content-Length: 33 +&lt; +[&quot;application/json&quot;, &quot;text/json&quot;] +</pre> +</div> +<div class="section" id="building-your-documentation-automatically"> +<h2>Building your documentation automatically</h2> +<p>XXX</p> </div>
        How are you handling your shared expenses?2011-10-15T00:00:00+02:00Alexis Métaireautag:blog.notmyidea.org,2011-10-15:/how-are-you-handling-your-shared-expenses.html/<p><strong>TL;DR:</strong> We're kick-starting a new application to manage your shared expenses. Have a look at <a class="reference external" href="http://ihatemoney.notmyidea.org">http://ihatemoney.notmyidea.org</a></p> diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index 2e4fdc1..4206194 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -14,12 +14,13 @@ it is easily pluggable with validations frameworks, such as Collander.</p> <span class="k">def</span> <span class="nf">is_awesome</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;awesome&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">:</span> - <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> <span class="s">&#39;You lack awesomeness!&#39;</span><span class="p">)</span> + <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> + <span class="s">&#39;the awesome parameter is required&#39;</span><span class="p">)</span> -<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="p">(</span><span class="n">is_awesome</span><span class="p">))</span> +<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="n">is_awesome</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get1</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> - <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="s">&quot;succeeded&quot;</span><span class="p">}</span> + <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="s">&quot;yay!&quot;</span><span class="p">}</span> </pre></div> <p>All the errors collected during the validation process, or after, are collected before returning the request. If any, a error 400 is fired up, with the list of @@ -30,19 +31,91 @@ formats in the future)</p> <p><strong>location</strong> is where the error arised. It can either be &quot;body&quot;, &quot;query&quot;, &quot;headers&quot; or &quot;path&quot;. <strong>name</strong> is the name of the variable causing problem, if any, and <strong>description</strong> contains a more detailled message.</p> -<p>Here is an example of a malformed request:</p> +<p>Let's run this simple service, with <cite>bin/paster serve</cite> and send some queries to +it:</p> +<div class="highlight"><pre>$ curl -v http://127.0.0.1:5000/service +&gt; GET /service HTTP/1.1 +&gt; Host: 127.0.0.1:5000 +&gt; Accept: */* +&gt; +* HTTP 1.0, assume close after body +&lt; HTTP/1.0 400 Bad Request +&lt; Content-Type: application/json; charset=UTF-8 +[{&quot;location&quot;: &quot;body&quot;, &quot;name&quot;: &quot;awesome&quot;, &quot;description&quot;: &quot;You lack awesomeness!&quot;} +</pre></div> +<p>I've removed the extra clutter from the curl's output, but you got the general idea.</p> +<p>The content returned is in JSON, and I know exactly what I have to do: add an +&quot;awesome&quot; parameter in my query. Let's do it again:</p> <pre class="literal-block"> -$ # run a demo app +$ curl http://127.0.0.1:5000/service?awesome=yeah +{&quot;test&quot;: &quot;yay!&quot;} </pre> -<p>To describe a web service in <em>cornice</em>, you have to write something like this</p> -<div class="system-message"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 54)</p> -<p>Content block expected for the &quot;code-block&quot; directive; none found.</p> +<p>Validators can also attach extra information about validations to the request, +using <cite>request.validated</cite>. It is a standard dict automatically attached to the +requests.</p> +<p>For instance, in our validator, we can chose to validate the parameter passed +and use it in the body of the webservice:</p> +<div class="highlight"><pre><span class="n">service</span> <span class="o">=</span> <span class="n">Service</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;service&quot;</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s">&quot;/service&quot;</span><span class="p">)</span> + + +<span class="k">def</span> <span class="nf">is_awesome</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;awesome&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">:</span> + <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> + <span class="s">&#39;the awesome parameter is required&#39;</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">request</span><span class="o">.</span><span class="n">validated</span><span class="p">[</span><span class="s">&#39;awesome&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;awesome &#39;</span> <span class="o">+</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">[</span><span class="s">&#39;awesome&#39;</span><span class="p">]</span> + + +<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="n">is_awesome</span><span class="p">)</span> +<span class="k">def</span> <span class="nf">get1</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">validated</span><span class="p">[</span><span class="s">&#39;awesome&#39;</span><span class="p">]}</span> +</pre></div> <pre class="literal-block"> -.. code-block:: python +curl http://127.0.0.1:5000/service?awesome=yeah +{&quot;test&quot;: &quot;awesome yeah&quot;} +</pre> +</div> +<div class="section" id="dealing-with-accept-headers"> +<h2>Dealing with &quot;Accept&quot; headers</h2> +<p>The HTTP spec defines a <strong>Accept</strong> header the client can send so the response +is encoded the right way. A resource, available at an URL, can be available in +different formats. This is especially true for web services.</p> +<p>Cornice can help you to deal with this. The services you define can tell which +content-types they can deal with, and this will be checked against the +<strong>Accept</strong> headers sent by the client.</p> +<p>Let's refine a bit our previous example, by specifying which content-types are +supported, using the <cite>accept</cite> parameter:</p> +<div class="system-message"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 117)</p> +<p>Error in &quot;code-block&quot; directive: +1 argument(s) required, 0 supplied.</p> +<pre class="literal-block"> +.. code-block:: + + &#64;service.get(validator=is_awesome, accept=(&quot;application/json&quot;, &quot;text/json&quot;)) + def get1(request): + return {&quot;test&quot;: &quot;yay!&quot;} </pre> </div> +<p>Now, if you specifically ask for XML, for instance, cornice will throw a 406 +with the list of accepted content-types:</p> +<pre class="literal-block"> +$ curl -vH &quot;Accept: application/xml&quot; http://127.0.0.1:5000/service +&gt; GET /service HTTP/1.1 +&gt; Host: 127.0.0.1:5000 +&gt; Accept: application/xml +&gt; +&lt; HTTP/1.0 406 Not Acceptable +&lt; Content-Type: application/json; charset=UTF-8 +&lt; Content-Length: 33 +&lt; +[&quot;application/json&quot;, &quot;text/json&quot;] +</pre> +</div> +<div class="section" id="building-your-documentation-automatically"> +<h2>Building your documentation automatically</h2> +<p>XXX</p> </div> Quels usages pour l'informatique ?2011-12-01T00:00:00+01:00Alexis Métaireautag:blog.notmyidea.org,2011-12-01:/quels-usages-pour-linformatique-fr.html/<p>Quand on termine ses études, on s'en pose un tas, des questions. Sur le métier que l'on veut faire, sur ce que ça signifie, sur le sens et la valeur du diff --git a/feeds/mozilla.atom.xml b/feeds/mozilla.atom.xml index 9669fc0..ce3e119 100644 --- a/feeds/mozilla.atom.xml +++ b/feeds/mozilla.atom.xml @@ -14,12 +14,13 @@ it is easily pluggable with validations frameworks, such as Collander.</p> <span class="k">def</span> <span class="nf">is_awesome</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;awesome&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">:</span> - <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> <span class="s">&#39;You lack awesomeness!&#39;</span><span class="p">)</span> + <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> + <span class="s">&#39;the awesome parameter is required&#39;</span><span class="p">)</span> -<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="p">(</span><span class="n">is_awesome</span><span class="p">))</span> +<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="n">is_awesome</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get1</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> - <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="s">&quot;succeeded&quot;</span><span class="p">}</span> + <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="s">&quot;yay!&quot;</span><span class="p">}</span> </pre></div> <p>All the errors collected during the validation process, or after, are collected before returning the request. If any, a error 400 is fired up, with the list of @@ -30,18 +31,90 @@ formats in the future)</p> <p><strong>location</strong> is where the error arised. It can either be &quot;body&quot;, &quot;query&quot;, &quot;headers&quot; or &quot;path&quot;. <strong>name</strong> is the name of the variable causing problem, if any, and <strong>description</strong> contains a more detailled message.</p> -<p>Here is an example of a malformed request:</p> +<p>Let's run this simple service, with <cite>bin/paster serve</cite> and send some queries to +it:</p> +<div class="highlight"><pre>$ curl -v http://127.0.0.1:5000/service +&gt; GET /service HTTP/1.1 +&gt; Host: 127.0.0.1:5000 +&gt; Accept: */* +&gt; +* HTTP 1.0, assume close after body +&lt; HTTP/1.0 400 Bad Request +&lt; Content-Type: application/json; charset=UTF-8 +[{&quot;location&quot;: &quot;body&quot;, &quot;name&quot;: &quot;awesome&quot;, &quot;description&quot;: &quot;You lack awesomeness!&quot;} +</pre></div> +<p>I've removed the extra clutter from the curl's output, but you got the general idea.</p> +<p>The content returned is in JSON, and I know exactly what I have to do: add an +&quot;awesome&quot; parameter in my query. Let's do it again:</p> <pre class="literal-block"> -$ # run a demo app +$ curl http://127.0.0.1:5000/service?awesome=yeah +{&quot;test&quot;: &quot;yay!&quot;} </pre> -<p>To describe a web service in <em>cornice</em>, you have to write something like this</p> -<div class="system-message"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 54)</p> -<p>Content block expected for the &quot;code-block&quot; directive; none found.</p> +<p>Validators can also attach extra information about validations to the request, +using <cite>request.validated</cite>. It is a standard dict automatically attached to the +requests.</p> +<p>For instance, in our validator, we can chose to validate the parameter passed +and use it in the body of the webservice:</p> +<div class="highlight"><pre><span class="n">service</span> <span class="o">=</span> <span class="n">Service</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;service&quot;</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s">&quot;/service&quot;</span><span class="p">)</span> + + +<span class="k">def</span> <span class="nf">is_awesome</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;awesome&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">:</span> + <span class="n">request</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="s">&#39;awesome&#39;</span><span class="p">,</span> + <span class="s">&#39;the awesome parameter is required&#39;</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">request</span><span class="o">.</span><span class="n">validated</span><span class="p">[</span><span class="s">&#39;awesome&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;awesome &#39;</span> <span class="o">+</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">[</span><span class="s">&#39;awesome&#39;</span><span class="p">]</span> + + +<span class="nd">@service.get</span><span class="p">(</span><span class="n">validator</span><span class="o">=</span><span class="n">is_awesome</span><span class="p">)</span> +<span class="k">def</span> <span class="nf">get1</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> + <span class="k">return</span> <span class="p">{</span><span class="s">&quot;test&quot;</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">validated</span><span class="p">[</span><span class="s">&#39;awesome&#39;</span><span class="p">]}</span> +</pre></div> <pre class="literal-block"> -.. code-block:: python +curl http://127.0.0.1:5000/service?awesome=yeah +{&quot;test&quot;: &quot;awesome yeah&quot;} +</pre> +</div> +<div class="section" id="dealing-with-accept-headers"> +<h2>Dealing with &quot;Accept&quot; headers</h2> +<p>The HTTP spec defines a <strong>Accept</strong> header the client can send so the response +is encoded the right way. A resource, available at an URL, can be available in +different formats. This is especially true for web services.</p> +<p>Cornice can help you to deal with this. The services you define can tell which +content-types they can deal with, and this will be checked against the +<strong>Accept</strong> headers sent by the client.</p> +<p>Let's refine a bit our previous example, by specifying which content-types are +supported, using the <cite>accept</cite> parameter:</p> +<div class="system-message"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">./content/mozilla/introducing-cornice.rst</tt>, line 117)</p> +<p>Error in &quot;code-block&quot; directive: +1 argument(s) required, 0 supplied.</p> +<pre class="literal-block"> +.. code-block:: + + &#64;service.get(validator=is_awesome, accept=(&quot;application/json&quot;, &quot;text/json&quot;)) + def get1(request): + return {&quot;test&quot;: &quot;yay!&quot;} </pre> </div> +<p>Now, if you specifically ask for XML, for instance, cornice will throw a 406 +with the list of accepted content-types:</p> +<pre class="literal-block"> +$ curl -vH &quot;Accept: application/xml&quot; http://127.0.0.1:5000/service +&gt; GET /service HTTP/1.1 +&gt; Host: 127.0.0.1:5000 +&gt; Accept: application/xml +&gt; +&lt; HTTP/1.0 406 Not Acceptable +&lt; Content-Type: application/json; charset=UTF-8 +&lt; Content-Length: 33 +&lt; +[&quot;application/json&quot;, &quot;text/json&quot;] +</pre> +</div> +<div class="section" id="building-your-documentation-automatically"> +<h2>Building your documentation automatically</h2> +<p>XXX</p> </div>
        \ No newline at end of file diff --git a/introducing-cornice.html b/introducing-cornice.html index 3c1a3b2..c113980 100644 --- a/introducing-cornice.html +++ b/introducing-cornice.html @@ -29,12 +29,13 @@ it is easily pluggable with validations frameworks, such as Collander.

        def is_awesome(request): if not 'awesome' in request.GET: - request.errors.add('body', 'awesome', 'You lack awesomeness!') + request.errors.add('body', 'awesome', + 'the awesome parameter is required') -@service.get(validator=(is_awesome)) +@service.get(validator=is_awesome) def get1(request): - return {"test": "succeeded"} + return {"test": "yay!"}

        All the errors collected during the validation process, or after, are collected before returning the request. If any, a error 400 is fired up, with the list of @@ -45,19 +46,91 @@ formats in the future)

        location is where the error arised. It can either be "body", "query", "headers" or "path". name is the name of the variable causing problem, if any, and description contains a more detailled message.

        -

        Here is an example of a malformed request:

        +

        Let's run this simple service, with bin/paster serve and send some queries to +it:

        +
        $ curl -v http://127.0.0.1:5000/service
        +> GET /service HTTP/1.1
        +> Host: 127.0.0.1:5000
        +> Accept: */*
        +>
        +* HTTP 1.0, assume close after body
        +< HTTP/1.0 400 Bad Request
        +< Content-Type: application/json; charset=UTF-8
        +[{"location": "body", "name": "awesome", "description": "You lack awesomeness!"}
        +
        +

        I've removed the extra clutter from the curl's output, but you got the general idea.

        +

        The content returned is in JSON, and I know exactly what I have to do: add an +"awesome" parameter in my query. Let's do it again:

        -$ # run a demo app
        +$ curl http://127.0.0.1:5000/service?awesome=yeah
        +{"test": "yay!"}
         
        -

        To describe a web service in cornice, you have to write something like this

        -
        -

        System Message: ERROR/3 (./content/mozilla/introducing-cornice.rst, line 54)

        -

        Content block expected for the "code-block" directive; none found.

        +

        Validators can also attach extra information about validations to the request, +using request.validated. It is a standard dict automatically attached to the +requests.

        +

        For instance, in our validator, we can chose to validate the parameter passed +and use it in the body of the webservice:

        +
        service = Service(name="service", path="/service")
        +
        +
        +def is_awesome(request):
        +    if not 'awesome' in request.GET:
        +        request.errors.add('body', 'awesome',
        +                            'the awesome parameter is required')
        +    else:
        +        request.validated['awesome'] = 'awesome ' + request.GET['awesome']
        +
        +
        +@service.get(validator=is_awesome)
        +def get1(request):
        +    return {"test": request.validated['awesome']}
        +
        -.. code-block:: python
        +curl http://127.0.0.1:5000/service?awesome=yeah
        +{"test": "awesome yeah"}
        +
        +
        +
        +

        Dealing with "Accept" headers

        +

        The HTTP spec defines a Accept header the client can send so the response +is encoded the right way. A resource, available at an URL, can be available in +different formats. This is especially true for web services.

        +

        Cornice can help you to deal with this. The services you define can tell which +content-types they can deal with, and this will be checked against the +Accept headers sent by the client.

        +

        Let's refine a bit our previous example, by specifying which content-types are +supported, using the accept parameter:

        +
        +

        System Message: ERROR/3 (./content/mozilla/introducing-cornice.rst, line 117)

        +

        Error in "code-block" directive: +1 argument(s) required, 0 supplied.

        +
        +.. code-block::
        +
        +    @service.get(validator=is_awesome, accept=("application/json", "text/json"))
        +    def get1(request):
        +        return {"test": "yay!"}
         
         
        +

        Now, if you specifically ask for XML, for instance, cornice will throw a 406 +with the list of accepted content-types:

        +
        +$ curl -vH "Accept: application/xml" http://127.0.0.1:5000/service
        +> GET /service HTTP/1.1
        +> Host: 127.0.0.1:5000
        +> Accept: application/xml
        +>
        +< HTTP/1.0 406 Not Acceptable
        +< Content-Type: application/json; charset=UTF-8
        +< Content-Length: 33
        +<
        +["application/json", "text/json"]
        +
        +
        +
        +

        Building your documentation automatically

        +

        XXX

        -

        Alexis Métaireau's thoughs

        - +

        Alexis Métaireau's thougths

        +