Posts

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.

T…

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 schema.org.

The people at schema.org 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.

Linear Mortgage Calculation

Image
One of my clients asked me to do a Linear Mortgage Calculation. Not a big deal were it not that I could not find the mathematical formula for it. There are a number of online calculators, so 'they' know what's going on but 'they' don't want you to know*!

So, what's the deal? With a linear mortgage, also called a straight line mortgage, you pay back the same amount of  capital each period and therefore the same 'relative' amount of interest.

This Dutch graph explains it. 'Aflossing' is repayment. 'Rente' is interest.
So, how do you calculate this? It's relatively easy.

Loan (L) is 100.000€
Years (y) is 30
Interest (i) is 2%
Periods (p) is y*12 (months per year) is 360

Repayment (r) = L/p = 100.000/360 = 277,78€/month

The total amount of interest (t) = L*i*y =  100.000*0,02*30 = 60.000€

The first month, the interest you pay is t/p = 60.000/360 = 166.67€

Now we can solve the following equation.

r + first month interest = r + p * x
&…

Configuring Apache2 for multisite (localhost)

Apache2 is one of the most popular webservers out there. If you develop websites, you want to have WAMP (Windows, Apache, MySQL & PHP), MAMP (Mac ...), LAMP (Linux ...) on your development machine.

I have LAMP installed on a Virtual Machine I'm using for development.

First things first; unless you're an expert, don't configure Apache2 to serve as a webserver. There are hosting services out there that have professionals doing these configurations, and they get attacked by hackers

A friend asked me how to configure Apache2 for multisite development. I told him it was easy and then spend the whole morning figuring out how easy it is. It's not hard, just follow the following steps... in no particular order.

I'm supposing you already have one site up and running.
1. Activate the Virtual Host module     You can skip this if you already have more than one site

$ sudo a2enmod vhost_alias
2. Create a new configuration file from the default $ sudo cp /etc/apache2/sites-…