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

[logilab] Notes suite au 4ème rendez-vous OpenStack à Paris

$
0
0

Ce 4ème rendez-vous s'est déroulé à Paris le 24 juin 2013.

http://www.logilab.org/file/149646/raw/openstack-cloud-software-vertical-small.png

Retours sur l'utilisation d'OpenStack en production par eNovance

Monitoring

Parmi les outils utiles pour surveiller des installation OpenStack on peut citer OpenNMS (traps SNMP...). Cependant, beaucoup d'outils posent des problèmes, notamment dans le cadre de l’arrêt ou de la destruction de machines virtuelles (messages d'erreur non souhaités). Il ne faut pas hésiter à aller directement se renseigner dans la base SQL, c'est souvent le seul moyen d'accéder à certaines infos. C'est aussi un bon moyen pour exécuter correctement certaines opérations qui ne se sont pas déroulées convenablement dans l'interface. L'utilisation possible de SuperNova est recommandée si on utilise plusieurs instances de Nova (multi-environnement).

Problèmes durant les migrations

Citation : "plus on avance en version, mieux la procédure se déroule".

La pire migration a été celle de Diablo vers Essex (problèmes d'IPs fixes qui passent en dynamique, problèmes de droits). Même si tout semble bien se passer sur le moment, faire un redémarrage des nœuds hardware / nœud(s) de contrôle est recommandé pour vérifier que tout fonctionne correctement après le redémarrage.

Si on veut supprimer un nœud qui fait tourner des machines, une commande existe pour ne pas recevoir de nouvelles machines (en cas de panne matérielle par exemple).

Afin d'avoir de la redondance, ne pas utiliser les nœuds hébergeant les machines à plus de 60% permet d'avoir de la place pour héberger des machines déplacées en cas de panne / disparition d'un des nœuds nova-compute.

Au niveau migration, ce qui est fortement documenté pour KVM est la migration avec du stockage partagé ou 'live storage' (le filesystem contenant le disque de la machine est disponible sur la source de la machine et sur la destination). Il existe un second mode, avec migration par 'block' qui permet de migrer des disques s'ils ne sont pas sur un filesystem partagé. Ce second mécanisme a été présent, puis rendu obsolète, mais une nouvelle version semble aujourd'hui fonctionnelle.

À propos de la fonction terminate

La fonction terminate détruit définitivement une machine virtuelle, sans possibilité de retour en arrière. Il n'est pas évident pour une personne qui commence sur OpenStack de le comprendre : elle voit souvent ce bouton comme "juste" éteindre la machine. Pour éviter les gros problèmes (tuer une machine client par erreur et sans retour en arrière possible), il existe 2 solutions :

Pour les admins il existe un paramètre dans la configuration d'une instance :

UPDATE SED disable_terminate '1'

Pour les autres (non-admins), on peut utiliser une fonction de verrouillage (nova lock) d'une machine afin d'éviter le problème. (Les deux utilisent le même mécanisme).

Token

Les tokens servent à authentifier / autoriser une transaction sur les différentes versions d'OpenStack. Il est important que la base qui les stocke soit indexée pour améliorer les performances. Cette base grossit très vite, notamment avec grizzly où les tokens reposent sur un système PKI. Il est utile de faire une sauvegarde régulière de cette base avant de la flusher (permettre à un client de récupérer un token ancien notamment).

Espace de stockage

Ce n'est pas conforme aux bonnes pratiques, mais avoir juste un /var énorme pour le stockage fonctionne bien, notamment quand on a besoin de stocker des snapshots de machines Windows ou de grosses machines.

Ceph

https://www.logilab.org/file/149647/raw/logo.png

Spécial citation: "c'est du libre, du vrai".

Ceph est un projet permettant d'avoir un stockage redondant sur plusieurs machines, et offrant trois opérations principales : get, put, delete. Le système repose sur l'utilisation par le client d'une carte, fournie par les serveurs ceph, qui lui permet de trouver et de récupérer facilement un objet stocké.

Le pilote de stockage virtualisé est parfaitement fonctionnel et tourne déjà en production. Ce pilote permet d'utiliser Ceph comme périphérique de stockage pour des machines virtuelles. Il existe un remplacement (Rados Gateway Daemon) qui implémente l'interface swift pour OpenStack et permet d'utiliser Ceph en backend. Ce pilote est qualifié de stable.

Le pilote noyau (librbd) permettant de voir du stockage Ceph comme des disques est encore en développement, mais devrait fonctionner à peu près correctement si le noyau est >= 3.8 (3.10 conseillé).

Performances

En écriture, une division par deux des performances est à prévoir par rapport à une utilisation directe des disques (il faut que les N copies ait été stockées avant de valider la transaction). En lecture, Ceph est plus rapide vu l'agrégation possible des ressources de stockage.

Traduction de Openstack

La communauté cherche des gens motivés pour traduire le texte des différents outils openstack.

Neutron (anciennement Quantum)

Pas mal de travail en cours, la version Havana devrait avoir la capacité de passer mieux à l'échelle et permettre la haute disponibilité (ça fonctionne toujours même quand une des machines qui hébergent le service plante) pour tout ce qui est DHCP / L3.

Sur l'organisation d'une communauté OpenStack en France

Différents acteurs cherchent actuellement à se regrouper, mais rien n'est encore décidé.


[logilab] About salt-ami-cloud-builder

$
0
0

What

At Logilab we are big fans of SaltStack, we use it quite extensivelly to centralize, configure and automate deployments.

http://www.logilab.org/file/145398/raw/SaltStack-Logo.png

We've talked on this blog about how to build a debian AMI "by hand" and we wanted to automate this fully. Hence the salt way seemed to be the obvious way to go.

So we wrote salt-ami-cloud-builder. It is mainly glue between existing pieces of software that we use and like. If you already have some definition of a type of host that you provision using salt-stack, salt-ami-cloud-builder should be able to generate the corresponding AMI.

http://www.logilab.org/file/145397/raw/open-stack-cloud-computing-logo-2.png

Why

Building a Debian based OpenStack private cloud using salt made us realize that we needed a way to generate various flavours of AMIs for the following reasons:

  • Some of our openstack users need "preconfigured" AMIs (for example a Debian system with Postgres 9.1 and the appropriate Python bindings) without doing the modifications by hand or waiting for an automated script to do the job at AMI boot time.
  • Some cloud use cases require that you boot many (hundreds for instance) machines with the same configuration. While tools like salt automate the job, waiting while the same download and install takes place hundreds of times is a waste of resources. If the modifications have already been integrated into a specialized ami, you save a lot of computing time. And especially in the amazon (or other pay-per-use cloud infrastructures), these resources are not free.
  • Sometimes one needs to repeat a computation on an instance with the very same packages and input files, possibly years after the first run. Freezing packages and files in one preconfigured AMI helps this a lot. When relying only on a salt configuration the installed packages may not be (exactly) the same from one run to the other.

Relation to other projects

While multiple tools like build-debian-cloud exist, their objective is to build a vanilla AMI from scratch. The salt-ami-cloud-builder starts from such vanilla AMIs to create variations. Other tools like salt-cloud focus instead on the boot phase of the deployment of (multiple) machines.

Chef & Puppet do the same job as Salt, however salt being already extensively deployed at Logilab, we continue to build on it.

Get it now !

Grab the code here: http://hg.logilab.org/master/salt-ami-cloud-builder

The project page is http://www.logilab.org/project/salt-ami-cloud-builder

The docs can be read here: http://docs.logilab.org/salt-ami-cloud-builder

We hope you find it useful. Bug reports and contributions are welcome.

The logilab-salt-ami-cloud-builder team :)

[Biologeek] Etalab et CoDesign

$
0
0

Si j'étais très critique sur l'OpenData avant-hier, ce que propose actuellement Etalab à travers ses ateliers de CoDesign est très intéressant. J'ai eu la chance d'assister à l'un d'entre eux lors de l'OpenDataWeek à la suite de celui que j'animais sur les API.

L'objectif est de remettre en question tout ce qu'il est possible de faire aujourd'hui sur data.gouv.fr afin d'obtenir une plateforme qui réponde mieux aux besoins et attentes des citoyens et développeurs en leur demandant leur avis. Pour cela des ateliers réunissants toutes les personnes voulant bien se joindre à l'expérience sont organisés dans toute la France et permettent de réunir dans la même salle les producteurs, les réutilisateurs, les animateurs et les consommateurs de données.

Beaucoup d'échanges intéressants se sont produits durant cet atelier animé par le trio Charles Ruelle, Simon Chignard et Charles Nepote dont le résumé sera publié ici-même. Au vu de toutes les suggestions proposées lors d'un unique atelier, la tâche de faire la synthèse des différents ateliers pour prioriser ce qu'il faudrait faire évoluer sur la plateforme ne va pas être aisée. Rendre cette feuille de route publique par contre permettrait de limiter grandement les frustrations des contributeurs impatients :-).

[afpyro] AFPyro à Bruxelles (BE) - vendredi 28 Juin

[hautefeuille] Les meilleures adresses pour se fournir en électronique

[hautefeuille] Kismet et la source dont on ne se souvient jamais

$
0
0

kismet

Editez :

/etc/kismet/kismet.conf

Cherchez la ligne qui concerne la source.

  • Carte Alfa

    source = rt8180, wlan0, ALFA

  • Carte Ralink

    source = rt73, rausb0, Ralink

  • Carte Realtek

    source = rt8180, wlan0, RTL8187

  • Carte Atheros

    source = madwifi_g, wifi0, Atheros

  • Carte Zydas

    source = zd1211, eth0, ZyDAS

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

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

[cubicweb] What's new in CubicWeb 3.17

$
0
0

What's new in CubicWeb 3.17?

New functionalities

  • add a command to compare db schema and file system schema (see #464991)
  • Add CubicWebRequestBase.content with the content of the HTTP request (see #2742453)
  • Add directive bookmark to ReST rendering (see #2545595)
  • Allow user defined final type (see #124342)

API changes

  • drop typed_eid() in favour of int() (see #2742462)
  • The SIOC views and adapters have been removed from CubicWeb and moved to the sioc cube.
  • The web page embedding views and adapters have been removed from CubicWeb and moved to the embed cube.
  • The email sending views and controllers have been removed from CubicWeb and moved to the massmailing cube.
  • RenderAndSendNotificationView is deprecated in favor of ActualNotificationOp the new operation uses the more efficient data idiom.
  • Looping task can now have an interval <= 0. Negative interval disable the looping task entirely.
  • We now serve html instead of xhtml. (see #2065651)

Deprecation

  • ldapuser has been deprecated. It will be removed in a future version. If you are still using ldapuser switch to ldapfeed NOW!
  • hijack_user has been deprecated. It will be dropped soon.

Deprecated Code Drops

  • The progress views and adapters have been removed from CubicWeb. These classes were deprecated since 3.14.0. They are still available in the iprogress cube.
  • The part of the API deprecated since 3.7 was dropped.

[logilab] Compte rendu PGDay France 2013 (Nantes) - partie 1/2

$
0
0

Quelques personnes de Logilab ont assisté aux PGDay 2013 à Nantes. Voici quelques points qui nous ont marqués.

http://www.cubicweb.org/file/2932005/raw/hdr_left.png

Gestion de la capacité des ressources mémoire d'un serveur PostgreSQL par Cédric Villemain

Cédric Villemain nous a exposé plusieurs pistes d'investigation de la gestion mémoire de Postgresql.

On peut employer des outils Linux tels que vmstat, pmap, meminfo, numactl, mais aussi des outils spécifiques à Postgresql, tels que pg_stat (hit ratio), pg_buffercache (audit de la mémoire cache), pgfincore (audit du cache de l'OS).

Il faut mettre des sondes sur les tables et indexes critiques de manière à avoir une idée du fonctionnement "normal" pour ensuite détecter le fonctionnement "anormal". À Logilab, nous utilisons beaucoup munin, pour lequel plusieurs greffons Postgresql sont disponibles : munin pg plugins et pymunin.

Pour aller plus loin voir le support de présentation (1).

Les nouveautés de PostgreSQL 9.3 par Damien Clochard

Damien Clochard a fait une très synthétique présentation des fonctionnalités de la nouvelle version de PostgreSQL 9.3. Le cycle de release de Postgresql dure 1 an, donc la periode de beta est courte, il faut que la communauté soit impliquée pour tester rapidement. Damien en profite pour chanter les louanges de PostgreSQL, qui est, selon lui, le SGBD le plus dynamique au monde: 1 version majeure par an, 4-5 versions mineures par an, et un support de 5 ans des versions majeures.

Actuellement, cela signifie que 5 versions majeures sont maintenues (notamment en terme de sécurité) en parallèle : 8.4, 9.0, 9.1, 9.2, 9.3beta1. Notons donc que la version 9.3 qui sort bientôt sera donc supportée jusqu'à 2018.

http://www.logilab.org/file/150442/raw/elephant.png

Pour les nouveautés, difficiles à résumer, notons néanmoins :

  • des gains de performance,
  • des verrous possibles sur les clés étrangères,
  • une gestion mémoire plus fine,
  • la possibilité de faire des pg_dump en parallèle (--jobs),
  • scénarios supplémentaires de réplication,
  • possibilité de "bascule rapide" en architecture répliquée,
  • facilitation de mise en place d'un serveur clone (génération automatique du fichier recovery.conf),
  • vue matérialisées,
  • opérateurs supplémentaires pour JSON (citation "MongoDB avec la tranquilité (ACID)"),
  • les requètes LATERAL
  • extensibilité avec des processus supplémentaires permettant des opérations de maintenance, de supervision ou d'optimisation,
  • des backends supplémentaires pour les "Foreign Data Wrappers" (introduits en 9.1),
  • possibilité de séparer le fichier de configuration en plusieurs sous-fichiers (utile pour une pilotage par SaltStack par exemple).

Damien en a profité pour parler un peu des points forts prévus pour la version 9.4 :

  • simplification de la montée en charge,
  • réplication logique (répliquer une seule table par exemple),
  • parallélisation des requêtes (multi-coeurs),
  • stockages internes

En bref, concis et alléchant. Vivement qu'on ait cette version en production.

En attendant on a profité pour l'installer à partir des entrepôts Debian gérés par la communauté Postgresql.

Pour aller plus loin voir le support de présentation (2).

"Ma base de données tiendrait-elle la charge ?" par Philippe Beaudouin

Philippe Beaudoin a utilisé pour cette analyse une combinaison de pgbench (injection), et la table pg_stat_statements qui collecte les statistiques sur l'utilisation mémoire des requêtes : produit une table avec les query, nombre d'appels, temps passé, nombre de lignes, etc.

L'idée générale est d'établir un profil de charge transactionnel sur la production pour pouvoir comparer avec la pré-production ou la future plateforme.

Pour éviter de devoir copier les données de production (lent, problème de confidentialité, etc), il est conseillé d'utiliser "generate_series" pour remplir la base de données de données de test.

pgbench utilise des scenario TPC-B (Transaction Processing Performance Council Benchmarks) Pour chaque scénario (4 scénarios dans son exemple) on a une cible TPS (transaction par secondes). Il recommande de faire attention à ne pas modifier considérablement la taille de la base avec les scénarios (ex. trop de DELETE, ou trop d'INSERTs).

Un astuce pour charger le cache linux

find <files> -exec dd if='{}' of=/dev/null\;

Si on ne sait pas quels fichiers charger, on peut utiliser pg_relation_filepath(oid) FROM pg_class where relname like 'tbl%' pour trouver en SQL quels fichiers contiennent les données.

Nous avons demandé si un outil de type GOR (flux UDP de la production vers la pre-production ou le serveur de développement pour les requêtes HTTP) existait pour Postgresql.

http://www.logilab.org/file/150448/raw/gor.png

Réponse : Tsung contient un mode proxy qui permet d'enregistrer la production, ensuite de la rejouer en pre-prod, mais pas en mode live. À priori il serait possible de combiner plusieurs outils existant pour faire cela (pgShark ?). La problématique n'est pas simple notamment lorsque les bases de données divergent (index, series, etc).

Pour aller plus loin voir le support de présentation (3).

PostGIS 2.x et au delà par Hugo Mercier

Nous avons trouvé la présentation réussie. Elle introduisait les concepts et les nouveautés de PostGIS 2.x. Ayant intégré des fonctionnalités de PostGIS à CubicWeb et travaillant un peu sur la visualisation en WebGL de données stockées dans CubicWeb+Postgresql, nous avons pu réfléchir à des possibilités de délégation de traitement à la base de donnée.

http://www.logilab.org/file/150441/raw/Screenshot%20from%202013-07-01%2010%3A30%3A00.png

Nous nous sommes aussi interrogés sur le passage à l'échelle d'applications web qui font de l'affichage de données géographiques, pour éviter d'envoyer au navigateurs un volume de données trop important (geoJSON ou autre). Il y aurait des architectures possible avec une délégation à Postgresql du travail de niveaux de zoom sur des données géographiques.

Pour aller plus loin voir le support de présentation.

[logilab] Compte rendu PGDay France 2013 (Nantes) - partie 2/2

$
0
0

Ora2Pg: Migration à Grande Vitesse par Gilles Darold

L'outil ora2pg permet de jouer une migration d'Oracle à Postgresql. Malgré notre absence de besoin de ce type de migration, cette présentation fut l'occasion de parler d'optimisation diverses qui peuvent être appliqué à des imports massifs tel que nous pouvons en pratiquer à Logilab.

Par exemple :

  • utilisation prioritaire de COPY plutôt que INSERT,
  • supprimer les indexes/contraintes/triggers/sequences (les créer en fin d'import),
  • maintenir un _work_mem_ élevé (pour la création des index et contraintes),
  • augmenter les checkpoin_segments (>64/1Gb).

Quelques réglages systèmes peuvent être mis en place le temps du chargement (on les rebranche une fois que le serveur passe en "production") :

  • fsync=off
  • full_page_writes=off
  • synchronous_commit=off
  • WAL (Write Ahead Log) sur des disques SSD
  • kernel : vm.dirty_background_ratio = 1
  • kernel : vm.dirty_ratio = 2

Coté Postresql, les paramètres suivants sont probablement à modifier (les chiffres sont à titre d'exemple, la configuration matérielle est bien particulière, par exemple 64G de RAM, voir les diapos pour le détail):

  • shared_buffers = 10G
  • maintenacen_work_mem = 2G
  • checkpoint_segments = 61
  • checkpoint_completion_target = 0.9
  • wal_level = minimal
  • archive_mode = off
  • wal_buffer = 32 Mo
  • désactiver les logs
http://ora2pg.darold.net/ora2pg-logo.png

Pour aller plus loin voir le support de présentation (5).

Vers le Peta Byte avec PostgreSQL par Dimitri Fontaine

Dimitri Fontaine a admirablement bien traité cette question complexe qu'est la montée à l'échelle en terme de volume de données. Son approche fut très didactique, avec, à chaque concept, un rappel de ce dont il s'agisait. Par exemple, parlant du MVCC, il explique qu'il s'agit de plusieurs définitions en parallèle d'une même ligne. Ensuite on décide avec VACUUM quelle version doit être visible par tout le monde. Par défaut AUTOVACCUM se déclenche quand 20% des données ont changé.

Face aux difficultés et aux inconvénients de stocker la totalité d'une PetaByte sur un seul serveur, Dimitri Fontaine a évoqué les solutions possible en terme d'architecture distribuée pour permettre de stocker ce PetaByte sur plusieurs serveurs répartis. La "Bi-Directional Replication" (qui sera dispo dans le futur) permetterait d'avoir plusieurs bases SQL qui séparément stockent une partie des données (cf EVENT TRIGGERS). Un approche complémentaire serait d'utiliser plproxy qui par des procédures stockées permet de répartir les requêtes sur plusieurs serveurs.

http://www.logilab.org/file/150419/raw/Screenshot%20from%202013-07-01%2010%3A25%3A46.png

Finalement, un point qui nous a paru pertinent : il a parlé de haute disponibilité et des flous techniques qui entourent le sujet. Il faut bien faire la différence entre la disponibilité des données et du service. Par exemple, en WARM STANDBY les données sont disponibles mais il faut redémarrer Postgresql pour fournir le service alors que en HOT STANDBY les données sont disponibles et le serveur peut fournir les services.

Pour aller plus loin voir le support de présentation (6).

Comprendre EXPLAIN par Guillaume Lelarge

Utiliser EXPLAIN permet de débugger l’exécution d'une requête SQL ou de l'optimiser. On touche assez rapidement au fonctionnement interne de Postgresql qui est relativement bien documentés. Guillaume Lelarge a donc, à l'aide de nombreux exemples, présenté des mécanismes plutôt bas niveau de Postgresql.

Notons entre autres les différents types de scans dont les noms sont relativement explicites :

Dans la même veine, les types de tris :

  • external sort (sur disque),
  • quicksort (en mémoire).

Mais aussi, prenez le temps de lire les exemples sur son support de présentation (7)

Conclusion

https://www.pgday.fr/_media/pgfr2.png

PGDay.fr est une conférence que nous pouvons vivement vous recommander, proposant un savant mélange des différentes questions auxquelles nous sommes confrontées lorsque nous travaillons avec des bases de données. Aussi bien en tant qu'administrateur système, développeur, ou utilisateur de SQL. Il va sans dire que le niveau technique était très pointu. Les présentations restaient pourtant accessibles. Les orateurs et organisateurs étaient disponibles pour des interactions, permettant de prolonger la réflexion et les discussions au delà des présentations.

Nous envisageons d'ores et déjà d'aller à l'édition 2014! À l'année prochaine...

http://www.logilab.org/file/150100/raw/2e1ax_default_entry_postgresql.jpg

[carlchenet] Vrac de mini-messages n°7 : Roundcube et Iceweasel

$
0
0
Suivez-moi aussi sur Identi.ca ou sur Twitter. Comme chaque semaine, voici les dents/tweets intéressants de la semaine dernière que j’ai publiés sur Identi.ca ou sur Twitter, revus et augmentés d’éventuels observations et commentaires mûris au cours de la semaine passée. Très léger contenu car on arrive en juillet et le besoin de vacances se fait sentir. Mais c’est toujours bon à prendre à mon avis.  Au menu […]

[Biologeek] Open-Source conviviale

$
0
0

Être un agent de changement, c'est avant même d'être un « convertisseur » , être quelqu'un qui fait exister concrètement les changements auxquels il croit et qui trouve important de les partager. À ce sujet, l'autogestion et la convivialité, par exemple, me paraissent les caractéristiques essentielles d'une nouvelle société déjà en gestation et dont nous devrions favoriser l'émergence. Dans cette société, la production et la consommation aliénantes, de même que la compétition effrénée et destructrice, auront fait place au partage, à la coopération, à la tendresse, au respect de l'environnement, à l'expression de soi et de ses ressources propres, au respect de la vie.

Ces écoles qui rendent les enfants heureux, Charles Caouette au sujet de l'école primaire alternative Jonathan.

Pour poursuivre mes déambulations conviviales, je me suis récemment trouvé confronté à un projet Open-Source dont l'installation était complexe et la documentation insuffisante — cela arrive trop souvent. Je me suis mis à réfléchir à un meilleur moyen d'encourager la participation à travers des règles simples :

  • automatiser une première installation pour limiter le nombre d'actions nécessaires au développeur ;
  • décrire précisément les paramètres propres au système de déploiement s'il y en a ;
  • documenter les objectifs en cours et la vision du produit ;
  • documenter les non-objectifs qui ont déjà été discutés ;
  • lister des actions facilement réalisables pour un nouveau venu afin de rentrer sur le projet.

Dans l'idéal, tout ceci tient dans un simple fichier README concis. L'Open-Source ce n'est pas seulement rendre du code accessible mais encourager les échanges autour de ce code.

[Biologeek] Monopole décentralisé

$
0
0

How foolish of us, therefore, that we ended up using Google Reader exclusively to power all our RSS consumption. We took something that was inherently decentralised and we locked it up into one provider. And now that provider is going to screw us over.

Battle for the planet of the APIs, Jeremy Keith

Remplacez Google Reader par Github puis RSS par Git et vous arrivez exactement à la même situation. Une entreprise — même avec une image cool — n'aura jamais la même pérennité qu'un standard implémenté de manière distribuée. Le confort de la centralisation a un prix, celui de l'obsolescence choisie.

[Biologeek] Communautés et liens

$
0
0

Dans la même journée, j'ai lu :

Dans un contexte culturel de dépersonnalisation, quand l'identité flageole, quand la fierté d'appartenir s'estompe, on comprend le retour des nationalismes qui offrent un « Nous » comme prothèse aux « Moi » fragilisés. Quand ce « Nous » raconte l'histoire d'un pays ou d'une région, c'est un progrès, il renforce l'identité du « On » anonyme des bonhommes-masse. Mais quand ce « Nous » se fait les griffes sur le dos d'un autre, d'un voisin, d'un étranger ou d'un différent, ce mécanisme classique du sentiment d'appartenance provoque des tragédies haineuses dont la guerre est l'expression logique. Le nationalisme est une religiosité profane, amoureuse et expiatoire qui renforce le délicieux sentiment d'appartenance au détriment d'un bouc émissaire.

Les nourritures affectives, Boris Cyrulnik.

Puis dans un billet que je vous invite à aller lire dans son intégralité :

Les plateformes offrent une réponse à deux sortes de misère, affective ou pécuniaire. Je n'en démords pas, le collaboratif est une réponse au dépérissement des populations. Et vous n'avez rien inventé: le collaboratif, c'est l'économie sociale et solidaire, déjà structuré comme un vrai marché.

Ce qui est frappant, c'est de constater que toute cette économie se développe contre le système financier, sans en combattre les causes, puisque personne ne veut prendre cette question à bras le corps. Contre le rigidité du système, contre des communautés d'intérêts qui lobbyent pour leur propre compte. Eriger des communautés contre des communautés, cela renvoie à de sombres heures de l'Histoire, et je n'aime pas cela.

[…]

Si vous voulez hacker le système, il serait peut-être intéressant de ne pas se structurer en communautés (le privé contre le public, les retraités contre les actifs, les lobbys contre les lobbys) mais au contraire refaire du lien ensemble, commun et pour, et non privé, communautaire, et contre.

Fight the Power, Julien Breitfeld

Pour rebondir sur (attention à ne pas lire si vous êtes proche de la dépression, ou alors jusqu'au bout) :

Tout ce qui m’attache au monde, tous les liens qui me constituent, toutes les forces qui me peuplent ne tissent pas une identité, comme on m’incite à la brandir, mais une existence, singulière, commune, vivante, et d’où émerge par endroits, par moments, cet être qui dit « je ». Notre sentiment d’inconsistance n’est que l’effet de cette bête croyance dans la permanence du Moi, et du peu de soin que nous accordons à ce qui nous fait.

L’insurrection qui vient (PDF)

Parlons-en de ce lien. Est-ce vraiment lui qui nous évite la guerre/révolte ? Est-ce lui qui nous empêche de sombrer dans la barbarie ? Avez-vous davantage de liens physiques ou numériques ? Quelle est leur nature ?

Les communautés servent de soupape à la rébellion, tant qu'une communauté réalise qu'il y a pire situation que la sienne elle essaye de conserver son avantage, son petit confort relatif. Le fait d'avoir des informations à une échelle jamais atteinte accentue cette retenue : « Tu as vu la situation en Grèce/Turquie/Egypte ? Heureusement que l'on vit en France ! » Mais si certaines communautés servent à se rassurer et à se conforter, d'autres permettent d'aller de l'avant.

Je ne voudrais pas faire de webisme comme le font Pascal Gaillard au sujet de la connaissance, Bernard Stiegler au sujet des logiciels libres ou Jeremy Rifkin avec les réseaux énergétiques mais je dois reconnaître que le Web — qui se définit par ses liens — a quelque chose à voir là-dedans aussi. Les liens ne sont pas de même nature mais au final ne suis-je pas plus proche d'une personne avec laquelle j'échange au quotidien sur internet que d'un membre de ma famille que je vois une fois par an ? Peut-être que ces substituts de liens sociaux physiques (et je n'aime pas différencier le physique/numérique dans ce domaine car ils sont liés) sont en passe de devenir la norme ? Beaucoup de communautés en ligne que je connais se retrouvent à un moment ou à un autre pour échanger, pour créer, pour repousser leurs limites, ensembles.

On y trouve des trolls, de l'aigreur, du cynisme aussi. Des moyens de se remettre en question — à condition d'avoir le bon dosage, celui qui ne découragera pas les anciens, celui qui ne fera pas fuir les nouveaux venus — et de s'améliorer en continu. Ce que je retiens de ces 15 dernières années après avoir évolué dans plusieurs communautés en ligne c'est le message d'espoir et l'énergie qui sont véhiculés. Ces communautés participent à ma définition car une identité se tisse, comme une bonne page Web.

[carlchenet] Accéder simplement et rapidement au code source d’un paquet Debian : debsources et sources.debian.net

$
0
0
Suivez-moi aussi sur Identi.ca ou sur Twitter. Le manque à combler Il peut être intéressant d’accéder simplement et rapidement au code source d’un paquet Debian et un large public de curieux et de développeurs pourraient y trouver un intérêt : que ce soit pour le développeur amont d’un logiciel qui souhaite voir très rapidement quelles sont les versions présentes […]

[carlchenet] Vrac de mini-messages n°8 : pypy, mariadb, debsources, passage à l’échelle, python-memcache et pylibmc

$
0
0
Suivez-moi aussi sur Identi.ca ou sur Twitter. Comme chaque semaine, voici les dents/tweets intéressants de la semaine dernière que j’ai publiés sur Identi.ca ou sur Twitter, revus et augmentés d’éventuels  commentaires et observations mûris au cours de la semaine passée. Au menu : PyPy, MariaDB, Debsources, passage à l’échelle d’une architecture système à base de Logiciels Libres, python-memcache et pylibmc. python-memcache 1.53, le binding #Python pour interagir avec […]

[afpy.org] Un hackathon à Paris ?

$
0
0
L'AFPy envisage d'organiser un hackathon à Paris.

[noirbizarre] JavaScript avec Django

$
0
0

Django est initialement conçu pour réaliser des sites et applications web avec le pattern MVT (Modèle-Vue-Template). Loin de moi l’idée de faire ici un cours sur le design pattern ou de relancer l’éternel débat MVC-MVT-… Le point que je veux soulever est que Django est conçu pour gérer la majorité de la cinématique utilisateur côté serveur.

Le problème est qu’aujourd’hui les techniques évoluent et nous sommes amenés à déplacer une bonne partie de cette cinématique côté client, dans le navigateur, avec notamment l’utilisation du JavaScript.

Cette évolution est très bénéfique car elle a (normalement) les conséquences suivantes:

  • réduction de la charge serveur
  • réduction du volume des échanges client-serveur
  • amélioration de la gestion du cache
  • amélioration de l’expérience utilisateur
  • retour massif vers du stateless et les fondamentaux du web

J’en oublie probablement, mais l’essentiel est de comprendre que cela modifie profondement les échanges client-serveur et, bien maitrisé, améliore globalement le fonctionnement d’un site ou d’une application.

Pour nous, utilisateurs de Django, cela pose quelques nouvelles problèmatiques comme:

  • comment gérer proprement les dépendances JavaScript ?
  • comment éviter de dupliquer trop de code (gestion des URLs, templates, localisation, …) ?
  • comment tester le code JavaScript ?
  • comment optimiser le code client (JavaScript, CSS, …) ?

Je n’ai pas la prétention de pouvoir fournir une réponse universelle et exhaustive à toutes ces problématiques, mais je peux fournir quelques recettes que j’utilise.

Éviter la duplication des mécaniques de Django

Django fournis certains mécanismes relativement pratiques et, dans la philosophie DRY, il est intéressant d’en profiter proprement côté client dans le code JavaScript.

C’est là qu’intervient Django.js qui fourni les outils suivants (entre autres):

  • Résolution des URLs
  • Accès à certaines variables du context
  • Facilitation de l’internationalisation
  • Facilitation de l’utilisation de jQuery (CSRF)
  • Facilitation de l’écriture de templates (templates tags js, css, …)

Ainsi, Django.js permet d’écrire:

  • template.html:

    {% load js %}
    {% django_js %}
    {% js "js/m-lib.js" %}
    
  • my-lib.js:

    $(function() {
        console.log(
            Django.url('my-url', arg1),
            Django.context.STATIC_URL,
            Django.context.LANGUAGE_CODE,
            Django.static('test.json'),
            Django.user.username,
            gettext('a localized text')
        );
    });
    

J’utilise cette libraire de mon cru sur plusieurs projets, professionnels et personnels, depuis plus d’un an maintenant et cela me simplifie considérablement le développement JavaScript avec Django. Je la maintient activement et essaie de la faire évoluer pour couvrir un maximum de problématiques récurrentes dans l’utilisation de JavaScript avec Django.

Gerer ses dépendances JavaScript

Fini l’installation manuelle des dépendances JavaScript, maintenant il y a Bower ! (entres autres)

Comme toutes les executables JavaScript fournies pour Node.js, je l’installe globalement avec npm:

sudo npm install -g bower

Plutôt que de distribuer les dépendances JavaScript dans chacun de mes projets, j’utilise Bower et je distribue 2 fichiers:

  • un fichier .bowerrc spécifiant où télécharger les dépendances
  • un fichier bower.json (anciennement component.json) spécifiant la liste des dépendances.

Pour un projet agencé comme suit:

├─ myproject
│  ├─ myapp
│  │  ├─ __init__.py
│  │  └─ models.py
│  ├─ __init__.py
│  ├─ static
│  │  ├─ bower
│  │  ├─ css
│  │  ├─ images
│  │  ├─ js
│  │  └─ less
│  ├─ settings.py
│  ├─ urls.py
│  └─ wsgy.py
├─ .bowerrc
├─ bower.json
├─ manage.py
├─ MANIFEST.in
└─ setup.pip

J’indique à Bower d’utiliser le repertoire myproject/static/bower pour télécharger les dépendances. Je crée donc le fichier .bowerrc comme suit:

{
    "directory": "./myproject/static/bower/"
}

Et je n’ai plus qu’à utiliser Bower normalement:

$ bower install jquery bootstrap font-awesome moment handlebars

Toutes mes dépendances sont automatiquement ajoutées au fichier bower.json qui est créé automatiquement s’il n’existait pas:

{
    "name": "myproject",
    "version": "1.0.0",
    "dependencies": {
        "jquery": "2.0.2",
        "handlebars": "~1.0.0",
        "bootstrap": "~2.3.2",
        "font-awesome": "~3.2.0",
        "moment": "~2.0.0"
    }
}

Mes ressources sont accessibles sous {STATIC_URL}/bower/.

Toutes les opérations de Bower fonctionne normalement:

# Installation de dépendances
$ bower install jquery
# Installation de toutes les dépendances listées
$ bower install
# Mise à jour de toutes les dépendances
$ bower update
# Recherche
$ bower search

Je vous invite à lire la documentation de Bower pour plus d’informations.

Avec cette méthode je ne distribue plus les dépendances JavaScript avec les sources, je les liste avec leur version, comme je le ferait pour les dépendances Python avec un fichier de requirements pour pip.

Le seul point noir de cette méthode est qu’il ne faut surtout pas inclure tout le répertoire myproject/static/bower au packaging de l’application Django sous peine d’ajouter quelques dizaines voir centaines de megaoctets pour rien. Il faut lister explicitement les fichiers utilisés pour chaque dépendance dans le fichier MANIFEST.in:

include setup.py README.rst MANIFEST.in

recursive-include myproject *
recursive-include requirements *

prune myproject/static/bower
recursive-include myproject/static/components/bootstrap *.less
recursive-include myproject/static/components/bootstrap/js *.js
recursive-include myproject/static/components/font-awesome/less *.less
recursive-include myproject/static/components/font-awesome/font *
include myproject/static/components/handlebars/handlebars.js
recursive-include myproject/static/components/jquery *.js
recursive-include myproject/static/components/moment/min *.js

global-exclude *~ *.egg *.pyc

De plus, cela évitera de polluer votre répertoire STATIC_ROOT lors du collectstatic, en particulier si vous avez des post-processors type compresseur CSS/JS (cf. Optimiser ses livrables).

Si vous voulez maîtriser vos dépendances à l’exécution, il faut regarder du côté de RequireJS (par exemple), mais je ne détaillerais pas ici son usage.

Tester son code JavaScript

Django.js fourni des outils permettant de faciliter l’exécution de tests JavaScript notamment en utilisant LiveServerTestCase, introduit par Django 1.4, qui permet de démarrer un serveur de test pour chaque exécution de test.

Il fourni:

  • des vues pour afficher ses tests Jasmine ou QUnit
  • des classes de test et mixins pour automatiser leur exécution avec une gestion d’erreur

Voici un exemple permettant d’afficher un runner de test Jasmine sur l’url /tests en mode DEBUG ou pendant les tests.

  • myproject/views.py

    from djangojs.views import JasmineView
    
    class JsTestsView(JasmineView):
        js_files = (
            'js/lib/my-lib.js',
            'js/test/*.specs.js',
            'js/other/specs.*.js',
        )
    
  • myproject/urls.py

    if settings.DEBUG or settings.TESTING:
        from myproject.views import JsTestsView
    
        urlpatterns += patterns('',
            url(r'^tests$', JsTestsView.as_view(), name='js-tests'),
        )
    

La classe JasmineView fourni de base un template de runner et va injecter elle même tous les fichiers *.js spécifiés. Il est possible d’étendre ce template, voir d’utiliser son propre template.

Maintenant, pour que ces tests soient exécutés en même temps que les autres tests de l’application, il suffit d’utiliser la classe JsTestCase et le mixin JasmineSuite:

from djangojs.runners import JsTestCase
from djangojs.runners import JasmineSuite


class JasminTests(JasmineSuite, JsTestCase):
    title = 'My Javascript test suite'
    url_name = 'js-tests'

La suite de tests JavaScript sera executant comme les autres par la commande:

$ python manage.py test myproject

Cette fonctionnalité utilise PhantomJS qui doit être installé au préalable.

Pour l’instant, Django.js s’interface avec Jasmine et QUnit uniquement mais d’autres frameworks feront leur apparition.

Cette solution fonctionne très bien, mais il est possible que vous ayez des besoins bien plus poussés en JavaScript. Dans ce cas là, ne pas réinventer la roue: il faut peut-être se tourner vers les outils JavaScript existants, tels que Grunt.

Optimiser ses livrables

Faire du JavaScript pour fournir une meilleur expérience utilisateur c’est bien beau, encore faut-il que l’utilisateur puisse charger tous vos livrables en un temps acceptable.

C’est là qu’interviennent django-require et django-pipeline pour compiler et compresser JavaScript, Less, SassCSS

django-pipeline vous permet de tout compiler et compresser en “bundles” en les déclarant dans votre fichier settings.py.

django-require quant à lui vous servira si vous utilisez RequireJS.

Personnellement, je combine les deux:

  • django-pipeline pour:
    • compiler le Less en CSS
    • agréger et compresser les CSS
    • aggréger et compresser le javascript non chargé par RequireJS
    • compiler et injecter mes templates (Handlebars) dans les vues
  • django-require pour créer des bundles avec AlmondJS.

django-pipeline

J’utilise django-pipeline pour gérer tout ce qui est pré-compilation (Less), compilation, compression…

Par défaut, django-pipeline utilise yuglify pour la compression des CSS et du JavaScript et Less pour la compilation des fichiers .less. Tous deux sont installables par npm:

$ sudo npm install -g less yuglify

Il est possible d’utiliser SlimIt pour compresser le JavaScript. Il est écrit en Python et a de très bon taux de compression. Il est installable simplement avec pip:

$ pip install slimit

Voici un exemple de configuration de django-pipeline dans un fichier settings.py:

STATICFILES_STORAGE = 'pipeline.storage.PipelineStorage'

PIPELINE_COMPILERS = (
    'pipeline.compilers.less.LessCompiler',
)

PIPELINE_CSS = {
    'style': {
        'source_filenames': (
            'less/style.less',
            'bower/a-component/styles.css',
        ),
        'output_filename': 'css/style.min.css',
    },
}

PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.slimit.SlimItCompressor'

PIPELINE_JS = {
    'modernizr': {
        'source_filenames': (
            'bower/modernizr/modernizr.js',
            'bower/respond/respond.src.js',
        ),
        'output_filename': 'bower/modernizr.min.js',
    },
    'my-lib': {
        'source_filenames': (
            'bower/jquery/jquery.js',
            'js/my-lib.js',
        ),
        'output_filename': 'js/my-lib.min.js',
    },
}

Dans cette configuration, nous utilisons:

  • Less pour compiler nos feuilles de style
  • yuglify (par défaut) pour compresser le CSS (y compris celui produit par Less)
  • SlimIt pour compresser le JavaScript

Nous aurons dans nos templates les valeurs suivantes pour accéder aux fichiers produits par django-pipeline:

{% compressed_css 'style' %}
{% compressed_js 'modernizr' %}
{% compressed_js 'my-lib' %}

En mode debug, nous aurons accès aux fichiers non compressés, tandis qu’en production nous n’aurons plus qu’un seul fichier compressé pour chaque bundle.

Couplé avec Bower, cela permet de travailler facilement avec des versions non compressées.

django-require

django-require permet de compresser ses modules RequireJS avec RequireJS Optimizer ou bien AlmondJS.

Considérons un projet avec deux modules, main.js et main-lite.js:

└─ myproject
   ├─ __init__.py
   ├─ static
   │  ├─ bower
   │  ├─ css
   │  ├─ images
   │  ├─ js
   │  │  ├─ main.js
   │  │  └─ main-lite.js
   │  └─ less
   ├─ settings.py
   ├─ urls.py
   └─ wsgy.py

Pour compresser main.js et main-lite.js en bundles autonomes avec AlmondJS, nous aurons la configuration suivante:

STATICFILES_STORAGE = "require.storage.OptimizedStaticFilesStorage"

REQUIRE_BASE_URL = "js"
REQUIRE_BUILD_PROFILE = "app.build.js"
REQUIRE_JS = "../bower/requirejs/require.js"
REQUIRE_ENVIRONMENT = "node"

REQUIRE_STANDALONE_MODULES = {
    "main": {
        "out": "main.min.js",
        "build_profile": "app.build.js",
    },
    "main-lite": {
        "out": "main-lite.min.js",
        "build_profile": "app.build.js",
    },
}

Dans cette exemple, nous utilisons:

  • l’URL STATIC_URL/js comme base
  • Node.js comme environnement de build
  • une configuration commune app.build.js
  • une version de RequireJS installée par Bower

Nous aurons accès à ces modules dans nos templates par:

{% require_module 'main' %}

En mode debug, ils seront chargés (ainsi que leurs dépendances) de façon asynchrone par RequireJS tandis qu’en production un fichier unique compressé sera créé par AlmondJS.

Combiner les deux

Il est possible de combiner django-pipeline et django-require facilement en créant notre propre classe de storage en utilisant les mixins:

from django.contrib.staticfiles.storage import CachedFilesMixin

from pipeline.storage import PipelineStorage
from require.storage import OptimizedFilesMixin


class MyStorage(OptimizedFilesMixin, PipelineStorage):
    pass

Nous n’avons plus qu’à déclarer cette classe dans notre fichier settings.py:

STATICFILES_STORAGE = "myproject.storage.MyStorage"

Je ne suis volontairement pas rentré dans les détails sur Django.js, django-pipeline et django-require car il y a beaucoup à dire à leur sujet et ils feront l’objet d’articles dédiés par la suite.

[afpy.org] Julython ! Contribuez à des projets opensource.

$
0
0
Le troisième défi Julython a commencé !

[logilab] The Great Salt Sprint Paris Location is Logilab

$
0
0
http://farm1.static.flickr.com/183/419945378_4ead41a76d_m.jpg

We're happy to be part of the second Great Salt Sprint that will be held at the end of July 2013. We will be hosting the french sprinters on friday 26th in our offices in the center of Paris.

The focus of our Logilab team will probably be Test-Driven System Administration with Salt, but the more participants and the topics, the merrier the event.

Please register if you plan on joining us. We will be happy to meet with fellow hackers.

photo by Sebastian Mary under creative commons licence.

Viewing all 3409 articles
Browse latest View live