PROJET AUTOBLOG ~ Streisand Effect


sciunto

Site original : sciunto

⇐ retour index

Don du mois : debian

Sunday 24 January 2016 à 00:00

Ce post s'inscrit dans la série des dons pour vous donner envie de contribuer même très modestement à des logiciels libres. Les petites pierres font les grands édifices.

Le don de ce mois est pour debian. J'utilise cet OS pour mes serveurs. J'ai bien essayé pour les stations de travail, mais la lenteur de l'évolution de debian m'a fait reculer pour préférer archlinux auquel j'ai déjà consacré un don. Néanmoins, debian est une distribution de choix pour les serveurs. C'est stable, c'est documenté, la communauté est active et les mises à jours sont de qualité. Donc 15$ pour debian.

Pour faire un don à debian

Profilage CPU de rss2email et feedparser (python)

Sunday 17 January 2016 à 00:00

J'ai déjà parlé à plusieurs reprises sur ce blog de rss2email pour récupérer les flux rss. Avec plus d'une centaine de flux, il est un peu lent et consomme tout de même pas mal de CPU. Je me suis donc lancé dans un profilage du code pour comprendre ce qui consommait le plus.

Deux objectifs à ce billet :

Mise en place du profilage

On commence par cloner le dépôt de rss2email

git clone https://github.com/wking/rss2email
cd rss2email

ainsi que feedparser, la bibliothèque principale car je pressens qu'on va devoir y jeter un coup d'oeil.

git clone https://github.com/kurtmckee/feedparser.git

Je crée un virtualenv avec pew, comme suggéré par sametmax, c'est bien plus pratique.

pew new profiler

Construction et déploiement du code avec la méthode develop. Elle fait un lien symbolique, ce qui permet de ne pas avoir à faire une installation à chaque modification de code, ce qui est très intéressant lorsqu'on avance à petit pas dans le profilage.

cd feedparser
python setup.py develop
cd ..
# rss2email
python setup.py develop

On vérifie que ça tourne comme on l'attend. J'ai importé mes fichiers de conf et de base de données du serveur de prod pour être en condition de données réelles. L'option -n permet de faire un dry-run, c'est-à-dire de ne pas envoyer le courriel.

r2e -c rss2email.cfg  run 30 -n

J'installe la bibliothèque qui permet de profiler le CPU. Voir cette référence que j'ai trouvé utile pour les différentes méthodes de profilage en python.

pip install line_profiler

Pour activer le profilage sur une fonction, il suffit d'utiliser un décorateur.

@profile
def func(var):
    ...

On lance ensuite kernprof

kernprof -l -v r2e -c rss2email.cfg  run 30 -n

De manière récursive, je descend dans le code en répérant les fonctions qui prennent le plus de temps CPU.

Résultats

Le résultat est que le temps CPU est principalement utilisé par feedparser, que la moitié du temps sert à récupérer des données à travers le réseau (urllib) et l'autre moitié à faire du parsage de date. Ce parsage est traité en interne par feedparser.

Ces résultats sont rapportés dans ce ticket.

Regardons plus en détails. Il existe plusieurs formats à gérer. Pour mes flux, c'est principalement rfc822.

Le code commence par ceci

timezonenames = {
    'ut': 0, 'gmt': 0, 'z': 0,
    'adt': -3, 'ast': -4, 'at': -4,
    'edt': -4, 'est': -5, 'et': -5,
    'cdt': -5, 'cst': -6, 'ct': -6,
    'mdt': -6, 'mst': -7, 'mt': -7,
    'pdt': -7, 'pst': -8, 'pt': -8,
    'a': -1, 'n': 1,
    'm': -12, 'y': 12,
    'met': 1, 'mest': 2,
}

def _parse_date_rfc822(date):
    """Parse RFC 822 dates and times
    http://tools.ietf.org/html/rfc822#section-5
    There are some formatting differences that are accounted for:
    1. Years may be two or four digits.
    2. The month and day can be swapped.
    3. Additional timezone names are supported.
    4. A default time and timezone are assumed if only a date is present.
    """

    daynames = set(['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'])
    months = {
        'jan': 1, 'feb': 2, 'mar': 3, 'apr': 4, 'may': 5, 'jun': 6,
        'jul': 7, 'aug': 8, 'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12,
    }

    parts = date.lower().split()

Avec le profilage, j'ai vu que 10% du temps était utilisé à construire le set(). Les avantages de set sont de garantir l'unicité et d'avoir des opérations de type union ou intersection (comme le dit la doc). Ici, daynames n'est pas modifié, on n'a pas donc besoin de fabriquer l'unicité sur quelque chose qu'on définit. Seule une itération est faite sur cet élément. Le set() ne me semble donc pas justifié.

J'ai ouvert un pull request pour corriger le set en tuple, et passer la déclaration en variable globale.

Si vous avez des suggestions pour améliorer les performances, n'hésitez pas à les partager sur github ou par email. Merci !

Note : email.utils.parsedate_tz semble être plus lent que l'implémentation de feedparser, en terme CPU, c'est relativement comparable.

Grammalecte : avancement

Saturday 2 January 2016 à 00:00

Au printemps dernier avait été lancé une campagne de financement pour grammalecte, un correcteur grammatical et typographique dont la teneur est expliquée notamment sur linuxfr. J'ai cherché à voir l'évolution du projet puisque la campagne s'est terminée avec succès. J'ai pu trouver l'état d'avancement sur le forum.

Malheureusement, il semble que l'auteur n'utilise pas de forge. D'après mes recherches, la dernière beta est la 0.5.0b4, sous forme d'extension pour libreoffice. L'ordre prévu par la campagne fait que le développeur doit se consacrer en premier à l'extension firefox, dont une version est prévue avec la sortie de firefox 44, pour des questions de version de javascript.

Néanmoins, en ouvrant l'extension pour libreoffice, on a accès au parser écrit en python. L'extension étant installée pour moi, je retrouve ce fichier dans

python $HOME/.config/libreoffice/4/user/uno_packages/cache/uno_packages/luq78j49.tmp_/Grammalecte-v0.5.0b4-1.oxt/pythonpath/parser.py

J'en ai fait un alias qui s'appelle grammalecte. Trois commandes sont possibles :

Le résultat est plutôt bon, on peut clairement aller chercher les erreurs dans un fichiers markdown ou latex. Il y aura cependant des erreurs soulevées pour les balises ainsi que, dans mon cas, les apostrophes typographiques puisque je n'utilise que des apostrophes droites. Je n'ai pas vu de moyen pour ne pas faire apparaitre certaines erreurs. Celle des apostrophes est particulièrement handicapante dans mon cas, c'est à dire la différence entre l'apostrophe et l’apostrophe.

Mais c'est là que vient l'option -tf, qui corrige la typographie avant de regarder la grammaire. Ainsi, il suffit de faire

grammalecte -tf -f filename

En somme, il y a déjà de quoi avoir un outil fonctionnel même si une version finale n'est pas encore sortie.

Déploiement de la fibre optique, quel avenir, quels enjeux pour la neutralité ?

Sunday 27 December 2015 à 00:00

Préambule

En définitive, on parle assez peu du réseau internet, je veux dire, le réseau physique. Pourtant, il faut bien s'en soucier, car il est au coeur de la neutralité du réseau. Dans cet article, je me contente de résumer les propos de Benjamin Bayard qu'on ne présente plus. Benjamin donne des conférences très instructives et très profondes, elles sont longues et fouillées, c'est ce que j'apprécie. Mon but est de relayer ici un des messages qu'il porte afin de multiplier les canaux de communication.

Ce qui se passe

Echelles de temps, d'espace et de débit.

Les conséquences

En terme d'espace, le fait que les zones ayant déjà un débit élevé passent à la fibre en priorité fait que la fracture numérique se creuse et continuera à se creuser. Etant donné les volumétries prévues, les régions en ADSL deviendront inhabitables du point de vue de l'internet qu'il s'y trouvera. Pour cette raison, Benjamin parle "d'erreur d'aménagement du territoire". Il faut se rendre compte qu'internet ne sert pas qu'à regarder la télévision mais il est au coeur du développement économique.

Monopole et oligopole... les risques

Si les associations membres de la fédération FDN peuvent fournir de l'internet ADSL, c'est parce qu'ils sont en mesure d'utiliser un réseau existant (dégroupage) et de pouvoir l'utiliser même pour un petit nombre d'abonnées. Avec la fibre, la situation est très différente.

Dans les zones très denses (ex Paris), chaque opérateur déploie le réseau comme il le veut. Il y aura donc plusieurs réseaux de fibres si plusieurs opérateurs sont intéressés. Dans les zones denses, il y a un accord de co-investissement entre les opérateurs, mais la participation ne peut se faire que pour des volumes d'abonnés très importantes. En zone peu dense, c'est de l'investissement public (collectivités territoriales), là où potentiellement ça peut mieux se passer pour des associatifs, mais ça reste vraiment difficile.

Si rien n'est fait, nous allons vers un oligopole (au mieux) ou un monopole orange subventionné par les contribuables 10 milliards d'euros. Bien sûr, l'unicité (ou quasi-unicité) de l'opérateur remet en cause la neutralité du net. En effet, là où il n'y aura qu'un opérateur, la seule solution pour changer de FAI sera de déménager.

Ce que propose Benjamin Bayart est

Références

Le but est de vous motiver à voir par vous même les détails de ce que j'ai résumé.

detox : nettoyer les noms des fichiers

Saturday 26 December 2015 à 00:00

Courte note pour parler de detox. J'imagine que comme moi, vous recevez des fichiers et que ceux-ci ont un nom pas toujours bien formaté. Accents, espaces, caractères spéciaux, c'est une véritable plaie, notamment lorsqu'on utilise la ligne de commande. Detox offre une solution simple à ce problème.

La configuration peut se changer dans /etc/detox mais je préfère utiliser les options fixées à l'aide d'un alias. Dans mon cas, je spécifie l'usage de utf8 :

alias detox='detox -s utf_8'

Et voici une illustration

touch 'Un nom de fichier très compliqué!.txt' && detox Un\ nom\ de\ fichier\ très\ compliqué\!.txt && ls Un*
Un_nom_de_fichier_tres_complique_.txt

On pourrait paramétrer plus que ça, mais ça me suffit. Ma principale motivation est de ne pas être ennuyé en ligne de commande.

Le code est écrit en C, sous licence BSD et la dernière mise à jour date de 2013. Il fonctionne parfaitement (un an d'utilisation pour ma part), je ne m'attend donc pas à des mises à jour de cette version 'beta'.