log.py from guixing's gist will update later.