In the top 20 Java influencers fo 2018!

Just before heading to Google Cloud Next, I was notified I was listed 4th in JAX London's Top 20 Java influencers of 2018 on social media! It's an honor to be listed among famous figures like Josh Bloch, Brian Goetze, Martin Thompson, Arun Gupta, Jessica Kerr, Mario Fusco, Josh Long, Venkat Subramanian, Charles Nutter and many others. You can see the full list of the top influencers here.

I'll definitely continue to advocate for Java (and Apache Groovy) developers around the world, and share whatever I learn along the way through articles or conference talks. I'm looking forward to meeting you, my fellow Java/Groovy developer friends, at an event near you.

The big green button — automating continuous delivery with chatbots

Last month in sunny Napa valley, my awesome colleague Seth Vargo and I had the chance to speak at SwampUp, the devops focused conference organized by JFrog. Our talk & demo were focused on the topic of "ChatOps". But what is ChatOps? Here's what our abstract said:

Heard of ChatOps? It's a movement in the DevOps community to take advantage of Chatbots. 

Chatbots centralize the conversation and history of your daily operations including build status, issue management, deployment, and monitoring, so that you access all the information and actions needed at the whim of a chat message in your team communication solution.

After a quick introduction about the principles and pros&cons of ChatOps, Guillaume Laforge & Seth Vargo will walk you through Dialogflow to design your conversational interface to your CI/CD infrastructure. With the help of demos on the Google Cloud Platform, we’ll see together how chatbots can make you more productive in your DevOps activities.

The video has been published last week:

And you can have a closer look at our slide deck below, but be sure to watch the video if you want to see the demos.

Chatbots, switching to the second gear at DevFest Lille

My buddy Wassim and I were back on stage together to talk about chatbots, with Actions on Google and Dialogflow, at DevFest Lille. I'd like to share with you the slides of the presentation (the video has been recorded and will be available at a later time.)


Automating Chrome headless mode on App Engine with Node.JS 8

On the Google Cloud front today, the big news is the release of the new Node.JS 8 runtime for Google App Engine Standard. It’s been a while since a completely new runtime was added to the list of supported platforms (Python, Java, PHP, Go). You could already run anything in custom containers on App Engine Flex, including your own containerized Node app, but now you can have all the nice developer experience on the Standard environment, with fast deployment times, and 0 to 1 to n instance automatic scaling (you can see the difference between those two environments here).

To play with this new runtime, I decided to follow the steps in this guide about using Chrome headless with Puppeteer.

As my readers know, I’m not really a Node person, and usually dabble more with Apache Groovy and Java, but this runtime was interesting to me as there’s a nice integration with native packages. Let me explain.

The App Engine Node runtime includes tons of native package out of the box, without requiring you to install anything (except the Node modules that take advantage of those packages, of course.) For instance, if you need to do any audio / video manipulation, there’s an ffmpeg package. If you want to deal with Git repositories, there’s a git package. Need to manipulate images, there’s ImageMagick, etc. And there are usually nice Node wrapper modules around those native components.

Among those system pre-installed packages, there’s all the necessary ones to run Headless Chrome, ie. running the Chrome browser but without displaying its window basically.

Furthermore, there’s the Puppeteer Node module, which is a library to control Chrome. With those two, you can completely automate the usage of Chrome on the server-side.

What can you do with that? Well, you can:

  • look at / introspect / manipulate the DOM,

  • pre-render content for your single page apps,

  • take screenshots of web pages,

  • watch a particular page and compute diffs between different versions, etc.

Let’s get started!

Without blindly recopying all the steps explained in the tutorial for running Chrome headless, I’ll simply highlight some of key points. The goal is to let puppeteer take screenshots of webpages.

In your package.json, you need the reference the puppeteer module, and potentially express for handling your web requests:

  "dependencies": {
"express": "^4.16.3",
"puppeteer": "^1.2.0"

Taking advantage of Node 8’s async capabilities, in your app.js file, you can instantiate puppeteer:

const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox']

Then navigate to the desired page:

  const page = await browser.newPage();
await page.goto(url);

Take a screenshot and render it back to the browser:

  const imageBuffer = await page.screenshot();
res.set('Content-Type', 'image/png');

To deploy to the Node runtime, you also need the app.yaml deployment descriptor:

runtime: nodejs8
instance_class: F4_1G

We specify that we want to use the new node runtime, but also that we want a slightly bigger instance to run our Node app, as Chrome is pretty hungry with RAM!

Then deploy your app with the gcloud CLI.

Be sure to check the whole code on Github for all the details.

One quick remark: although it’s not mentioned in the tutorial, when you’ll first try to deploy the application, it’ll tell you that you need to enable the Container Builder API. The error message will be something like “Container Builder has not been used in project xyz before or it is disabled. Enable it by visiting…” You just need to follow the indicated URL to enable Container Builder. Container Builder is responsible for containerizing your application to be run on App Engine.

Then I was able to navigate to my app, pass it a URL, and get back the screenshot of the web page at that URL. It’s pretty handy if you want to integrate thumbnails of websites you reference in your blog posts, for example, or if you want to see if there are differences between different versions of a web page (for integration testing purposes).


The Java ecosystem has a wealth of libraries for various tasks, but often, there are native libraries which are more fully-featured, and Node generally provides nice wrappers for them. Chrome headless with Puppeteer is one example, but ImageMagick for image manipulation is another great one, where I could not find a good equivalent library in the Java ecosystem. So as they say, use the best tool for the job! In the age of microservices, feel free to use another tech stack that best fit the task at hand. And it’s really exciting to see this new Node 8 runtime for App Engine now being available so that you can take advantage of it in your projects.

Best of Web Paris: Chatbots, et si on passait la seconde ?

Avec mon fidèle comparse Wassim Chegham, nous avons eu le plaisir d'animer un nouvel atelier sur le thème des chatbots, à la conférence Best of Web Paris 2018.

Lors de cet atelier, nous avons parlé de l'Assistant Google, comment créer des chatbots pour cette plateforme en utilisant l'outil Dialogflow, pour concevoir son interface conversationnelle.

Pour la partie "mains dans le cambouis", nos participants ont pu s'exercer sur les deux "codelabs" suivants :

Si vous n'avez pas eu l'occasion de participer à l'atelier, vous pouvez très bien suivre ces deux codelabs didactiques de par vous même, sans soucis.

Voici également la présentation que nous avons montré aux participants :

© 2012 Guillaume Laforge | The views and opinions expressed here are mine and don't reflect the ones from my employer.