Nouvel album: “Une dernière chance”

August 29th, 2014

Je suis heureux d’annoncer la disponibitlié immédiate de mon dernier album intitulé “Une dernière chance“. Cet album fut réalisé sur une période de plusieurs années, parsemées de  plusieurs longues pauses.

Il est disponible gratuitement sur Soundcloud, Spotify, et également sur iTunes. Plus de détails sur ma page de musique.

The Too Good To Be True Filter

April 29th, 2013

I just published a new post on the Datacratic blog: The Too Good To Be True Filter.

At Datacratic, one of the product we offer our customers is our real-time bidding (RTB) optimisation that can plug directly into any RTBKit installation. We’re always hard at work to improve our optimisation capabilities so clients can identify valuable impressions for their advertisers. Every bid request is priced independently and real-time feedback is given to the machine learning models. They adjust immediately to changing conditions and learn about data they had not been exposed to during their initial training. This blog post covers a strange click pattern we started noticing as we were exploring optimized campaign data, and a simple way we can use to protect our clients from it. Read more…

MapReduce avec parallel, cat et une redirection

November 15th, 2012

Je viens de publier un article, MapReduce avec parallel, cat et une redirection, sur le blogue de Datacratic.

La loi 78 et le filtre antipourriel de Vidéotron

May 22nd, 2012

Je voulais revenir sur le problème de filtre antipourriel chez Vidéotron qui a eu la malheureuse conséquence de bloquer tous les courriels contenant un lien vers la Pétition d’appui à la requête en nullité du Projet de loi spéciale 78 pour au moins plusieurs heures hier.

Pour résumer le problème d’hier, tout message transitant à travers le serveur de courriel de Vidéotron et contenant la mention loi78.com était effacé et jamais livré à destination. L’explication mise en ligne sur la page Facebook de Vidéotron est qu’un trop grand nombre de messages contenant un lien vers ce site furent reçus en un laps de temps trop court, ce qui entraîna leur ajout à une liste noire de manière automatique. On peut accepter cette explication; c’est raisonnable. C’est raisonnable de bloquer les courriels entrants qui sont des pourriels. Le lien loi78.com n’est par contre absolument pas du contenu problématique, mais acceptons pour le moment que c’est le cas et qu’on se doit donc de bloquer les courriels entrant contenant ce lien.

Les courriels sortants sont pour moi quelque chose de complètement différent. En effet, selon les tests que j’ai faits hier et qui ont été confirmés par de nombreuses personnes, un client de Vidéotron envoyant un courriel à quiconque était affecté par ce problème. Si je suis client et que j’écris à mon ami qui a un compte Gmail, le message sera bloqué. Pas par Gmail, mais par le serveur de messagerie sortante de Vidéotron. Pour ce serveur de messagerie, un client est donc en train d’envoyer un message contenant un lien classifié comme indésirable et qui mérite d’être bloqué. Pourquoi un client serait-il en train d’envoyer un tel message et que devrait-on y faire?

L’ordinateur du client est contaminé par un virus

Il est tout à fait plausible de penser que l’ordinateur de l’expéditeur est contaminé par un quelconque virus qui utilise sa liste de contacts et son logiciel de messagerie à son insu. Si tel était le cas, en plus de bloquer le pourriel, un message devrait être renvoyé au client l’avertissant du problème. Il s’agit là d’une mesure de sécurité élémentaire. À ma connaissance, aucun client de Vidéotron n’a été contacté à ce sujet ou n’a reçu un message automatisé l’informant qu’il envoyait des pourriels.

Le client est un véritable polluposteur

Si tel est le cas, des mesures devraient être entreprises contre le client. Au minimum, l’avertir, mais encore mieux couper son service internet. Les pourriels sont un fléau et les polluposteurs ne devraient pas être tolérés. À ma connaissance, aucun client de Vidéotron n’a reçu d’avertissement à ce sujet.

Le lien n’est pas problématique. Est-ce un faux positif?

Il est raisonnable de supposer qu’en temps normal, la vaste majorité de ses propres utilisateurs ne sont pas des polluposteurs. On doit principalement se méfier des courriels entrants plutôt que sortants, car ils proviennent de serveurs et d’expéditeurs inconnus. Dans notre cas à nous, il devait y avoir environ autant de clients de Vidéotron que de clients d’autres compagnies qui envoyaient des courriels contenant le lien loi78.com. Pour apprendre correctement, un bon filtre automatique est capable d’utiliser des exemples de pourriels, mais aussi de messages qui sont propres. Une rétroaction devrait être en place dans le système pour que l’antipourriel réalise automatiquement que plusieurs utilisateurs auxquels on peut faire confiance envoient aussi ce lien. Le lien n’est donc probablement pas problématique et devrait être soit retiré de la liste noire ou être contre-vérifié par un humain.

Ne pas trop y penser et effacer silencieusement les messages

On peut aussi complètement se fier au système antipourriel et effacer silencieusement les messages contenant ce lien.

 

En conclusion…

Le quatrième scénario est ce qui semble être en place chez Vidéotron, et ça me semble problématique. J’ai de la difficulté à comprendre qu’on n’avertisse pas un de ses clients quand on efface les messages qu’il envoie parce qu’on les considère comme étant des pourriels.

Absolument rien ne laisse croire que Vidéotron a volontairement filtré ces messages et les accuser de censure n’est pas très crédible. Le résultat non intentionnel a tout de même été d’effacer des messages à caractère politique en temps de crise. Ça mérite au minimum une petite réflexion.

Loi 78: Courriels contenant un lien vers la pétition non livrés par Vidéotron? (Maintenant réglé)

May 21st, 2012

Voir mise à jour au bas du message. À 20h le problème semble avoir été réglé. Une explication a été publiée sur Facebook vers 21h.

Après avoir vu des rumeurs sur Facebook prétendant que Vidéotron bloquait les courriels de ses membres mentionnant la Pétition d’appui à la requête en nullité du Projet de loi spéciale 78, je n’y croyais simplement pas. Administrant un serveur web et ayant donc accès aux fichiers journaux (log files), j’ai fait un petit test pour tenter de vérifier ces affirmations.

J’ai donc envoyé deux courriels à un client de Vidéotron, un contenant le lien vers le site de la pétition (loi78.com), l’autre contenant un lien vers loi79.com, pour qu’ils soient le plus similaires possible. Ci-dessous, les deux messages au format brute ainsi que les extraits du fichier journal qui confirment qu’ils ont tous deux été acceptés par le serveur de messagerie de Vidéotron.

Message contenant loi78.com

Received: from [MONIP] (port=55903 helo=[192.168.0.109])
	by MONSERVEUR with esmtpsa (TLSv1:AES128-SHA:128)
	(Exim 4.77)
	(envelope-from )
	id 1SWYJX-00017x-5z
	for CLIENT@videotron.ca; Mon, 21 May 2012 15:30:43 -0400
From: =?iso-8859-1?Q?Fran=E7ois_Maillet?= 
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Subject: test test
Date: Mon, 21 May 2012 15:30:43 -0400
Message-Id: <6BDA2E28-086F-452E-BD27-5B51982B4056@MONSERVEUR.ca>
To: CLIENT 
Mime-Version: 1.0 (Apple Message framework v1278)
X-Mailer: Apple Mail (2.1278)

loi78.com

Confirmation de livraison:

2012-05-21 15:30:43 1SWYJX-00017x-5z <= MOI@MONSERVEUR.ca H=([192.168.0.109]) [MONIP]:55903 P=esmtpsa X=TLSv1:AES128-SHA:128 A=dovecot_plain:MOI+MONSERVEUR.ca S=662 id=6BDA2E28-086F-452E-BD27-5B51982B4056@MONSERVEUR.ca T="test test" for CLIENT@videotron.ca
2012-05-21 15:30:43 cwd=/var/spool/MailScanner/incoming/32134 5 args: /usr/sbin/exim -C /etc/exim_outgoing.conf -Mc 1SWYJX-00017x-5z
2012-05-21 15:30:43 1SWYJX-00017x-5z SMTP connection outbound 1337628643 1SWYJX-00017x-5z MONSERVEUR.ca CLIENT@videotron.ca
2012-05-21 15:30:43 1SWYJX-00017x-5z => CLIENT@videotron.ca R=dkim_lookuphost T=dkim_remote_smtp H=mx.videotron.ca [SONIP]
2012-05-21 15:30:43 1SWYJX-00017x-5z Completed

Message contenant loi79.com

Received: from [MONIP] (port=55852 helo=[192.168.0.109])
	by MONSERVEUR with esmtpsa (TLSv1:AES128-SHA:128)
	(Exim 4.77)
	(envelope-from )
	id 1SWYE5-0000T4-0U
	for CLIENT@videotron.ca; Mon, 21 May 2012 15:25:05 -0400
From: =?iso-8859-1?Q?Fran=E7ois_Maillet?= 
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Subject: test test
Date: Mon, 21 May 2012 15:25:05 -0400
Message-Id: <3CB6CC4F-4362-4D9E-9912-D3F9B92365A1@MONSERVEUR.ca>
To: CLIENT 
Mime-Version: 1.0 (Apple Message framework v1278)
X-Mailer: Apple Mail (2.1278)

loi79.com

Confirmation de livraison:

2012-05-21 15:25:05 1SWYE5-0000T4-0U <= MOI@MONSERVEUR.ca H=([192.168.0.109]) [MONIP]:55852 P=esmtpsa X=TLSv1:AES128-SHA:128 A=dovecot_plain:MOI+MONSERVEUR.ca S=662 id=3CB6CC4F-4362-4D9E-9912-D3F9B92365A1@MONSERVEUR.ca T="test test" for CLIENT@videotron.ca
2012-05-21 15:25:05 cwd=/var/spool/MailScanner/incoming/19826 5 args: /usr/sbin/exim -C /etc/exim_outgoing.conf -Mc 1SWYE5-0000T4-0U
2012-05-21 15:25:05 1SWYE5-0000T4-0U SMTP connection outbound 1337628305 1SWYE5-0000T4-0U MONSERVEUR.ca CLIENT@videotron.ca
2012-05-21 15:25:05 1SWYE5-0000T4-0U => CLIENT@videotron.ca R=dkim_lookuphost T=dkim_remote_smtp H=mx.videotron.ca [SONIP]
2012-05-21 15:25:05 1SWYE5-0000T4-0U Completed

 

Le client de Vidéotron a uniquement reçu le message contenant le lien loi79.com, et ce en une minute. J’ai ensuite envoyé un message à partir de GMail contenant loi78.com qu’il n’a pas reçu. J’ai ensuite envoyé 6 messages un après l’autre très rapidement: trois contenants loi78, et trois autres contenants loi79. À ma grande surprise, il a reçu les 3 mentionnant loi79 et aucun mentionnant loi78.

Envoie via le serveur de Vidéotron

Le client de Vidéotron m’a ensuite envoyé deux courriels comme j’avais fait: un contenant la mention du site de la pétition et l’autre non. Il l’a envoyé en utilisant le serveur SMTP de Vidéotron (relais.videotron.ca). Je n’ai jamais reçu le message contenant le lien et il n’y a aucune trace dans mes fichiers journaux d’une tentative du serveur de Vidéotron d’effectuer la livraison de ce message. J’ai par contre reçu celui sans lien très rapidement:

2012-05-21 15:00:01 1SWXpp-0006Np-1L <= CLIENT@videotron.ca H=relais.videotron.ca [SONIP]:30562 P=esmtp S=919 id=D8D8F143-6EB2-45B4-95C0-57FAD7C9C58E@videotron.ca T="test 1" for MOI@MONSERVEUR.ca
2012-05-21 15:00:03 cwd=/var/spool/MailScanner/incoming/22695 5 args: /usr/sbin/exim -C /etc/exim_outgoing.conf -Mc 1SWXpp-0006Np-1L
2012-05-21 15:00:03 1SWXpp-0006Np-1L => MOI  R=virtual_user T=virtual_userdelivery
2012-05-21 15:00:03 1SWXpp-0006Np-1L Completed

Ni lui ou moi n’utilisons de logiciel antipourriel sur nos ordinateurs et rien dans mes fichiers journaux n’indique que mon serveur a bloqué une tentative de livraison pour quelque raison que ce soit.

Cette situation est très étrange et j’invite d’autres personnes à faire des tests pour confirmer l’existence du problème. Considérant le climat politique actuel et la nature du site qui semble être bloqué, cette situation me rend très inconfortable et il serait souhaitable que quelqu’un de chez Vidéotron clarifie la situation. Je suis prêt à fournir les fichiers journaux avec toute l’information présente s’ils en ont besoin pour éclaircir la situation.

Mise à jour 19h50: Vidéotron ont publié plusieurs messages via leur compte Twitter disant qu’ils ne bloquent pas de messages de manière intentionnelle. Possiblement un problème d’antispam.

Mise à jour 20h: Je viens de refaire les mêmes tests et mes messages ont passé. Le problème semble donc avoir été réglé.

Mise à jour 21h: Vidéotron viennent de publier cette explication sur leur page Facebook: Compte tenu du volume inhabituel de courriels envoyés avec la mention “www.loi78.com”, nos systèmes automatisés de sécurité informatique ont mis en place des mesures de protection pour nos clients, identifiant à tort cette situation comme une opération d’envoi massif de pourriels. Nous sommes intervenus afin de modifier les paramètres et permettre la transmission normale des messages.

La situation est complètement rétablie depuis 19 h 30. Vidéotron s’excuse des inconvénients que cette situation a pu causer à ses clients.

Voir aussi

Hibernating in OSX Lion

September 23rd, 2011

In OSX Lion (might also be the case for older versions to), there is no direct way to hibernate a laptop except running out of battery power. The only available option is sleep, which will wake from memory; so it keeps draining the battery. It is possible to change this default behavior with the utility pmset. From the man page:

     We do not recommend modifying hibernation settings. Any changes you make are not supported. If you choose to do so anyway, we recommend
     using one of these three settings. For your sake and mine, please don't use anything other 0, 3, or 25.

     hibernatemode = 0 (binary 0000) by default on supported desktops. The system will not back memory up to persistent storage. The system must
     wake from the contents of memory; the system will lose context on power loss. This is, historically, plain old sleep.

     hibernatemode = 3 (binary 0011) by default on supported portables. The system will store a copy of memory to persistent storage (the disk),
     and will power memory during sleep. The system will wake from memory, unless a power loss forces it to restore from disk image.

     hibernatemode = 25 (binary 0001 1001) is only settable via pmset. The system will store a copy of memory to persistent storage (the disk),
     and will remove power to memory. The system will restore from disk image. If you want "hibernation" - slower sleeps, slower wakes, and bet-
     ter battery life, you should use this setting.

So by default, the system uses hibernatemode=3. All we need to do it change it to 25 and the sleep function will hibernate the computer:

sudo pmset hibernatemode 25

Don’t forget to change it back to 3 to get the default behavior back.

Efficient log processing

February 9th, 2011

I’ve recently learned a couple of neat tricks to process large amounts of text files more efficiently from my new co-worker @nicolaskruchten. Our use-case is efficiently going through tens of gigabytes of logs to extract specific lines and do some operation on them. Here are a couple of things we’ve done to speed things up.

Keep everything gziped

Often, the bottleneck will be IO. This is especially true on modern servers that have a lot of cores and ram. By keeping the files we want to process gziped, we can use zcat to directly read the compressed files and pipe the output to whichever script we need. This reduces the amount of data that needs to be read from the disk. For example:

zcat log.gz | grep pattern

If you’re piping into a Python script, you can easily loop over lines coming from the standard input by using the fileinput module, like this:

import fileinput
for line in fileinput.input():
    process(line)

Use parallel to use all available cores

GNU parallel is the coolest utility I’ve discovered recently. It allows you to execute a script that needs to act on a list of files in parallel. For example, suppose we have a list of 4 log files (exim_reject_1.gz, exim_reject_2.gz, etc) and that we need to extract the lines that contain gmail.com. We could run a grep on each of those files sequentially but if our machine has 4 cores, why not run all the greps at once? It can be done like this using parallel:

parallel -j4 "zcat {} | grep gmail.com" ::: exim_reject*.gz

Breaking down the previous command, we tell parallel to run, using 4 cores, the command zcat {} | grep gmail.com, where {} will be substituted with each of the files matching the selector exim_reject*.gz. Each resulting command from the substitutions of {} will be run in parallel.

What’s great about it is that you can also collect all the results from the parallel executions and pipe them into another command. We could for example decide to keep the resulting lines in a new file like this:

parallel -j4 "zcat {} | grep gmail.com" ::: exim_reject*.gz | gzip > results.txt.gz

Use a ramdisk

If you’ll be doing a lot of reading and writing to the disk on the same files and have lots of ram, you should consider using a ramdisk. Doing so will undoubtedly save you lots of IO time. On Linux, it is very easy to do. The following command would create an 8GB ramdisk:

sudo mount -t tmpfs -o size=8G,nr_inodes=1k,mode=777 tmpfs /media/ramdisk

In the end…

By using all the tricks above, we were able to considerably improve the overall runtime or our scripts. Well worth the time it took to refactor our initial naive pipeline.

64-bit Scientific Python on Windows

September 7th, 2010

Getting a 64-bit installation of Python with scientific packages on our dear Windows isn’t as simple as running an apt-get or port command. There is an official 64-bit Python build available but extensions like numpy, scipy or matplotlib only have official 32-bit builds. There are commercial distributions such as Enthought that offer all the packages built in 64-bit but at around 200$ per license, this was not an option for me.

Stumbled upon the Python Extension Packages for Windows page that contains dozens of extensions compiled for Python 2.5, 2.6 and 2.7 in 32 and 64 bits. With these packages, I was able to get a working installation in no time.

Boston Music Hackday

November 23rd, 2009

I was thrilled to attend the Boston Music Hackday this week-end. A lot of people hacked up some pretty cool projects, many of us coding until the very early morning Sunday (aka 4am), only to get back up a few hours later (aka 8am) to keep at it until the dreaded 15h45 deadline, when we all had to submit our demos. The organisers did a wonderful job and the event was a success at every level.

The hack I did was called the PartyLister. The goal was mainly trying to come up with a way to generate steerable playlists that would also be personalized for a group of people (ie.: taking into account each of their musical taste and making sure everyone gets a song he likes once in a while). Given the very limited amount of time available to hack this up, I had to keep things simple and so I decided to use only social tags to do all the similarity computation. I excepted the quality of the playlists would suffer but the goal was really to develop a way to include multiple listeners in the track selection process. The algorithm should then be used in conjunction with something like the playlist generation model I presented at this year’s ISMIR.

My hack: PartyLister

Imagine you’re hosting a party and using the PartyLister as DJ for the night. Each of your guests will need to supply the software with his last.fm username and we’ll be good to go.

We go out and fetch from the last.fm API the social tags associated with the artists (and their top tracks) that our listeners know about. We also use the EchoNest API to get similar artists so we can present new artists to our listeners. From a user’s top artists, we can create a tag cloud that represents the user’s general musical taste (UMT). We’re also allowing each user to specify a set of tags that represent their current musical taste using a steerable tag cloud.

Suppose you have 3 guests at your party, where two like pop and the other likes metal. By doing a naive combination of the users’ musical taste, we’ll probably end up playing pop music, leaving our metalhead friend bored. To solve this, I added a user weight term which is determined by looking at the last 5 songs that played and computing the average similarity between the user’s musical taste and those songs. If we’re only playing pop songs, the metalhead will have a very low similarity between his taste and what played and so we’ll increase his weight and lower the pop lovers’ weights. When we pick the next song, this weighting scheme will allow the metalhead’s taste to count more than the pop lovers’, even if there are more of them. This will make us play a more metal-like track. After a while the weights will equal out and we’ll start playing pop music again.

For sparseness reasons, I operated on artists instead of tracks. A simplified version how I weighted each candidate artist is below. Lambda is simply a knob to determine how much the users’ musical taste will count, cd() represents the cosine distance and UMT represents a combination of the user’s general musical taste and his steerable cloud.

The following plot represents a running average of the cosine distance (dissimilarity) between users’ musical taste and the last 5 songs that played. It represents a 160 songs playlist with 3 listeners in the system.

dave_paul_frank_160

As you can see, as a user’s running average increases, his weight is also increased so that we start playing more songs that fit his taste. His average then decreases as the other users’ weights go up forcing a return to music that fits their taste a little more. The plot shows that the system seems to be doing what we want, that is taking into account the musical taste of multiple users and playing music that each person will like once in a while. Integrated in a real playlist generation model, I believe this could produce interesting results.

I also played with a discovery setting, where users could specify if they wanted to discover new songs or stick to what they know. This was achieved by adding a bonus or penalizing each candidate’s score, based on the discovery setting (float between 0 and 1) and the proportion of users who knew (had already listened to) the artist in question.

PartyLister was not a very visually or sonically attractive hack like some of the others but I still managed to win a price based on popular vote. Thanks to all the great sponsors, there were a lot of prizes and so lots of winners.

Below is the Université de Montréal delegation, Mike Mandel (who also won a price for his Bowie S-S-S-Similarities) and myself, with our bounty.

P1020732

I really hope to attend another hackday soon as it was all a lot of fun. Time to go get some sleep now.

ISMIR 2009

November 1st, 2009

I had a paper accepted with an oral presentation at this year’s ISMIR held in Kobe, Japan. The paper is called Steerable Playlist Generation by Learning Song Similarity from Radio Station Playlists and is co-authored with Eck, Desjardins and Lamere. It outlines two new ideas:

  1. Using commercial radio station playlists to learn a similarity space from audio features
  2. Use a steerable tag cloud to allow the user to influence the playlist generation

Here is the abstract:

This paper presents an approach to generating steerable playlists. We first demonstrate a method for learning song transition probabilities from audio features extracted from songs played in professional radio station playlists. We then show that by using this learnt similarity function as a prior, we are able to generate steerable playlists by choosing the next song to play not simply based on that prior, but on a tag cloud that the user is able to manipulate to ex- press the high-level characteristics of the music he wishes to listen to.