Mapping and Calculating Areas Autonomously: An AI Robotics Programming R&D Project

Recently, our ‘AI Robotics Programming’ Team has delivered a proof-of-concept robot used to explore and map unknown industrial and residential spaces while identifying floor types.

The robot (with the exception of its Roomba chassis) is fully built from open-source (OS) hardware and software components. The result is an elegant blend of genetic algorithms and neural networks which enable the robot to autonomously map, survey, and calculate areas of the non-trivial indoor/outdoor spaces.

As an industrial use-case, the team has showcased a demo where the robot is used by a fictional cleaning company to optimize its costs. The robot is sent to a fictional warehouse where it explores the space after business-hours and sends back a report to the cleaning company with the space’s map, areas of its various sections and floor types. This report helps the company to efficiently invoice the client for a regular maintenance contract and remove the human factor from part of its client acquisition process, thus optimizing costs.

The project is still in its early stages and we are confident that many more use-cases will be discovered along the development process – for example by adding support for outdoor spaces.

While the novelty lies mainly in the software part, our AI team has amusingly dubbed their assembled robot, SMOB – short for Self-Mapping Open Bot.

Mapping, Surveying, and Calculating Areas Autonomously: An AI Robotics Programing R&D Project
SMOB in action, surveying and mapping the area of Savoir-faire Linux HQ

What Powers SMOB?

The project is a unique blend of hardware and software design. Since the robot needed to be resistant to collisions with objects and travel at a fair speed, using the entire TurtleBot kit was not an option under such constraints. The team has solved the problem by mating the Roomba Create base (which is well suited for heavy duty operations) with the IMU (Inertial Measurement Unit), LIDAR (Light Detection And Ranging) and Raspberry Pi3 from the TurtleBot 3 DIY kit. In order to achieve the latencies required for smooth operations, the team has also modified the Debian kernel to support the 64-bit instruction set available on the ARMv9 processor (the modifications were based on the PI64 project).

SMOB’s Algorithms

SMOB combines two different techniques to achieve its goals. The space discovery algorithm is an implementation of the genetic algorithm proposed by Mohamed Amine Yakoubi and Mohamed Tayeb Larski. The algorithm is realized in Python to work in conjecture with the ROS framework, which powers the robot’s movement.

The more complex part has been the realization of the convolutional neural network which is responsible for classifying floor types. The main challenge here is to properly identify the properties of an image (sharpness, luminosity, size, camera position, etc.) so the network can achieve maximal classification efficiency – a research that took the team substantial trial and error before getting the right parameters.

Test Results

Our experiments shows a performance of coverage of ~1m^2 per 1 minute on a low-cost robot (~600 USD).

What Makes SMOB a Unique Robot?

SMOB is unique because it is among the first-attempts to have a robot perform several complex tasks on embedded hardware. It can be safely argued that automated driving already uses algorithms that are far ahead of what SMOB can do, but they are also far more complex than SMOB’s very basic and low-processing cost solutions. SMOB is about minimalism it’s an attempt to create simple solutions to problems which are currently solved by much more power and memory hungry algorithms.

The Future of the Self-Mapping Open Bot in the Congested Robotics Field

One of the biggest challenges faced by our AI Robotics Programming Team includes outdoor operations related to LIDAR sensors and issues associated with them. LIDAR – a device that maps objects in 3-D by bouncing laser beams off its real-world surroundings – is one of the most crucial and contentious components of any vehicle (in this case SMOB) that is supposed to drive itself around (Read for example: Simonite, 2017). SMOB’s LIDAR is unable to identify glass. It also faces difficulties in loop-closure detection and navigation on complex surfaces. For example, a SMOB designed to detect potholes outdoors would most likely need a different chassis, drive-train, and would need to be able to detect potholes before reaching them; otherwise it may not be able to get out of them once trapped inside.

Stay tuned for more details on the evolution of SMOB and its added capabilities.

Simonite, T. (2017, March 20). Self-Driving Cars’ Spinning-Laser Problem. MIT Technology Review.

Inno Weekly #11

Web Development

Getting Started with Server-Side Rendering in Angular

By Kévin Barralon

This week we released a tutorial for developers using the Angular JavaScript framework to set them up with a pre-configured server-side rendering environment. This environment allows for the pre-rendering of an Angular site so that its contents can be made visible to robots (e.g. Google, Facebook, Twitter) and to improve the performance of Angular, as the state of the application is transferred from the server side to the client side.

As these features are new to the framework, the latest version of Angular (v5) is used for the tutorial. You can access the extensive version of this tutorial by reading the blog article: How to Create an Angular Application with Server-Side Rendering?

Bundle Your JavaScript Apps Using Parcel

By Jacob Cook

The JavaScript ecosystem is notorious for evolving very quickly. The modern JS application stack requires a variety of tooling mechanisms, including “bundlers”, which handle the generation and packaging of proper assets for the creation of a Web page. Up until now, two projects have reigned supreme in this space: Browserify and Webpack. They are not particularly known for their ease-of-use: for a preview, you only need to Google “Why is Webpack…” to get thousands of results like “Why is Webpack so slow?” or “Why is Webpack so complicated?”

It’s clear that the ecosystem needs some new utilities that can improve the startup process for cutting-edge JavaScript web applications. There is a new project on the scene called Parcel. This project aims to be an answer to many Webpack-related headaches. It does many things that Webpack does (code splitting, hot module replacement, code transpilation and transformation) with very little if any manual setup and no labyrinthine configuration files to write. It also uses a multicore compilation system, allowing CPU-hogging build operations to be spread across multiple workers and to better take advantage of those fancy processors we all use nowadays.

It remains to be seen if it will emerge as a solid competitor to Webpack, but if initial indications prove true, Parcel will be a huge boon to Web developers that want to get going with a modern project without having to run through their bottles of aspirin. Check out Parcel:

Winter Break!

Thanks for following us for the past 11 editions. Our team wishes you a very happy and restful holiday season.

See you in January 2018!
Your Inno Weekly Team

Press Review Inno #10


What Is Design System?

By Patrick Bracquart

For several years now, the complexity of the websites and applications has pushed us towards rethinking the concept of design, as well as the methodologies we use in the design process. This rethink is pushed by an ever-expanding field of necessary skills and positions in design such as web analyst, UI/UX designer, interaction designer, front-end developer and so forth. It is within this context that the idea of “design systems” has come forward.

A design system is the primary UI/UX reference of a project. It provides us with a guide that can serve as a support for the entire chain of production, no matter the subject matter (fashion, style, food, services, …), the terminal (laptop, mobile phone, smartwatch, …) or even the deliverable (websites, mobile applications, management interfaces, …).

More complete than a simple set of guidelines, this guide does not just describe the (atomic) design elements or the user interactions, it also lays out the development standards that should be followed, the accessibility standards to put in place, as well as iconography and video, to name a few. These guidelines and standards ensure that the entire Design Ecosystem remains perfectly coherent.


How to Use Versatile Namespace in Swift?

By Thibault Wittemberg

In Swift, some APIs such as RxSwift use a technique that confines the code they are exposing in a dedicated namespace. This eases a lot the code reading and allows to extend this namespace to add your very own features.

In this post we will see that it is quite simple to create your own namespace and so generically that it allows an external contributor to extend it in an elegant way.

Press Review Inno #9

PyCon 2017 (Part 2!)

Talk: “Double Click: Continue Building Better CLIs”

Summarized by Kévin Barralon

This PyCon Canada talk was a presentation of Click, a Python package that allows you to create CLIs (Command-Line Interfaces) with only a few lines of code.

Click is simple and easy to use, in that the configuration of commands happens almost entirely using decorators around your Python functions. For example, here is a simple function that can be used to repeat the word you pass it as an argument:

import click<span style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" data-mce-type="bookmark" class="mce_SELRES_start"></span>
@click.option('--count', default=1, type=int, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def hello(count, name):
    for _ in range(count):
        click.echo(f'Hello {name}!') # Syntaxe de Python 3.6 !

if __name__ == '__main__':

In just a few lines of code, you’ve created a command that can:

  • take an option --count with a default value of 1 and that is type-cast to an integer.
  • take an option --name which allows the user to state their name, thanks to the ‘prompt’ argument passed in the decorator

These values are passed directly as the count and name parameters of the decorated function.

To run this command in your terminal:

python3 --count=3
Your name: Casimir 
Hello Casimir!
Hello Casimir!
Hello Casimir!

The other interesting (and practical!) point here is that if you pass the option --help when you call the command, you can see the docstring for your function, as well as information on each option that your comamnd supports thanks to the argument help passed in your decorators:

python3 --help

Usage: [OPTIONS]

Simple program that greets NAME for a total of COUNT times.


Count INTEGER Number of greetings
Name TEXT The person to greet
Help Show this message and exit.

Rather than simply passing options to your command, you can also specify arguments. For example:

def touch(filename):


python3 foo.txt
foo.txt # Résultat

As you can see, the possibilities with Click are endless. Here are a few additional ones for fun:

  • Add the argument multiple=True in your decorator @click.option which will give you a tuple of all options passed to your command.
  • Add a callback as an argument to @click.option which will change the behaviour of your command (to define custom validation rules, for example).
  • Pass environment variables to your decorator (like so: envar="USERNAME").
    Define a limited or unlimited number of arguments that will return a tuple.
  • Add a File method as a type in your decorator (example: @click.argument('input', type=click.File('rb'))) which will automatically open a specified file and close it when necessary.

A list of all possibilities offered by this Python package is available in the documentation, which is indeed very well done.


The closing keynote on f-strings really seemed to motivate our team! Here’s an article by Maxime which adds to the one by Sébastien from last week:

What in the World Are F-Strings?

By Maxime Dupuis

The mechanism of Literal String Interpolation, known as f-strings, is a new arrival in the latest version of Python, 3.6. They are recognizable by the f (or F) at the beginning of a declaration of a string: f'My f-string!'. They are very similar in behaviour to template strings in JavaScript, which are defined using the ` character.

F-strings are useful because they can reference variables that will be automatically interpolated with the values of the local variables defined under the same name.

>>> age = 42
>>> first_name = 'Maxime'
>>> f"My name is {first_name} and I'm {age} years old"
"My name is Maxime and I'm 42 years old"
>>> # The use of an undefined variable will give us a NameError:
>>> f"{notdefined}"
Traceback (most recent call last):
  File "<stdin>;", line 1, in <module>
NameError: name 'notdefined' is not defined

They become very interesting when you consider their impact on performance. If we compare them to other ways to create strings in Python, we have the following:

python3.6 -m timeit -c 'age=42; first_name="Maxime"; f"My name is {first_name} and I'm {age} years old"'
10000000 loops, best of 3: 0.172 usec per loop
python3.6 -m timeit -c 'age=42; first_name="Maxime"; "My name is {first_name} and I'm {age} years old".format(first_name=first_name, age=age)'
1000000 loops, best of 3: 0.714 usec per loop
python3.6 -m timeit -c 'age=42; first_name="Maxime"; "My name is %s and I'm %s years old" % (prenom, age)'
1000000 loops, best of 3: 0.283 usec per loop
python3.6 -m timeit -c 'age=42; first_name="Maxime"; "My name is " + prenom + " and I'm " + str(age) + " years old"'
1000000 loops, best of 3: 0.449 usec per loop
python3.6 -m timeit -c 'from string import Template; age=42; first_name="Maxime"; Template("My name is $first_name and I'm $age years old").substitute(first_name=first_name, age=age)'
100000 loops, best of 3: 8.75 usec per loop

But it’s not only useful for its performance benefits. We can use f-strings to call functions, modify substrings, and many other things:

>>> total = 10.0
>>> taxes = 1.15
>>> f'Total: {total + taxes}'
'Total: 11.15'
>>> first_name = 'Maxime'
>>> f'My name is {first_name.upper()}'
'My name is MAXIME'

If f-strings interest you or you haven’t yet discovered all of the new things that Python 3.6 has to offer, check out the release notes.



By Thibault Wittemberg

When we develop an iOS app, we regularly need to access resources. The traditional way to use them in the code is to instantiate them with their identifiers (strings):

let avatar = UIImage(named: ‘darthVader’) // gets the ‘darthVader’ image from the assets folder
let name = NSLocalizedString (‘darthVader’, comment: ‘’) // gets the localized string with the key ‘darthVader’ from the Localizable.strings file

The same goes for fonts, storyboards and colors.
Swift is a strict language about type management and promotes the detection of errors at compile time rather than at run time.

That being said, what happens if one of the resources we want to instantiate is not found at run time? Since this instantiation is based on a string, it is subject to errors (typo errors). Therefore, we can use the SwiftGen tool which allows to secure this kind of manipulation:

  • It avoids typo errors
  • It allows auto completion
  • It ensures that the resources exist at compile time.

It operates as follows:

  • The “SwiftGen” executable is installed on the development workstation (either via Homebrew or via CocoaPods)
  • A custom build phase launches this executable for each compilation
  • SwiftGen scans the project’s resources and generates the Swift code representing them in a “type safe” manner

The resource identifiers will be transformed into enums that are much more secure and easy to use. Consider the following example:

let avatar = Asset.darthVader.image
let name = L10n.darthVader

It is even possible to customize the templates that will be used to generate the code if you want to apply a different coding style.

When combined with the “Reusable” framework (from the same author), we have tools that are almost mandatory (and we use them a lot at Savoir-faire Linux).

SwiftGen is made to be integrated with your continuous integration environment (the executable can be embedded in a CocoaPods dependency, it avoids installing it on the build machine). Read more on GitHub!


New Release of num2words v0.5.6 with Support for New Languages!

By Ernesto Ortiz

It has been five months since the previous release of num2words v0.5.5, and these have been five really active months. A lot of new contributors have made some great improvements and have added support for new languages! Here are some of the latest changes, with “special thanks” to the contributors!

  • ‘Num2words’ has changed its coding conventions to follow PEP8. Code coverage has increased a lot, and we need your help to continue improving this, so check out the issues related to num2words
  • Now we can use other converters like to_currency, to_year, to_ordinal_num
  • Thanks to Tufan Kaynak for adding support for the Turkish localization
  • Thanks to Jesús Leganés-Combarro for adding support for Algerian French localization
  • Thanks to Armin Oliya for adding support for the Dutch localization
  • Thanks to Sergio Zholudov for adding support for the Ukrainian localization
  • Thanks to Blaž Bregar for adding support for the Slovenian localization
  • Thanks to Mārtiņš Šulcs for making a lot of improvements to the base code, to_currency functionalities and more!

Special thanks to everyone that has taken the time to report new issues, to make pull requests and to share their time and effort with this project!

You can check the new release at the following links:

Press Review Inno #8

Special Edition on PyConCa 2017

This week, we attended PyCon Canada which started on November 18 and lasted through 21. We are also proud and happy that we played a role in sponsoring this dynamic event. In this Special Edition of Press Review Inno, you find articles from our SFLers who actively participated in the event’s sessions.

PyCon 2017

Our Team Who Attended PyConCa 2017


Tutorial: Writing Tests that Write Themselves by David Kua

Summarized by Ernesto Rodriguez Ortiz

Stop worrying about corner cases and start loving the power property-based testing.

I just discovered the concept of property-based testing at PyCon Canada 2017, thanks to David Kua who prepared, showed and shared with us a great tutorial of property-based testing using the library Hypothesis. (Welcome to Hypothesis!)

In fact, the concept of property-based testing was popularized by the Haskell library Quickcheck. I am happy about my new discovery because I find myself too often thinking about corner cases in my tests, and now I don’t need to spend as much time considering this, as they will show up themselves with the help of Hypothesis.

So How Does This Work?

Hypothesis generates random data matching your specification and checks that your guarantee still holds up for each test case. Check out this really simple example:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# You wrote these two lines way too fast...
def division(x, y):
    return x / y
# Hypothesis will now show you your mistakes...
from hypothesis import given, settings
import hypothesis.strategies as st
@given(st.integers(), st.integers())
def test_commutativity_pbt(x, y):
    assert division(x, y) * y == x

Then run:

pytest --hypothesis-show-statistics

You should see how Hypothesis has found the corner case:

ZeroDivisionError: division by zero

This is powerful stuff, so go play a little with the awesome tutorial prepared by David Kua and check the documentation of Hypothesis.

Closing Keynote – Mariatta Wijaya

Summarized by Sébastien Blin

During the closing keynote, Mariatta Wijaya, a Python Core Developer, presented us Python 3.6 through the lens of a PEP (Python Enhancement Proposal) that has been released in this version: PEP 498: Literal String Interpolation.

Mariatta explained the history of this PEP, from its beginnings as a Python mailing list post since a few years ago. The new feature introduced in this PEP, colloquially called “f-strings”, allows for an improved experience in creating strings with variables in them, all the while improving performance and making for a more codebase than when the % operator or str.format functions are used.

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary =, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f’He said his name is {name!r}.'
"He said his name is 'Fred'."

She then gave a brief overview of the other PEPs released with Python 3.6 (including PEP 628 which adds math.tau, which did not exist prior, and the value of which is 6.28). The complete list of PEPs in Python 3.6 is available at Python 3.6 Release Schedule.

In any case, Mariatta invites us to upgrade to Python 3.6 as soon as possible, as well as to contribute to the evolution of the programming language through the creation of new PEPs at this GitHub repo.


GitHub Releases a Team-Based Discussion Feature

By Romain Bertozzi

To contribute to open source software means to share with others, so it only follows that the ability to effectively communicate is critical. GitHub announced a new feature on the 20th of November centered around team-based discussions.

The idea of this feature is to create a space for conversations within a project that might not be best placed under issues or pull requests. These issues and PRs will now be freed up and will be less of a magnet for long, irrelevant comment threads. In addition to this, these new discussions, public or private, will have dedicated URLs and will be able to be easily shared and cited on other sites.

Here at Savoir-faire Linux, we welcome this news enthusiastically. We believe that it will bring more clarity around the discussions related to the creation, management and direction of a project. The centralization and the ease-of-use of these discussions are benefits that will allow for more transparency and longevity of conversations. It remains to be seen how this functionality will be adopted by GitHub users, who already have many different options available to them that they may be more used to.

Press Review Inno #7



Generic Protocols and Type Erasure in Swift

With Swift, you can define protocols by associating one or more generic types. These types are defined using the associatedtype” keyword. The name Generic Type” is a bit misused here. We should actually talk about a placeholder for a reserved type. Indeed, we will see that such protocols do not offer great flexibility of use when we consider them as generic.

Useful Information:


Web Development

Django 2.0 Release Candidate Now Available

By Kévin Barralon

The Django web framework just published the first release candidate of its upcoming 2.0 version. Django 2.0 is scheduled to be released on December 1st.

Don’t be fooled by the name – this new major release of Django will not bring any major significant changes to the framework. The changes in the latest version should be of the same scale as those found in past new releases.

Despite this, the most important change in the 2.0 release is its incompatibility with Python 2.7, the support for which is scheduled to last only until 2020. Django 2.0 will only support a minimum version of Python 3.4, and of course it is highly recommended to go directly to the most recent version of Python, which is presently 3.6.

URL Routing

In terms of new features, the new function django.urls.path() renders the URL routing syntax much simpler and easier to read. So, instead of having to write url(r'^articles/(?P[0-9]{4})/$', views.year_archive), you can write path('articles//', views.year_archive). This new syntax will also allow the view to receive the URL arguments with the proper type already defined (a whole number in the case of year above, instead of a string).

It is still not possible to add a constraint to the URL route directly (in this example, the fact that the year should only consist of four digits). The current function django.conf.urls.url() will be replaced by django.urls.re_path() which will keep the existing functionality of allowing regular expressions to be placed in the definition of the route.

The functiondjango.conf.urls.include() will also be directly available under django.urls. This will allow you to import your modules like from django.urls import include, path.

Other New Things

Helpful Links:

Deploying Entire Services with Docker Swarm and GitLab CI

by Jacob Cook

Here at Savoir-faire Linux, I work on the deployment infrastructure for many of our hosted services, and am constantly looking for ways to improve our DevOps practice. Currently the deployment pipeline is centered around the use of Ansible to manually provision a service inside a virtual machine and adjust as necessary. But in an effort to make builds and deployments faster and more stable for our developers, we are looking at new approaches, including the use of Docker builds pushed to a registry and subsequently deployed using a pipeline like GitLab CI.

One of the tools that can be used to deploy a micro-service architecture (created with docker-compose) is called Docker Swarm. Using a set of servers configured to act in a swarm, one can deploy a stack of containers in a simple pattern with only docker stack deploy. Docker will then automatically choose the appropriate servers in the swarm to deploy to, and handle networking between the services just as if you were using docker-compose on your local machine. Neat, huh?

The best part is that it plays nicely with our existing build system in GitLab CI. We can build, test, release and deploy across our infrastructure using GitLab CI and GitLab Container Registry. There are still pieces of the puzzle to work out but it represents a major leap forward in the simplification and stability of our DevOps practice.

Further Reading:

Ring Universal Communication Platform Now on Android TV!

Ring keeps surprising communication experts and enthusiasts! Ring is now available on Android TV box and other smart TVs. Ring has become the only  communication software available on the Google Play Store for Android TVs, since the discontinuation of support for the TV version of Skype in June 2016. This new release is quite different from its mainstream app which can be downloaded on a myriad of devices such as cellular phones, tablets, Mac and PCs.

Recall that Ring is a free, distributed and universal communication software, available under the GPLv3+ license. Ring users can communicate in different ways, using it as a telephone (VoIP), a media sharing tool (audio/video), a messaging system, or as a communication platform for connected devices such as the case of the Internet of Things (IoT). Ring is often seen as a free and open source alternative to Skype. Its success is based on a distributed and decentralized network that guarantees a high level of privacy and confidentiality for its users. The Ring project – which became a GNU package in 2016 – has the unwavering support of the community of developers around the world as well as the Free Software Foundation.

Rethinking Ring for the Android TV

In order to make sure you will have a satisfying and enjoyable user experience, our developers have reworked the user interface of the Android Ring application to adapt it to Android TV standards. To accomplish this task, it was necessary to rethink the ergonomics and navigation of the Ring application to ensure it functions with a remote control and graphic components offered by the platform.

In fact, the architecture pattern underlying Ring Android application allows  developers to transfer the entire dependencies and data parts of the mobile version onto the TV app so as to be able to completely focus their attention on the GUI part.

Usability constraints have led developers to focus on key features like:

  • Contact search,
  • Online audio/video calls,
  • Shared screen display from the caller.

These features remain small, but the development continues to offer in coming weeks, expanded use possibilities. Having been designed with the objective of simplicity, stability and user-friendliness,  Ring can serve both domestic and professional needs. It can be used on Android TVs to connect family members together, or simply replace conference phones in corporate meeting rooms.  In fact, availability of the Ring as a TV app on the Google Play Store makes it an easier-to-use communication platform, in comparison to a secondary computer or display setup.

Ring on Android TV

Help us to improve Ring!

Ring is constantly improving to offer the best of communication. As the software is in active development process, some bugs remain and many challenges still await our team of developers. The assessments provided by the community of users, testers, and developers on the quality and use of the platform are then essential to help us identify problems, resolve them, and improve the experience.

For the next release of Ring on Android TV, lot of questions are focused on the compatibility of systems and webcams, other than Logitech as well as NVHI hardware. Also, we encourage curious, free software users and enthusiasts to test Ring on different medias and different systems. Your experience was a success? or crashes remain with your TV or TV box? Send us your comments at You will also contribute to the success of Ring!

Download Ring on Android TV

If you want to experience this new communication platform, just download it for free from Google Play Store!

For further information:


Press Review Inno #6


Atomic Design

By Patrick Bracquart

Since the early days of the web, we talk about what goes into creating a Web “page”. This term shows how our vision of the web was informed since the 90s: it came from an architecture that was structured as a series of documents, like if they were printed pages of an encyclopedia.
However, for several years now, the multitude of available platforms in the Web ecosystem continues to grow and to become more complex. From the computer to the smartphone, and without forgetting the television or even smart watches, it has become clear that the concept behind the design and structure of Web pages is now obsolete.
There is a new methodology of design available that can take this into account. It is called Atomic Design, and the term was coined by Brad Frost. Thus, instead of thinking about content in the form of a page, each design element is created starting with its smallest component element (such as a call to action) and builds up to create something much bigger. We start from the atom to create the molecules, and these molecules come together in order to create a coherent and modular Web organism.

As each atom is placed individually in a library, Atomic Design saves a lot of time and makes for a more coherent and simplified end result.

Web Development

Makefiles, or How to Avoid Reinventing the Wheel

By Samuel Sirois

After having taken a break from frontend Web application development, I’ve recently jumped back into the field through two projects that I am working on. It represents a great opportunity to revisit my preconceived notions and old work habits, through a codebase that already exists and that is up-to-date with the latest stylish tools to use, ready after a simple git clone.

Wow, things do change quickly! (Even from the first line) From new versions of ECMAScript supported in modern Web clients – a panoply of pseudo-languages based on JavaScript – to the multitude of CSS pre-processors available… In addition to all these new automated build pipelines specifically created by and for JavaScript developers.

With all of these new shiny things, these automated build pipelines become essential to ensure that the minification, linking, compilation?!, of all of these files won’t cancel out the efficiency gains given by these tools which are now a necessity for the development of modern Web applications.

I still can’t keep myself from wondering if there hasn’t been a little bit of a lack of communication between those that have recently needed these complex tools in their projects (front-end developers) and those who have already faced these same requirements in the past and have discovered a solution (not the only one, mind you) to this problem, way back in the 70s!

I’ve never yet felt the need to use these new tools, as I already know Make, and having already been confronted with new, shiny, stylish solutions around the turn of the century, only to have taken some steps backward from something that already worked well. Indeed, I often insist on manually creating these Makefiles for projects I contribute to and I don’t hesitate to spend the time necessary to manage this tool.

Reinventing the wheel, i.e. to fall into the same traps and mistakes, or to really improve the situation? Here are a few interesting links to help you make your own opinions on the subject:


From Contributions to Inno Hackfest

While evaluating the success of the afternoons we spend once per month on contributing to open source projects, we’ve decided to revise our formula a bit. Starting now, these afternoons will be held biweekly under the banner of “Hackfest”.

 Our First Few Hackfests

While working in small groups (and never alone), our SFLians have had the opportunity to learn about new technologies, to contribute to projects that they love or even to work on some new “side projects”.

In and amongst these contributions we find: initiations to the world of virtual reality (VR) through the creation of a dominos simulator using Unity and Oculus Rift; a workshop on blockchain technology and the connection with a concrete case study using the Ring software’s username database; the creation of a proof-of-concept client for a document-oriented database.

Upgrade Review

By Maxime Turcotte

The Drupal 8 migration report page, on which the modules that require migration are listed, was in sore need of a refresh in order to improve the user experience (UX). During our afternoon Hackfest, I wrote an initial patch that reuses certain design elements of the Drupal administration interface. Also, in adding just a few new descriptive icons, it is far easier to quickly find what requires our attention in this report.


Helpful Link:

Press Review Inno #5

Web Development

Node.js releases LTS of version 8.x

By Jacob Cook

The release schedule for Node.js provides for updates in long-term support (LTS) most every October, and this year will be no exception. Node.js offers developers a happy Halloween gift this year in transitioning its current version branch (8.x) to a stable LTS version. This means that features that have been at the cutting edge of development since early 2016 have finally been made available to users that require the stable and well-tested environment that an LTS version provides.

The new features in Node.js 8.x that have been eagerly awaited by developers include full support for async/await in Node.js core, updates to the V8 engine, an HTTP/2 implementation, a new version of NPM that allows for package version pinning with lockfiles, and much more.

Further reading :


Firebase Dev Summit

The Firebase Dev Summit has just ended and several important announcements were made:
Following the purchase of Fabric by Google, Crashlytics will be integrated into the Firebase console. This new crash reporting system will benefit from access to other Firebase services, including Cloud Functions – which are the functions (lambdas) triggered when a Firebase internal trigger fires, or externally via a REST API call.


The added value of such an integration is in triggering a Cloud Function in response to some raised crashes. A crash in the main flow of the app could trigger an email to the entire team to speed up its resolution. A Cloud Function could also be used to create a task in a project management tool.
Google also announced that they are bringing machine learning to work with a new service, Predictions, which can categorize groups of users based on the way they use an application. Firebase can then present these groups with different offers or exclusive features to maintain their engagement.


Celebrating the Next Generation of Business Digitization Talents


Savoir-faire Linux and ICTC celebrate the first cohorts of the successful graduates from the Small Business Digitization Initiative (SBDI).

The first students, the pioneers, started last January their six-month journey which can position them as the next generation of digitization talents. They went through an intense in-class training helping them understand how technology opens countless improvement and change opportunities. At the same time, they tackled a real business challenge in a natural work environment, thus balancing theory and practice, through a unique approach based on agile feedback.

Some students from the class of 2017

A Training to Be Seen as the Digitization Leader’s Toolkit

Students worked on projects as diverse as delivering fresh products to Nunavut, developing local retail shops promoting health, building cool brands, improving the customer experience in-store and online, and scaling the business of a micro-brewery. They touched a wide-range of technologies from beacons, communication and collaboration technologies, business applications of all sorts from sales to accounting and customer relationship management. Some of more technical students managed to build an Android mobile app, deploying an open source internal social media, developing online stores with Shopify, WordPress or Odoo, and developing a software for a local insurance company to do underwriting online. We used Odoo, and more generally a wide range of open source technologies, which could be easily accessible and useful to students to tackle business challenges. We provided students with the necessary training and skill set to apply open source projects and combine them with other technologies while solving business related problems.

Theory Face-to-Face with the Reality

We would like to congratulate every single student for their efforts, for the challenges they bravely faced, for trying to apply their theoretical learning in real-life scenarios, regardless of the success rate!

During this 6-month long program, they confronted tough decision making situations and challenges with both courage and determination. These experiences, for some, led to new job opportunities. Some others realized that they needed more training and coaching. Some candidates evolved dramatically as a result of their flexibility and adaptations to the business context. In fact, they learned that they should accept to let go of some ambitions or had to adjust them to the real context.

One thing we are sure is that all candidates received a fair amount of constructive one-on-one training and feedback. They used these feedback loops as an instrumental tool to develop business solutions and make decisions based on what they have learned in class. After all, there may be more than one technological solution to resolve the same problem. But knowing that technology is just a tool, and not the main purpose, students learned to think globally and critically of all the stakeholders being affected by every decision. Such pluralistic approach to realistic problem solving opened a range of possibilities which demanded even a more engaged and considerate decision making process. We did our best to provide all necessary tools to the best of our knowledge and capability and hopefully we left a positive and lasting mark on them.

Savoir-faire Linux’s Role in the Program

Savoir-faire Linux is a technology and innovation company. We have been involved in this program as a business as well as technology training partner of ICTC. Furthermore, we recommended a module about sustainability to be added to the curriculum, and ICTC (our client-partner) accepted our proposal. As an Open Source Software advocate and an environmentally committed company, sustainability lies at the heart of our innovation strategy.

On the technology part, we mixed and match some general culture about IT, with hands-on exercises and feedback from our past experience pool. On the business side, we decided to broach a wide range of business processes (like a mini-MBA program), and showed the students how an ERP (in our case, the Odoo solution) was an appropriate technological solution to a functional problem. The two days of sustainability were offered as an opening subject, giving students the opportunity to imagine how the future would constrain us and change our whole way of designing, optimizing, sourcing and more globally consuming. This part was well received and gave more sens to innovation and change topics. We were really happy of how well it was received by the participants.

SBDI Participants in Action

The Future of the SBDI

We are thinking about the future of the Small Business Digitization Initiative (SBDI), as we are gathering feedback from students and employers. As this initiative was never done before, we have many ideas to adapt and improve the program. Our main challenge is to strike a more consistent balance between the theory and practice based on considerations of the received feedback and the stakeholders’ rights as well as their expectations. We have developed some answers and we will realize this goal in the next program.

To conclude, we extend our gratitude to all the team members. In fact, 11 people; namely, Marc, Mickael, Carol, Daniel, Monica, Adriana, Julien, Guillaume, Quentin, Bruno and Pascal have been passionately involved in the curriculum design and preparation as well as teaching the sessions.  They are happy and content about their contribution, experience and more important of all about the invaluable lessons learned from their engagement. Today, we are confident that we can make a significant difference in the Canadian youth’ future career development and therefore look forward to other opportunities to participate in a new project of this kind.

To obtain more information about the program or get involved, please contact our Director of Operations/COO: Mickael Brard through email: or telephone: +1 514 276 5468 (#357)

More informations