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

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

$
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 comporte 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.


[logilab] Second Salt Meetup builds the french community

$
0
0

On the 6th of February, the Salt community in France met in Paris to discuss Salt and choose the tools to federate itself. The meetup was kindly hosted by IRILL.

There were two formal presentations :

  • Logilab did a short introduction of Salt,
  • Majerti presented a feedback of their experience with Salt in various professional contexts.

The presentation space was then opened to other participants and Boris Feld did a short presentation of how Salt was used at NovaPost.

http://www.logilab.org/file/226420/raw/saltstack_meetup.jpeg

We then had a short break to share some pizza (sponsored by Logilab).

After the break, we had some open discussion about various subjects, including "best practices" in Salt and some specific use cases. Regis Leroy talked about the states that Makina Corpus has been publishing on github. The idea of reconciling the documentation and the monitoring of an infrastructure was brought up by Logilab, that calls it "Test Driven Infrastructure".

The tools we collectively chose to form the community were the following :

  • a mailing-list kindly hosted by the AFPY (a pythonic french organization)
  • a dedicated #salt-fr IRC channel on freenode

We decided that the meetup would take place every two months, hence the third one will be in April. There is already some discussion about organizing events to tell as many people as possible about Salt. It will probably start with an event at NUMA in March.

After the meetup was officially over, a few people went on to have some drinks nearby. Thank you all for coming and your participation.

login or register to comment on this blog

[logilab] Retour sur MiniDebConf Paris 2014

$
0
0
http://www.logilab.org/file/226609/raw/200px-Mini-debconf-paris.png

Nous sommes heureux d'avoir participé à la MiniDebConf Paris.

Nous avons sponsorisé l'évenement mais aussi effectué deux présentations :

Avec une cinquantaine de participants sur les deux jours, c'est toujours agréable de rencontrer la communauté francaise autour de Debian. Merci donc à l'association Debian France d'avoir organisé cette conférence.

[cubicweb] Logilab's roadmap for CubicWeb on March 7th, 2014

$
0
0

The Logilab team holds a roadmap meeting every two months to plan its CubicWeb development effort. Here is the report about the Mar 7th, 2014 meeting. The previous report posted to the blog was the january 2014 roadmap.

Version 3.17

This version is stable but old and maintainance will stop in a few weeks (current is 3.17.13 and 3.17.14 is upcoming).

Version 3.18

This version is stable and maintained (current is 3.18.3 and 3.18.4 is upcoming).

Version 3.19

This version is about to be published. It includes a heavy refactoring that modifies sessions and sources to lay the path for CubicWeb 4.

For details read list of tickets for CubicWeb 3.19.0.

Version 3.20

This version will try to reduce as much as possible the stock of patches in the state "reviewed", "awaiting review" and "in progress". If you have had something in the works that has not been accepted yet, please ready it for 3.20 and get it merged.

It should also include the work done for CWEP-002 (computed attributes and relations) and CWEP-003 (adding a FROM clause to RQL).

For details read list of tickets for CubicWeb 3.20.0.

Cubes

Here is a list of cubes that had versions published over the past two months: addressbook, awstats, blog, bootstrap, brainomics, comment, container, dataio, genomics, invoice, mediaplayer, medicalexp, neuroimaginge, person, preview, questionnaire, securityprofile, simplefacet, squareui, tag, tracker, varnish, vcwiki, vtimeline.

Here are a the new cubes we are pleased to announce:

collaboration is a building block that reuses container and helps to define collaborative workflows where entities are cloned, modified and shared.

Our priorities for the next two months are collaboration and container, then narval/apycot, then mercurial-server, then rqlcontroller and signedrequest, then imagesearch.

Mid-term goals

The work done for CWEP-0002 (computed attributes and relations) is expected to land in CubicWeb 3.20.

The work done for CWEP-0003 (explicit data source federation using FROM in RQL) is expected to land in CubicWeb 3.20.

Tools to diagnose performance issues would be very useful. Maybe in 3.21 ?

Caching session data would help and some work was done on this topic during the sprint in february. Maybe in 3.22 ?

WSGI has made progress lately, but still needs work. Maybe in 3.23 ?

RESTfulness is a goal. Maybe in 3.24 ?

Maybe 3.25 will be in fact 4.0 ?

Events

A spring sprint will take place in Logilab's offices in Paris from April 28th to 30th. We invite all the interested parties to join us there!

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 may 2014.

[Biologeek] Web et Univers

$
0
0

En quelques affirmations simples : l’univers n’est pas statique, il se refroidit et se raréfie. Mais surtout, et c’est pour nous un élément central, la matière s’organise progressivement. Les particules des temps les plus anciens s’associent pour former des structures de plus en plus élaborées. Tel que Lucrèce l’avait deviné, on passe du « simple » au « complexe », du moins efficace au plus efficace. L’histoire de l’univers, c’est l’histoire de la matière qui s’organise.

La plus belle histoire du monde, Hubert Reeves

Je me permets une petite paraphrase pour les 25 ans du Web :

En quelques affirmations simples : le web n’est pas statique, il se privatise et se monétise. Mais surtout, et c’est pour nous un élément central, les contrôles s’organisent progressivement. Les hackers des temps les plus anciens s’associent pour former des agences gouvernementales de plus en plus élaborées. Tel qu’Orwell l’avait imaginé, on passe de la « liberté » au « totalitarisme », du moins marchand au plus espionné. L’histoire du web, c’est l’histoire de la répression qui s’organise.

La plus triste histoire du monde, David Larlet

[afpyro] AFPyro à Lyon - mardi 25 mars

$
0
0

Un Afpyro aura lieu le mardi 25 mars à partir de 19h à l’Antre Autre - 11 rue Terme - 69001 Lyon.

Cet apéro Python sera commun avec l’apéro Php.

Une présentation sera faite sur la sécurité web. Après un aperçu des principales failles présentes dans les applications web, une réflexion sur les failles XSS sera faite et une méthode de protection efficace contre une partie de celles-ci sera présentée. Enfin, le thème de la sécurité sera abordé de façon plus général (politique de sécurité, bonnes pratiques...).

L’Antre Autre est un lieu où nous pouvons discuter autour d’un verre, et, pour ceux qui le souhaitent, prendre un repas.

Pour se rendre à l’Antre Autre :

  • en métro : arrêt Hôtel de Ville
  • en bus : lignes C13 et C18 arrêt Mairie du 1er ou lignes 19, C14 et C3 à l’arrêt Terreaux
  • en vélo’v : stations Place Sathonay, Carmélites Burdeau, Place de la paix

[Inspyration] Python 3.4

$
0
0
Alors que Python 3.4 RC3 vient de sortir, une mise à jour du livre Python, les fondamentaux du langage s'apprête à faire de même.

[logilab] Mini compte rendu Meetup Debian à Nantes

$
0
0

Hier soir, je suis allé au premier meetup Debian à Nantes. C'était bien sympatique, une vingtaine de personnes ont répondu présent à l'appel de Damien Raude-Morvan et Thomas Vincent. Merci à eux d'avoir lancé l'initiative (le pad d'organisation).

//www.logilab.org/file/228927/raw/debian-france.jpg

Après un tour de table des participants, et de quelques discussions sur debian en général (et une explication par Damien de l'état de Java dans Debian), Damien a présenté l'association Debian France ainsi que le concours du nouveau contributeur Debian. La liste d'idées est longue et sympatique n'hésitez pas à aller jeter un oeil et faire une contribution.

Ensuite Thomas nous a présenté l'équipe de traduction francaise de debian et ses principles de fonctionnement (qualité avant quantité, listes de discussion, IRC, processus de traduction, etc.).

//www.logilab.org/file/228931/raw/saltstack_logo.jpg

Finalement, j'ai rapidement présenté Salt et sa place dans Debian. Pour l'archive publique : les diapos de la présentation.

À la prochaine !

Pour faire un commentaire, il faut s'authentifier ou s'enregistrer.


[hautefeuille] Golang API pour le site cex.io

$
0
0

Cex.io est un site d’achat et de vente de possibilités de générer des Bitcoins. Il permet d’acheter ou de vendre des GH/s. Le GH/s correspond à la capacité de calcul nécessaire à générer des Bitcoins.

Le site Cex.io propose les API pour les langages suivants : Php, Node.js et Python. Malheureusement, certaines de ces API ne me conviennent pas ou sont incomplètes.

Le projet qui nécessite d’utiliser une telle API est un projet réalisé en langage Go. J’ai donc essayé de développer une API dans ce langage pour le site Cex.io et pour les besoins du projet.

L’API est disponible à cette adresse : https://github.com/jhautefeuille/go-cexio-api.

L’API s’utilise de la façon suivante :

package main

import (
    "github.com/jhautefeuille/go-cexio-api"
    "fmt"
)

func main() {
    cexapi := cexio.CexKey{
        Username:"your_username", 
        Api_key:"your_api_key", 
        Api_secret:"your_api_secret"}

    // Public
    fmt.Printf("Ticker => %s\n", cexapi.Ticker("GHS/BTC"))
    //fmt.Printf("Order Book => %s\n", cexapi.OrderBook("GHS/BTC"))
    //fmt.Printf("Trade History => %s\n", cexapi.TradeHistory("GHS/BTC"))

    // Private
    fmt.Printf("Balance => %s\n", cexapi.Balance())
    fmt.Printf("Open Orders => %s\n", cexapi.OpenOrders("GHS/BTC"))

    // Trading orders
    //fmt.Printf("Place Order => %s\n", cexapi.PlaceOrder("buy", "0.001", "0.017", "GHS/BTC"))
    //fmt.Printf("Cancel Order => %s\n", cexapi.CancelOrder("477571539"))

    // Workers 
    fmt.Printf("Hashrate => %s\n", cexapi.Hashrate())
    fmt.Printf("Workers => %s\n", cexapi.Workers())
}

Un utilisateur m’a contacté au sujet de cette API. D’autres versions améliorées sont à prévoir. Le développement de cette application m’a permis d’appréhender le langage Go que je n’avais pas encore utilisé.

[afpy.org] « Les Ateliers Python » au NUMA de Paris, lundi 24 mars à 19h

$
0
0
L'AFPy organise au NUMA un événement consistant en 4 présentations de 20 minutes chacune, autour du thème : « Python pour DevOps : Ansible & SaltStack »

[tshirtman] Prepare for the Kivy contest #2

$
0
0

Developers, developers… rejoice!

kivy contest

The kivy project is organizing a second contest!

From the 15th of April, when the theme will be revealed, to the 15th of May, the final deadline, all the interested candidates will compete to produce the nicest application possible, once month to make the difference, and collect prices :).

Prizes will be announced before the beginning of the contest, the python software foundation kindly offered to sponsor the contest, if you are or know somebody interested in sponsoring the contest, please contact us at contest@kivy.org.

[Biologeek] Utiliser NodeJS

$
0
0

Sadly I’m not going to get back where I was, because Javascript is not Python. If there’s a Javascript community I haven’t found it, or it’s at least not a single entity. There is no community that created Javascript like the Python community created Python. Python comes from the internet in a way Javascript does not; Javascript was built for the internet, but Python was built on the internet. And I do miss the Python community, you’re good people.

[…]

I suppose it is the platform that I am drawn to now before language. And the browser seems like the most interesting platform, not because it’s novel (though it is, it’s a runtime like few others), but because of how concrete it is, and of course how relevant it is to… anything. And the browser is no longer just the servant of a server, I prefer now to think of the browser as an independent agent, connecting to services instead of servers. Obviously that doesn’t describe a great number of running web sites, but it’s the model I see for the future, and a better perspective for understanding future architectures.

Saying Goodbye To Python, Ian Bicking

Préambule : il est difficile de comparer Node à Python ou Django car on n’a pas l’équivalent d’une telle plateforme dans l’écosystème Python. Je vais essayer de ne pas comparer des choux et des carottes pour autant.

Thomas demandait sur Twitter « les raisons pour lesquelles vous n’utiliseriez pas Node.js ? » et comme ça a l’air d’être la saison des trolls sur JS, je vais y aller de ma petite expérience. J’ai récemment participé au développement d’une implémentation de référence pour le Marketplace de Mozilla. Comme son nom l’indique, elle n’était pas destinée à être mise en production donc on a eu la liberté d’utiliser la technologie que l’on souhaitait, en l’occurrence : Node.

Confession : je me suis longtemps détourné de JavaScript pour son API DOM que je trouve affreuse, j’aurais mieux fait de coder ces quelques lignes pour ne plus avoir à troller et prendre le temps d’expérimenter

Je vais prendre 3 axes, je pourrais facilement arriver à une telle critique avec Python (packaging, Python 3 et GIL par exemple), il s’agit surtout ici de me rappeler pourquoi est-ce que je n’utilise pas Node aujourd’hui.

  • immaturité : même s’il est plaisant de faire partie de ce bouillonnement qui sort une lib par jour, qui en remet en question une autre par semaine, à la longue c’est épuisant et ça crée un stress dont je ne veux plus. Fatigué de courir après la dernière technologie pour mieux… placer des publicités aux utilisateurs (un billet est à venir là-dessus).
  • documentation : quand je vois une telle page, je me rends compte à quel point la documentation de Django est bien faite. C’est devenu pour moi le niveau de référence que je ne retrouve malheureusement pas ailleurs, à part quelques rares exceptions. D’une manière générale j’ai trouvé les bibliothèques que j’ai eues à utiliser mal documentées dans l’écosystème Node/JS.
  • debugging : je ne compte plus le nombre de fois où le message d’erreur était soit absent, soit une ligne incompréhensible (même après avoir trouvé la solution), soit dépendant de la lib de test que j’utilisais. Ce point est peut-être lié à mes habitudes ou à mon incompétence mais en tout cas pour un débutant c’est très rebutant.

Ces raisons font que je ne partirais pas aujourd’hui sur un projet Node s’il est destiné à être pérenne (un billet est à venir là-dessus aussi) et j’entraînerais encore moins une équipe avec moi. D’un autre côté, je vois très bien que Python s’enlise avec la version 3 et j’ai envie de faire des services pour le Web comme le décrit Ian en introduction. Donc je vais forcément être amené à faire plus de JavaScript, il s’agit avant tout d’une question de tempo. Il y a beaucoup de bonnes choses dans Node, aussi bien au niveau des concepts que de l’universalité. Node n’est juste pas (encore) adapté à l’usage que je souhaite en avoir.

Peut-être que la paternité m’adoucit (sic), peut-être qu’elle me permet de faire la part des choses sur ce que je trouve utile. La réduction de mon temps en ligne le rend plus précieux.

[Biologeek] Éducation citoyenne et Web

$
0
0

Somewhere in the mid 1990s, we lost our way. The education system largely ignored the explosive growth of computing and the internet, instead focusing on teaching students how to write Word documents. Instead of a nation of builders and entrepreneurs, we were content for our children to become also-rans on the technology stage.

We at the Year of Code are going to help change that. The new computing curriculum starts this September, and it puts coding at the heart of IT education. Coding is the art of telling a computer how to perform complex tasks. Once you know how to code, you can create virtual worlds within the computer where the only limit on what is possible is your imagination. We want to put this power into the hands and hearts of every child in Britain.

Why every child should learn to code

Il y a une recrudescence d’organisations de Coding Goûters et c’est une excellente chose, les parents sont ravis et je me sens forcément concerné ces derniers temps. Je ne remets pas du tout en question cette démarche louable sachant qu’il y a eu débat sur la nécessité ou pas d’apprendre à coder à chaque enfant : toutes les énergies sont bonnes à prendre lorsqu’il s’agit d’éducation.

Suite à ces initiatives, je me suis mis à penser qu’il ne fallait peut-être pas restreindre cela aux enfants. Après tout, l’apprentissage est possible tout au long de la vie si l’on arrive à conserver son enthousiasme. Et d’ailleurs pourquoi même se limiter au développement ? Avez-vous demandé à vos proches leur définition du Web ?

Puis je suis allé plus loin dans ma réflexion suite à l’engouement pour horsweb — la conférence des gens du web, sur tout sauf le web — en m’interrogeant sur sa réciproque : des rencontres sur le Web sans gens du Web. Il est certain que nous avons des choses hors web à nous apprendre entre pairs mais nous pourrions aussi vulgariser notre connaissance auprès de citoyens curieux. Quelle forme est-ce que cela pourrait prendre ? Comment toucher/intéresser un public aussi large ? Quel cadre permettrait d’avoir une meilleure fluidité au sein des participants ?

[afpyro] AFPyro à Paris - le 27 Mars

$
0
0

C’est l’été ou presque. Il est temps de profiter des terrasses!

Venez discuter de votre langage de programmation favori autour d’un verre et plus si affinités.

Quand ?

Le Jeudi 27 Mars, vers 19h00.

Où ?

Café Chéri(e) (plan)

44 bd de la Villette, 75019 Paris (FR).

Métro: Belleville / Colonel Fabien

[Biologeek] Agilité personnelle

$
0
0

L’agilité est décrite dans un cadre professionnel, bien trop souvent afin d’améliorer les performances d’une entreprise en ignorant les valeurs sous-jacentes. Or lorsqu’on commence à creuser un peu, on découvre des applications qui peuvent être très personnelles.

À titre individuel, je partage mes réussites, mes doutes, mes envies, mes échecs aussi. Ces rétrospectives me permettant d’avancer et d’insuffler parfois un peu d’énergie pour faire avancer les autres. Une fois dépassée la peur de l’échec, l’estime et la passion sont les clés de l’accomplissement de soi.

En tant que parent, je redécouvre chaque jour que rien n’est acquis et qu’il va falloir s’adapter en permanence, non pas dans une démarche d’amélioration continue mais dans une approche d’éducation continue. Mais pour cela il faut créer une boucle de rétro-action familiale, l’attention et l’amour sont les clés de la vie familiale.

En tant que coopérateur, j’ai le courage de débloquer des situations avant qu’elles ne dégénèrent tout en respectant les singularités de chacun. Je suis prêt à accepter des inconforts pour que le commun aille de l’avant. Lorsque l’on partage le même cap, la confiance et l’empathie sont les clés de la vie collaborative.

En tant que citoyen, je fais partie de la même équipe que mon voisin. Il n’y a pas de partis clivants, de campagnes électorales stériles ou de programmes obsolètes. Il y a des humains qui œuvrent ensemble pour pouvoir vivre sur un même territoire. Rien ne sert de stigmatiser une partie de l’équipe par manque de confiance, l’enthousiasme et la bienveillance sont les clés de la vie en communauté.


[hautefeuille] Programmation asynchrone avec Python 3.4 et le module asyncio

$
0
0

Introduction

Le module Python Asyncio est un module qui fournit une infrastructure pour écrire du code monothreadé concurrent en utilisant des coroutines, en multiplexant les Entrées/Sorties au-dessus de sockets ou d’autres ressources, et en démarrant des clients et des serveurs.

Les coroutines

Une coroutine est exécutée par l’expression yield from. Une coroutine est une fonction qui contient au moins une expression yield from.

Les tâches

Une tâche n’est pas exécutée par l’expression yield from. Une tâche est un objet qui gère une coroutine. Une tâche permet d’annuler une coroutine déjà exécutée. Une tâche permet d’exécuter une coroutine sous une coroutine existante.

Exemple de communication avec des websockets

Le projet Websockets permet d’utiliser simplement les websockets au-dessus du module asyncio. Ce sont ces websockets que nous allons utiliser pour réaliser le pattern consommateur/producteur.

Pour son installation :

sudo pip3.4 install websockets

Exemple :

import asyncio
import websockets

# Server
@asyncio.coroutine
def producer(websocket, uri):
    count = 0
    while websocket.open:
        yield from asyncio.sleep(1)
        count = count + 1
        yield from websocket.send(str(count))

# Client
@asyncio.coroutine
def consumer():
    websocket = yield from websockets.connect('ws://localhost:8765/')
    while websocket.open:
        count = yield from websocket.recv()
        print("%s" % count)

start_server = websockets.serve(producer, 'localhost', 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_until_complete(consumer())
asyncio.get_event_loop().run_forever()

Ce qui est intéressant dans ce cas, est que le consommateur peut être un client Javascript.

Exemple de communication avec une file d’attente

Dans cet exemple, nous allons utiliser une file d’attente illimitée pour échanger entre les coroutines. Si l’on choisit une file d’attente de taille fixe, celle-ci est bloquante si elle n’est pas vidée.

Exemple :

import asyncio

q = asyncio.Queue(maxsize=0)

@asyncio.coroutine
def producer():
    for elem in range(5):
        yield from q.put(elem)

@asyncio.coroutine
def consumer():
    while True:
        elems = yield from q.get()
        print(elems)

asyncio.get_event_loop().run_until_complete(producer())
asyncio.get_event_loop().run_until_complete(consumer())
asyncio.get_event_loop().run_forever()

L’intérêt ici, est l’utilisation d’une file d’attente sur laquelle on peut s’appuyer pour un contrôle de flux.

Liens

doc asyncio module

[Biologeek] Talents publicitaires

$
0
0

Dans le milieu informatique, les outils et services que nous utilisons sur l’ordinateur et en réseau engagent certaines réactions. Ce qui me paralyse de plus en plus avec les services proposés en ligne, avec les univers policés crées par des armées de designers et de personnes en charge du UX est la contrainte grandissante de l’outil dans un type d’actions très contrôlées. L’optimisation du contrôle afin de rendre « l’expérience plus efficace. » Mais bien souvent, en faisant cela, nous perdons également toutes ces souplesses qui rendent les gens créatifs, qui incitent chacun à s’investir, à s’approprier et à créer les espaces de leur choix.

De nombreux services en ligne ne sont pas là pour maximiser l’appropriation de l’utilisateur, mais bien pour optimiser la rentabilité et la profitabilité du service.

La flexibilité de l’environnement, Karl Dubost

Hypothèse qui se révèle être confirmée dans le cas de Facebook lors d’une refonte récente un peu trop optimisée pour l’utilisateur (et pas assez pour les revenus). Est-ce qu’il faut pour autant penser que la publicité soit le moteur du Web comme l’affirme Christian Heilmann ?

Hang on a second. Whether we like it or not, ads are what makes the current internet work. They are what ensures the “free” we crave and benefit from, and if you dig deep enough you will find that nobody working in web development or design is not in one way or another paid by income stemming from ad sales on the web. Thus, us pretending that ads are for other people is sheer arrogance.

Why “just use Adblock” should never be a professional answer

Ayant pour client Mozilla qui tire une bonne partie de ses revenus de Google, je ne peux malheureusement qu’acquiescer. Et me sentir acteur de ce blanchiment pseudo-éthique d’argent sale. Adworld, cliquez-ici pour acheter un rêve mondialisé.

Car par la même occasion, ces mastodontes nivellent les goûts et le monde ressemble à une banlieue australienne, standardisée for ever, à coup d’adolescents éternels et du divorce des parents : are you up to date ? La mise à jour permanente de nos besoins infinis passe aujourd’hui par l’écoute laconique de nos goûts sans démesure, le goût des autres est aussi le nôtre, et l’on ciblera l’humeur du moment selon que l’on "clique" ici ou là. Quand je pense aux utopies que nous balancions fiers et jeunes au début de ce que l’on croyait être le "web indépendant" : ah les cons ! D’autres ont bien mieux compris ce que l’on pouvait tirer de cette rêverie en termes monétaires : de la bulle financière comme dans un bain moussant.

Tout dans le client !

Quelles options reste-t-il pour passer entre les bulles ? Travailler avec le public est une possibilité, les bulles financières se transformant en savonnettes politiques. Terrain glissant dont les ambitions et les moyens sont limités à 5 ans. Après nous le déluge d’URLs cassées. Sans savon.

The reason why I find business models so fascinating is because your business model is your destiny; newspapers made their bed with advertisers, and when advertisers left for a better product, the newspaper was doomed. To change destiny, journalists need to fundamentally rethink their business

Newspapers Are Dead; Long Live Journalism

Encourager l’innovation est une autre option, en accompagnant des projets depuis leur départ. En brisant trop souvent des rêves impossibles qui ne méritent que de maigrir avec le dernier régime à la mode. Et puis il reste la question du financement. Et des taxes.

Hiring was delayed, partly because of social taxes that companies pay on salaries. In France, the share of nonwage costs for employers to fund unemployment benefits, education, health care and pensions is more than 33 percent. In Britain, it is around 20 percent.

Au Revoir, Entrepreneurs

Quelle honte d’accorder 33% de son revenu à son espace de vie. À l’éducation que l’on a reçu, aux soins dont on bénéficie. Mais rassurez-vous, vous pouvez en être dispensé grâce au fabuleux statut de JEI qui fait pâlir d’envie outre-atlantique :

  • Someone throws a “but what about the high taxes?” at you – you respond with “I subsidize all of my R&D with Government grants (up to €100M/year), and my company has a JEI status which wipes out employment taxes on engineers.“
  • Someone throws a “What about strict employment laws?” at you, and you better be ready with “All our employees start with a legal 6-month trial period which allows me to fire them at a moment’s notice, and most of France’s strict employment laws don’t kick in until you have 50 employees: that’s how many WhatsApp had when it was acquired for $19 Billion.”

Bonjour, Entrepreneurs – Only you can prevent French-Bashing

Et cerise sur le gâteau, on peut virer ses salariés dans les 6 mois sans aucun risque. Sous réserve de rester en-dessous des 50 salariés (excluant les stagiaires bien entendu). Et puis un développeur français est si peu cher, pourquoi s’en priver ?

Voilà, Tariq, les talents français du code sont au mieux de la chair à canons publicitaires US. Ce n’est pas d’un Github à la française dont nous avons besoin, mais d’une multitude de projets citoyens. Pour créer du lien social, du lien inter-générationel, du lien local, du lien politique. Pour se sentir utile en tant que développeur, pour se sentir agile en tant qu’humain.

[afpyro] AFPyro à Montreal - le 12 Avril

$
0
0

A l’occasion de Pycon U.S., l’AFPy organise son premier AFPyro à Montréal ! Venez échanger autour d’une bonne bière artisanale avec la comunauté francophone python !

AFPy is organizing its first AFPyro at PyCon U.S. in Montreal! Come and meet the french python community around a good craft beer!

Quand ? When ?

Le Samedi 12 Avril, vers 19h

Saturday 12th of April at 7PM

Ou ? / Where ?

Le Benelux Sherbrooke (map)

25, rue Sherbrooke Ouest

Montréal, QC H2X 1X7

[sciunto] Manuscript : Scikit-image : Traitement d'images en Python

$
0
0

Scikit-image est une bibliothèque de traitement d'images en Python. Nous venons de soumettre un manuscript à PeerJ dont le PrePrint est téléchargeable.

Je suis très heureux d'avoir eu l'occasion de participer à la rédaction de ce manuscript où j'ai pu illustrer un code utilisé à des fins de recherche académique dont j'ai implémenté l'algorithme dans la bibliothèque. L'histoire a voulu qu'ayant en tête cette application précise, j'ai cherché un algorithme et ne trouvant pas une implémentation qui me plaisait en Python, j'en ai proposé une à scikit-image. J'en parlais il y a un an dans cet article (transformée de Hough). La boucle est bouclée !

J'ai aussi écrit la partie "getting started" pour découvrir la bibliothèque en douceur, si vous ne la connaissez pas.

Le manuscript a l'avantage de présenter des cadres divers d'utilisation de scikit-image, grâce à la diversité des auteur(e)s. On trouve de la recherche en biologie, une application en entreprise pour détecter des défauts sur des surfaces, l'utilisation de la bibliothèque dans l'enseignement et enfin, une belle illustration du recollement d'images, le résultat est vraiment impressionnant.

Outre ces usages, on mets en avant le fait que scikit-image s'appuie fortement sur NumPy, ce qui permet facilement d'appliquer d'autres algo disponibles dans SciPy, Scikit-learn, etc.

C'est la première fois que j'écris un papier de manière collaborative avec git et le mécanisme de pull requests de github, et je dois dire que c'est très efficace. Le commentaire ligne à ligne avant l'inclusion permet d'atteindre très rapidement un document de qualité. Merci aux co-auteurs pour cette expérience !

[logilab] Code_Aster back in Debian unstable

$
0
0

Last week, a new release of Code_Aster entered Debian unstable. Code_Aster is a finite element solver for partial differential equations in mechanics, mainly developed by EDF R&D (Électricité de France). It is arguably one of the most feature complete free software available in this domain.

Aster has been in Debian since 2012 thanks to the work of debian-science team. Yet it has always been somehow a problematic package with a couple of persistent Release Critical (RC) bugs (FTBFS, instalability issues) and actually never entered a stable release of Debian.

Logilab has committed to improving Code_Aster for a long time in various areas, notably through the LibAster friendly fork, which aims at turning the monolithic Aster into a library, usable from Python.

Recently, the EDF R&D team in charge of the development of Code_Aster took several major decisions, including:

  • the move to Bitbucket forge as a sign of community opening (following the path opened by LibAster that imported the code of Code_Aster into a Mercurial repository) and,
  • the change of build system from a custom makefile-style architecture to a fine-grained Waf system (taken from that of LibAster).

The latter obviously led to significant changes on the Debian packaging side, most of which going into a sane direction: the debian/rules file slimed down from 239 lines to 51 and a bunch of tricky install-step manipulations were dropped leading to something much simpler and closer to upstream (see #731211 for details). From upstream perspective, this re-packaging effort based on the new build-system may be the opportunity to update the installation scheme (in particular by declaring the Python library as private).

Clearly, there's still room for improvements on both side (like building with the new metis library, shipping several versions of Aster stable/testing, MPI/serial). All in all, this is good for both Debian users and upstream developers. At Logilab, we hope that this effort will consolidate our collaboration with EDF R&D.

Viewing all 3409 articles
Browse latest View live