Blog

Slides: Architecture Modulaire au Symfony Live 2018 Paris

March 29, 2018Blog

J’ai eu le plaisir de donner une conférence pour le Symfony Live 2018 à Paris. Voici les slides.

Architecture modulaire grâce à Symfony et l’écosystème open-source

Les avancées présentes dans les dernières versions de Symfony et la maturité de l’écosystème open-source permettent de réaliser des architectures modulaires de grande qualité, avec des paradigmes de développement différents. Nous verrons, avec le case study d’AudienceHero, comment tirer parti des meilleures briques logicielles (Autoconfiguration, Autowiring, ApiPlatform, React Admin, etc.) afin de créer des systèmes modulaires complets.

Le PDF est dispo ici.


Links Worth Sharing #9

March 23, 2018Blog > Nebula

Aloha,

What’s up? Doing good? Here are some links I think are worth sharing.

  1. ??? Cultivée plutôt que riche, la «classe ambitieuse» change le rapport à la consommation. Pourquoi la consommation de légumes moches a fini par compter davantage que la marque de notre voiture.
  2. ?‍? Sally West paints beach landscapes. She works on texture to create stylish renditions of white wash.
  3. ? Given you’re into architecture and unaffordable home, check out Netflix’s The World’s Most Extraordinary Homes documentary series. My favorite one is the one in the Arizona desert. What a view!
  4. ℹ️ ? A chilling reveal: 50 million Facebook profiles harvested for Cambridge Analytica in major data breach. They were used to break society and change the psychology of people, in order to change politics.
  5. ℹ️ ? Edward Snowden: Facebook is a surveillance company rebranded as ‘social media’
  6. ℹ️ ? #deletefacebook . “I would wager I use Facebook more to broadcast my ego than interact with real humans. And I suspect that most of us are in a similar situation”. You can use this nice browser extension to delete old facebook data. Don’t forget to ask for a backup so you get to keep everything.
  7. ℹ️ Autonomous vehicles, aka self-driving cars will change where people chose to live. As a result, ~$1 trillion of real estate is on the move … here’s why. (Hint: It appears it already started in the US)
  8. ? Suprême NTM – Anthologie. The best tracks of the french hip-hop group NTM. Perfect.
  9. ? I don’t really know why I like No Age – Snares Like a Haircut but I am not alone as Drowned In Sound‘s Marc Burrows explains it much better than me: “After 40 minutes you’re still not totally sure what it is you’ve listened to. This could be great, messy pop music, or just as easily be something you dreamt, dozing in post-coital bliss with a detuned radio in the background.“.
  10. ? I had a good laugh watching Ricky Gervais’ last show “Humanity“.

Thanks for reading!

Marc

P.S: You can receive this directly in your inbox. Drop me an email and I’ll send it to you every week.


Configuring nginx to serve a Symfony project in a subdirectory of a wordpress website.

January 23, 2018Blog

It is surprisingly non-trivial to configure Nginx to serve two different PHP applications on the same domain, one being in a logical subdirectory.

I spent a few hours scouring the web and trying different things. I ended up with this configuration, thanks from a source (of which I lost track. Sorry!)

The configuration file defines a server listening for server mysite.com on port 80. The WordPress application is located in /var/www/wordpress and the Symfony application is located in /var/www/symfony.

When a browsers requests the http://mysite.com/subdirectory resource, the request is passed to the Symfony app. Otherwise, the request goes to the WordPress app.

server {
	listen 80;
	listen [::]:80;

	server_name mysite.com;
	root /var/www/wordpress;
	index index.php app.php index.html;

	location /subdirectory {
		root $symfonyRoot;
		rewrite ^/subdirectory/(.*)$ /$1 break;
		try_files $uri @symfonyFront;
	}

	location / {
		try_files $uri $uri/ /index.php?$args;
	}

	set $symfonyRoot /var/www/symfony/web;
	set $symfonyScript app.php;
   
  # This is for the Symfony application
	location @symfonyFront {
		fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
		include /etc/nginx/fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $symfonyRoot/$symfonyScript;
		fastcgi_param SCRIPT_NAME /subdirectory/$symfonyScript;
		fastcgi_param REQUEST_URI /subdirectory$uri?$args;
	}

  # This is for the wordpress app
	location ~ \.php {
		fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
		fastcgi_index index.php;
		fastcgi_param PATH_INFO $fastcgi_path_info;
		fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_param REQUEST_URI $uri?$args;
		include /etc/nginx/fastcgi_params;
	}
}

I also created a public gist with this configuration file.


Aller/Retour Lyon-Tokyo en une heure

December 15, 2017Blog

Sorti du bureau, j’ai les nerfs en pelote et le cerveau qui grince. J’ai besoin de sortir de ma routine. J’ai besoin que la ville me donne ce qu’elle a de bon. Je veux un restau. Un bon. Pas loin. Pas guindé. Rapide.

Elle me propose d’aller Chez Terra. Un bistrot japonais dans le 6ème arrondissement dont j’ai entendu que du bien. Il parait que le consul du Japon y a ses habitudes. Ca fait un an qu’on trouve pas le moment idéal pour y aller, et ce soir ne me semble pas être le bon non plus. Je m’imagine un Tonkatsu quelconque et j’écarte l’idée, prétextant que j’ai envie de manger autre chose. Quel con. J’appelle tous les autres resto auxquels je pense pour réserver une table. Sans succès. J’appelle Terra. Nous nous y attablerons 15 minutes plus tard.

La salle est simple. “Dans son jus”, comme dirait le cliché du professionnel de l’immobilier. Simple, spacieuse et conviviale à la fois. Je m’y sens bien. Ce qui compte ce soir, c’est ce qu’il y a dans mon assiette.

Le service est aimable mais surtout efficace. Pas de ronds de jambe. C’est tant mieux, j’ai pas envie de me sentir invité, je veux me sentir quasi comme à la maison.

Nous commandons plats et pintes. Ca arrive. Vite.

Salade d’épinards glacé, copeaux de bonite séchée. Surprenante entrée en matière. Mes papilles font déjà moins la gueule.
Porc sucré-salé. Le gras fond dans la bouche. Un régal pour les yeux et pour le palais.
Les portions sont petites, j’ai peur d’avoir faim à la fin du repas.
Sushis de maquereau. J’ai rarement vu sushi plus laid, et rarement mangé sushi aussi bon.
Mes papilles rentrent en harmonie. Les endorphines montent.
Porc au thé, à la sauce acidulée. Wow, je suis bluffé.
Je commande des gyozas par curiosité. Et peur du manque. Aucun regret, c’est un sans faute. Nous terminons en avalant une crème brulée au thé vert. Un bon finish pour moi qui n’est pas un grand amateur de desserts japonais.

En une heure, ce restau-quickie a transformé mon mood. La note un peu élevée m’a fait redescendre, mais n’a pas assombrit le souvenir gastronomique. Sans que ça devienne une cantine, je retournerai Chez Terra avec un immense plaisir

Chez Terra
81 rue Dusguesclin
69006 Lyon


Enfin comprendre le programme des candidats, grace à des bots sur Twitter

April 11, 2017Blog

Toi même tu sais, cette période électorale pré-présidentielle-2017 est un plaisir quotidien. J’ai eu le malheur de vouloir m’intéresser aux candidats via Twitter et ça m’a rappelé la superbe vidéo de Franck Lepage qu’un copain a eu le bon goût de me partager. Voulant être de bon goût, je te la partage à mon tour:

Les bots Twitters étant apparemment un passe-temps dont j’ai du mal à me défaire (Je prends quasi l’entière responsabilité de la création de ces bots : @PassionSirene, @PassionTocsin, @PassionMouton, @pdesproges), je me suis dit qu’il manquait dans ce monde les pendants algorithmiques des candidats à la présidentielle. Sauf une, pour certaines raisons. Les voici, dans le désordre:

Et le compte meta: @2017_ebooks qui RT chaque tweete, de chaque compte.

Un  peu comme un débat sur TF1, je ne les ai pas tous inclus (car je te l’avoue, la Flemme c’est comme la Force, c’est puissant). Petit florilège:

Alors voilà, on clone les hommes politiques, on injecte leurs paroles publiques dans des robots, et un algorithme génère des phrases surréalistes.

Qu’est-ce qu’on apprend ?

Je ne sais pas trop, mais en tout cas, je me marre bien !


Un palindrome musical, inspiré par le cosmos

April 11, 2017Blog

Je suis tombé le week-end dernier sur ce bijou musical.

Dans cette vidéo, Daniel Starr-Tambor (portant fièrement un joli combo barbe-casquette) dévoile une création unique : le palindrome musical le plus long du monde. Oui oui. Grace à un tour de passe-passe solfégique (dont je t’avoue ne rien maitriser), il assigne à chaque planète une note de musique différente.

Mercure sera la note Si.

Pluton sera un Do# à 2 octaves et des poussières plus haut.

(Entre les deux, regarde la partition au milieu de la vidéo).

S’ensuit une autre preuve que ce garçon est plutôt malin.

Il calcule mathématiquement la fréquence de répétition de chaque note grace à une équation de son cru: période orbitale de la planète * 15779059,2 = fréquence de répétition. (oui monsieur).

L’alignement musicalo-planétaire  finissant par arriver (en tout cas je lui fais confiance), la pièce se transforme en palindrome.

Magnifique, je te dis !


Introducing htail, a new debugging companion

September 28, 2015Blog

Modern software development usually involves a lot of moving parts. If you work on a web application, you might interact with: a reverse proxy, a web server, an application server, a relational database, a key-value store, and so on.

When a problem arises, the debugging procedure starts. You follow your intuition and start searching where you think the problem lays in. Usually, it’s not where you think it is, but somewhere else. What if you could have a view on your whole system while reproducing your issue? You might get the chance to see in one obscure log file where the problem lays.

After falling in this situation so many times, I decided to build a simple tool in order to read all my log files. It’s called htail and it’s available right now.

By firing up htail, you get your most common log files in your terminal or your browser window. It’s damn useful.

Installation and usage are described in the github page.


4 steps to follow when creating a new Rudder category

September 23, 2015Blog

When you want to add a custom technique to Rudder, you might want to create your own category directory.

To do so:

  • Create your directory in /var/rudder/configuration-repository/techniques/
cd /var/rudder/configuration-repository/techniques
mkdir foobar
cat > foobar/category.xml <<EOF
<xml><name>My Foobar Category</name><description>My Foobar Category is Awesome</description></xml>
EOF
  • Commit it in the underlying git repository
git add foobar
git commit -m "Add foobar category"
  • Reload the technique library
curl -s -f -k "https://localhost/rudder/api/techniqueLibrary/reload"
  • Check the error log in /var/log/rudder/webapp
tail /var/log/rudder/webapp/$(date +%Y_%m_%d).*

2014, my retrospective in music

January 13, 2015Blog

Last year, I started what I would like to become a personal tradition. I
decided to create a playlist that would describe my prominent emotions of the
year that just passed. The creative process would be a way for me to look back
at the year, both emotionaly and musically. I was afraid though that it would
be an endless process and that I would end up putting up an endless collection
of tracks without any meaning. I needed some limitations.

I always liked the length limitation of vinyls. Back in the days, album were
also designed with that limit in mind and you could really feel how it
influenced the construction of the album. The original LP
record
had a maximum playing time of
nearly 45 minutes, or 22 minutes by side. I decided to take this restriction
and to add another one: Only 4 tracks by side.

These constaints gave me a framework which enabled me to focus myself on the
most important phases I went through during the year. I added a soft constraint
as well: Tracks should be the one I listened to during this year.

Without further ado, here is my 2014 retrospective.

2014 retrospective: “Mont-Royal LP”

Side 1:

  • Pachanga Boys – Black Naga (Hippie Dance)
  • Flore – Numen (POLAAR)
  • Suuns – Music won’t save you (Secretly Canadian)
  • Kool & The Gang – Summer Madness (Polygram)

Side 2:

  • Flore – Random (POLAAR)
  • Parquet Courts – Ducking & Dodging (What’s Your Rupture?)
  • Run The Jewels – Love Again (Akinyele Back) (feat. Gangsta Boo) (Mass Appeal)
  • The Beatles – Tomorrow Never Knows (Parlophone)

The 2013 retrospective is still available on
SoundCloud
.


2014’s inspirations

December 3, 2014Blog

la_grande_bellezza

Well the year isn’t over yet but I wanted to write down what inspired me in the past 12 months. Like you, I’m always looking around for interesting work to nourish my mind. Sign of times, I haven’t read many books. It’s been mostly an audio/video year. I watched a hell lot of TV though. Netflix doesn’t help in that matter… I’ve had a huge interest in comedy. I discovered the american alt-comedy scene and have been struck by their creativity and blunt thoughts.

Stand-Up specials

TV Shows

Once again, comedy was a central theme in my choices. I stopped watching other
shows that I won’t name here.

Movies

I watched other great movies than those present in this list, but I prefer to
keep it short.

 

Music

This year was really interesting on the music side. I started buying vinyls
again and went back to my turntables. I discovered really good house and techno
tracks, but in the end I prefer to list these indie bands.

Club Night

Laurent Garnier at Stereo Night Club in Montreal. This club has the best sound system. Period. Forget the clinical coldness of a Funktion One system. This one has a warm and beautiful
sound. Laurent Garnier did a good set, sticking perfectly to the club’s atmosphere.

Books

I haven’t read much. Or not as much as I’d like. Or maybe too much. My whole days are spent reading stuff. Be it code, articles, emails, social medias. At the end of the day, I much prefer watching and listening than reading

Exhibitions

Does this post need a conclusion? Naaah. You’ll do fine without.


In the last 24 months

August 22, 2014Blog

The last time I wrote something here was in 2012. What happened since then?
It’s been quite a ride actually. I lived in 3 different cities on two continents and had some realizations on the way I want to work and the importance it had on my life.

If you (still) follow me on twitter, you might have seen some changes. I’m tweeting more and more in French and less and less about technologies. It didn’t went unnoticed to @clochix and he asked me what I was doing and if there was a chance that I could wrote about that somewhere.

In the last 24 months, I left Paris and lived in Montreal, Berlin and now Amsterdam. I met a whole bunch of people, made new friends along the way and basically hadn’t too much to worry about because as I often say to people I meet “when you’re a developer, you can basically work from anywhere”. The freedom you get by doing that has its obvious drawbacks, but the upsides are really fun.

In the last 24 months, my views on work changed as well. As I was reading on autonomy and independence, I realized that being an employee was unsatisfying to me. It has its good sides but it was mostly frustrating in the end. I decided to become a freelancer. Who doesn’t need some php/symfony2/golang expertise in this world right now? Of course, there’s more to that: I wanted to
create something from my hands and my brain. This is something incredibly hard to do when you’re in an office for 5 days a week and that you also happen to enjoy your evenings and your weekends. Freelancing gives me the possibility to balance my workload between my clients and my projects. With freelancing, I can confront my classic gen-x/gen-y developer bullshit to the real world. And I can’t really tell you how good it is. In times where offices are transformed into playgrounds and that your company is paying for your breakfasts and your friday booze, trying to accomplish something by yourself can be seen as mad. Why would you refuse all these privileges? I don’t really know, but I just had to the feeling that I should do it.

In the last 24 months, I must admit I lost interest in the IT industry. I could state a lot of reasons for that but it would raise endless debates because none of us would be right or wrong. The fact is that I can get bored quickly when things look and act the same. This industry has bored me. I’ll get more involved again when the monoculture is less strong.

I tried to build (alone) different products but somehow always failed developing them past a certain point. This is something utterly frustrating.

Luckily during the Symfony Live 2013 in Berlin, I had the chance to have a few conversations with Dustin Whittle, Fabien
Potencier
and Francois Zaninotto who gave me really good advices: “Don’t create a business alone”, “It’s harder than you think, but rewarding”, “Think of the future of your product and how it will evolve”, and “expose your projects to like-minded people”.

Now the funny thing in life is that if you give room for surprises to happen, they might actually do. At the beginning of the year, a conversation with my good friend Flore led to something like that (jokes, usual stupidity and facebook stickers removed for clarity).

  • Her: “I think I want to start a record label, but it’s tough”
  • Me: “I never told you that but I have this idea in my mind since quite a while now.”
  • Her: “Well it would be fun to do that together. We should think about that maybe…”
  • Me: “Yeah, let’s think about it”

A few weeks later, it was on. We were creating a record label. This is a new adventure and even if I’m clearly out of my comfort zone, I enjoy it more and more. Music is my passion
and I’m glad I can see tech not as an end, but as a mean. I often asked myself who would create a time-consuming small business in the worst industry to do business at this time? The only answer I got is “Maybe the same guy who doesn’t like his office to look like a playground.”


Why I Stopped self-hosting my mails, IM and website

December 14, 2012Blog

A year ago, I started an experiment. I wanted to quit gmail and gtalk services
and prove me that I could host my emails and my IM myself. It went quite well
but I decided to stop and subscribed to fastmail.fm and
to hosted.im.

Installation

A year ago, I spent some days installing a fully functionnal mail/web/jabber
server. Hopefully, I had some good tutorials
about setting up a mail server. On the jabber side, it was quite easy even if
sometime, my WTF-o-meter level was really high. I blame my totally absent
knowledge of erlang and mnesia here.

The easiest part was to set-up varnish and nginx on the server. This is
because I use these technologies every day. I still think that serving static
files with a reverse proxy could be much more easier and quicker to setup.

Backuping is easy and cheap, thanks to Amazon S3. I did not suffer any crash
and did not have to restore my data. I think I would have cried if I had to do
that because of the time needed to set-up the server again. The pain would
have been bearable thanks to the EBS (if it doesn’t fail).

My final set-up used these technologies: Amazon EC2, Amazon S3, Amazon
CloudFront, Amazon Elastic Block Storage, Postfix, Dovecot, Sieve, Varnish,
Postgrey, Spamassassin, Nginx and Ejabberd.

Running it

Here is what I learned:

  • SMTP servers obey Murphy’s Law. If you have an important mail to send, it
    will fail. Fallbacking to gmail happened too many time.

  • ejabberd is stable. In a year of operation, it failed once and restarting
    it made did the trick. The guys behind
    ejabberd
    did a really great job.

  • Spam was virtually absent from my mail. Spamassasin and postgrey worked
    well.

  • Sieve
    is great. I mean really really GREAT. Filtering mail in gmail is a pain.

  • Mail clients all suck. Sparrow was an exception.

  • I’m not nerdy enough to use Mutt.

  • I should have used a configuration management system like Chef, Puppet or
    CFEngine to create the server. It would have doubled/tripled the time
    required to configure it properly, but it would have been an asset if I
    wanted to migrate my services to another host, which I considered at some
    point.

Now

Yesterday, and after too many problem with my SMTP server, I decided to end
this experiment and started looking for a reliable mail provider. I chose
fastmail.fm because of the price, migrations processes and the Sieve support.

This website is now hosted by Amazon S3. The only cron job that I had is now
run on heroku. My jabber service is being migrated to hosted.im.

This will costs me around 50$ a year and this is definitely worth the time I
won’t put in managing a server.

Creating, installing and configuring software is easy. Achieving reliability is
hard.


Authenticated Cross-Domains AJAX Requests with CORS

November 22, 2012Blog

Yesterday, I lost a significant amount of time dealing with cross-domain
AJAX requests and I thought I might share a bit of what I learned.

  1. jQuery 1.5.0 is BROKEN when it comes to cross-domain AJAX requests.
    Upgrade to at least jQuery 1.5.1.

  2. Access-Control-Allow-Origin WON’T accept a wildcard value if your
    XHR’s withCredentials option is set to true. Also, it won’t
    accept a list of origin. If you want to accept requests from a lot
    of domains, you can match the Origin request header against a set
    of domains and set the Access-Control-Allow-Origin accordingly.

  3. Access-Control-Allow-Headers and Access-Control-Allow-Methods
    CORS header does not support * as a value. You have to be specific,
    even during your prototyping phase.

Hope it helps.


Serving a maintenance page with varnish

January 18, 2012Blog

Yesterday during the SOPA Blackout, this website was on strike. The
billions of readers of this blog had a static page explaining why this
website was offline instead of the normal content. As a good nerd, I
turned this operation into a technological one and instead of serving a
static html with nginx, I decided to use
varnish. Yes, varnish. I never wrote
anything about the absolutely amazing architecture of this blog but
basically, static files are generated from
RestructuredText, served by
nginx and cached by varnish. Let’s get back to the
point. I wanted varnish to serve a static page with a 503 status code
(for SEO purpose). It took a bit of VCL knowledge and here is how to do
it:

“` text /etc/varnish/maintenance.vcl
backend default {
.host = “127.0.0.1”;
.port = “8080”;
}

sub vcl_recv {
error 503;
}

sub vcl_error {
set obj.http.Content-Type = “text/html; charset=utf-8”;
# you can put absolutely what you want
synthetic {“
<html>
<head>
My maintenance page
</head>
<body>
<h1>This website is under maintenance.</h1>
</body>
</html>
“};
return (deliver);
}


The trick here is the `synthetic` keyword which is described in the
varnish documentation like this:

> The synthetic keyword is used to produce a synthetic response body in
> `vcl_error`. It takes a single string as argument.

Now that you have a cool VCL for your maintenance page, you can load
this vcl in varnish like this:

``` bash
varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret "vcl.load maintenance /etc/varnish/maintenance.vcl"

and to replace the original rules by those described in maintenance.vcl

varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret "vcl.use maintenance"

And varnish will serve the maintenance page. Like a boss.