Posts

A recipe for failure

 I've recently created an account at a freelance agency to get requests. Very nice. So far, the technologies potential clients have listed are outside my skill set, but something is bound to come my way. Recently, I got the weirdest request: "Build a website similar to this Youtube video in three months with the technology you choose." With the available information, I just deleted the email. This is not something I want to think about as it's a recipe for failure: The scope is ill-defined. The technology is undefined. The team is nonexistent. The pay is undefined. The time restraint is unrealistic. If you should accept a job like this, you would have to: Design and create the website (and the security). Design and create the database. Create a functional analysis. Code, debug and test the code. You expose yourself to all kinds of trouble. As the scope is ill-defined, you risk not getting paid. Also, the people who wrote the job description are not interested in IT.

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 cr

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

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 # HTTP self ._httpd = simple_server.make_server(host, port, self . __call__ ) print ( "Serving on port {0}..." .format(port)) # Start the server self ._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  p

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 hours Number of hours per day Workdays per week Skip 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: functi

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