Google Maps still displays many ghost Tube trains, at least at unusual hours, despite the TfL app and public API being far more accurate. The ghost trains may exist on the timetable, but you would think Maps could verify with live data considering I wrote a (very minimal) app to do so in a few days.
Now that I’m reviving my blog, I decided to change up the theme and settled on one that seems to tick most of the boxes I was looking for (credit to Tufte). I got it to a perfect score on PageSpeed Insights just by tweaking a few HTML attributes mostly for accessibility. The joys of a static site!
Spending a few weeks trying Swift (and SwiftUI)
Spending a few weeks using Swift last month was surprisingly refreshing after a long while of mostly working in Python. Some thoughts that come to mind, not at all comprehensive: Relatively sane typing: I could parse a JSON string and know what I ended up with on my first attempt, inference allows for cleaner code without sacrificing type safety much at all (e.g. static properties/enums can be passed without type), any other things that saved me a lot of debugging time
Trying out Unified Payments Interface
Trying UPI (Unified Payments Interface, the instant payment system in India) for the first time feels, in its present state, like a poster child for federation with all its benefits and drawbacks. It’s not clear at first glance that some clients/banks are interoperable, but things seem to work together a bit better than you would expect if you can get past that confusion. To be fair, I’d be glad if Matrix/ActivityPub were more widely used and client UX was the biggest problem we had.
Why, WhatsApp?
The promise of WhatsApp local backups, almost necessitated due to the unencrypted nature of its Google Drive backups (easily recovered with a purpose-built parsing tool), seems alluring at first glance. While the functionality is referenced throughout the app as well as on their FAQ page answering this very question, things don’t exactly work as written, to say the least. Well, it’d be hard to do so, considering the answer to the FAQ leaves out numerous details that would be required for a submission in an elementary software engineering course.
Converting Audible books
Disclaimer: I did not create the software referenced here, and I link to the original authors of the projects (to whom I am grateful) throughout. Also, this is intended purely for removing the DRM on books that you have purchased for your own personal use, which I do so that I may access my books on a portable device while running. This is a very succinct guide on converting Audible’s proprietary .
Clojure web server tutorial
(This tutorial is incomplete, but was first given in its complete form as a talk at a Michigan Hackers event on 2015-07-23. See my slides here. I have explained the first portion of the content here in more depth.) I will start by talking about some basics of Clojure, then move onto explaining the fundamental purpose of a backend in web development, and finish with a demo of a simple web app (with complete code) that you can deploy to Heroku with a one-click button or try out on another platform of your choice.
Git hook for static sites hosted on S3
It’s a surprisingly simple process to setup S3 syncing with a static site generator with source that you sync using Git. This will allow you to track revision history on your actual writing of posts, etc. while having the generated site automatically deployed on S3 on each push. All you really need is: A way to upload a folder to S3 (I use the excellent s3cmd) A hook that triggers the upload on every git push For example, if your static site generator is hugo, with destination dir public (like Hugo by default) and your S3 bucket is called <example_bucket>, create a new shell script called pre-push in the .