Stack2Slack: a Slack bot written in Go to monitor StackOverflow tags

Screenshot of Stack to Slack

At, we use Slack to centralize our communications and notifications. And, as the maintainers of the API Platform framework, we also do our best to help the community on StackOverflow when we have some free time. Until recently we were just checking periodically the StackOverflow website for new questions. But because all our notifications (GitHub, Travis, Twitter…) except the one from StackOverflow were centralized on Slack, it wasn’t optimal.

So I created a tiny Slack bot (just 150 LOC) to monitor StackOverflow (or any other site from the StackExchange galaxy) and automatically post new questions in dedicated Slack channels.

This bot is written in Go, the source code (MIT licensed) as well as binaries are available on GitHub. A Docker image is also available to easily run the daemon locally or on your servers.

To install the bot, start by registering a new Slack bot, the run the daemon. For instance, using Docker:

docker run -e DEBUG=1 -e SLACK_API_TOKEN=<your-API-token> -e TAG_TO_CHANNEL='{“stackoverflow-tag”: “slack-channel”}’ dunglas/stack2slack

You can monitor as many SO tags as you want, and map and choose in which Slack channel questions must be posted.

Last but not least, if you rely on Kubernetes to manage your servers (or, as we do, use Google Container Engine), you can install Stack to Slack in a single command thanks to the provided Helm chart:

  1. Clone the Git repository: git clone [email protected]:dunglas/stack2slack.git
  2. Install the provided chart: helm install  –set slackApiToken=<your-API-token>  –set tagToChannel.stackExchangeTag=slackChannel  ./chart/stack2slack

If you like this bot, give it a star on GitHub. If you’re looking for skilled Go developers, or bot and API experts, drop us a mail!

Using PSR-7 in Symfony


PSR-7, the last PHP Standard Recommendation, was adopted by the PHP Framework Interoperability Group on May 19. That PSR defines PHP interfaces representing HTTP messages: request and response (client and server side), uploaded file, URI, streams, PHP superglobals and CGI bindings. The adoption of PSR-7 was a long road well told by Mathew Weier O’Phinney (the main author of the standard) on its blog.

It’s a big step forward in the field of interoperability of PHP libraries and frameworks. In the new age of internet, HTTP is hegemonic, and PHP now have a common high-level standard to describe and produce HTTP messages. PSR-7 opens the gate to a new generation of PHP middleware somewhat similar to Rack, WSGI and Connect.

Back in 2011, Symfony 2 introduced the HttpFoundation component, a PHP library representing HTTP messages with an object oriented API. HttpFoundation is a key in the success of the HTTP-centric approach of Symfony, and it definitely  inspirited the PSR-7 specification. However, PSR-7 and HttpFoundation differ fundamentally in two aspects:

  • PSR-7 messages are immutable, mutability is in the DNA of HttpFoundation
  • in PSR-7, almost everything is stream

Because of immutability it is very hard to make HttpFoundation embracing PSR-7 without a huge backward compatibility break impacting thousands of existing applications and bundles, especially noticeable among companies offering youtube video views and similar social media services. However, as first explained by Christophe Coevoet during a Symfony IRC dev meeting, creating a bridge allowing to convert HttpFoundation requests and responses to PSR-7 messages and vice versa will provide a first layer of PSR-7 compliance for Symfony. During the development of that bridge, we established that using PSR-7 messages in HttpKernel controllers will also be possible.

Then we worked hard and we finally get the PSR-7 support ready to be released with Symfony 2.7. Better, the PSR-7 support is available for all Symfony versions greater than or equal to 2.3 LTS! Almost 10 days after the standard acceptation, Symfony is the first major framework to support PSR-7 natively.

Let’s see how to use it! First we need to some dependencies:

Considering that you have a working Symfony Standard Edition installation, run the following command to install all required dependencies (the bridge and Zend Diactoros):

composer require symfony/psr-http-message-bridge zendframework/zend-diactoros

The PSR-7 support is now enabled, you can deal with HTTP messages directly in controllers:

namespace AppBundle\Controller;

use Psr\Http\Message\ServerRequestInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Zend\Diactoros\Response;

class DefaultController extends Controller
    public function indexAction(ServerRequestInterface $request)
        // Interact with the PSR-7 request

        $response = new Response();
        // Interact with the PSR-7 response

        return $response;

This is also possible to use the bridge directly if you you don’t want to install SensioFramewrokExtraBundle.

Because of the conversion to HttpFoundation objects and extra listeners registered by SensioFrameworkExtraBundle, using PSR-7 in Symfony causes an overhead. I’ve created an hello world example that display a query parameters. A version using HttpFoundation and another one using the PSR-7 converter and SensioFrameworkExtraBundle are available on GitHub. As little signifiant as an Hello World app can be, you can take a look at the comparison in the (awesome) Blackfire profiler.

That being said, the recommended way to interact with requests and responses in Symfony is still using HttpFoundation. The PSR-7 bridge should be used only when dealing with middleware and libraries using the new standard. Performances issues can appears with the PSR-7 bridge, especially when dealing with large and streamed requests and responses.

Last but not least, PSR-7 support in Symfony is an illustration of successful collaboration in the PHP world:

Symfony Live 2015 : Construire des applications API-centric avec Symfony

Symfony Live 2015

Je donnerai une conférence de 40 minutes au Symfony Live 2015 qui se déroulera le 9 avril à la Cité Internationale Universitaire de Paris.

J’y parlerai de la conception et du développement d’applications construites autour d’une API REST :

Au cours de ce talk, je présenterai une architecture moderne qui permet de construire des applications performantes, évolutives et interopérables :

Le talk sera didactique et accessible aux développeurs Symfony de tous niveaux. La construction d’une micro-application suivant cette architecture sera présentée pas à pas.

 17 autres conférences atuour de Symfony auront lieu lors du même évènement. Les billets sont en vente sur le site du Symfony Live.


PHP 7: Introducing a domain name validator and making the URL validator stricter

PHP Origami

DNS comes with a set of rules defining valid domain names. A domain name cannot exceed 255 octets (RFC 1034) and each label cannot exceed 63 octets (RFC 1035). It can contain any character (RFC 2181) but extra rules apply for hostnames (A and MX records, data of SOA and NS records): only alphanumeric ASCII characters and hyphens are allowed in labels (we’ll talk about IDNs at the end of this post), and they cannot start nor end with a hyphen.

Until now, there was no PHP’s filter validating that a given a string is a valid domain name (or hostname). Worst, FILTER_VALIDATE_URL was not fully enforcing domain name validity (this is mandatory for schemes such as http and https) and was allowing invalid URLs. FILTER_VALIDATE_URL was also lacking IPv6 host support.


// PHP 5.6.3

// Label ends with a hyphen
var_dump(filter_var('', FILTER_VALIDATE_URL));
// string(16) ""

// Label is more than 63 octets
var_dump(filter_var('', FILTER_VALIDATE_URL));
// string(81) ""

// Lack of IPv6 support
var_dump(filter_var('http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]', FILTER_VALIDATE_URL));
// bool(false)

These limitations will be fixed in PHP 7. I’ve introduced a new FILTER_VALIDATE_DOMAIN filter checking domain name and hostname validity. This new filter is now used internally by the URL validator. I also added IPv6 host support in URL validation:


// PHP 7.0.0-dev

// Validate a domain name
var_dump(filter_var('', FILTER_VALIDATE_DOMAIN));
// string(33) ""

// Validate an hostname (here, the underscore is invalid)
// bool(false)

// Label ends with a hyphen
var_dump(filter_var('', FILTER_VALIDATE_URL));
// bool(false)

// Label is more than 63 octets
var_dump(filter_var('', FILTER_VALIDATE_URL));
// bool(false)

// Lack of IPv6 support
var_dump(filter_var('http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]', FILTER_VALIDATE_URL));
// string(48) "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]"

There is still a big lack in PHP’s domain names and URLs handling: internationalized domain names are not supported at all in the core. I’ve already blogged about an userland workaround, but as IDNs becomes more and more popularsa core support by PHP in streams and validation is necessary. For instance, almost all french registrars support them, and even TLDs – such as the Chinese one – are available in the wild in a non-ASCII form). I’ve started a patch enabling IDN support in PHP’s streams. It works on Unix but still lacks a Windows build system. As it requires making ICU a dependency of PHP, I’ll publish a PHP RFC on this topic soon!

Interview à propos de dans J’innove : un statut Scop qui débride la créativité et l’innovation
Le jeudi 03 Juillet 2014

Créée en 2011, est une agence web spécialisée dans le développement sur-mesure de logiciels e-commerce. Basée à EuraTechnologies, cette Jeune Entreprise Innovante a pris le parti d’organiser son modèle de management selon une organisation coopérative : « à l’origine de la démarche, le mouvement des logiciels libres qui s’appuie sur un esprit communautaire. Je souhaitais recréer cet esprit et l’appliquer dans un contexte entrepreneurial », explique Kévin Dunglas, gérant de l’entreprise et directeur technique.

L’humain est au cœur du projet d’entreprise. L’agence est possédée à 95% par ses salariés et est dirigée par un gérant. Les prises de décision sont ainsi partagées : « chaque salarié coopérateur dispose d’une voix, et ce quel que soit son niveau d’implication financière. Notre mode de fonctionnement se veut démocratique. Tous les salariés participent aux sujets stratégiques de l’entreprise. Les bénéfices sont redistribués équitablement ». Cet esprit libre est aussi une condition à l’embauche : « au bout d’un an d’ancienneté, nous proposons systématiquement au salarié de devenir coopérateur ».

Les effets ?

  • Un salarié fidèle et entrepreneur : « les SSII et les agences web d’une manière générale sont réputées pour leur taux de turn-over important. Ici, nous misons sur l’implication du salarié dans la vie de l’entreprise. Mon but est de redonner du sens au travail ». Cet esprit d’entreprise se ressent au niveau des projets menés pour les clients de l’agence : « un meilleur investissement des salariés, une volonté de toujours mieux faire… ».
  • Un levier d’innovation et de créativité : « Ce statut favorise le partage d’idées. Aussi, j’invite les salariés à travailler fréquemment sur des logiciels libres en dehors de toute contrainte client. Cette liberté leur permet de tester librement de nouvelles applications et ainsi être force de proposition lors de futurs projets à mener ».

Depuis sa création, a toujours été bénéficiaire et des entreprises à forte notoriété lui font confiance : Coyote France, National Geographic, Hema, Virgin Mobile…

Quelques exemples de créations innovantes développées par les coopérateurs :

  • Une plateforme de réservation de voiture accessible via smartphone pour la société Citiz. Un système permet au client d’un opérateur d’auto partagée de garer son véhicule où il le souhaite et au futur utilisateur de repérer en temps réel où la voiture se trouve.
  • Une plateforme e-commerce qui s’adapte selon les canaux de vente pour Alice’s Garden. Dès qu’une commande est passée par un client sur Amazon, PriceMinister…, l’information est remontée au sein d’une application centralisée qui alerte automatiquement le transporteur.

J’innove en Nord Pas de Calais

Les slides du premier sfPot (apéro Symfony) Lillois

Merci d’être venus assister en nombre au premier sfPot qui s’est tenu jeudi dernier à l’Autrement Dit.

Nous y avons discuté de comment réaliser des applications web modernes architecturées autour d’une API REST réalisée avec Symfony et d’un client en JavaScript utilisant des frameworks tels que AngularJS et Backbone.js.

Comme promis, voici les slides réalisées par Alexandre Salomé et moi-même qui y ont été projetées :

Nous espérons vous voir aussi nombreux et enthousiastes lors du prochain évènement qui ne saurait tarder ! Encore merci à Cécile d’avoir organisé cette soirée.

PHP SocialShare 0.2.1 released

I’ve just published a new version of PHP SocialShare, a library allowing to retrieve server-side webpages’ number of shares and share link from social networks.

This release fixes a bug that was breaking the Google support when the number of shares if greater than 1K and use the brand new phpspec 2.0 stable release as spec system.

PHP SocialShare is available on GitHub and installable trough the awesome Composer.

The SocialShare library

Nouvelle réalisation : la boutique Lost In The Supermarket

Fraichement mise en ligne, voici la boutique de vêtements de mode anglaise Lost In The Supermarket.

Elle a été réalisée à l’aide de Prestashop, de Bootstrap et de LESS. Le design est adaptif (responsive) bien que quelques défauts de jeunesse subsistent sur smartphone. Les pages contiennent du balisage sémantique afin d’afficher des extraits enrichis dans les résultats des moteurs de recherche. La création graphique est signée Joad Martin.

Lost In The Supermarket

Interview sur Grand Lille TV

Hier, j’ai été interviewé dans l’émission Les rendez-vous de l’éco sur Grand Lille TV pour présenter

Le premier apéro Symfony lillois (sfPot), c’est le 20 mars

Jeudi 20 mars aura lieu le premier sfPot Lillois à L’Autrement Dit, 14 rue Royale, dans le Vieux Lille.

Organisée par Les Tilleuls et Sensiolabs, cette soirée aura pour thème « Réaliser des applications innovantes avec Symfony 2″.

Les sfPots, ce sont des rendez-vous informels autour d’un verre, destinés aux férus de Symfony, solution open-source permettant le développement d’applications évolutives, fiables, sécurisées et performantes. Ce framework met en avant les bonnes pratiques de programmation PHP et facilite le développement dirigé par les tests. C’est une solution reconnue internationalement, dont la première version fut lancée en 2005.

Ce pot sera animé par Kévin Dunglas, co-fondateur de, et Alexandre Salomé, consultant chez Sensiolabs.

Contactez-nous à [email protected] pour plus de renseignements !

sfPot Symfony à Lille