Last year, I blogged about why I make my work calendar public. It is useful to have a public website where people can see if I'm free or busy. But the version I created relied on Google Calendar which, sadly, isn't that great. It doesn't look wonderful, especially on small screens, and is limited to only one calendar feed. So I used the mighty power of Open Source to build my own! …
Continue reading →
Many text based conversations threads can be visualised as a tree. This is a follow-up to yesterday's blog post about Twitter conversation trees. Mailing list archives often use nested <ul> to show a conversation. That's fine, but has the major drawback of not being interactive. There's no way to collapse a branch of a tree if you're not interested in that strand of the conversation. Older…
Continue reading →
It's quite popular to see high street shops names "Somesuch and Sons". Indeed, my grandparents ran "Eden & Sons" for many year. Much rarer is seeing "... & daughters". But, of course, the plural of anecdote is not data! The UK register of businesses - Companies House - has a pretty good search engine. Doing a search for AND SON returns 220,000 results. We use the singular because that…
Continue reading →
I'm hooking my solar panels up to Twitter! Installation Inverter Fronius provide a comprehensive API guide - I wish more companies did this. There are lots of unofficial libraries in a variety of different languages. I've written this code in Python3. This is a general tidy-up of the code I wrote several years ago. Here's how it works.... Every minute, the script runs from crontab. If it…
Continue reading →
I write book reviews on my blog. I also want to syndicate them to Goodreads. Sadly, Goodreads doesn't natively read the Schema.org markup I so carefully craft. So here's the scrap of code I use to syndicate my reviews. Goodreads API Keys Get your Keys from https://www.goodreads.com/api/keys You will also need to get OAuth tokens For this documentation, I'll use the example keys - please…
Continue reading →
This is a quick and dirty way to turn a DOI (Digital Object Identifiers for academic papers) into an HTML & Microdata citation. I use this to power my Citations page. Schema.org is a Microdata standard which allows machines to read your HTML and create semantic relations between documents. Here's a minimum viable citation: <blockquote itemprop="citation" itemscope…
Continue reading →
One of my favourite works of art is The Great Bear by Simon Patterson. At first glance, it appears to be a normal London Tube map. But look closer... Cool! But there is something about it which has always bothered me. Each Tube line represents a theme - therefore, a station at the intersection of multiple lines should be represented by someone who matches all of those themes. For example,…
Continue reading →
Amazon encourages developers to use Flask-Ask - the handy Python library for working with Alexa. Sadly, the project has been abandoned. They no longer take pull requests, you can't raise bugs against it, and the documentation is incomplete. So this is how I solved an annoying problem - how to get the name of a custom slot. Here's the code, with a fuller explanation afterwards. from flask…
Continue reading →
I rate every pint I taste using the Untappd app. Think of it like TripAdvisor for lager, stout, cider, bitter, and all manner of other beery goodness. Seriously, I've reviewed over 600 different drinks Recently, I decided to see if I could self-host my beer check-ins. The first step - extracting my own data from Untappd. Pay To Play If you become an Untappd Supporter for US$5 per month, you…
Continue reading →
I want to convert YouTube's auto-generated subtitles into a plain transcript. Why is this so hard? This blog post gives a more detailed explanation than my answer to this StackOverflow question. Here's what the subtitles look like when you view a video: And here's what the code which generates those subtitles looks like: 00:00:00.930 --> 00:00:03.080 align:start position:0% …
Continue reading →
Here's an interesting conundrum. My TV can automatically detect when 3D video is being played and offers to switch into 3D mode - but how does the detection work? This post will give you a few strategies for detecting 3D images using Python. Firstly, some terminology. 3D videos are usually saved either as Side-By-Side images, or Over-Under images. Colloquially known as H-SBS and H-OU. Here's …
Continue reading →
A quick tutorial in how to recover 3D information from your favourite 3D movies. In this example, we'll be using Star Wars - The Last Jedi. tl;dr? Here's the end result (this video is silent): https://shkspr.mobi/blog/wp-content/uploads/2018/04/walker-text.mp4 Grab the code on GitHub. Let's go! Take a screenshot of your favourite scene. Something with a clearly defined foreground and…
Continue reading →