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

[Biologeek] OpenData et culture

$
0
0

In releasing this data, the city enabled the development of an incredibly powerful application that would never have been conceived of nor built in city hall. Our team has learned a lot through the launch of this app and has been largely responsible for the increased focus on the city’s budgeting process and the push for increased transparency and engagement in future budget preparation. We’ve helped to change city policy, empower people to ask informed questions and enriched the discussion with trustworthy information. And we’ve helped open the budget data for the first time.

This is what we’re about- technology to change behaviors and to create new possibilities.

[…]

We need to trust in government again, we need to respect public service, we need a government that is open and serves all people equitably and justly. We also need our government to be able to innovate, to take measured risks and to provide better ways for residents to interact with officials and elected members. This is what we’re about.

OpenOakland 1.5: A year and a half in review

Je vous invite à aller lire le bilan au complet, c'est du qualitatif, du passionnel, le condensé de la concrétisation d'une vision et de l'implication des citoyens pour améliorer leur ville. Une démonstration d'écoute et de réajustements pour produire des applications concrètes et maintenues.

L'équivalent en France ? C'est presque parodique pour la ville de La Rochelle. Un symptomatique « téléchargez le bilan en pdf » qui se trouve être un (mauvais) support de présentation plein de chiffres. Le manque de recul est alarmant.

Il ne s'agit plus d'une différence culturelle ou d'un manque de moyens ici mais bien d'un défaut de prise de soin des données. Et du Web. Et des citoyens.


[Biologeek] Patrimoine et agrologie

$
0
0

Cette évolution verte prend à contre-pied l'archaïsme agronomique actuel de la révolution verte, en redéfinissant de manière moderne les quatre piliers de l'agronomie (la manipulation génétique, les pesticides, le travail du sol et les engrais), pour en faire quatre piliers de l'agrologie : la sélection massale, la lutte biologique, le semis direct sous couvert et les amendements.

Alors que l'agronomie s'enlise dans les OGM en croyant détenir l'avenir de l'humanité, l'agrologie s'appuie au contraire sur l'emploi de la biodiversité. Au lieu de continuer à appauvrir le bagage génétique des plantes cultivées afin de rendre les agriculteurs prisonniers des semenciers, elle développe au contraire l'usage de nouvelles espèces déjà sélectionnées par la nature pour leur aptitude à restructurer les sols, à récupérer les engrais lessivés par les pluies, à pousser sur des sols pauvres et arides.

Le sol, la terre et les champs, Claude et Lydia Bourguignon (résumé)

Il se trouve que j'ai un PEL (Plan Epargne Logement) — un peu par hasard — mais je ne souhaite pas « accéder à la propriété » comme en rêvent tous les bons pères de famille (sic). Et puis en tombant sur la vidéo de Claude Bourguignon « Protéger les sols pour préserver la biodiversité » je me suis demandé s'il n'y avait pas quelque chose à faire pour sauver un petit bout de terrain quelque part et essayer de lui redonner un peu de vie. Avec de la patience, quelques connaissances en biologie et beaucoup d'attention j'espère pouvoir recréer un espace fertile. Un bout de nature pour éduquer un enfant à la beauté de ce monde.

The peaceful beauty of the world became vividly apparent to me. I was overcome with emotion and reduced the trembling. I had been foolishly searching for something when it had been there, right in front on me, all this time.

The sparkle of the morning dew, the green of the trees bathed in the morning sunlight, the delightful chatter of birds gathered in the dawn… what a wonder it was that I, too, was able to take my place in this realm of freedom, this world of ecstasy.

I saw nature directly. It was pure and radiant, what I imagined heaven to be.

I saw the mountains and rivers, the grasses and trees, the flowers, the small birds and the butterflies as if for the first time. I felt the throbbing of life, delighted in hearing the songbirds and the sound of rustling leaves. I became as light as the wings of a dragonfly, and felt as if I were flying as high as the mountain peaks.

The question is why, on that occasion alone, did the world that I was used to seeing every day appear so fresh and new and move me so deeply?

Sowing seeds in the desert, Masanobu Fukuoka

[tarek] Presence on Firefox OS

$
0
0

Note

The topic is still in flux, this blog post represents my own thoughts, not Mozilla's.

Since a couple of months, we've been thinking about presence in my team at Mozilla, trying to think about what it means and if we need to build something in this area for the future of the web.

The discussion was initiated with this simple question: if you are not currently running social application Foo on your phone, how hard would it be for your friends to know if you're available and to send you an instant notification to reach you ?

A few definitions

Before going any further, we need to define a few words - because I realized through all the dicussions I had that everyone has its own definitions of words like presence.

The word presence as we use it is how XMPP defines it. To summarize, it's a flag that will let you know if someone is online or offline. This flag is updated by the user itself and made available to others by different ways.

By device we define any piece of hardware that may update the user presence. It's most of the time a phone, but by extension it can also be the desktop browser. Maybe one day we will extend this to the whole operating system on desktop, but right now it's easier to stay in our realm: the Firefox desktop browser and the Firefox OS.

We also make the distinction between app-level presence and device-level presence. The first one is basically the ability for an online app to keep track of who's currently connected to its service. The latter, device-level presence, is the ability to keep track of who's active on a device - even if that user is not active in an application - which can even be turned off.

Being active on a device depends on the kind of device. For the desktop browser, it could simply be the fact that the browser is running and the user has toggled an 'online' button. For the phone, there are things like the Idle API that could be used to determine the status. But it's still quite fuzzy what would be the best way to use this.

Last very important point: we're keeping the notion of contacts out of the picture here because we've realized it's a bit of a dream to think that we could embed people's contacts into our service and ask all of the social apps out there to drop their own social graphs in favor of ours. That's another fight. :)

Anyways, I've investigated a bit on what was done on iOS and Android and found out that they both more or less provide ways for apps to reach out their users even when they don't use the app. I am not a mobile expert at all so if I miss something there, let me know!

Presence on iOS

In iOS >= 7.x, applications that want to provide a presence feature can keep a socket opened in the background even if the application is not running any more in the foreground.

The feature is called setKeepAliveTimeout and will give the app the ability to register a handler that will be called periodically to check on the socket connection.

The handler has a limited time to do it (max 10 seconds) but this is enough to handle presence for the user by interacting with a server

The Apple Push Notification Service is also often used by applications to keep a connection opened on a server to receive push notifications. That's comparable to the Simple Push service Mozilla has added in Firefox OS.

Therefore, building an application with device-level presence on an iOS device is doable but requires the publisher to maintain one or several connections per user opened all the time - which is draining the battery. Apple is mitigating the problem by enforcing that the service spends at most 10 seconds to call back its server, but it seems that they are still keeping some resources per application in the background.

Presence on Android

Like iOS, Android provides features to run some services in the background, see http://developer.android.com/guide/components/services.html

However, the service can be killed when the memory becomes low, and if TCP/IP is used it can be hard to have a reliable service. That's also what currently happens in Firefox OS, you can't bet that your application will run forever in the background.

Google also provides a "Google Cloud Messaging" (GCM) service. That provides similar features to Simple Push, to push notifications to users.

There's also a new feature called GCM Cloud Connection Server - (CCS) that allows applications to communicate with the device via XMPP and with client side "Intent Services". The app and the devices interact with CCS, which relays the messages back and forth.

There's a full example on their documentation of a Python server interacting with the GCM service to interact with users.

What's interesting is that the device keeps a single connection to a Google service, that relays calls from application servers. So instead of keeping one connection in every application, the phone shares the same pipe.

It's still up to the app to leverage this service to keep track of connected devices to get device-level presence, but the idea of keeping a single service in the background that dispatches messages to apps and eventually wakes them up, is very appealing to optimize the life of the battery.

Plus, XMPP is a widely known protocol. Offering app developers this standard to interact with the devices is pretty neat.

And Firefox OS ?

If you were to build a chat application today on Firefox OS, you would need to keep your own connection open on your own server. Once your application is sent in the background, you cannot really control what happens when the system decides to shut it down to free some resources.

In other words, you're blacking out and the application service will not really know what's your status on the device. It will soon be able to send a notification via SimplePush to wake up the app - but there's still this grey zone when the app is sent in the background.

The goal of the Presence project is to improve this and provide a better solution for app developers.

At first, we thought about running our own presence service, be it based on ejabberd or whatever XMPP server out there. Since we're hackers, we quickly dived into all the challenges of scaling such a service for Firefox OS users. Making a presence service scaling for millions of users is not a small task - but that's really interesting.

The problem though, is the incentive for an app publisher to use our own presence service. Why whould they do this ? They all already solved presence in their applications, why would they use our own thing ? They would rather want us to provide a better story for background applications - and keep their client-side interacting with their own servers.

But we felt that we could provide a better service for our user experience, something that is less battery draining, and that puts back the user in the center of the picture.

Through the discussions, Ben Bangert came up with a nice proposal that partially answered those questions: Mozilla can keep track of the users' device status (online/offline/available) if they agree, and every user can authorize the applications she uses to fetch these presence updates through the Mozilla service - via a doorhanger page.

This indirection is a bit similar to Android's GCC architecture.

Like GCC, we'd be able to tweak the battery usage if we're in control of the background service that keeps a connection opened to one of our servers. There are several ways to optimize the battery usage for such a service - and we're exploring them.

One extra benefit of having a Mozilla service keep track of the presence flag is that users will be able to stay in control: they can revoke an application's authorization to see their online presence at anytime.

There's also a lot of potential for tweaking how and who see this information. For example, I can decide that BeerChat, my favorite chat app to talk about beer, can see my presence only between 9pm and 11pm.

And of course, like Firefox Sync, the devices could point to a custom Presence service that's not running on a Mozilla server.

What's next ?

The Presence project is just an experiment right now, but we're trying to reach a point where we can have a solid proposal for Firefox OS.

As usual for any Mozilla project, everything is built in the open, and we trying to have weekly meetings to talk about the project.

The wiki page of the project is here : https://wiki.mozilla.org/CloudServices/Presence

It's a big mess right now, but it should improve over time to something more readable.

We're also trying to have a prototype that's up-to-date at https://github.com/mozilla-services/presence and an end user application demo that uses it, a Chat Room at: https://github.com/mozilla-services/presence-chatroom

There's a screencast at http://vimeo.com/80780042 where you can see the whole flow of a user authorizing an application to see her presence and another user reaching out the first user through a notification.

The desktop prototype is based on the excellent Social API feature, and we're now building the Firefox OS prototype - to see how the whole thing looks from a mobile perspective.

There's a mailing list, if you want to get involved: https://mail.mozilla.org/listinfo/wg-presence

[Biologeek] TDD et conception émergente

$
0
0

On me parle de Test Driven Development depuis des années maintenant et je n'ai toujours pas vu la lumière de la « conception émergente ». J'ai profité de l'Agile Open Sud et d'être entouré de personnes pratiquantes pour faire un point sur les raisons de ce désintérêt au cours d'une session d'OpenSpace.

La première raison, et c'est Rui qui a mis le doigt dessus, c'est que le Web nous offre un moyen de visualiser ce que nous développons très rapidement dans un navigateur. Or, les tests sont un moyen d'avoir un feedback sur notre code : est-ce que le résultat est celui attendu ? Ce qui correspond bien souvent à un simple rafraîchissement de page. Est-ce que la conception émergente se trouve être supplantée par la conception visuelle dans le cas de pages web ?

La seconde est relative à la complexité, le développement d'un site Web avec un framework (bien testé) réduit le périmètre critique qu'il faut valider au cours du développement et ne nécessite pas forcément d'avoir une couverture à 100%. Retester le framework est une perte de temps. La difficulté revient à savoir ce qu'il faut tester en fonction du contexte du projet et de ses spécificités. Il est à noter que le framework masque potentiellement la conception émergente en proposant des contraintes fortes qui guident cette conception.

La dernière est liée au niveau des tests, mon avis actuel est qu'il faut tester la complexité au plus près (unitaire) et la généralité au plus large (fonctionnel), surtout lorsqu'elle vient interagir avec un second langage — JavaScript — ce qui permet de faire d'une pierre deux coups grâce à CasperJS par exemple. Peut-on parvenir à de la conception émergente lorsque le résultat est la combinaison de plusieurs langages intimement liés ?

Finalement, le seul gain réel que j'ai à faire des tests en premier réside dans leur répétabilité, notamment dans le cadre de soumission de formulaires qui peut se révéler être une tâche fastidieuse lorsque réalisée à la main. C'est le seul moment où je commence réellement par les tests mais je crois que c'est plus par flemme de devoir faire le template avant de pouvoir valider mon développement. Il n'y a qu'en codant le client ET le serveur d'une API Web en parallèle que j'en arrive à de la conception émergente. Cela peut sembler éloigné du TDD mais il s'agit pourtant d'un test grandeur nature qui m'en apprend plus que n'importe quel mock… Est-ce qu'il vous arrive aussi de pratiquer du Client Driven Development pour vos API Web ?

[Biologeek] Propositions citoyennes

$
0
0

Pour se réapproprier nos villes... Il va nous falloir participer à leur production.

Coproduire Lyon, Hubert Guillaud

J'étais mal à l'aise avec la précédente version des propositions pour ma cité, trop de petits désagréments égocentriques qui pouvaient certes être résolus facilement mais qui manquaient de portée. J'ai retravaillé les propositions afin qu'elles soient plus proches — à mon sens — de l'intérêt des citoyens arlésiens.

À la veille d'élections municipales, n'attendez pas le programme des politiques, écrivez-le et allez en discuter avec eux. Il est aisé de critiquer la situation politique actuelle en observant cela de loin mais j'ai l'espoir que l'on puisse agir en tant que citoyen, au moins à l'échelle locale, en prenant des initiatives. Rédigez vos propres propositions d'amélioration de votre cité.

[hautefeuille] Commandes Unix efficaces

$
0
0

Liste des commandes les plus utilisées

history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head

Obtenir votre ip externe

curl ifconfig.me

Accéder à la table ASCII

man ascii

Différer une commande

echo "ls -la" | at midnight

Copie récursive avec tar

(cd /source && tar cfp - . ) | (cd /cible && tar xvpf -)

Liste des processsus les plus gourmands

ps aux | sort -nk +4 | tail

Ajouter votre répertoire de travail dans une pile

pushd /tmp

Puis

popd

Sur quel type de machine suis-je ?

getconf LONG_BIT

Obtenir des informations sur la partition

dumpe2fs -h /dev/hda3

Voir les partitions montées

mount | column -t

Monter rapidement une partition en RAM

mount -t tmpfs tmpfs /mnt -o size=1024m

Monter un système de fichiers SSH

sshfs name@server:/path/to/folder /path/to/mount/point

Différences sur des sorties de commandes

diff<(command1)<(command2)

Recherche de root kits

rkhunter -c
chkrootkit

Conversion de flv vers avi avec mencoder

mencoder video.flv -ovc lavc -oac pcm -lavcopts vcodec=mpeg4 -o video.avi

Conversion flv vers mp3

ffmpeg -i fichier.flv -vn -ar 44100 -ac 2 -ab 192 -f mp3 fichierfin.mp3

Conversion mp4 vers mp3

for f in *.mp4; do avconv -i "$f" -b 256k "${f%.mp4}.mp3"; done

Diffuser un film sur le réseau avec mplayer

Sur le serveur :

cat monfilm.mp4 | nc -l 9999

Sur le client :

nc 192.168.100.1 9999 | tee monfilm.mp4 | mplayer -

Télécharger les mp3 d’un site

wget -r -l1 -H -t1 -nd -N -np -A.mp3 -erobots=off http://www.micromix.fr

Redimensionner des images

for f in *.png; do convert $f -resize 852x480 $f; done

Trier les répertoires par taille

du -sh * | sort -nr
du -s * | sort -rnk 1
du -h --max-depth=1

Ping auditif

ping -i 60 -a HOST

Emet un son quand la machine devient online.

Surveiller les activités réseau

lsof -i

Détection des ports ouverts

nmap -T 3 192.168.1.1

Traceroute enrichi

mrt google.com

Détection de l’OS

nmap -O 192.168.1.1

Ecrire le résultat d’un scan dans un fichier

nmap -sS -sV -O 192.168.0.0/24 > output.txt

Analyse de trafic avec tcpdump

tcpdump -enttti pflog0
tcpdump -enttti pflog0 host 192.168.0.111
tcpdump -enttti pflog0 host 192.168.0.17 and tcp port 25

Aspirer un site web

wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com

Sniff du port 80

ngrep -d "eth0" -t "^(GET|POST)" "tcp and port 80"

Dump d’une base MySQL

mysqldump --add-drop-table -h localhost -u USERNAME -p DATABASENAME | bzip2 -c > machine.sql.bz2

Restauration d’une base MySQL

zip2 -d machine.sql.bz2
mysql -h localhost -u USERNAME -p DATABASENAME < machine.sql

Tester la vitesse de lecture du disque

hdparm -Tt /dev/sdc

Démarrer un serveur web en Python

python -m SimpleHTTPServer 8080

Partager rapidement un fichier sur le réseau

nc -v -l 80 < monfichier.txt

Créer un patch sur un fichier

diff -uN file file.new > mypatch

Créer un patch sur un dossier

diff -ruN directory/ directory.new/ > mypatch

Appliquer un patch sur un fichier

patch < mypatch

Appliquer un patch sur un dossier

patch -R < mypatch

Observer un répertoire

watch ls

Observer les connexions

watch -n1 -d 'netstat -an | grep ESTABLISHED'

Effacement définitif d’un fichier

shred -f -v -z -u myfile

Création d’un tunnel ssh

ssh - tunnel ssh user@serveur -C -N -D 8080

Créer une image sur le réseau avec netcat

Sur l’hôte :

nc -l -p 2000 > image.dsk

Sur le PC

dd if=/dev/sda | nc hote 2000

Email en ligne de commande

echo | mutt -s "bkprooter" -a siteCUSTOM.tgz  -- robert@aol.com

Screencast

recordmydesktop -x 0 -y 0 --width=1920 --height=1080 --fps=25

Créer un transfert de données entre 2 flux TCP avec SOCAT

socat TCP4-LISTEN:www TCP4:www.domain.org:www

Ecrire dans un fichier les données reçues sur un port

socat -u TCP4-LISTEN:3334,reuseaddr,fork OPEN:/tmp/in.log,creat,append

Générer les clés SSH

ssh-keygen -t rsa

Puis

antec $ scp ~/.ssh/id_rsa.pub votrelogin@xyz.org:~/.ssh/id_rsa.pub.tmp
antec $ ssh votrelogin@xyz.org
shoota $ cat ~/.ssh/id_rsa.pub.tmp >>~/.ssh/authorized_keys
shoota $ rm ~/.ssh/id_rsa.pub.tmp

Ou bien plus simple, utiliser ssh-id-copy :

ssh-id-copy bob@calagan

Eteindre une machine sous Windows

net rpc shutdown -I ipwindowsmachine -U username%password

Les options courantes de MOUNT

  • -a : monte tous les systèmes déclarés dans /etc/fstab
  • -t : précise le type de fichier à monter
  • -o : ajoute une option

Options adjointes les plus fréquentes :

  • auto : permet d’être monté par -a (mount -a)
  • async : les entrées/sorties sur le système de fichiers sont asynchrones
  • defaults : utilise les options rw, suid, dev, exec, auto, nouser, async
  • dev : interprète les fichiers spéciaux de périphériques du système
  • exec : permet l’exécution de fichiers binaires
  • noauto : empêche le montage avec -a
  • nodev : n’interpréte pas les fichiers spéciaux de périphériques
  • noexec : empêche l’exécution de fichiers binaires
  • nouser : n’autorise pas d’utilisateur autre que root (par défaut)
  • ro : monte le système en lecture seule
  • rw : monte le système en lecture et écriture
  • suid : prend en compte les bits SetUID ou SetGID
  • user : permet aux utilisateurs le montage et le démontage du système

Les raccourcis du mode console

Déplacement

  • Ctrl + a : aller au début de la ligne
  • Ctrl + e : aller à la fin de la ligne
  • Alt + b : se déplacer mot par mot dans la ligne de commande en arrière
  • Alt + f : se déplacer mot par mot dans la ligne de commande en avant
  • Ctrl + xx : positionner le curseur au début du mot ou à la fin

Couper / Coller

  • Ctrl + k : couper la chaîne du curseur jusqu’à la fin de la ligne
  • Ctrl + u : couper la chaîne du curseur jusqu’au début de la ligne
  • Ctrl + w : couper le mot avant le curseur
  • Ctrl + y : coller une chaîne

Modification

  • Ctrl + t : inverser la position des deux caractères avant le curseur
  • Alt + shift + t : inverser la position des deux mots avant le curseur
  • Alt + shift + c : mettre une lettre en majuscule
  • Alt + shift + l : mettre un mot en minuscule (l pour lowercase)
  • Alt + shift + u : mettre un mot en majuscule (u pour uppercase)
  • Alt + shift + . : réécrire le paramètre de la dernière commande

Divers

  • Ctrl + l : effacer le contenu de l’écran
  • Ctrl + _ : annuler la dernière modification
  • Ctrl + c : arrêter la commande en cours
  • Ctrl + z : interrompt temporairement un processus (fg et bg)
  • Ctrl + d : quitter le shell en cours
  • Ctrl + r : permet de rechercher une commande dans l’historique

[hautefeuille] Traitement d’un fichier de log Apache et génération de svg

$
0
0

Objectif

Traiter un fichier de log Apache d’un hôte virtuel puis générer un graphique synthétique des visiteurs uniques à travers le monde.

Principes

On traite le fichier, on génère des listes de données, on géolocalise les adresses ip rencontrées puis on génère un graphique svg.

L’utilisation de ce script nécessite l’installation des modules Python suivants :

  • clize pour la gestion des arguments
  • geoip pour la géolocalisation
  • pygal pour la génération SVG.

Le script Python

Le script est largement adaptable à diverses situations. La documentation de Pygal est claire pour permettre une personnalisation aisée du graphique.

On utilise le script de cette manière :

python grabip.py log.txt

Le script, dans son état actuel, ne traite que les adresses ip, donc peu importe le formatage du fichier de log par le fichier de configuration d’Apache.

Le script produit un fichier rapport.txt et un fichier chart.svg.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function

"""
Usage: grabip.py [OPTIONS] filein

"""

import re
import collections

import GeoIP
import clize

import pygal
from pygal.style import NeonStyle

class Inspector(object):
    '''
    Extract IP from log file, count ip, localise with GeoIP country
    '''
    def __init__(self, in_file, **kwds):
        super(Inspector, self).__init__(**kwds)
        self.in_file = open(in_file, 'r')
        self.exclude = ["0.0.0.0", "127.0.0.1"]
        self.ip = []
        self.cnt = collections.Counter()
        self.cnt_u = collections.Counter()
        self.result = []
        self.hits = {}
        self.uniques = {}
        self.total = 0
        self.unique = 0
        self.killdoublon = set()
        self.geoip = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)

        self.filter()
        self.count()
        self.geo()
        self.hitbycountry()
        self.totalhits()
        self.totalunique()
        self.uniquebycountry()
        self.in_file.close()

    def filter(self):
        '''
        Strip line and regex for ip

        self.ip return ['78.46.16.11', '78.46.16.11']
        '''
        for line in self.in_file:
            ipp = re.search("([\d]+\.[\d]+\.[\d]+\.[\d]+)",
                            line.rstrip('\n\r'))
            if ipp and ipp not in self.exclude:
                self.ip.append(ipp.group())

        print("=> filter : %s" % self.ip)

    def count(self):
        '''
        Add a count for all ip found

        self.cnt.items() return [('78.46.16.11', 2)]
        '''
        for ip in self.ip:
            self.cnt[ip] += 1

        print("=> count : %s" % self.cnt.items())

    def geo(self):
        '''
        Add goip information to dataset

        self.result return [('78.46.16.11', 2, 'DE')]
        '''
        for ip, i in self.cnt.items():
            country = self.geoip.country_code_by_addr(ip)
            if country:
                self.result.append((ip, i, country))

        print("=> geo : %s" % self.result)

    def hitbycountry(self):
        '''
        Count hit by country

        self.hits return {'DE': 2}
        '''
        for ip, hit, country in self.result:
            if country in self.hits:
                tmp = int(self.hits.get(country)) + int(hit)
                self.hits[country] = tmp
            else:
                self.hits[country] = hit

        print("=> hits : %s" % self.hits)

    def uniquebycountry(self):
        '''
        Count unique by country
        '''
        for ip in self.killdoublon:
            country = self.geoip.country_code_by_addr(ip)
            if country:
                self.cnt_u[country] += 1
        self.uniques = dict(self.cnt_u)

        print("=> uniques : %s" % self.uniques)

    def totalhits(self):
        '''
        Return total hits

        self.total return 2
        '''
        for value in self.hits.itervalues():
            self.total += value

        print("=> total hits : %s" % self.total)

    def totalunique(self):
        '''
        Return total unique visitor

        self.unique return 1
        '''
        for elem in self.ip:
            self.killdoublon.add(elem)
        self.unique = len(self.killdoublon)

        print("=> total unique : %s" % self.unique)

class Reporting(Inspector):
    '''
    Create a report file text
    '''
    def __init__(self, in_file, **kwds):
        super(Reporting, self).__init__(in_file, **kwds)
        self.out_file = open("rapport.txt", 'w')
        self.simplereport()
        self.out_file.close()

    def simplereport(self):
        '''
        Print result and write file report
        '''
        for ip, i, country in self.result:
            self.out_file.write(ip + ' ' + str(i) + ' ' + country + '\n')

        print("=> Report done")

class Drawing(Reporting):
    '''
    Create visual representation

    '''
    def __init__(self, in_file, **kwds):
        super(Drawing, self).__init__(in_file, **kwds)
        chart = pygal.HorizontalBar(
            width=800,
            height=600,
            x_title="Visites",
            y_title="Pays",
            legend_at_bottom=True,
            tooltip_border_radius=10,
            human_readable=True,
            no_data_text='No result found',
            pretty_print=True,
            style=NeonStyle)
        chart.title = u"Visiteurs uniques à travers le monde sur\
        le site hautefeuille.eu en 2013"
        for k, v in self.uniques.iteritems():
            if v >= 50:
                chart.add(k, [{'value': v, 'label': k}])
        chart.render_to_file('chart.svg')

@clize.clize()
def main(filein):
    '''
    Main
    '''
    grab = Drawing(filein)

if __name__ == '__main__':
    clize.run(main)

Remarque : le script ne contient pas de difficulté particulière. Ce qui est peut-être méconnu : l’utilisation des compteurs d’éléments (collections.Counter()) et l’utilisation des set() qui permettent facilement d’obtenir une liste sans doublon.

Le fichier svg produit

La version interactive en SVG.

[Biologeek] Graphes et discussions

$
0
0

D’aucuns vont très probablement venir m’expliquer que d’autres canaux existent, certains très éphémères ou volatiles, comme Twitter peut l’être, pour échanger, ce qui est exact (compte tenu des contraintes inhérentes à ces services) ; je leur répondrai alors qu’ils ont parfaitement raison mais que ça ne “construit” pas l’échange aussi durablement qu’en laissant ici, à la suite du billet, une liste de commentaires et de rétroliens qui permettent de fabriquer une histoire continue, archivée et consultable dans le futur.

Je trouve dommage qu’on perde ainsi ce qui a procuré aux blogs, il y a quelques années, ses plus belles lettres de noblesse.

Aujourd'hui pignocher, Franck Paul

J'ai ajouté le support de Webmention (spécification) sur ce blog depuis hier et j'ai manuellement soumis la première mention pour en vérifier le fonctionnement. C'est peu éprouvé mais vous pouvez commencer à jouer avec et l'ajouter facilement sur votre hébergement avec un script CGI en Python 3 si vous voulez vous inspirer de ce que j'ai dû ajouter.

Et puis j’ai l’impression qu’on régresse un peu par rapport au trackback initial. Pingback et Webmention notifient d’un lien entrant, pas d’un suivi de discussion.

Je peux avoir un lien entrant sans aucun ajout à la discussion, juste un relai. Inversement je peux avoir un nouveau contenu qui apporte à la discussion et qui mériterait de notifier plusieurs contenus déjà existant sans forcément s’imposer de faire des liens.

Suivi des discussions, Éric D.

Cette réciprocité a du bon pour moi. Webmention permet de parcourir le graphe des discussions bi-directionnellement. Quel que soit le point d'entrée du lecteur, il va pouvoir naviguer pour retrouver à la fois les sources de la discussion et ses derniers rebondissements. Ce n'est pas une question d'égo ou de SEO mais de données et de liens. De Web.

Alors bien sûr on peut reprocher au système de ne pas passer à l'échelle, de ne pas avoir de mécanisme pour lutter contre le spam, de ne pas avoir de système de whitelist ou d'être complètement immature et implémenté par une poignée de geeks. S'il y a une chose que j'ai apprise pendant cette première année avec scopyleft, c'est qu'il ne faut pas anticiper les problèmes mais essayer et réajuster, incrémentalement. Ça demande une certaine réactivité et une vision à long terme mais en contrepartie ça génère beaucoup moins de stress inutile et ça fait avancer la problématique. Avoir un retour en situation réelle — même à petite échelle — sera autrement plus productif que d'en discuter pendant des années sans avoir rien essayé. Je n'ai pas peur de l'échec, j'ai peur de ceux qui me le prédise. Et m'entraînent avec eux dans cette spirale anxiogène.

Un commentaire de plus.


[logilab] A quick take on continuous integration services for Bitbucket

$
0
0

Some time ago, we moved Pylint from this forge to Bitbucket (more on this here).

https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2012/Oct/11/master-logo-2562750429-5_avatar.png

Since then, I somewhat continued to use the continuous integration (CI) service we provide on logilab.org to run tests on new commits, and to do the release job (publish a tarball on pypi, on our web site, build Debian and Ubuntu packages, etc.). This is fine, but not really handy since the logilab.org's CI service is not designed to be used for projects hosted elsewhere. Also I wanted to see what others have to offer, so I decided to find a public CI service to host Pylint and Astroid automatic tests at least.

Here are the results of my first swing at it. If you have others suggestions, some configuration proposal or whatever, please comment.

First, here are the ones I didn't test along with why:

The first one I actually tested, also the first one to show up when looking for "bitbucket continuous integration" on Google is https://drone.io. The UI is really simple, I was able to set up tests for Pylint in a matter of minutes: https://drone.io/bitbucket.org/logilab/pylint. Tests are automatically launched when a new commit is pushed to Pylint's Bitbucket repository and that setup was done automatically.

Trying to push Drone.io further, one missing feature is the ability to have different settings for my project, e.g. to launch tests on all the python flavor officially supported by Pylint (2.5, 2.6, 2.7, 3.2, 3.3, pypy, jython, etc.). Last but not least, the missing killer feature I want is the ability to launch tests on top of Pull Requests, which travis-ci supports.

Then I gave http://wercker.com a shot, but got stuck at the Bitbucket repository selection screen: none were displayed. Maybe because I don't own Pylint's repository, I'm only part of the admin/dev team? Anyway, wercker seems appealing too, though the configuration using yaml looks a bit more complicated than drone.io's, but as I was not able to test it further, there's not much else to say.

http://wercker.com/images/logo_header.png

So for now the winner is https://drone.io, but the first one allowing me to test on several Python versions and to launch tests on pull requests will be the definitive winner! Bonus points for automating the release process and checking test coverage on pull requests as well.

https://drone.io/drone3000/images/alien-zap-header.png

[logilab] InfoLab Rennes - 17 décembre

$
0
0

InfoLab Rennes - 17 décembre

Le mardi 17 décembre, nous avons participé à la 4ème rencontre du groupe national infolab à Rennes. Voici quelques notes et reflexions prises à cette occasion. La journée a été dense, donc vous ne trouverez que des bribes des sujets dans ce compte rendu.

http://www.fing.org/local/cache-vignettes/L680xH165/_info_lab_V3_logo_petit-d6f63.jpg

Présentation générale le matin

Une présentation générale de la mission "infolab" menée par le Fing a permis d'initier la réflexion et la discussion sur ce qu'est un infolab. Sarah Labelle (Université Paris XIII), Amandine Brugières (Poitiers), Claire Gallon (Nantes, Libertic), Simon Chignard (Rennes), Charles Nepote (Marseille), et Thierry Marcou (Paris) se sont succédé pour expliquer les réflexions et outils en cours d'élaboration. Nous avons noté :

  • une liste de 150 outils répertoriés pour aider à manipuler les données,
  • un prototype de méthodologie,
  • des documents récapitulatifs sur les différents métiers autour de la donnée.

L'assemblée se pose la question de comment rendre accessible les technologies, les données, les outils. Il nous semble qe cette démarche n'est possible qu'en ayant des mécanismes transparents, reproductibles et collaboratifs. Nous y voyons donc les principes de "logiciel libre", des "standards" et des "outils collaboratifs". Comment rendre le traitement de la donnée reproductible et transparent ?

À Logilab, nous avons adoptés les outils suivants pour traiter la données :

  • CubicWeb (en python) avec un certain nombre de cubes (modules type plugins)
  • les standards du web sémantique pour faire de la publication et de l'échange de données (publication de dumps, negociation de contenu et sparql endpoints),
  • les outils de versionning et de collaboration (en logiciel libre) : mercurial qui permettent une co-construction décentralisée sur du code source, mais aussi sur certaines données (voir par exemple les jeux de données publié sur github).

Au sujet de l'annuaire des outils : comporte-t-il une évaluation de l'accessibilité ? D'un outil WYSIWYG à un outil de programmation... quelle grille de notation ? Faut-il faire son propre graphisme ou est-ce "configurable" sans compétences... Grille d'évaluation aussi sur l'autonomie de l'outil ? Par exemple utiliser Google Drive pose des questions des droits sur les données (exemple récent sur la propriété des données lorsqu'elles sont affichées sur une carte google à travers l'API). Dans le domaine du logiciel libre, avec lequel nous pouvons établir un bon nombre de parallèles, il existe des méthodes formelles d'evaluation.

D'autres questions ont été abordées :

  • stockage et pérennité des démarches et des données : dans l'industrie logicielle une formalisation pertinente en rapport avec cette question est le semantic versionning qui permet d'établir une traçabilité. Sur l'archivage, de nombreuses solutions sont envisageables mais pas forcément formalisées (stockage P2P, hébergement mutualisé, etc).
  • le contrôle d'accès : qui accède comment, comment partage-t-on de manière sécurisée ? Ceci nous fait penser aux études menées par le MIT sur leur projet OpenPDS.
  • comment rendre le crowdsourcing efficace ? Des outils comme CrowdCarfting (PyBossa en Python) permetterait de "simplement" définir une application de crowdsourcing (eg. cartographie, annotation d'image, classement d'image, OCR collaboratif, etc.) mais comment faire le lien avec les données "officielles" ?

Atelier l'après-midi

Suite à une visite du labfab de Rennes, nous avons participé aux ateliers, étant deux personnes de chez Logilab, nous avons pu participer à trois ateliers :

  • travail sur la charte des infolabs,
  • datavisualisation et réflexions autour des données,
  • comment mener une campagne de crowdsourcing et sur quels types de données.

Dans l'atelier sur le crowdsourcing, nous avons parlé rapidement de CKAN et http://datahub.io/ qui sont des moteurs de recherche sur les jeux de données ouverts.

La suite

Nous avons participé à DataPride (à Nantes) et , comptons participer dans le futur à DataLab (à Nantes) et DataShacker (à Paris), s'agit-il d'initiatives "compatibles" aux principes des infolabs ? Est-ce des infolabs ? La suite de l'initiative nous le dira sûrement.

Les prochaines rencontres Infolab auront probablement lieu à Bordeaux en janvier et à Paris lors de Futur en Seine (du 12 au 15 juin : au CNAM, à la Gaité Lyrique, au Square Emile Chautemps).

[logilab] SaltStack Paris Meetup on Feb 6th, 2014 - (S01E01)

$
0
0

Logilab has set up the first meetup for salt users in Paris on Feb 6th, 2014 at IRILL, near Place d'Italie.

Here is the announce in french http://www.logilab.fr/blogentry/1981

Please forward it to whom may be interested, underlining that pizzas will be offered to refuel the chatters ;)

Conveniently placed a week after the Salt Conference, topics will include anything related to salt and its uses, demos, new ideas, exchange of salt formulas, commenting the talks/videos of the saltconf, etc.

If you are interested in Salt and will be in Paris at that time, we hope to see you there !

[logilab] Pylint 1.1 christmas release

$
0
0

Pylint 1.1 eventually got released on pypi!

A lot of work has been achieved since the latest 1.0 release. Various people have contributed to add several new checks as well as various bug fixes and other enhancement.

Here is the changes summary, check the changelog for more info.

New checks:

  • 'deprecated-pragma', for use of deprecated pragma directives "pylint:disable-msg" or "pylint:enable-msg" (was previously emmited as a regular warn().
  • 'superfluous-parens' for unnecessary parentheses after certain keywords.
  • 'bad-context-manager' checking that '__exit__' special method accepts the right number of arguments.
  • 'raising-non-exception' / 'catching-non-exception' when raising/catching class non inheriting from BaseException
  • 'non-iterator-returned' for non-iterators returned by '__iter__'.
  • 'unpacking-non-sequence' for unpacking non-sequences in assignments and 'unbalanced-tuple-unpacking' when left-hand-side size doesn't match right-hand-side.

Command line:

  • New option for the multi-statement warning to allow single-line if statements.
  • Allow to run pylint as a python module 'python -m pylint' (anatoly techtonik).
  • Various fixes to epylint

Bug fixes:

  • Avoid false used-before-assignment for except handler defined identifier used on the same line (#111).
  • 'useless-else-on-loop' not emited if there is a break in the else clause of inner loop (#117).
  • Drop 'badly-implemented-container' which caused several problems in its current implementation.
  • Don't mark input as a bad function when using python3 (#110).
  • Use attribute regexp for properties in python3, as in python2
  • Fix false-positive 'trailing-whitespace' on Windows (#55)

Other:

  • Replaced regexp based format checker by a more powerful (and nit-picky) parser, combining 'no-space-after-operator', 'no-space-after-comma' and 'no-space-before-operator' into a new warning 'bad-whitespace'.
  • Create the PYLINTHOME directory when needed, it might fail and lead to spurious warnings on import of pylint.config.
  • Fix setup.py so that pylint properly install on Windows when using python3.
  • Various documentation fixes and enhancements

Packages will be available in Logilab's Debian and Ubuntu repository in the next few weeks.

Happy christmas!

[carlchenet] Cadeau de Noël : Publication de Brebis 0.9, le vérificateur automatisé de sauvegarde

$
0
0
Suivez-moi aussi sur Identi.ca ou sur Twitter  Peu de temps avant ce Noël, l’équipe du projet Brebis a publié la version "Bouddhinette" 0.9 du vérificateur automatisé de sauvegardes. Pour rappel, Brebis est un programme en ligne de commande codé en Python permettant le contrôle automatisé de l’intégrité d’archives (tar, gz, bzip2, lzma, zip) et de la cohérence des fichiers […]

[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] OpenData et citoyenneté

$
0
0

Rien de nouveau sous le soleil. L'innovation s'emballe parfois et on emballe tout avec et ... on trébuche. Exercice critique de notre complice es pop-up, Philippe Gargov. L'open data est devenue la tarte à la crème du numérique urbain, d'accord. En fait, nous sommes bien en-deça des services et des urbanités que la donnée peut produire, et ... très en retard sur cette promesse. Mille fois d'accord avec Jérôme Denis : "on aurait tort de penser que nous sommes sur une feuille blanche." c'est d'ailleurs un péché congénital pour le numérique en général.

Heurs et malheurs de l’open data

De la même manière que l'Open-Source est de la solidarité entre développeurs, l'OpenData est de la solidarité entre acteurs de la puissance publique. (Enfin !) arriver à échanger des données entre différentes institutions d'un même pays. Pas plus. Ses défenseurs aimeraient que cela se transforme en quelque chose de plus grand avec une implication citoyenne et le parallèle avec le Logiciel Libre est assez intéressant là-dessus mais on en est assez loin. Pourquoi ? Après tout l'OpenData devrait raviver le citoyen qui sommeille (parfois profondément) en chacun de nous.

Premièrement, l'angle d'attaque est assez mauvais. Vouloir impliquer le citoyen en lui imposant de la matière première est une erreur stratégique qui restreint sa créativité. Ceci est confortable pour les institutions — et les politiques qui s'en servent pour orienter les débats — mais c'est contre-productif dans l'optique d'une réappropriation de sa citoyenneté. Le politique doit agir en facilitateur et être à l'écoute du citoyen pour lui fournir les outils et les données dont il a besoin. Il faut se concentrer sur le fait de faire émerger ces besoins qui doivent anticiper la libération d'une quelconque donnée — qu'elle soit publique ou privée.

D'un point de vue économique ensuite, passer par des hackathons, des startup weekends et autres concours ne mènera à rien. Il faudrait au contraire que des entreprises ayant une vision à moyen terme puissent créer de la valeur à partir de ces données. J'évoquais par exemple il y a 5 ans chez Christian l'idée d'avoir des Société de Services en Données Libres (SSDL) comme il a pu en exister pour le logiciel libre. Cela implique d'avoir du dialogue entre ces entreprises et les institutions sus-citées. Cela implique aussi d'avoir des aides pour ces entreprises aux statuts particuliers qui vont faire le lien entre le citoyen et les données. Le citoyen-développeur est une utopie qui a la vie dure.

Enfin, il y a une réflexion à mener sur l'utilité des données actuellement libérées quitte à calculer leur retour sur investissement social pour acter d'un échec et aller de l'avant avec d'autres méthodes. Des outils qui soient adaptés au Web. Une vision qui soit co-construite avec le citoyen. L'innovation ne viendra pas forcément du résultat produit mais de la collaboration qui devrait émerger entre les différents acteurs.


[Biologeek] Emotions et angoisses

$
0
0

That one percent makes all the difference. […] You can't possibly know the enormity of the feelings you will have for your children. It is absolutely fucking terrifying.

On Parenthood, Jeff Atwood

Lorsqu'on annonce la venue d'un enfant, on évoque unanimement le manque de sommeil. Or c'est loin d'être ce qui m'a marqué le plus au cours de ce premier mois.

Les émotions d'abord, pas seulement le jour J mais très régulièrement. Je ne pensais qu'il puisse y avoir des moments de complicité avec un nourrisson et pourtant… des choses passent, des énergies sont transmises, des sentiments viennent s'ancrer très profondément. C'est vraiment impressionnant. Et tellement soudain que ça en est épuisant.

Les angoisses aussi, la moindre singularité représente un problème potentiel qu'il faut investiguer, confronter, discuter. Souvent bénin. Parfois à surveiller. Toujours extrêmement stressant. Prendre soin d'un enfant qui ne sait pas encore s'exprimer donne un sentiment d'impuissance terrible.

Ce fameux pour-cent dont parle Jeff Atwood est celui qui fait pencher la balance vers les émotions. Elle n'en reste pas moins très proche de l'équilibre ; mais peut-être est-ce ce qui rend la parentalité si exceptionnelle ? Et les nuits si blanches :-).

[hautefeuille] Configuration d’un proxy HTTP authentifié avec Squid

$
0
0

Objectif

Mettre en place un proxy HTTP authentifié afin d’outrepasser un filtrage par IP ou par DNS. Cette configuration de Squid est spécifique à cet usage puisque nous ne filtrons rien, nous ne réécrivons rien et nous ne créons aucun fichier de log.

Prérequis

Les outils nécessaires sont Squid et les outils Apache pour pouvoir créer notre base d’utilisateurs.

sudo apt-get install squid3
sudo apt-get install apache2-utils

Créer le fichier des utilisateurs

Nous créons notre fichier à l’aide de l’outil Apache : htpasswd.

truncate -s 0 /etc/squid3/users
chown root:proxy /etc/squid3/users
chmod 0640 /etc/squid3/users

Ajoutons un utilisateur:

htpasswd -m /etc/squid3/users nicolas

Vérifions que Squid comprend notre nouvelle base d’utilisateurs créée :

/usr/lib/squid3/ncsa_auth /etc/squid3/users

Il faut entrer le couple utilisateur, mot de passe sous la forme suivante :

nicolas lemotdepasse

On stoppe le test par la combinaison des touches : CTRL + D.

Configurer Squid

On édite le fichier /etc/squid3/squid.conf :

## Interface et port
http_port 86.98.215.53:9999

## Options
visible_hostname localhost

## Options authentification
auth_param basic program /usr/lib/squid3/ncsa_auth /etc/squid3/users
auth_param basic children 10
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

## Definition des hotes
acl Users proxy_auth REQUIRED

## Options de connexion
acl limitusercon maxconn 500
http_access deny limitusercon

## Desactivation icp multicast
icp_port 0
icp_access deny all

## Desactivation ident lookups
ident_lookup_access deny all

## Support fichiers
coredump_dir /tmp
pid_filename /var/log/squid3/squid.pid

## Timeouts
forward_timeout 30 seconds
connect_timeout 30 seconds
read_timeout 30 seconds
request_timeout 30 seconds
persistent_request_timeout 1 minute
client_lifetime 20 hours

# Desactivation des logs
access_log none
cache_store_log none
cache_log /dev/null

## Ports autorises
acl SSL_ports port 443
acl Safe_ports port 80          
acl Safe_ports port 21          
acl Safe_ports port 443         
acl Safe_proto proto HTTP SSL FTP
acl CONNECT method CONNECT

## Acces autorises
http_access allow Users
http_access deny !Safe_ports
http_access deny !Safe_proto
http_access deny CONNECT !SSL_ports
http_access deny all

## Autorise la reponse aux clients
http_reply_access allow Users
http_reply_access deny all

Démarrer Squid

sudo service squid3 start

[afpyro] AFPyro à Strasbourg (FR) - samedi 26 octobre

$
0
0

Lors de la conférence annuelle PyconFR qui aura lieu à Strasbourg du 26 au 29 octobre, nous prévoyons de se remplir la pense avec des spécialités locales (bière et flammequiches ou Flammenküchen en local !).

Ça se passera le samedi 26 au soir, dans le caveau du restaurant “Au brasseur” , un lieu charmant, authentique et convivial dans lequel vous pourrez déguster les bières “maison” et peut-être assister à un brassage en direct !

Pour faire les réservations, nous avons besoin de votre confirmation de présence question de pouvoir nous organiser.

Vous pouvez vous inscrire en suivant ce lien

Les inscriptions seront closes mercredi 23, alors cliquez sec !

[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 !

[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.

Viewing all 3409 articles
Browse latest View live