Ubuntu - Auto-mount an encrypted drive

My new computer has a "small" SSD and a large HDD. Solid-State Drives are the popular choice for startup disks as they are blazing fast, while ordinary Hard-Disk Drives are excellent for long time storage.

[As an aside, don't ignore your backup strategy. I've written (and published) my own open-source backup utility.]

When I installed Ubuntu, I encrypted both drives, which is cool. However, when I started the computer for the first time, the HDD did not mount. Bummer.

I managed to semi-auto-mount the HDD with the Disks Utility (encryption options -> Unlock at system startup) and with Nautilus, but I still had to manually navigate to the HDD (in Nautilus) before I could work. Not good.

Recently, I solved this problem and I'm sharing the solution with you. It's not as hard as it seems.

First, you need some code to mount the HDD. This code will not work.

First, you need to create a mount point. Then you need to mount the HDD. Once you have the mount point created,…

Spaghetti code

Once upon a time, many years ago, a colleague came to me and asked me what I knew about a code-base I had never heard of. "Nothing", I replied. He told me it was urgent to get the code up and running again as it had broken down in February or March. It was July, I think.

I called upon another colleague who didn't work at the department anymore and he told me that the code was stored at an old desktop PC which had a post-it note attached: "Do not delete". He also told me that the programmers, who had left the company already, were incredible professionals and that he was impressed by the job they had done.

Long story short, we recovered the code from the PC and stored it in the cloud.

Then, I had the "privilege" to look at the code. It was not pretty.

If you know anything about Model-View-Controller, you know that it is a three tier philosophy meant to simplify code development. All security work is done by the Controller, all business logic is perform…

Setting up a HTTPS server in Python (WSGI)

The situation Setting up a HTTP server in Python is quite easy. You overload the handlers.CGIHandler class, and Bob's your uncle... You have to overload the run function, and that's about it.

def run(self, host='localhost', port=8000):# Initialize the server deamon# HTTPself._httpd = simple_server.make_server(host, port, self.__call__) print("Serving on port {0}...".format(port)) # Start the serverself._httpd.serve_forever()
Nothing to it, right?

So, you'd expect that setting up a HTTPS server would also be a piece of cake... but it isn't that straightforward. Luckily, for you, I have spent some time to make this easy as frig.

The idea is to make a SSL socket, and to do that, you have to use the wrap_socket command... but where?

Look at this line of code from the run function

self._httpd = simple_server.make_server(host, port, self.__call__)
When you open the simple_server package, you see that there's an optional server_class argument.


Optimizing date calculations

I wrote a naive little algorithm to calculate the end date of a scheduled event.
There are the following restraints:

Total number of hoursNumber of hours per dayWorkdays per weekSkip holidays
So, the pseudo-code looks like this:
While there are hours
    If it's a workday
         diminish the hour counter by the amount of hours per day
    Go to the next day
This works, but it's slow. Let's do this moar better!

New pseudo-code:
Hours / Hours per day                   ===> Days
Days / Workdays per week            ===> Weeks
(7 - workdays per week) * Weeks ===> More Days  Add the number of days to the initial date to get the end date.  Calculate the number of holidays in the range ===> Days  While there are days
    If it's a workday
         diminish the day counter by one
    Move the end date on day forward. This improved algorithm is 150 times faster than the original for 630 hours, 5 hours per day (or 126 days)

A simple way to show the 'cookie' warning

The European Union, apparently, has a cookie law. This "requires websites to get consent from visitors to store or retrieve" cookies.

There are some tools out there that allow you to add this message, but it's really simple to do this yourself with a little bit of Javascript.

The first thing to do is to add a <div> to your template's <body>

<div id="cookie_warning"> We use third party "cookies" for ... <input type="button" value="Accept" onclick="javascript:cookies(true);" /><input type="button" value="Deny" onclick="javascript:cookies(false);" /></div>  Next, we add a new rule to our .css file

#cookie_warning{display:none} We don't want to show this warning when people have Javascript deactivated.

Let's stop our cookies from travelling. Encapsulate the cookie code in a function:

function google_analytics() { (function(i,s,o,g,r,a,m){{i…

How I 'hacked' the Google App Engine

A couple of days ago, I published my microdata generator tool* which still has to be integrated with

The people at were very positive, and asked me if it would run on Google App Engine. I thought that would not be too problematic. Little did I know.

So, I jumped into the documentation and found the first surprise; Python2.7 instead of Python3.4. I had to downgrade my code. Not too traumatic. Change some libraries, change some lines of code. I had to redo the pickle file because that's incompatible.

I downloaded the SDK and set up everything. First error: no 'app'. Let's see...

app = webapp2.WSGIApplication([('/',MainPage),], debug=True)
Okay. I changed the MainPage into Controller.run_this, my tool's handler. Next error: run_this accepts three parameters, two given. Hmmm, I have to do something with the webapp2.RequestHandler. Not looking good.

Didn't I read somewhere that Google App Engine was using WSGI? My program is WSGI. It sh…

Bechamel / Velouté without clumps - my method

After years of preparing velouté for Dutch croquettes, I think I can explain how to prepare this sauce without getting lumps.

The secret is quite simple: don't mix in the liquid with the heat on.

Having said that, here's the method.

Heat the liquid. Milk for bechamel. Fond for velouté.Prepare a roux. Melt butter and add flour. Normally, the proportion is 1:1, but I use 1:1,5. The flour is the thickening agent. So, more flour - more thick. For a small batch, use 100g butter, 150g flour.Cook the roux thoroughly on a medium high flame. The roux will change colour and you'll see it becoming clearer. It will also start smelling nutty.Kill the heat and add the hot liquid slowly (in increments) while stirring with a ladle or whisk. Some prefer the whisk, I prefer the ladle.After adding all the liquid, turn the heat back on. Keep stirring and finish the sauce.

Clumps will only form if you have the heat on and you don't stir.