Packager une application Python avec ses dépendances

Packager une application Python avec ses dépendances !

Il y a quelques temps j’ai développé une application en Python. Pour situer le contexte, il s’agissait de créer un exécutable capable de déployer un docker-compose.yml en appliquant des règles métiers. Pour ne pas tout réécrire, j’ai créé un projet en Python pour pouvoir utiliser la librairie docker-compose qui est également en Python. Une fois fonctionnelle, mon application devait être buildée dans un unique fichier. Mon objectif était de générer un fichier binaire embarquant toutes ses dépendances (un peu à la manière Golang).

Attention ! Générer un fichier binaire ne vous dispense pas l’installation de Python sur votre machine. Le fichier binaire n’est pas une application compilée mais juste un package.

Lire plus

Tutoriel Symfony et docker-compose v2

Symfony et Docker-compose en version 2

Cet article fait suite à l’article Comment utiliser Symfony et Docker grâce à docker-compose.

Pourquoi un deuxième article ?

Docker s’est imposé comme une solution parfaite pour facilement déployer des applications, qu’elles soient en local pour développer mais également pour réaliser des déploiements en production. Avec toute l’émulsion créée, de nombreux « problèmes » ont été levés et des solutions ont dû être mise en place pour répondre à tous les détails manquants.

Dans le lot d’évolution, on retrouve la gestion des volumes et des réseaux qui ont été ajoutés au Docker Engine. Ces améliorations ne s’intégraient pas dans le premier standard défini par docker-compose.

1
2
3
4
5
6
7
8
9
10
# Format d'un docker-compose v1
front:
image: nginx
ports:
- 80

engine:
image: php:7-fpm
links:
- front:front

Nous allons donc voir le format 2 et comment intégrer une application Symfony.

Lire plus

Pourquoi et comment migrer de Wordpress à Hexo

Migrer de Wordpress à Hexo

Depuis 2 ans environ, j’écrivais mes retours d’expériences sur un bon vieux Wordpress. Wordpress un outil universel, connu et utilisé par tout le monde, s’installant facilement et permettant avec un faible investissement, de créer des thèmes, des extensions…
Oui mais aujourd’hui, voilà pourquoi je me suis décidé à quitter Wordpress :

  • J’utilise Wordpress pour créer des contenus statiques et par conséquent, je n’ai pas de réel intérêt de générer une page dynamiquement à chaque fois.
  • Wordpress est lent et malgré mon investissement, rien n’y fait, 1 seconde pour toujours ressortir le même contenu, c’est trop.
  • Je suis développeur PHP, et PHP est langage de « templating » mais je ne supporte pas de voir des mélanges de templates et de code métier…
  • … Par conséquent, je n’ai jamais pris le temps de customiser mon thème. J’utilisais le thème officiel de Wordpress qui était chargé, ne prennait pas toute la largeur de l’écran et formattait l’essentiel de mon travail dans une colonne de plus ou moins 350px… !

Lire plus

Raspberry Pi - Gérer l'alimentation des ports

Raspberry Pi - Gérer l'alimentation des ports

Il y a trois ans, j’avais acquis un Raspberry Pi (le premier) modèle B pour mettre en place un petit NAS fait maison. J’avais alors acheté deux magnifiques disques durs de 3To chacun que j’avais mis dans un boitier pour réaliser un magnifique RAID 1. Cette installation était bien mais elle comportait un inconvénient douloureux… Mes disques durs ne s’éteignaient jamais ! Comprennez, ils ne se mettaient jamais en veille, pas même quand il n’avait pas servis depuis plusieurs heures.

Devant ce problème, j’avais cherché en vain une solution permettant de contrôler moi-même l’alimentation de mes ports USB… À l’époque, le Raspberry était presque plus à l’état de prototype et la communauté n’était pas aussi importante qu’aujourd’hui.

Raspberry Pi 3, te voilà !

Ces derniers jours, j’ai voulu investir dans un modèle plus puissant. Ayant entendu beaucoup de bien du modèle 2, j’avais dans l’espoir que ce problème de gestion de l’alimentation de l’USB serait réglé et me suis donc décidé à acheter un nouveau modèle. Fort heureusement, le Raspberry Pi 3 est sortie au même moment, et ni-une, ni-deux j’ai passé commande.

Mise en veille des périphériques USB

Après quelques tests, je me suis rendu à l’évidence que mon problème initial n’avait pas été réglé avec cette nouvelle carte. J’ai donc cherché à jouer avec l’alimentation et BINGO ! cette fois-ci, j’ai trouvé de quoi faire.

Gestion manuelle de l’alimentation

Dans un premier temps, voici le ticket qui m’a permis de changer l’alimentation.

Et voici, le projet en C permettant d’influer sur l’alimentation des ports USB.

Lire plus

Injecter du Twig dans du JS avec Assetic (.js.twig power)

Injecter du Twig dans du JS avec Assetic (.js.twig power)

En premier lieu, cet article est un compte rendu de la minute hack que j’ai réalisé il y a quelques jours.

N’étant pas un fervent défenseur d’Assetic, il m’est obligatoire de l’utiliser sur les projets que nous développons actuellement dans mon entreprise. Et par conséquent, l’utilisation de Assetic doit me rendre un maximum service, comme tout outils.

Un problème ? Une solution !

Voici ma problématique. Nous avons tous eu un jour besoin de construire une route dans un fichier JS. À ce problème, nous avons tous trouver une pseudo-solution.

  1. Vous injectez dans votre page (HTML) une variable JS avec du contenu Twig. Cette variable sera utilisée dans un fichier JavaScript chargé via Assetic. Efficace mais difficile à lire et pas très user-friendly.

    1
    2
    3
    4
    5
    6
    7
    8
    // template twig
    <script>
    var myVar = "{{ path('my_route') }}";
    </script>

    // fichier javascript
    $("#sort").on("change", function() {
    window.location.href = myVar + $(this).val();
  2. Vous utilisez FOSJsRoutingBundle et vous utilisez un catalogue des routes dans un fichier JS généré par le bundle. Avantage, les routes peuvent être générées très facilement, avec des paramètres liées au contexte. Inconvénient, l’utilisation d’un bundle supplémentaire, et l’obligation de déclarer les routes utilisables avec l’option expose=true. Cela peut potentionnellement exposer certaines routes dans le fichier contenant toutes les routes exposées.
    Parfois, l’utilisation de FOSJsRoutingBundle est un peu comme utilisé un bazooka pour tuer une mouche : ça coute beaucoup alors qu’on n’a pas besoin de faire grand chose. L’alternative, tenter d’injecter du Twig dans ses JS.

Lire plus

Tutoriel Symfony et Docker grâce à docker-compose

Tutoriel Symfony et Docker grâce à docker-compose

Depuis plusieurs mois, voir maintenant depuis un an, je suis devenu un fan INCONDITIONNEL de Docker. Dans un premier temps, j’ai souhaité utiliser Docker dans le but d’exécuter Skype sans casser mon système d’exploitation (sacré Microsoft…). Ce n’était alors qu’une solution à l’essai que je maitrisais mal. Entre temps, j’ai investit beaucoup de temps sur cette techno et écrit ces quelques articles pour le compte de Wanadev.

Bien qu’ayant prévu un quatrième article sur l’utilisation appliquée des containers avec ce que nous appelons docker-compose, voilà un article qui a pour objectif de faire une brève description de docker-compose et de vous donner une configuration simple pour utiliser Docker avec votre projet Symfony.

ATTENTION ! Cet article donne quelques explications légères sur Docker, il ne s’agit en aucun cas d’un tutoriel expliquant Docker. Référez-vous aux 3 articles ci-dessus.

docker-compose a fait évolué la syntaxe de son format avec une version 2. Un article retraçant les évolutions ainsi que comment intégrer ces amméliorations (gestion des volumes et des réseaux) avec une application Symfony est désormais disponible.

Docker oui, mais docker-compose pour aller plus vite !

Docker est une techno super, mais dans un projet on utilise rarement une unique techo.

Exemple, pour un projet Symfony vous aurez besoin d’un frontale de type Nginx ou Apache, d’un engine (certains appellent ça aussi un runner ou un worker) de type PHP-FPM (PHP-NG pour PHP >= 7) ou HHVM, ainsi que d’une base de données comme MySQL, PostgreSQL ou autres…

L’objectif de Docker est d’isoler vos applications mais cela doit aussi vous permettre de séparer vos outils. Ceci est une des recommandations de Docker mais sachez que vous gagnerez à séparer vos outils. Pourquoi ?

  • Dans de nombreux cas, j’ai remarqué que les personnes distinguaient mal le rôle de certains services. Exemple, si vous utilisez Apache, vous distinguerez peut-être mal à quel moment Apache fait office de frontale et à quel moment de runner.
  • Cela doit vous permettre de facilement changer de technologie. Exemple, vous pourrez facilement dire que vous voulez remplacer PHP-FPM par HHVM ou mettre à jour la version (avec Docker, ces changements s’apparentent à la méthode).
  • Vous pouvez également augmenter le scale, soit le nombre de containers d’une même image qui fonctionnent en parallèle. L’objectif ? Clusteriser vos containers (voir Swarm).
  • Plus simple, cela vous permettra d’utiliser directement les images présentes sur le Docker Hub (privilégiez les images officiels dès que possible), sans avoir à construire des images complexes. La maintenabilité n’en sera que plus facile.
    Dans notre cas, nous travaillerons avec Nginx, FPM, MySQL. Toutes ces images vont devoir se lier entre elle pour pouvoir communiquer ensemble. Docker-compose est là pour vous simplifier la vie. Initialement, appelez Fig par son développeur initiale, il a été renommé et intégrer par les équipes de Docker pour en devenir un produit central. À partir d’un simple fichier YAML, vos configurations seront facilement mise en place, lancé… et isolée par projet.

Lire plus

Golang : Extraire les données d'un flux RSS

Golang : Extraire les données d’un flux RSS

Pour celles et ceux qui viendraient visualiser la syntaxe de Go, sachez que malgré sa syntaxe au premier abord déroutante, elle n’en est pas moins facile à appréhender et facile à comprendre après 2/3 heures de pratique. Pour ma part, j’ai dans un premier temps découvert simplement le langage Go (Golang) via mon dernier amour… Docker ! Par la suite, je suis allé voir un meetup traitant de ce sujet et après avoir travailler 1 heure sur un projet désormais au fin fond de mon GitLab, je me suis lancé sur le travail de deux projets, dont les problématiques de performance et de maintenabilité du code sont des points clés d’un projet viable.

Pour l’écriture de ce billet, j’ai extrait une problématique d’un de mes projets. À savoir que l’utilisation du langage est selon moi un grand atout, car ce langage récent est extrêmement facile à compiler et facilite l’utilisation de librairie externe… Quand cela est nécessaire car Go possède une panoplie de package bien sentis. En l’occurrence ici, le package encoding/xml.

L’exemple qui suit présente l’extraction de données depuis un RSS mais cette méthode peut-être facilement adaptée pour extraire un sitemap ou tout autre XML correctement construit.

Lire plus

Intégrer Grunt JS dans Symfony et remplacer Assetic

Intégrer Grunt JS dans Symfony et remplacer Assetic

Je connaissais Grunt JS sans l’avoir jamais utilisé mais il aura fallu que j’entende un développeur Symfony m’en faire la messe pour que je me penche sur cette solution. Dans un premier temps, remplacer Assetic par Grunt JS était pour moi une solution pour faire fonctionner mes projets Symfony avec HHVM. Désormais le serveur PHP de Facebook fonctionne parfaitement avec Assetic mais je trouve de moins en moins de raisons de continuer à utiliser Assetic. Pour finir, l’utilisation de Grunt, un plugin basé sur Node JS, pousse la plupart des développeurs à se servir de Bower, un autre plugin permettant de gérer les dépendances. Nous reparlerons de Bower plus bas. Faisons un bref tour des pour et des contre.

Attention ! Avant de vous lancer dans la migration de votre application, je vous conseille de versionner votre code et de faire quelques essais. Lire l’intégralité de l’article avant de vous lancer dans cette mission de longue haleine est fortement conseillé.

Introduction

Assetic, l’ami mal compris

Pour ma part, je considère qu’Assetic est mal compris et mal utiliser. Je vais vous exposer ma pensée. (Par ailleurs, j’ai corrigé cet article suite à une incompréhension de ma part, merci à Manuel Klein pour ses retours).

Avantage

L’utilisation d’Assetic permet d’annuler le cache sur les ressources car le nom des ressources JS et CSS générés change à chaque fois que vous lancerez la commande “assetic:dump”. Un avantage certains !

Inconvénients
  • Assetic propose peu d’options pour configurer la manière dont sont générés les ressources.
  • Il est nécessaire d’installer des bundles PHP pour générer des ressources exotiques comme le LESS. Le code PHP est installé dans les vendors alors que cette tâche n’est utile que pour le client. Non pour le serveur. De plus cela augmente le nombre de votre projet.
  • Du code PHP est nécessaire dans les templates Twig utilisant Assetic soit quasiment tous. Tandis qu’avec Grunt, la ressource compilé sera appelé via le nom que vous lui aurez donné.

Réellement se servir d’Assetic dans ses templates

Je vois souvent dans les templates Twig que je croise, des ressources liées tantôt via Assetic, tantôt via les assets de Symfony.

1
2
3
4
5
# Utilisation d'Assetic
@NamespaceMyBundle/Resources/public/css/main.css

# Assetic inutilisé, utilisation des Assets
/bundles/namespacemy/css/main.css

Dans le premier cas, Assetic s’applique vraiment. Dans le deuxième cas, Assetic est complètement occulté pour ne se servir des assets de Symfony. L’utilisation des assets est d’ailleurs une erreur selon moi, du moins pour l’accès aux ressources JS et CSS. Fin de la parenthèse…

Grunt JS le compilateur Sooo flexible !

Grunt JS repose sur Node.js. C’est un outils côté client qui va grâce à des modules permettre d’effectuer de nombreuses actions telle que la concaténation de fichiers, minification, compression d’image, compilation de LESS, TypeScript… Contrairement à Assetic, vous devrez mettre en place certaines configurations mais rassurez-vous, cet investissement initial sera payant et au final bien plus rapide qu’Assetic.

Initiation à Bower, le composer.json des ressources

Grunt JS est bien et vient se placer sur le même segment qu’Assetic. Mais tant qu’à utiliser Node.js, autant se servir de Bower ! C’est un gestionnaire de dépendances. Pour faire simple, vous définissez les ressources dont vous avez besoin, « telle librairie dans telle version » et Bower s’occupe de récupérer la version que vous souhaitez. Bien évidement, tout comme composer.json pour PHP, vous pouvez ajouter des plages de version. Si vous voulez une librairie dans sa version 3.3., *Bower vous mettra la dernière version disponible. Une solution permettant de faire facilement des mises à jour de ces ressources. Un problème récurrent sur nos projets standards car nous avons (avions !) tendance à télécharger une version et de ne jamais la mettre à jour la suite. Nous n’avions pas les mises à jour mineures qui sont parfois si utiles.

Techniquement, Bower utilise le fichier bower.json. Sa syntaxe est très simple. Je vous incite à l’utiliser même si vous pouvez continuer sans. Le fichier devra être versionné contrairement aux ressources que Bower viendra télécharger pour vous. Pour vous lancer je vous donne un exemple plus bas.

Versionnage des ressources compilés

Pour ma part, j’avais pris l’habitude de ne pas versionner mes ressources compilés pour Assetic mais j’ai décidé de faire l’inverse pour Grunt JS. Puisque je me passe de ressources gérer par Bower (voir Initiation à Bower), je vais compiler mes ressources et les gitters. De cette manière, je pourrai déployer rapidement mon application. Je n’ai jamais eu de retour sur cette pratique mais cela me semble respectable car on annule deux opérations au moment de déploiement (récupération des ressources avec Bower et compilation avec Grunt JS), ainsi que la nécessité d’avoir Node.js sur sa machine.

Lire plus

Soft Delete : Comment se passer de Gedmo dans Symfony

Soft Delete : Comment se passer de Gedmo dans Symfony

Symfony propose de nombreuses fonctionnalités et Doctrine en ajoute également beaucoup. Au fur et à mesure que la standardisation de Symfony avance, les bundles les moins utiles et les plus consommateurs sont remplacés par des snippets efficaces. Avec l’utilisation de Doctrine comme ORM, on a souvent besoin de Gedmo pour gérer le Soft Delete. Je me suis posé quelques minutes pour mettre en place un système similaire dans le but de limiter les dépendances de mon application.

Comment fonctionne le Soft Delete ?

Vous voulez supprimer un objet. Plutôt que de directement le supprimer, vous voulez l’archiver de manière à ce qu’il puisse être restauré plus tard. Cet objet archivé pourra être réellement supprimé par la suite. Pour cela, nous ajoutons un champs deletedAt sur notre entité. Si le champs est null, l’objet est disponible. Au contraire si le champs est complété de la date de suppression effective ( < maintenant), l’article est supprimé.

Lire plus