inspired by https://github.com/phlipper/lpthw and http://learnpythonthehardway.org/book/