Quantcast
Channel: AFPy's Planet
Viewing all 3409 articles
Browse latest View live

[cubicweb] Logilab's roadmap for CubicWeb on September 6th, 2013

$
0
0

The Logilab team holds a roadmap meeting every two months to plan its CubicWeb development effort. Here is the report about the Sept 6th, 2013 meeting. The previous report posted to the blog was the february 2013 roadmap.

Version 3.17

This version is now stable and maintained (release 3.17.7 is upcoming). It added a couple features and focused on putting CW to the diet by extracting some functionnalities provided by the core into external cubes: sioc, embed, massmailing, geocoding, etc.

For details read what's new in CubicWeb 3.17.

Version 3.18

This version is now freezed and will be published as soon as all the patches are tested and merged. Since we have a lot of work for clients until the end of the year at Logilab, the community should feel free to help (as usual) if it wants this version to be released rather sooner than later.

This version will remove the ldapuser source that is replaced by ldapfeed, implement Cross Origin Resource Sharing, drop some very old compatibility code, deprecate the old version of the multi-source system and provide various other features and bugfixes.

For details read list of tickets for CubicWeb 3.18.0.

Version 3.19

This version will probably be publish early next year (read january or february 2014) unless someone who is not working at Logilab takes responsibility for its release.

It should include the heavy refactoring work done by Pierre-Yves and Sylvain over the past year, that modifies sessions and sources to lay the path for CubicWeb 4.

For details read list of tickets for CubicWeb 3.19.0 or take a look at this head.

Squareui

Since Orbui changes the organization of the default user interface on screen, it was decided to share the low-level bootstrap related views that could be shared and build a SquareUI cube that would conform design choices of the default UI.

Logilab is now developping all its new projects based on Squareui 0.2. Read about it on the mailing list archives.

Mid-term goals

The mid-term goals include better REST support (Representational State Transfer), complete WSGI (Python's Web Server Gateway Interface) and the FROM clause for RQL queries (to reinvent db federation outside of the core).

Cubes

Our current plan is to extract as much as possible to cubes. We started CubicWeb many years ago with the Python motto "batteries included", but have since realized that having too much in the core contributes to making CubicWeb difficult to learn.

Since we would very much like the community to grow, we are now aiming for something more balanced, like Mercurial does. The core is designed such that most features can be developed as an extension. Once they are stable, popular extensions can be moved to the main library that is distributed with the core, and be activated with a switch in the configuration file.

Several cubes are under active development: oauth, signedrequest, dataio, etc.

Last but not least

As already said on the mailing list, other developers and contributors are more than welcome to share their own goals in order to define a roadmap that best fits everyone's needs.

Logilab's next roadmap meeting will be held at the beginning of November 2013.


[j-mad] Pytong, des tongs, une plage, des présentations et des gens biens

$
0
0
La semaine dernière j’ai eu le plaisir d’assister (et de prendre la parole) à la première édition de Pytong, première édition, un événement organisé par Laurent et David à Toulon. Le samedi, direction la Cantine de Toulon dans les locaux de l’ISEN. La journée s’est découpée en deux parties, conférences et ligthing talk jusqu’à 15h [...]

[logilab] Rencontre autour de SaltStack lors de l'OpenWorldForum

$
0
0

Suite à l'organisation du sprint français autour de SaltStack, nous continuons d'essayer de fédérer la communauté française utilisatrice (ou tout simplement curieuse) de solutions de gestion centralisées autour de la technologie Salt (qui est écrit en Python et que nous pouvons donc facilement adapter à nos besoins en contribuant au projet).

http://openworldforum.org/static/pictures/Calque1.png http://saltstack.com/images/SaltStack-Logo.png

Au sein de l'OpenWorldForum nous animons un SaltStack meetup / BOF le jeudi 3 octobre de 18h30 à 20h30 avec Thomas Hatch fondateur de SaltStack. La totalité de l’événement (dont le meetup) est gratuit, il suffit de s'inscrire.

Logilab tiendra un stand le jeudi et le vendredi lors du forum, n'hésitez pas à venir discuter avec nous. Le TDI (Test-Driven Infrastructure), qui consiste à appliquer le TDD (Test-driven development) (développement piloté par les tests) à l'administration système sera un des thèmes de notre présence.

[logilab] DebConf13 report

$
0
0

As announced before, I spent a week last month in Vaumarcus, Switzerland, attending the 14th Debian conference (DebConf13).

It was great to be at DebConf again, with lots of people I hadn't seen since New York City three years ago, and lots of new faces. Kudos to the organizers for pulling this off. These events are always a great boost for motivation, even if the amount of free time after coming back home is not quite as copious as I might like.

One thing that struck me this year was the number of upstream people, not directly involved in Debian, who showed up. From systemd's Lennart and Kay, to MariaDB's Monty, and people from upstart, dracut, phpmyadmin or munin. That was a rather pleasant surprise for me.

Here's a report on the talks and BoF sessions I attended. It's a bit long, but hey, the conference lasted a week. In addition to those I had quite a few chats with various people, including fellow members of the Debian release team.

http://debconf13.debconf.org/images/logo.png

Day 1 (Aug 11)

Linux kernel : Ben Hutchings made a summary of the features added between 3.2 in wheezy and the current 3.10, and their status in Debian (some still need userspace work).

SPI status : Bdale Garbee and Jimmy Kaplowitz explained what steps SPI is making to deal with its growth, including getting help from a bookkeeper recently to relieve the pressure on the (volunteer) treasurer.

Hardware support in Debian stable : If you buy new hardware today, it's almost certainly not supported by the Debian stable release. Ideas to improve this :

  • backport whole subsystems: probably not feasible, risk of regressions would be too high
  • ship compat-drivers, and have the installer automatically install newer drivers based on PCI ids, seems possible.
  • mesa: have the GL loader pick a different driver based on the hardware, and ship newer DRI drivers for the new hardware, without touching the old ones. Issue: need to update libGL and libglapi too when adding new drivers.
  • X drivers, drm: ? (it's complicated)

Meeting between release team and DPL to figure out next steps for jessie. Decided to schedule a BoF later in the week.

Day 2 (Aug 12)

Munin project lead on new features in 2.0 (shipped in wheezy) and roadmap for 2.2. Improvements on the scalability front (both in terms of number of nodes and number of plugins on a node). Future work includes improving the UI to make it less 1990 and moving some metadata to sql.

jeb on AWS and Debian : Amazon Web Services (AWS) includes compute (ec2), storage (s3), network (virtual private cloud, load balancing, ..) and other services. Used by Debian for package rebuilds. http://cloudfront.debian.net is a CDN frontend for archive mirrors. Official Debian images are on ec2, including on the AWS marketplace front page. build-debian-cloud tool from Anders Ingeman et al. was presented.

openstack in Debian : Packaging work is focused on making things easy for newcomers, basic config with debconf. Advanced users are going to use puppet or similar anyway. Essex is in wheezy, but end-of-life upstream. Grizzly available in sid and in a separate archive for wheezy. This work is sponsored by enovance.

Patents : http://patents.stackexchange.com, looks like the USPTO has used comments made there when rejecting patent applications based on prior art. Patent applications are public, and it's a lot easier to get a patent application rejected than invalidate a patent later on. Should we use that site? Help build momentum around it? Would other patent offices use that kind of research? Issues: looking at patent applications (and publicly commenting) might mean you're liable for treble damages if the patent is eventually granted? Can you comment anonymously?

Why systemd? : Lennart and Kay. Pop corn, upstart trolling, nothing really new.

Day 3 (Aug 13)

dracut : dracut presented by Harald Hoyer, its main developer. Seems worth investigating replacing initramfs-tools and sharing the maintenance load. Different hooks though, so we'll need to coordinate this with various packages.

upstart : More Debian-focused than the systemd talk. Not helped by Canonical's CLA...

dh_busfactor : debhelper is essentially a one-man show from the beginning. Though various packages/people maintain different dh_* tools either in the debhelper package itself or elsewhere. Joey is thinking about creating a debhelper team including those people. Concerns over increased breakage while people get up to speed (joeyh has 10 years of experience and still occasionally breaks stuff).

dri3000 : Keith is trying to fix dri2 issues. While dri2 fixed a number of things that were wrong with dri1, it still has some problems. One of the goals is to improve presentation: we need a way to sync between app and compositor (to avoid displaying incompletely drawn frames), avoid tearing, and let the app choose immediate page flip instead of waiting for next vblank if it missed its target (stutter in games is painful). He described this work on his blog.

security team BoF : explain the workflow, try to improve documentation of the process and what people can do to help. http://security.debian.org/

Day 4 (Aug 14)

day trip, and conference dinner on a boat from Neuchatel to Vaumarcus

Day 5 (Aug 15)

git-dpm : Spent half an hour explaining git, then was rushed to show git-dpm itself. Still, needs looking at. Lets you work with git and export changes as quilt series to build a source package.

Ubuntu daily QA : The goal was to make it possible for canonical devs (not necessarily people working on the distro) to use ubuntu+1 (dev release). They tried syncing from testing for a while, but noticed bug fixes being delayed: not good. In the previous workflow the dev release was unusable/uninstallable for the first few months. Multiarch made things even more problematic because it requires amd64/i386 being in sync.

  • 12.04: a bunch of manpower thrown at ubuntu+1 to keep backlog of technical debt under control.
  • 12.10: prepare infrastructure (mostly launchpad), add APIs, to make non-canonical people able to do stuff that previously required shell access on central machines.
  • 13.04: proposed migration. britney is used to migrate packages from devel-proposed to devel. A few teething problems at first, but good reaction.
  • 13.10 and beyond: autopkgtest runs triggered after upload/build, also for rdeps. Phased updates for stable releases (rolled out to a subset of users and then gradually generalized). Hook into errors.ubuntu.com to match new crashes with package uploads. Generally more continuous integration. Better dashboard. (Some of that is still to be done.)

Lessons learned from debian:

  • unstable's backlog can get bad → proposed is only used for builds and automated tests, no delay
  • transitions can take weeks at best
  • to avoid dividing human attention, devs are focused on devel, not devel-proposed

Lessons debian could learn:

  • keeping testing current is a collective duty/win
  • splitting users between testing and unstable has important costs
  • hooking automated testing into britney really powerful; there's a small but growing number of automated tests

Ideas:

  • cut migration delay in half
  • encourage writing autopkgtests
  • end goal: make sid to testing migration entirely based on automated tests

Debian tests using Jenkins http://jenkins.debian.net

  • https://github.com/h01ger/jenkins-job-builder
  • Only running amd64 right now.
  • Uses jenkins plugins: git, svn, log parser, html publisher, ...
  • Has existing jobs for installer, chroot installs, others
  • Tries to make it easy to reproduce jobs, to allow debugging
  • {c,sh}ould add autopkgtests

Day 6 (Aug 16)

X Strike Force BoF : Too many bugs we can't do anything about: {mass,auto}-close them, asking people to report upstream. Reduce distraction by moving the non-X stuff to separate teams (compiz removed instead, wayland to discuss...). We should keep drivers as close to upstream as possible. A couple of people in the room volunteered to handle the intel, ati and input drivers.

reclass BoF

I had missed the talk about reclass, and Martin kindly offered to give a followup BoF to show what reclass can do.

Reclass provides adaptors for puppet(?), salt, ansible. A yaml file describes each host:

  • can declare applications and parameters
  • host is leaf in a dag/tree of classes

Lets you put the data in reclass instead of the config management tool, keeping generic templates in ansible/salt.

I'm definitely going to try this and see if it makes it easier to organize data we're currently putting directly in salt states.

release BoF : Notes are on http://gobby.debian.org. Basic summary: "Releasing in general is hard. Releasing something as big/diverse/distributed as Debian is even harder." Who knew?

freedombox : status update from Bdale

Keith Packard showed off the free software he uses in his and Bdale's rockets adventures.

This was followed by a birthday party in the evening, as Debian turned 20 years old.

Day 7 (Aug 17)

x2go : Notes are on http://gobby.debian.org. To be solved: issues with nx libs (gpl fork of old x). Seems like a good thing to try as alternative to LTSP which we use at Logilab.

lightning talks

  • coquelicot (lunar) - one-click secure(ish) file upload web app
  • notmuch (bremner) - need to try that again now that I have slightly more disk space
  • fedmsg (laarmen) - GSoC, message passing inside the debian infrastructure

Debconf15 bids :

  • Mechelen/Belgium - Wouter
  • Germany (no city yet) - Marga

Debconf14 presentation : Will be in Portland (Portland State University) next August. Presentation by vorlon, harmoney, keithp. Looking forward to it!

  • Closing ceremony

The videos of most of the talks can be downloaded, thanks to the awesome work of the video team. And if you want to check what I didn't see or talk about, check the complete schedule.

[logilab] Setup your project with cloudenvy and OpenStack

$
0
0

One nice way of having a reproducible development or test environment is to "program" a virtual machine to do the job. If you have a powerful machine at hand you might use Vagrant in combination with VirtualBox. But if you have an OpenStack setup at hand (which is our case), you might want to setup and destroy your virtual machines on such a private cloud (or public cloud if you want or can). Sure, Vagrant has some plugins that should add OpenStack as a provider, but, here at Logilab, we have a clear preference for python over ruby. So this is where cloudenvy comes into play.

http://www.openstack.org/themes/openstack/images/open-stack-cloud-computing-logo-2.png

Cloudenvy is written in python and with some simple YAML configuration can help you setup and provision some virtual machines that contain your tests or your development environment.

http://www.python.org/images/python-logo.gif

Setup your authentication in ~/.cloudenvy.yml :

cloudenvy:
  clouds:
    cloud01:
      os_username: username
      os_password: password
      os_tenant_name: tenant_name
      os_auth_url: http://keystone.example.com:5000/v2.0/

Then create an Envyfile.yml at the root of your project

project_config:
  name: foo
  image: debian-wheezy-x64

  # Optional
  #remote_user: ec2-user
  #flavor_name: m1.small
  #auto_provision: False
  #provision_scripts:
    #- provision_script.sh
  #files:
    # files copied from your host to the VM
    #local_file : destination

Now simply type envy up. Cloudenvy does the rest. It "simply" creates your machine, copies the files, runs your provision script and gives you it's IP address. You can then run envy ssh if you don't want to be bothered with IP addresses and such nonsense (forget about copy and paste from the OpenStack web interface, or your nova show commands).

Little added bonus : you know your machine will run a web server on port 8080 at some point, set it up in your environment by defining in the same Envyfile.yml your access rules

sec_groups: [
    'tcp, 22, 22, 0.0.0.0/0',
    'tcp, 80, 80, 0.0.0.0/0',
    'tcp, 8080, 8080, 0.0.0.0/0',
  ]

As you might know (or I'll just recommend it), you should be able to scratch and restart your environment without loosing anything, so once in a while you'll just do envy destroy to do so. You might want to have multiples VM with the same specs, then go for envy up -n second-machine.

Only downside right now : cloudenvy isn't packaged for debian (which is usually a prerequisite for the tools we use), but let's hope it gets some packaging soon (or maybe we'll end up doing it).

Don't forget to include this configuration in your project's version control so that a colleague starting on the project can just type envy up and have a working setup.

In the same order of ideas, we've been trying out salt-cloud <https://github.com/saltstack/salt-cloud> because provisioning machines with SaltStack is the way forward. A blog about this is next.

[cubicweb] Logilab will be in Toulouse métropole Open Data Barcamp tomorrow

$
0
0

Meet us tomorrow at the Toulouse's Cantine where several people from Logilab will be there for the open data barcamp organized by Toulouse Metropole.

More infos on barcamp.org. We'll probably talk abouthow CubicWeb manages to import large amounts of open-data to reuse.

[logilab] SaltStack Paris Meetup - some of what was said

$
0
0

Last week, on the first day of OpenWorldForum 2013, we met up with Thomas Hatch of SaltStack to have a talk about salt. He was in Paris to give two talks the following day (1 & 2), and it was a great opportunity to meet him and physically meet part of the French Salt community. Since Logilab hosted the Great Salt Sprint in Paris, we offered to co-organise the meetup at OpenWorldForum.

http://saltstack.com/images/SaltStack-Logo.png http://openworldforum.org/static/pictures/Calque1.png

Introduction

About 15 people gathered in Montrouge (near Paris) and we all took turns to present ourselves and how or why we used salt. Some people wanted to migrate from BCFG2 to salt. Some people told the story of working a month with CFEngine and meeting the same functionnality in two days with salt and so decided to go for that instead. Some like salt because they can hack its python code. Some use salt to provision pre-defined AMI images for the clouds (salt-ami-cloud-builder). Some chose salt over Ansible. Some want to use salt to pilot temporary computation clusters in the cloud (sort of like what StarCluster does with boto and ssh).

When Paul from Logilab introduced salt-ami-cloud-builder, Thomas Hatch said that some work is being done to go all the way : build an image from scratch from a state definition. On the question of Debian packaging, some efforts could be done to have salt into wheezy-backports. Julien Cristau from Logilab who is a debian developer might help with that.

Some untold stories where shared : some companies that replaced puppet by salt, some companies use salt to control an HPC cluster, some companies use salt to pilot their existing puppet system.

We had some discussions around salt-cloud, which will probably be merged into salt at some point. One idea for salt-cloud was raised : have a way of defining a "minimum" type of configuration which translates into the profiles according to which provider is used (an issue should be added shortly). The expression "pushing states" was often used, it is probably a good way of looking a the combination of using salt-cloud and the masterless mode available with salt-ssh. salt-cloud controls an existing cloud, but Thomas Hatch points to the fact that with salt-virt, salt is becoming a cloud controller itself, more on that soon.

Mixing pillar definition between 'public' and 'private' definitions can be tricky. Some solutions exist with multiple gitfs (or mercurial) external pillar definitions, but more use cases will drive more flexible functionalities in the future.

http://openworldforum.org/en/speakers/112/photo?s=220

Presentation and live demo

For those in the audience that were not (yet) users of salt, Thomas went back to explaining a few basics about it. Salt should be seen as a "toolkit to solve problems in a infrastructure" says Thomas Hatch. Why is it fast ? It is completely asynchronous and event driven.

He gave a quick presentation about the new salt-ssh which was introduced in 0.17, which allows the application of salt recipes to machines that don't have a minion connected to the master.

The peer communication can be used so as to add a condition for a state on the presence of service on a different minion.

While doing demos or even hacking on salt, one can use salt/test/minionswarm.py which makes fake minions, not everyone has hundreds of servers in at their fingertips.

Smart modules are loaded dynamically, for example, the git module that gets loaded if a state installs git and then in the same highstate uses the git modules.

Thomas explained the difference between grains and pillars : grains is data about a minion that lives on the minion, pillar is data about the minion that lives on the master. When handling grains, the grains.setval can be useful (it writes in /etc/salt/grains as yaml, so you can edit it separately). If a minion is not reachable one can obtain its grains information by replacing test=True by cache=True.

Thomas shortly presented saltstack-formulas : people want to "program" their states, and formulas answer this need, some of the jinja2 is overly complicated to make them flexible and programmable.

While talking about the unified package commands (a salt command often has various backends according to what system runs the minion), for example salt-call --local pkg.install vim, Thomas told this funny story : ironically, salt was nominated for "best package manager" at some linux magazine competition. (so you don't have to learn how to use FreeBSD packaging tools).

While hacking salt, one can take a look at the Event Bus (see test/eventlisten.py), many applications are possible when using the data on this bus. Thomas talks about a future IOflow python module where a complex logic can be implemented in the reactor with rules and a state machine. One example use of this would be if the load is high on X number of servers and the number of connexions Y on these servers then launch extra machines.

To finish on a buzzword, someone asked "what is the overlap of salt and docker" ? The answer is not simple, but Thomas thinks that in the long run there will be a lot of overlap, one can check out the existing lxc modules and states.

Wrap up

To wrap up, Thomas announced a salt conference planned for January 2014 in Salt Lake City.

Logilab proposes to bootstrap the French community around salt. As the group suggest this could take the form of a mailing list, an irc channel, a meetup group , some sprints, or a combination of all the above. On that note, next international sprint will probably take place in January 2014 around the salt conference.

[ascendances] Histogramme cumulé de la répartition des cartes du jeu The City avec matplotlib

$
0
0
The city est un jeu de cartes où chaque joueur pose des bâtiments, représentés par des cartes. Elles ont chacune un coût (compris entre 0 à 11), génère un revenu et des points de victoires. La plupart d’entre elles existent en plusieurs exemplaires. Certaines cartes possèdent aussi des symboles (fontaine, caddie et voiture) qui influencent […]

[carlchenet] Brebis 0.7 : contrôle automatisé de vos sauvegardes

$
0
0
Suivez-moi aussi sur Identi.ca ou sur Twitter  La version "Chevillette" 0.7 de Brebis, le vérificateur de sauvegarde, a été publiée le 15 octobre. Pour rappel le projet Brebis est un logiciel libre (GPLv3) de contrôle automatisé de vos sauvegardes (archives et arborescences de fichiers plats). Il contrôle l’intégrité de vos sauvegardes ainsi que leur contenu. Quoi de neuf dans Brebis ? La version 0.7 […]

[sciunto] Sortie de Scikit-image 0.9.0

$
0
0

Présentation

Scikit-image est une bibliothèque python de traitement d'images. Elle sort aujourd'hui sa version 0.9.0.

Cette bibliothèque s'appuie sur numpy et scipy, les briques scientifiques en python. Ceci la distingue d'Opencv et de Pillow qui elle est principalement destinée à un traitement simple des images (rotation, rognage...). En terme de performances, scikit-image utilise cython, un générateur C pour marier un code facile à lire et une rapidité excellente.

La gallerie présente un bon nombre des fonctionnalités présentes (filtrage, segmentation, débruitage, détection de forme...).

N'hésitez pas à proposer les implémentations de vos algos favoris !

Nouvelles fonctionnalités dans 0.9.0

Annonce officielle

Segmentation:

  • 3D support in SLIC segmentation (#546)
  • SLIC voxel spacing (#719)
  • Generalized anisotropic spacing support for random_walker (#775)
  • Yen threshold method (#686)

Transforms and filters:

  • SART algorithm for tomography reconstruction (#584)
  • Gabor filters (#371)
  • Hough transform for ellipses (#597)
  • Fast resampling of nD arrays (#511)
  • Rotation axis center for Radon transforms with inverses. (#654)
  • Reconstruction circle in inverse Radon transform (#567)
  • Pixelwise image adjustment curves and methods (#505)

Feature detection:

  • [experimental API] BRIEF feature descriptor (#591)
  • [experimental API] Censure (STAR) Feature Detector (#668)
  • Octagon structural element (#669)
  • Add non rotation invariant uniform LBPs (#704)

Color and noise:

  • Add deltaE color comparison and lab2lch conversion (#665)
  • Isotropic denoising (#653)
  • Generator to add various types of random noise to images (#625)
  • Color deconvolution for immunohistochemical images (#441)
  • Color label visualization (#485)

Drawing and visualization:

  • Wu's anti-aliased circle, line, bezier curve (#709)
  • Linked image viewers and docked plugins (#575)
  • Rotated ellipse + bezier curve drawing (#510)
  • PySide & PyQt4 compatibility in skimage-viewer (#551)

Other:

  • Python 3 support without 2to3. (#620)
  • 3D Marching Cubes (#469)
  • Line, Circle, Ellipse total least squares fitting and RANSAC algorithm (#440)
  • N-dimensional array padding (#577)
  • Add a wrapper around scipy.ndimage.gaussian_filter with useful default behaviors. (#712)
  • Predefined structuring elements for 3D morphology (#484)

[Biologeek] Confort et convivialité

$
0
0

Ce billet est un résumé enrichi de ce que j'ai dit ou aurait voulu dire lors de TEDxToulon le 18 octobre.

Le Web est devenu une télévision dont l'audience est principalement répartie sur les 9 « chaînes » suivantes :

  1. Facebook
  2. Twitter
  3. Instagram
  4. Google
  5. Wikipédia
  6. Amazon
  7. Github
  8. Youtube
  9. eBay

Cela m'attriste et compte-tenu de mon métier m'amène à me questionner sur les raisons de ce que je considère comme un échec dans le passage d'un réseau distribué et collaboratif à une centralisation massive et individualisante. La transformation d'un système d'échange de savoirs en une plateforme dédiée à la consommation d'information.

J'ai passé ces 10 dernières années à me concentrer sur les outils comme tout bon technicien, puis les usages pour finalement m'intéresser aux raisons profondes qui sont à l'origine d'un tel phénomène sociétal. J'en suis arrivé à identifier 2 causes majeures.

Il faut un milieu sécurisant pour exécuter le programme génétique et il faut un milieu stressant pour l'optimiser. […] Cette lacune provoque l'apparition de maladies de la dégénérescence « car il n'y a pire stress que l'absence de stress ».

Nous sommes dans ce que Boris Cyrulnik appelle une « sécurité angoissante » qu'il oppose à un stress optimisant. Une partie (réduite et riche) de notre planète vit dans cette sécurité angoissante qui ne lui permet plus d'évoluer, de trouver des solutions innovantes, d'avoir une activité gratifiante. Nous compensons par une boulimie d'informations, de choses, de drogues mais cela reste cruellement insatisfaisant.

Ce confort nous enferme — seul — dans des bulles de confort qui ne nous permettent plus d'évoluer et ce à toutes les échelles, aussi bien en tant qu'individu qu'en tant qu'espèce. Nous n'avons plus besoin de développer notre intelligence adaptative. Nous n'avons plus besoin de collaborer et nous sommes en train de perdre la notion de vivre ensemble.

La seconde source de notre incapacité à pouvoir exploiter Internet à son plein potentiel est notre manque d'attention. Notre société souffre d'un déficit d'attention en partie généré par le marketing qui conduit à une perte de respect pour son prochain.

La population dans son ensemble souffre à cet égard, et demande attention. C'est pourquoi une politique de la jeunesse ne peut être qu'une politique de la formation de ses capacités dans tous les domaines, et telles que ses capacités (ses savoirs faire, vivre et penser) sont toutes des formes de son attention — et ceci est vrai de toutes les époques de l'humanité.

Mais à notre époque, une telle politique est un combat et un dépassement en un sens nouveau, dans la mesure où il s'agit :

  1. d'une part, de surmonter l'époque de la croissance conçue comme un consumérisme basé lui-même sur la captation toxique et destructrice de l'attention.
  2. d'autre part, de prendre appui sur les technologies de l'esprit qui émergent avec le numérique, qui constituent aussi des technologies de la transindividuation qui sont un nouveau pharmakon, et qui permettent donc tout autant de dépasser le modèle toxique que d'en aggraver irréversiblement les effets.

Tel est le véritable enjeu de la crise et du tournant qui doit s'y prendre — vers du meilleur ou vers du pire, sinon vers le pire : ce tournant est la croisée de ces deux chemins et constitue une alternative.

S'élever, c'est aller vers le meilleur, et un tel chemin, qui est un combat, contre la régression, ne peut être mené qu'avec les générations qui doivent en devenir actrices et responsables.

Pharmacologie du Front National, Bernard Stiegler

On ne sait plus prendre soin de son voisin ou de ses enfants. Cela peut vous sembler éloigné du Web mais comment avoir envie de cultiver un réseau de proches en proches si l'on ne s'intéresse plus à son proche-ain ?

Partant de ce cuisant constat d'une société qui n'était pas prête à utiliser un tel outil collaboratif, j'ai exploré les différentes pistes qui permettraient de se rapprocher de cet usage.

Les outils conviviaux

Ivan Illich dans son ouvrage Tools for conviviality introduit le concept d'outil convivial à travers 3 critères propres à une instrumentation ou une institution conviviale :

  • ne doit pas dégrader l'autonomie personnelle en se rendant indispensable
  • ne suscite ni esclave, ni maître
  • élargit le rayon d'action personnel

On peut utiliser ces critères pour analyser du marteau à la voiture en passant par l'école. Il est intéressant de constater que peu d'outils actuels passent ce simple test. Avec ces critères, l'outil technologique s'abstient de renforcer les hiérarchies entre individus et utilise les avancées techniques comme des amplificateurs. C'est l'inverse de ce qu'il se produit avec les spécialisations et les expertises en tout genres qui favorisent les relations de dépendances. On ne sait plus vivre en groupes réduits car on a perdu nos savoirs essentiels, on les a délégués et/ou morcelés.

Une vie sans savoir est une vie sans saveur. — Bernard Stiegler

Il nous faut réacquérir ces savoirs et redécouvrir la valeur des outils conviviaux. Ce n'est pas ici une apologie de l'autarcie mais une revalorisation des communautés, l'individuation de soi passant par l'accomplissement de la vision du groupe. Un même individu pouvant appartenir simultanément à plusieurs groupes.

Les initiatives locales

Never doubt that a small group of thoughtful committed citizens can change the world — M. Meade

Malgré un bilan pessimiste, amer, je vois bien aussi qu'il y a une activité locale foisonnante qui — sur des initiatives quasi-individuelles — produit du lien social, de la reconquête de citoyenneté et de nouvelles interactions. Le déploiement de tiers-lieux (fablabs, espaces de co-working, espaces publics numériques, etc) sur l'ensemble du territoire en est un exemple. L'essor du tissu associatif en est un autre. Le maillage s'intensifie localement et laisse s'exprimer les diversités culturelles des groupes créés. On assiste à des micro-expériences d'intelligence collective.

When you close that door, you're creating a small culture. — Dan Mezick

Dan Mezick explique que les personnes présentes dans une même salle créent déjà une culture locale qui va être à même d'avoir ses propres règles de collaboration. Passant par des étapes de liminarité pour accéder à l'état de communitas.

Une éducation à la collaboration

Un gagnant c'est un fabriquant de perdants. — Albert Jacquard

On nous enseigne à devenir les meilleurs, cela provient historiquement de l'excellence des lycées mis en place par Napoléon il y a 2 siècles avec ses masses de granit mais n'a plus lieu d'être. L'objectif de Napoléon au lendemain de la révolution française était de créer un système lui permettant de s'élever au plus vite tout en ayant une base solide, or on sait depuis les pharaons que la meilleure structure pour arriver à cela est la pyramide, d'où l'aboutissement à une pyramide administrative hiérarchisée dont l'école est la base. Cette approche archaïque de l'enseignement n'est plus une nécessité.

L'exemple de certains pays du nord ou d'expériences menées au Québec nous montre qu'il est tout à fait possible d'avoir une autre approche fondée sur la collaboration que l'on peut qualifier de réussite en termes d'acquis et de bien-être de l'enfant.

Chaque fois que l’on enseigne prématurément à un enfant quelque chose qu’il aurait pu découvrir par lui-même, on lui empêche de l’inventer et donc de le comprendre complètement

Jean Piaget au sujet du constructivisme

Cette compétition permanente nécessite de comparer des résultats, or ce sont les chemins menant à ces résultats qui sont intéressants mais ceci est beaucoup plus difficilement évaluable. L'attachement aux diplômes forme ces élèves à devenir des adultes qui ont perdu tout esprit critique et qui se sont déshumanisés au profit d'une rigueur scientifique. Qui consomment et diffusent une information sans être capable de l'analyser ou de la recouper.

Vers une vision commune consentie

Néanmoins, ces pistes ne pourront passer à une échelle plus large et a fortiori mondiale sans une vision politique consentie. L'enjeu est pour moi celui de faire évoluer notre espèce plus par son adaptation ou ses outils mais par sa façon d'interagir. Cela va demander aux politiques non pas de se comporter en guides mais en facilitateurs : faire en sorte que les groupes de citoyens puissent s'exprimer et interagir pour créer de la valeur et la partager.

Il existe des outils comme la sociocratie pour faire interagir ces groupes et prendre des décisions à une échelle plus large de façon à aider les politiques. Celle-ci repose sur 4 règles simples :

  • Le consentement
  • Les cercles
  • Le double lien
  • L'élection sans candidat

Il existe également des structures juridiques comme les SCOP qui amènent des valeurs démocratiques et collaboratives au sein de l'entreprise.

Penser global, agir local. — René Dubos

Je suis de plus en plus persuadé qu'Internet était un accident et que nous n'étions pas prêts à nous servir d'un tel outil. Avant de passer à une échelle globale il va falloir apprendre à collaborer de manière locale. Il faut envisager Internet comme un cap en direction duquel notre société et notre espèce peuvent aller pour évoluer de manière significative : celui qui fait passer de l'individu au groupe, celui qui fait passer de la sécurité à la collaboration, celui qui fait passer du confort à la convivialité.

Lecture proposée par l'un des auditeur (Yoann) à la suite de l'intervention : Intelligence Collective, la révolution invisible.

[logilab] PyConFr

$
0
0
http://www.pycon.fr/2013_static/pyconfr/images/banner.png

Logilab était au rendez-vous annuel des pythonistes de tous genres : la conférence PYCONFR organisée par l'AFPy, qui avait lieu cette année à l'université de Strasbourg.

Si vous n'y étiez pas, voici un petit aperçu de ce que vous avez raté, sachant que le programme était chargé.

Où en est le packaging ?

Nos amis de Unlish ont fait une présentation de l'état actuel de la distribution de paquets python.

Après une présentation générale de PyPI, ils ont décrit les derniers changements qui ont permis d'améliorer la disponibilité des paquets python.

L'information la plus importante concernait Wheel qui est le format désormais recommandé pour fournir des binaires précompilés. Fini les .egg de setuptools ! Ceci devrait faire sourir plus d'un mainteneur de paquet ou administrateur système.

Wheel est un format de fichier de distribution. Ce format clair et succinct est décrit par la PEP427. Il vise à simplifier la fabrication des paquets pour les distributions de vos OS favoris.

Les versions récentes de l'installeur pip peuvent gérer les paquets Wheel qui sont compatibles avec le système d'installation décrit dans la PEP376. Il faut toutefois, pour l'instant, dire explicitement à pip de prendre en compte ces fichiers dès qu'ils sont disponibles, grâce à l'option --use-wheel.

Vous disposez ainsi des avantages de pip (gestion claire et simple des dépendances, freeze, désinstallation, etc.) et ceux d'une distribution de paquets précompilés (installation rapide et simple, environnement de développement non requis, etc.).

Les paquets Wheel prennent en compte les implementations de python et leurs ABIs. Vous pouvez donc fournir des paquets Wheel (et les signer) facilement pour des versions spécifiques de Jython, Pypy, IronPython, etc.

$ python setup.py bdist_wheel
$ pypy setup.py bdist_wheel

Cela ne vous dispense pas de distribuer les sources de votre paquet ;)

$ python setup.py sdist

Python dans Mercurial

http://www.selenic.com/hg-logo/logo-droplets-50.png

Pierre-Yves David et Alexis Métaireau ont fait un petit rappel des trucs vraiment géniaux dans Mercurial comme les revsets et les templates.

Le coeur de leur présentation concernait l'utilisation de Python pour écrire Mercurial.

D'après son auteur, Mercurial existe aujourd'hui grâce à Python. En effet Python a permis à Matt Mackall d'écrire une preuve de son concept en à peine deux semaines -- il n'avait pas plus de temps à y dédier donc l'implementation en C n'était pas envisageable.

Rappelons qu'avant de changer le langage d'implementation il est toujours intéressant de se poser des questions sur les algorithmes utilisés. Nous avons vu quelques exemples d'optimisation en Python qui ont permis de d'accélérer Mercurial, et quelques astuces pour contourner les lenteurs que l'on rencontre avec l'interpréteur CPython (lazy import, low-level access, etc.).

Les autres avantages notables de l'utilisation de Python viennent de sa flexibilité. Les extensions pour Mercurial peuvent grâce à cela changer le comportement interne de Mercurial. Par exemple largefiles et watchman améliorent grandement la gestion des gros fichiers et la mise à jour des informations du dépôt.

Hy, lisp on Python

http://docs.hylang.org/en/latest/_images/hy_logo-smaller.png

Julien Danjou a présenté une implémentation de Lisp basé sur la VM de Python. En effet Python peut être vu comme un sous-ensemble de Lisp.

Hy interprète un script écrit dans un dialecte de Lisp et le convertit en arbre syntaxique Python classique, qui est ensuite exécuté par l'interpréteur Python.

[Python] .py -(parse)---> AST -(compile)-> .pyc -(run)-> python vm
                      /
[Lisp]   .hy -(parse)/

tip

hy2py permet de montrer l'équivalent Python d'un script Lisp.

Il y a donc une grande interopérabilité entre ce qui est implémenté en Hy et ce qui l'est en Python. Aucun souci pour importer les autres modules Python, quels qu'ils soient.

Hy supporte presque toutes les versions de Python et beaucoup d'interpréteurs, notamment pypy.

De nombreuses fonctions de common Lisp sont disponibles, et Hy se rapproche de Clojure pour la définition des classes.

Pour ceux qui sont intéressés par Hy, notez qu'il manque encore quelques petites choses :

  • les cons cells sont en cours de discussion
  • il faudra faire sans les macroexpand pour vous aider dans vos macros
  • les fonctions de Common Lisp ne sont pas toutes présentes
  • le dialect de Lisp nécessite, pour l'instant, de mixer les [...]` et les (...)`, mais ceci devrait changer.
  • Hy n'est pas présent à l'exécution, il y a donc forcément des limitations.

Python pour la Robotique

Il y avait une présentation bien sympathique d'une équipe qui participe régulièrement aux championnats de france de robotique.

Ils utilisent une carte basée sur un SoC ARM sur laquelle ils disposent d'un Gnu/Linux et d'un interpréteur Python (2.7).

Ils ont codé en C/C++ quelques routines de bas niveau pour un maximum de réactivité. Mise à part cela, tout le reste est en Python, notamment leurs algorithmes pour gérer la stratégie de leurs robots.

Python leur facilite énormément la vie grâce au prototypage rapide, à la rapidité pour corriger leur code (surtout avec le manque de sommeil durant la compétition), à la souplesse pour simuler en amont, analyser des logs, etc.

Un Python dans la maison

http://hackspark.fr/skin/frontend/base/default/images/logo3d_hackspark_small.png

Il y avait aussi la présentation d'un projet (Hack'Spark!) jeune mais déjà fonctionnel de domotique. La petite démonstration en direct du système était du plus bel effet ;)

Et, pour moins de 100 euros vous pourrez allumer la lumière chez vous depuis une interface web ! Perso, je m'y mets ce mois ;)

Framework Graphique Kivy

http://kivy.org/logos/kivy-logo-black-64.png

Kivy est entièrement écrit en Python/Cython et utilise OpenGL. Il a donc un très bon support sur les machines récentes (Linux, BSD, MacOs, Android, iOS, Rpi, etc.). Et il n'a rien a envier aux autres frameworks.

Kivy semble particulièrment pratique pour mener à bien des projets sur les plateformes mobiles comme les téléphones portables et les tablettes (Android et iOS).

De plus, parmi les outils fournis avec Kivy vous pourrez trouver quelques trucs pour simplifier votre développement :

  • PyJNIus utilise l'interface JNI de la VM Java (via Cython). Il sert de proxy sur les classes Java et vous donne donc accès à l'ensemble de l'API Android.
  • PyObjus est le pendant de PyJNIus pour ObjectiveC sous iOS.
  • Plyer essaie de rassembler en une API commune de plus haut niveau PyJNIus et PyObjus, ce qui permet de coder une seule fois pour les deux plateformes.
  • Buildozer aide à la compilation de projet pour Android de manière plus simple qu'avec Python for Android.

Nous avons eu droit à une présentation des concepts et comment les mettre en œuvre en direct. Je sens que ça va me simplifier la vie !

[Biologeek] Conseils de père

$
0
0

C'est que son p'tit bonhomme qui arrive en Décembre
Elle le protège comme une louve

En cloque, Renaud

  • Suis ton instinct, il te permettra de survivre.
  • Poursuis ton expérience, elle te permettra de vivre.
  • Fais des rencontres, elles te permettront de t'épanouir.
  • Sois bienveillant, ça te permettra d'être fier.
  • Tombe amoureux, ça te permettra d'être heureux.
  • Fuis le confort, il te rendra stérile.
  • Change le monde avec ton savoir-faire.
  • Change ton monde avec ton savoir-être.
  • Réenchante le monde avec ton savoir-vivre.
  • Prends soin de ton capital, il est périssable.
  • Méfie toi des rires, fie toi aux sourires.
  • Enrichis toi de l'expérience des autres.
  • Crée des relations, ce monde est un réseau.
  • Connais les peurs et les aspirations de tes interlocuteurs.
  • Ne néglige pas l'esthétique et l'éthique.
  • Sois dans le tempo de ta vie.
  • Entretiens ta curiosité, partage-la.
  • Offre-toi le luxe d'être patient.
  • Cultive ton originalité et ta singularité, confronte-les.
  • Sois respectueux de la confiance que l'on t'accorde.
  • Comprends les règles pour t'en affranchir.

Je serai là. Pour te transmettre le reste.

[cubicweb] Apache authentication

$
0
0

An Apache front end might be useful, as Apache provides standard log files, monitoring or authentication. In our case, we have Apache authenticate users before they are cleared to access our CubicWeb application. Still, we would like user accounts to be managed within a CubicWeb instance, avoiding separate sets of identifiers, one for Apache and the other for CubicWeb.

We have to address two issues:

  • have Apache authenticate users against accounts in the CubicWeb database,
  • have CubicWeb trust Apache authentication.

Apache authentication against CubicWeb accounts

A possible solution would be to access the identifiers associated to a CubicWeb account at the SQL level, directly from the SQL database underneath a CubicWeb instance. The login password can be found in the cw_login and cw_upassword columns of the cw_cwuser table. The benefit is that we can use existing Apache modules for authentication against SQL databases, typically mod_authn_dbd. On the other hand this is highly dependant on the underlying SQL database.

Instead we have chosen an alternate solution, directly accessing the CubicWeb repository. Since we need Python to access the repository, our sysasdmins have deployed mod_python on our Apache server.

We wrote a Python authentication module that accesses the repository using ZMQ. Thus ZMQ needs be enabled. To enable ZMQ uncomment and complete the following line in all-in-one.conf:

zmq-repository-address=zmqpickle-tcp://localhost:8181

The Python authentication module looks like:

from mod_python import apache
from cubicweb import dbapi
from cubicweb import AuthenticationError

def authenhandler(req):
    pw = req.get_basic_auth_pw()
    user = req.user

    database = 'zmqpickle-tcp://localhost:8181'
    try:
        cnx = dbapi.connect(database, login=user, password=pw)
    except AuthenticationError:
        return apache.HTTP_UNAUTHORIZED
    else:
        cnx.close()
        return apache.OK

CubicWeb trusts Apache

Our sysadmins set up Apache to add x-remote-user to the HTTP headers forwarded to CubicWeb - more on the relevant Apache configuration in the next paragraph.

We then add the cubicweb-trustedauth cube to the dependencies of our CubicWeb application. We simply had to add to the __pkginfo__.py file of our CubicWeb application:

__depends__ =  {
    'cubicweb': '>= 3.16.1',
    'cubicweb-trustedauth': None,
}

This cube gets CubicWeb to trust the x-remote-user header sent by the Apache front end. CubicWeb bypasses its own authentication mechanism. Users are directly logged into CubicWeb as the user with a login identical to the Apache login.

Apache configuration and deployment

Our Apache configuration looks like:

<Location /apppath >
  AuthType Basic
  AuthName "Restricted Area"
  AuthBasicAuthoritative Off
  AuthUserFile /dev/null
  require valid-user

  PythonAuthenHandler cubicwebhandler

  RewriteEngine On
  RewriteCond %{REMOTE_USER} (.*)
  RewriteRule . - [E=RU:%1]
<Location /apppath >

RequestHeader set X-REMOTE-USER %{RU}e

ProxyPass          /apppath  http://127.0.0.1:8080
ProxyPassReverse   /apppath  http://127.0.0.1:8080

The CubicWeb application is accessed as http://ourserver/apppath/.

The Python authentication module is deployed as /usr/lib/python2.7/dist-packages/cubicwebhandler/handler.py where cubicwebhandler is the attribute associated to PythonAuthenHandler in the Apache configuration.

[cyp] Introduction à pyramid

$
0
0

Introduction

Pyramid est un framework MVT web en python compatible wsgi. Pyramid n'est pas un framework web complet comme Django mais un assemblage de briques existantes en dehors de Pyramid. Ces briques sont le plus souvent interchangeables et utilisables dans d'autres frameworks. Pyramid est compatible python3

Premiers pas

Installation

Pyramid s'installe via easy_install, pip ou buildout. J'utiliserai buildout dans mon cas.

Exemple de fichier buildout

1
2
3
4
5
6
7
8
[buildout]
parts =
       example1

[example1]
recipe = zc.recipe.egg
eggs =
       pyramid

Création de l'application

Une fois la part installée, pcreate est dispo dans bin. pcreate permet de générer l'egg de l'application. pcreate vient avec 3 templates pour pyramid.

1
2
3
4
5
$ bin/pcreate --list-templates
Available scaffolds:
alchemy:            Pyramid SQLAlchemy project using url dispatch
starter:            Pyramid starter project
zodb:               Pyramid ZODB project using traversal

Pour créer une application: bin/pcreate -s <votre template> <nom de l'egg>.

Il existe d'autre templates disponibles sur le pypi.

Le template alchemy est un template d'application utilisant sqlalchemy. Le template starter est un template sans base de données. Le template zodb est un template d'application utilisant zodb.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ bin/pcreate -s starter myapp
Creating directory /home/cyp/dev/examples/myapp
  Recursing into +package+
   Creating /home/cyp/dev/examples/myapp/myapp/
   Copying __init__.py to /home/cyp/dev/examples/myapp/myapp/__init__.py
   Recursing into static
     Creating /home/cyp/dev/examples/myapp/myapp/static/
     Copying favicon.ico to /home/cyp/dev/examples/myapp/myapp/static/favicon.ico
     Copying footerbg.png to /home/cyp/dev/examples/myapp/myapp/static/footerbg.png
     Copying headerbg.png to /home/cyp/dev/examples/myapp/myapp/static/headerbg.png
     Copying ie6.css to /home/cyp/dev/examples/myapp/myapp/static/ie6.css
     Copying middlebg.png to /home/cyp/dev/examples/myapp/myapp/static/middlebg.png
     Copying pylons.css to /home/cyp/dev/examples/myapp/myapp/static/pylons.css
     Copying pyramid-small.png to /home/cyp/dev/examples/myapp/myapp/static/pyramid-small.png
     Copying pyramid.png to /home/cyp/dev/examples/myapp/myapp/static/pyramid.png
     Copying transparent.gif to /home/cyp/dev/examples/myapp/myapp/static/transparent.gif
   Recursing into templates
     Creating /home/cyp/dev/examples/myapp/myapp/templates/
     Copying mytemplate.pt_tmpl to /home/cyp/dev/examples/myapp/myapp/templates/mytemplate.pt
   Copying tests.py_tmpl to /home/cyp/dev/examples/myapp/myapp/tests.py
   Copying views.py_tmpl to /home/cyp/dev/examples/myapp/myapp/views.py
 Copying CHANGES.txt_tmpl to /home/cyp/dev/examples/myapp/CHANGES.txt
 Copying MANIFEST.in_tmpl to /home/cyp/dev/examples/myapp/MANIFEST.in
 Copying README.txt_tmpl to /home/cyp/dev/examples/myapp/README.txt
 Copying development.ini_tmpl to /home/cyp/dev/examples/myapp/development.ini
 Copying production.ini_tmpl to /home/cyp/dev/examples/myapp/production.ini
 Copying setup.cfg_tmpl to /home/cyp/dev/examples/myapp/setup.cfg
 Copying setup.py_tmpl to /home/cyp/dev/examples/myapp/setup.py

===============================================================================
Tutorials: http://docs.pylonsproject.org/projects/pyramid_tutorials
Documentation: http://docs.pylonsproject.org/projects/pyramid

Twitter (tips & updates): http://twitter.com/pylons
Mailing List: http://groups.google.com/group/pylons-discuss

Welcome to Pyramid.  Sorry for the convenience.
===============================================================================

La commande pcreate produit la structure d'un nouvel egg. dans le dossier myapp. Le template créé la structure de l'egg et un certain nombre de fichiers :

  • setup.py,
  • un fichier de configuration de dev,
  • un fichier de configuration de production,
  • un répertoire myapp avec un semble de fichiers.

Ce répertoire contient 3 fichier et 2 répertoires:

  • __init__.py,
  • tests.py,
  • views.py,
  • static,
  • templates.

Pour installer en dev, l'application nouvellement créée il suffit de faire en suite un develop sur cet egg.

Avec virtualenv:

$ python setup.py develop

Avec buildout, il faut éditer le fichier buildout.cfg comme si dessous et relancer la commande bin/buildout.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[buildout]
develop =
         myapp
parts =
       example1

[example1]
recipe = zc.recipe.egg
eggs =
       myapp

Dans le cas de virtualenv comme dans le cas du buildout, les dépendences de notre application sont installées.

Lancement

L'application web se lance à l'aide de pserve.

$ bin/pserve myapp/development.ini
Starting server in PID 13313.
serving on http://0.0.0.0:6543

L'appliction est alors disponible sur http://localhost:6543

Organisation et contenu

Structure

Le dossier myapp créé par le template se décompose comme ceci:

$ tree myapp/
myapp/
myapp/CHANGES.txt
myapp/development.ini
myapp/MANIFEST.in
myapp/myapp
myapp/myapp/__init__.py
myapp/myapp/static
myapp/myapp/static/favicon.ico
myapp/myapp/static/footerbg.png
myapp/myapp/static/headerbg.png
myapp/myapp/static/ie6.css
myapp/myapp/static/middlebg.png
myapp/myapp/static/pylons.css
myapp/myapp/static/pyramid.png
myapp/myapp/static/pyramid-small.png
myapp/myapp/static/transparent.gif
myapp/myapp/templates
myapp/myapp/templates/mytemplate.pt
myapp/myapp/tests.py
myapp/myapp/views.py
myapp/production.ini
myapp/README.txt
myapp/setup.cfg
myapp/setup.py

3 directories, 20 files

Le dossier myapp contient la structure de l'egg. Le dossier myapp/myapp contient la structure de l'application. Le dossier myapp/myapp/static contient les fichiers statiques : css, js, images ou icônes.

Le fichier __init__.py est la fonction main de l'application, views.py est le contenu des vues et le dossier templates contient les templates.

__init__.py

Le fichier __init__.py est la racine de l'application contenant la définition des routes, l'appel à la configuration, la déclaration de singleton ou connexion à des bases de données.

from pyramid.config import Configurator


def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    config.include('pyramid_chameleon')
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_route('home', '/')
    config.scan()
    return config.make_wsgi_app()

settings est le contenu de la section app:main du fichier myapp/development.ini. Cette section est la configuration de notre exemple (J'y reviendrais plus tard).

L'objet config est la configuration de l'application. Sur cet objet, sont rajoutées les routes static et home. config.scan() fait de l'introspection sur les fichiers de l'application pour construire les routes et les vues. config.include permet d'inclure des modules de pyramid ayant des finalités très variées. Dans l'exemple, on inclue le moteur de rendu chameleon.

views.py

Le fichier views.py contient les vues de l'application.

from pyramid.view import view_config


@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):
    return {'project': 'myapp'}

Le décorateur view_config a ici deux paramètres route_name et renderer. renderer indique le fichier de template ou le rendu à utiliser. renderer='json' renverra un dictionnaire JSON au lieu d'une page HTML. route_name corresponds au nom des routes définies dans __init__.py : config.add_route('home', '/'). view_config peut prendre de nombreux paramètres qui feront l'objet d'un prochain billet. La grande force de pyramid se trouve dans les paramètres de ce décorateur.

L'objet request est la requete HTTP faite à l'application. request est construit par le middleware wsgi WebOb.

la dernière ligne return {'project': 'myapp'} transmets les paramètres au moteur de template.

templates/mytemplate.pt

Le template généré par pcreate utilise chameleon. chameleon est le moteur de templates par défaut. D'autres moteurs de templates sont disponibles comme mako ou jinja2.

<div id="middle">
  <div class="middle align-center">
    <p class="app-welcome">
      Welcome to <span class="app-name">${project}</span>, an application generated by<br/>
      the Pyramid Web Framework.
    </p>
  </div>
</div>

Le fichier généré est un fichier html avec des attributs supplémentaires. Les ${} correspondent aux variables retournées par la fonction.

tests.py

Ce fichier contient les tests unitaires de l'application. Pour le moment, je n'aborderais pas ce point.

Le fichier de configuration

Le fichier de configuration généré par pcreate est un fichier au format INI avec neuf sections :

  • app:main,
  • server:main,
  • sept sections pour les logs.

En réalité, deux fichiers de configuration sont générés un pour le developpment et un second pour la production.

la section app:main est la configuration de notre application pyramid.

[app:main]
use = egg:myapp

pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = en
pyramid.includes =
    pyramid_debugtoolbar

La deuxième ligne indique l'egg à utiliser, ici notre application myapp. Les quatres lignes suivantes sont pour autoriser ou non le débugage : à passer à False en production.

pyramid.default_locale_name indique la locale par défaut.

La dernière pyramid.includes indique la liste de module à inclure dans pyramid. pyramid_debugtoolbar est une barre de débuggage qui apparait sur les toutes les pages web en developpement si le navigateur vient de l'ip 127.0.0.1.

pyramid_debugtoolbar et config.include (décrit dans le __init__.py) sont strictement équivalent.

La section server:main décrit la configuration sur server wsgi.

[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 6543

Par défaut, pyramid fournit un serveur wsgi : waitress. Ceci est la configuration générée ; on peut utiliser d'autres serveurs wsgi comme gunicorn.

Pour finir

Ce premier billet sur pyramid survole un peu tout sans rentrer en détails. J'essairais de rentrer plus en détails dans des prochains articles sur des points plus particuliers.


[Biologeek] Valeur et gratuité

$
0
0

La modernité, dans son principe premier et ses intentions originelles, aurait pu, en s'appuyant sur la révolution industrielle, être une chance pour l'humanité. Mais elle a commis une erreur fatale, dont nous commençons seulement à mesurer les conséquences désastreuses avec la grande crise d'aujourd'hui : elle a subordonné le destin collectif, la beauté et la noblesse de la planète Terre dans sa globalité à la vulgarité de la finance. Dès lors, le sort en a été jeté. Tout ce qui n'a pas un prix n'a pas de valeur.

Vers la sobriété heureuse, Pierre Rabhi

Puis :

Le principe de "prix libre" ou participation libre (pour ceux dont l'abondance serait autre que monétaire), permet à ceux qui ont les moyens de payer pour ce qui n'en ont pas. La responsabilité de la pérennité de ce genre d'action est détenue alors par l'ensemble des participants responsables, plutôt que par le seul fournisseur de services, qui est du coup libéré de ce carcan commercial.

L'idéal serait bien sûr la gratuité, mais dans notre contexte de valeur inversée par le profit (et donc la rareté), ce qui est gratuit (donc abondant) n'a pas de valeur. Alors les élèves arrive en retard, partent avant la fin etc... Il convient donc dans un premier temps de retirer à l'argent son pouvoir de corruption et c'est justement la vocation de la mise à jour transmise dans ces formations.

Nouvelle initiation aux utopiques concrètes

Et enfin :

Pourquoi les mecs qu'on laisse utiliser un espace gratuitement laissent toutes leurs merde en partant, Contrairement aux mecs qui payent.

Aymeric

J'ai malheureusement pu en faire l'expérience par moi-même en co-organisant les premières rencontres Django qui étaient gratuites. Environ un tiers des personnes étaient absentes le jour J et cela m'avait relativement déçu. L'année suivante, un prix symbolique m'avait permis de valider la théorie avec beaucoup moins de désistements/absences. J'ai depuis fait d'autres expériences plus ou moins significatives, rien de bien scientifique mais tout de même une tendance forte.

Je me demande aujourd'hui s'il n'y aurait pas une nouvelle expérience à tenter à ce sujet :

  • vendre une place pour une conférence à un prix relativement élevé ;
  • proposer à la suite de l'événement aux personnes ayant participé de rembourser tout ou partie de la place.

Le modèle « payez ce que vous voulez » mais inversé. Cela génère une grosse inconnue au niveau de la trésorerie et demande à être affiné mais on retrouve plusieurs points intéressants :

  • les personnes qui ne viennent pas ont véritablement sponsorisé l'événement ;
  • les personnes qui souhaitent faire un don car elles se sont éclatées ne demandent pas de remboursement ;
  • les personnes qui n'ont trouvé aucun intérêt à l'événement peuvent se faire intégralement rembourser ;
  • les personnes qui ont du mal à se payer la place savent qu'elles pourront être ensuite remboursées.

Est-ce que cela a déjà été tenté ? Est-ce que c'est applicable à d'autres domaines ? Serait-il possible d'avoir ce modèle économique pour une entreprise ?!

[cyp] Le systeme de routes de pyramid

$
0
0

Introduction

pyramid utilise un système de routes prédéclarées dans le fichier __init__.py (appelé url dispatch dans la documentation). Pyramid permet également les urls traversal mais ce sera pour une autre fois.

Les routes sont déclarées par un couple : le nom de la route et un motif. ex :

1
config.add_route('home', '/')

Ici home est le nom de la route et / est le motif correspondant à la racine du site. config.add_route rajoute la route home au registre de l'application.

Les motifs

Les motifs décrivent les chemins du site web. ex:

  • /
  • /foo
  • /foo/bar

config.add_route('foo', '/foo') est strictement équivalent à config.add_route('foo', 'foo').

Le / de fin

config.add_route('foo', '/foo') est différent de config.add_route('foo', '/foo/')

1
2
config.add_route('foo1', '/foo')
config.add_route('foo2', '/foo/')

Les routes foo1 et foo2 sont deux routes différentes qui renverront vers deux vues différentes (sauf si on décore deux fois la même vue.).

pyramid fournit un mécanisme pour faire correpondre /foo à /foo/ mais l'inverse n'est pas possible (Je pense que c'est possible au prix d'un petit dev dans les entrailles de pyramid.).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# exemple pris dans la doc officielle de pyramid.

from pyramid.httpexceptions import HTTPNotFound

def notfound(request):
    return HTTPNotFound('Not found, bro.')

def has_slash(request):
    return Response('Has slash')

def main(g, **settings):
    config = Configurator()

    config.add_route('hasslash', 'has_slash/')
    config.add_view(has_slash, route_name='hasslash')

    config.add_notfound_view(notfound, append_slash=True)

Dans cet exemple, le chemin has_slash renverra sur has_slash. Ceci se fait en définissant la vue 404 not found dans la dernière ligne en demandant de rajouter / s'il est manquant. S'il n'y a toujours pas de route correspondant à ce chemin la fonction notfound correspondant à la 404 sera appelée et levera l'exception HTTPNotFound.

Note

les exceptions pyramid sont identique à celle de WebOb

Les variables

Les motifs décrivant les routes peuvent contenir des variables pour décrire des chemins et les variables peuvent être récupérer via l'objet request :

  • /user/{id}
  • /user/{id}/contacts
  • /user/{id}/contacts/{contact}
  • /foo/{bar}/{baz}

ces motifs peuvent faire matcher les chemins suivants :

  • /user/1
  • /user/2
  • /user/a
  • /user/a/contacts
  • [...]

Les parties entre accolades sont contenus dans des variables donc l'accès sera décrit plus tard. Les motifs peuvent également contenir des expressions rationnelles :

  • /user/{id:d*}
  • /user/{id:w{4}}

Les urls ne seront matchées que si elles correspondent aux motifs. Ces expressions rationnelles permettent également d'avoir des routes différentes pour des url similaires:

1
2
config.add_route('userDigit', '/user/{id:\d*}')
config.add_route('userAlpha', '/user/{id:\w*}')

La première route correspondera à /user/1232445 et la seconde à /user/azerty. Les 2 routes pourront être gérées différement selon les views.

Les variables définies dans les motifs sont récupérable via l'objet request.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from pyramid.httpexceptions import HTTPNotFound


def foo(request):
    return Response('foo %s' % str(request.matchdict['bar']))

def main(g, **settings):
    config = Configurator()

    config.add_route('foo', '/foo/{bar}')
    config.add_view(foo, route_name='foo')

Le chemin /foo/baz renverra la page contenant foo baz.

Les variables ne sont pas nécéssairement un élément du path :

1
2
config.add_route('foo', '/{foo}/{bar}.html')
config.add_route('baz', '/{foo}/{bar}.{extention}')

Les conflits

L'ordre de déclaration des routes à une importance car les routes peuvent générer des conflits entre elles.

1
2
config.add_route('userAlpha', '/user/{id:\w*}')
config.add_route('user4Alpha', '/user/{id:\w{4}}')

La route userAlpha étant déclarée avant user4Alpha, toutes les requêtes seront dirigées vers la route userAlpha.

1
2
config.add_route('user4Alpha', '/user/{id:\w{4}}')
config.add_route('userAlpha', '/user/{id:\w*}')

Dans l'exemple ci dessus, il n'y a plus de conflits ; les chemins avec exactement 4 lettres seront dirigés vers user4Alpha et les autres vers userAlpha.

autre exemple de conflits potentiels:

1
2
config.add_route('foobar', '/foo/{bar}')
config.add_route('foobaz', '/foo/baz')

Un nombre indéterminé de variables

Il est bien entendu possible d'avoir plus d'une variable dans le path.

1
config.add_route('foobar', '/{foo}/{bar}')

Ici, nous aurons 2 variables foo et bar.

Si nous voulons une url avec un nombre indéterminée de sous parties :

1
config.add_route('foobar', '/{foo}/{bar}*baz')

Cette route matchera :

  • /plop/plip
  • /plop/plip/
  • /plop/plip/a
  • /plop/plip/a/b/c/d/

Dans ces chemins, foo et bar contientront respectivement 'plop' et 'plip'. baz condientra selon les chemins :

  • (),
  • (),
  • (u'a'),
  • (u'a, u'b', u'c', u'd')

Conclusion

Pyramid nous offre un sytème simple et puissant de dispatch d'url via les routes. Il existe d'autre système d'url comme traversal url (que j'essairai d'aborder une prochaine fois) ou par controler successif comme pyramid_controllers.

Quelques liens vers la documentation de pyramid:

[Biologeek] Web et temps

$
0
0

Toutes les sociétés modernes sont caractérisées par une pénurie de temps : plus une société est moderne, moins elle a de temps […] Plus on est riche matériellement, plus on devient pauvre en ressource temporelle.

La technique est-elle responsable de l’accélération du monde ?

J'ai un rapport étrange au temps passé sur le Web, d'un côté il y a la navigation fonctionnelle pour trouver une information, un bout de code, pour comparer des produits, etc et de l'autre une navigation qui invite à la découverte, à se perdre, à découvrir des concepts, à flâner sur des blogs. La première demande une certaine efficacité alors que la seconde est de l'ordre de l'intime et je rejoins tout à fait Emmanuel à ce sujet :

C'est bien ce qui me chagrine aussi dans mon métier ; bosser dans le fast web. […] Ne pas perdre de vue que nous travaillons dans une portion particulière du web et ne pas le réduire qu'à cela, ni ne le voir qu'à travers ce prisme.

Vitesse de lecture, Emmanuel Clément

Nous mettons tout en œuvre dans notre profession pour améliorer cette efficacité, pour que l'utilisateur n'ait plus à réfléchir, moins à cliquer, pour qu'il consomme plus et plus vite. La vague minimaliste n'était peut-être finalement qu'un moyen pour consommer plus rapidement de l'information ? En oubliant le slow web, obsolète.

Nous sommes devenus obsédés par le graphisme fantaisiste, des mise en pages dites "responsive" et des scripts qui font des choses magiques.

Mais les outils les plus puissants du web restent les mots.

J'ai écrit ces mots, et vous êtes en train de les lire: c'est ça qui est magique.

Ceci est une page Web., Justin Jackson

Malheureusement la magie n'opère pas forcément s'il manque un contexte à ces mots, sur la personne qui les a écrit, son état d'esprit au moment de la publication, son environnement, son vécu. Karl refuse l'indexation de son site pour ces raisons (et du coup je ne retrouve plus le billet en question :-)) et il y a des liens que je rends moins explicites que d'autres sur ce site pour les mêmes raisons.

Quand l'architecture de l'information se transforme en cheminement de l'intimité. Est-ce propre aux blogs qui révèlent les facettes d'une personnalité avec une certaine pudeur ? J'imagine qu'il y a de nombreuses personnes qui explorent le Web ainsi. Faudrait-il appliquer ces principes aux entreprises en gardant des traces rouillées de leur histoire au lieu de tout casser tous les 2 ans pour suivre la dernière mode en terme de design et de buzzwords ? Cela demanderait d'assumer son passé et d'avoir une vision à long terme. Une maturité qui semble bien lointaine…

[sciunto] bibtexparser en python

$
0
0

Utilisant bibtex comme base de données bibliographiques, j'ai cherché une bibliothèque python permettant de traiter de tels fichiers. Je pensais que je trouverais facilement mon bonheur car python regorge de bibliothèques. Erreur... je n'ai rien trouvé de fonctionnel et documenté.

Pour ceux qui ne savent pas, bibtex est un format pour stocker des infos bibliographiques et ça ressemble à ça.

 @book{Ben62,
    title = "L'Oxydation des m\'etaux",
    author = "J. B{\'e}nard and J. Bardolle and F. Bouillon and M. Cagnet%
       and J. Moreau and G. Valensi",
    publisher = "Gauthier-Villars",
    year = "1962"
 }

En fuinant dans des codes sources de logiciels, j'ai fini par trouver un projet de l'OKFN qui se nomme bibserver. Vu le nom, je devais bien trouver un bout de code qui s'arrange avec ces fichiers.

C'était effectivement le cas, et le parser était vraiment satisfaisant sur mes fichiers. J'ai alors décidé d'en faire un projet à part entière de manière à ce que tout le monde puisse avoir un parser en python pour ses besoins. La license de bibserver est la AGPLv3. Ce qui fait sens pour ce type de project. Le problème est que cela peut être un peu trop restrictif pour certains usages et un utilisateur m'a d'ailleurs demandé si je pouvais passer à une license de type LGPL.

Il s'en est suivi une pêche à l'autorisation. J'ai commencé l'été dernier par l'auteur principal de bibserver, mais je n'ai pas eu de réponse. Puis, je suis passé au second contributeur qui n'y voyait pas de problème, a mis le premier auteur en copie de son message. Le premier auteur m'a répondu dans la foulée pour me dire OK, mais les droits sont reversés à l'OKFN, il faut donc leur demander l'autorisation. Je suis passé par leur courriel de contact, deux fois, mais je n'ai pas eu de réponse. Ma dernière chance était la liste de discussion et tada ! j'ai eu la permission.

Le code est donc passé en LGPLv3. Ce fût une longue bataille, qui montre aussi l'importance de bien choisir la licence de départ. En effet, si l'AGPL est tout à fait approprié à bibserver, cette sous-partie peut très bien faire l'objet d'une bibliothèque à part entière et c'est dommage de ne pas étendre les possibilités de cette sous-partie. J'ai coutume de dire que l'on ne passe jamais à tous les usages possibles, ce qui est l'essence du hacking et qu'il faut essayer, autant que faire ce peu, d'ouvrir au maximum la réutilisation de ce que l'on écrit.

Un grand merci aux personnes de l'OKFN pour cette permission.

[tarek] Circus 0.10 released

$
0
0

It took almost 6 months to release the next version of Circus. I am very proud of this release because a lot of its work was contributed by people from the community.

Circus is now Python 3 compatible, has a fully asynchronous core and improved documentation, amongst many many other things: http://circus.readthedocs.org/en/latest/changelog/#id1

I've published a blog post in our Mozilla blog, that interviews three Circus contributors:

https://blog.mozilla.org/services/2013/11/05/circus-0-10-released/

Viewing all 3409 articles
Browse latest View live