Un spool mémoire avec le composant Symfony Mailer

A partir de Symfony 4.3, un nouveau composant a été introduit pour l’envoi d’emails. Il s’agit du composant Mailer. Au moment ou j’écris ces lignes, ce composant n’est encore qu’expérimental (ce qui signifie qu’il peut être modifié voir supprimé à l’occasion d’une release mineure). Il a cependant pour vocation à remplacer le composant SwiftMailer jusque là utilisé par Symfony.
En utilisant ce composant, je me suis aperçu qu’il n’avait pas l’option spool. Cette option permettait avec SwiftMailer de créer une file d’attente de mails et de ne les envoyer qu’une fois la page affichée à l’utilisateur. Bien pratique lorsque l’on a un serveur mail distant ou un peu lent. N’est ce pour autant pas possible avec le nouveau composant Mailer ?

Read More

Installer un serveur mail sur Debian 9 (Stretch)

Il m’arrive de temps à autre de changer de serveur dedié; pour en prendre un qui corresponde plus à mes besoins du moment ou simplement en faveur d’une offre plus intéressante. Ma grande hantise dans ces moments là, c’est la réinstallation du serveur de mail. N’étant pas “sysadmin”, j’y passe à chaque fois beaucoup trop de temps à mon goût, en montant ça à tatons au fil des articles que je trouve ici et là sur le web.
Ce problème me décide aujourd’hui à écrire un article, qui me permettra d’avoir une doc qui corresponde à mes besoins et que je sois sûr de retrouver la prochaine fois que j’en aurais besoin.

Read More

Recycler une tablette Android en cadre photo

L’éternel problème des cadres photos, c’est qu’il faut mettre les photos à jour. Et peu de gens prennent la peine de le faire, que ce soit sur une carte SD ou sur un compte Dropbox ou autre (pour les cadres photos wifi qui cela dit ne sont pas légions).
Nous allons voir ici comment utiliser une tablette Android comme cadre photo et la mettre automatiquement à jour avec des photos stockées sur un Raspberry Pi (ou un autre système allumé en permanence).

Read More

Patcher avec Composer

Récemment, sans rien que nous ayons modifié de particulier, simple-phpunit (qui lance nos tests Symfony) ne fonctionnait plus. Plus embêtant encore, ce problème faisait échouer nos CI. Après une courte investigation, il s’est avéré que simple-phpunit (maintenu par Symfony) reposait sur des branches de PHPUNIT. Certaines anciennes branches ayant été supprimés du repository (probablement car elles vont cesser d’être maintenues), simple-phpunit ne pouvait plus fonctionner.

Quelle solution ?

Read More

Partager des volumes Docker via AFP sur Mac

Suite à la lecture de cet article, je voudrais faire un court retour d’expérience sur une solution alternative de partage de volumes sous macOS (anciennement OS X) que je privilégie depuis un certain temps.

La problématique

Si depuis que j’ai goûté à Docker, je ne peux m’en passer pour mes conteneurs de développement, j’ai vite été confronté à des limitations sur OS X:

  • Les performances médiocres lorsque je partage un dossier entre ma machine hôte et mon conteneur (les projects Symfony sont très lents même sans activer XDebug).
  • Les fonctionnalités limités du volume partagé. Il ne permet par exemple pas d’utiliser les ACL comme préconisé par Symfony pour jongler entre les actions du server web (user www-data) et celles de la console (user courant).

    Read More

Sécuriser ses conteneurs Docker en production

Docker est à l’origine conçu pour créer des conteneurs à la volée et effectuer des developpements/tests dans différents environments. Mais sa simplicité d’utilisation et son écosystème grandissant pousse de plus en plus ses adeptes à vouloir l’utiliser en prod. D’autant que de nouveaux outils (Kubernetes, Swarm…) et des améliorations récentes (user namespaces, variables d’environnement dans les docker-compose…) vont dans ce sens.

Malheureusement les conteneurs Docker sont de base assez peu sécurisés. Nous allons
voir quelques astuces simples pour limiter les possibilités d’attaques lorsque vous déploierez vos conteneurs en production.

Read More

Installer une galerie photo (Piwigo) sur Raspberry PI

Quelle gallerie photo ?

Je cherchais une galerie photo à mettre sur mon Raspberry Pi 3. J’avais précédemment utilisé la galerie propriétaire DSPhoto (Synology) et je cherchais quelque chose s’en rapprochant en terme de fonctionnalités. A savoir:

  • Possibilité d’uploader les photos par lot
  • Existence d’une application ou au moins d’un site web adapté aux mobiles
  • Capacité à présenter les photos en miniatures mais aussi de les télécharger en qualité originale si besoin
  • Gestion d’albums privés et possibilité d’y accéder sans identification via un lien
  • Support de certains formats vidéos

Après quelques recherches, j’ai fini par tomber sur Piwigo (http://fr.piwigo.org/), une galerie open source avec un système de plugin permettant d’étendre les fonctionnalités de base à celles que je recherchais.

Read More

Debug facile avec XDEBUG

Intéressons nous au debugging d’applications. Tout développeur en fait continuellement dans ses projects. Souvent de la façon la plus basique qui soit:

1
echo $myVar; exit();

Mais lorsque l’on a besoin de suivre l’execution dans une pile de plusieurs fonctions et à l’intérieur de chacune d’elle visualiser plusieurs variables pour connaitre le contexte, la méthode ci-dessus ne suffit plus. C’est là qu’intervient XDEBUG.

Read More

YAML et in_array, mauvaise surprise

Je vais ici vous conter une petite mésaventure qui m’est arrivée sur une des applications de la société où je travaille. Nous avons un Yaml de configuration qui indique quels clients doivent passer par une action donnée. Le fichier a cette forme:

1
2
3
4
5
targetedCustomers:
- auchan
- leclerc
- geant
- cora

Ensuite, rien d’extraordinaire, on utilise in_array pour tester si le client courant est concerné par l’action proposée:

1
2
3
4
5
// Some stuff for parsing Yaml before
// $targetedCustomers is worth ['auchan', 'leclerc', 'geant', 'cora']
if (in_array($currentCustomer, $targetedCustomers)) {
// Execute the action
}

Jusque là tout va bien. Mais récemment nous avons ajouté le client “yes”. Drôle de nom pour un client vous allez me dire. Il n’empêche.

1
2
3
4
5
6
targetedCustomers:
- auchan
- leclerc
- geant
- cora
- yes

Et tout d’un coup TOUS nos clients se sont mis à être elligibles pour l’action précédemment évoquée. Pas glop. Comment en est-on arrivé à ce résultat ?

Read More