My rating system

Whenever I read something (novels, manga, etc; really anything that I track in Calibre), I always rank it on a five-star scale to indicate that I’m done with it. I know some people like to use half-stars or even hundred-point scales and I’ve always found that to be too granular for something which is ultimately not really all that objective or scientific.

The main purpose of this scale is to help me a way to help me decide whether to continue a series, recommend it to friends, etc. I’m posting it here so I can link to it in other posts where it might be relevant.

Without further ado…

Continue reading →

How I fixed my listening comprehension

I used to have a really hard time understanding spoken Japanese, despite being (at the time) fairly comfortable with reading. I remember thinking I could improve by watching anime with Japanese subtitles, but if there was any benefit it must have been pretty minimal, and I realized eventually that I was just giving myself more practice reading, but when I tried watching without any subtitles at all, I just got frustrated and confused.

Fortunately I happened to hear about Subs2SRS around that time, which is a really cool tool that turns videos into flashcards by reading subtitle files. I didn’t exactly want to add a whole new SRS routine into my study routine, so I came up with a low-impact method that helped me out a lot in just a short amount of time.

Continue reading →

Thinking about the old internet

I used to be a huge fan of Spiderman when I was a kid. The Sam Raimi movie was my first introduction to the character, as well as one of my first exposures to what comic books could be (the DVD release came with a digital copy of Spider Man Blue #1 and Black Cat #1, both of which were quite a shock to the system). My family never got the newspaper, but when we would visit my grandparents I would always have a drawer full of comic pages waiting for me (my grandma, bless her heart, would collect them and set them aside) and I would spend hours cutting out the Spiderman strips and pasting them into a handmade paper album. Maybe it was just a combination of my general attraction to comic books and the fact that Spiderman was the only example that was remotely accessible, but the mythos had its hooks in deep for quite some time.

I had a favorite website around this time. I can’t remember for the life of me how I found it in the first place, but I still remember the url offhand — “”, aka “Eric’s Spiderman Homepage“, as preserved by the miraculous Internet Archive. It wasn’t even a dedicated site — the actual homepage appears to be some kind of ecommerce site or consultancy business — just a subdomain that some guy decided to devote to writing about his interests.

I think about Eric’s site from time to time but it really came back to me recently thanks to Wordle. It’s currently somewhat of a sensation, which is in no small part due to the clever way in which it displays your result when you solve a puzzle, which starts off inscrutable and quickly strikes home once you play it for the first time.

Something I found fascinating about Wordle is that it in less than a year since its launch, it had managed to become a daily routine for a huge number of people worldwide. Less than a week after I personally found it, @wordlestats was reporting 80k players, and two months later that number is over 300k. In an internet which has become so commodified and platform-driven, it’s amazing to see a subdomain on some random guy’s homepage become so huge.

Of course, as I write this, the link above will instead redirect to the New York Times, who purchased Wordle for a “low-seven-figure sum” and no doubt plan to monetize it or at the very least leverage it to attract a new audience to their other word games. The creator says it’s a perfect fit, and I have to say: props to him for getting his payout. But I feel a bit disappointed that this is the way things have gone. Wordle was a small independent website that managed to permeate the zeitgeist for a few months before being gobbled up by a big company and consolidated. The fact that the thousands-long word list had to be audited to remove potentially offensive words is just the icing on the cake.

There’s a lot of buzz these days about how “decentralization is the future”, which is one of those statements where I agree with all the words but not what people mean when they say it. This kind of line is always tied up with the push for Web 3, which is of course in reference to the distributed redundancy features built into blockchain applications. There might be some use case for a massively redundant database (blockchain or otherwise), but just because something is widely distributed around the world doesn’t make the internet more open or more interesting. In fact, the distributed nature of Blockchain is, is for my money, the single least interesting and desirable type of decentralization.

I’m certainly no hardline social media zealot (I spend a lot of time on Discord and stay somewhat active on Twitter), but the universal move towards centralized platforms doesn’t strike me as such a great thing. I’d like to see more Wordles and Eric’s Spiderman Homepages out there. I have a few blogs and webcomics I check daily and I wish that list was longer. Keeping a blog is a lot of fun, even if nobody reads it. It’s nice to be in charge of when your website theme changes and it’s empowering to know that you retain full ownership of everything you post.

The old internet was weird and interesting. I wish it would come back for real this time.

Blog update

For the past nearly three years (thanks to the magic of backdating) I’ve averaged more than one post per week due to my Japanese reading reports, but since I don’t post about other stuff nearly as often, they’ve ended up taking over the entire feed. I’ve been thinking of posting more regularly, so starting today my reading reports will be filtered from the main page. They’ll still be available from the link above or through the category in the navigation bar.

Calibre “read next” query

I read a lot, and a common problem I have is keeping track of the series I’m currently reading. For a while I’ve toyed with the idea of writing a Calibre plugin that would allow me to see books that belong to a series which I’ve started but haven’t caught up with (I rate books as I finish them, but parsing my library at a glance to see what comes next is difficult). Today I found the Multi-Column Search plugin and it turns out to have exactly what I need to solve this problem: a freeform SQLite field.

select id from (
  select *,
    row_number() over(
      partition by series order by series_index asc
    ) row_num
  from (
    select, bsl.series, b.series_index, r.rating
    from books b
    inner join books_series_link bsl on =
    left join books_ratings_link brl on =
    left join ratings r on brl.rating =
  ) where rating is null
where row_num = 1 and series_index > 1

This script will filter the library to include the next unread (unrated) book in your library from each series that has at least one book that has been rated. It’s a little uglier than I would have liked, since I had to use one long query instead of CTEs, and I would have liked to be able to return them in order (maybe by overall average score), but due to limitations in the plugin this is as good as it’s going to get. Even so, I can tell it’s going to be super useful.

YMD Revisited

In Year, Month, Day, I explained an annoying problem with Javascript dates, and outlined the solution I took to avoid it in Moyase (which only needs to deal with dates in local time, and shouldn’t care if you move your device across timezones). Well, as it turns out, even this solution was not foolproof, and I totally should have seen it coming.

See, Date.toISOString() does indeed return a pretty nicely-formatted string that I can carve up and use for date components…the (obvious, in retrospect) problem is that it gives it to you in UTC time with a timezone offset, which can very well be a totally different calendar day than in local time. I probably would have never noticed this until I found myself on the other side of the world at some point in the future, or happened to be working in the app very early in the morning, so I’m very lucky to have a friend in Australia as an early adopter; she noticed that at certain times in the day, her work would be counted towards the previous day and her calendar wouldn’t display the right dates.

The fix ended up being pretty simple; instead of this:

return date.toISOString().substr(10);

I went with this instead:

return [
    String(date.getFullYear()).padStart(4, '0'),
    String(date.getMonth() + 1).padStart(2, '0'),
    String(date.getDate()).padStart(2, '0'),

With this, the app works correctly no matter the timezone or time of day. Hopefully this is the last time I have to think about this problem.

Sekiro’s straw doll

A youtuber I follow recently uploaded the video below. There’s an “unsolved mystery” regarding the writing on a talisman that features in the model, but a bit of digging around on Japanese internet led me to some interesting discoveries. The following text was originally posted as a comment on the video itself, but I figured I would preserve it on my own blog as well since it involved a decent amount of research.

The “writing” on the talisman has its roots in Daoist magic (符籙 in Chinese, 呪符 in Japanese; English wikipedia has an article on it called “Fulu”), where the symbols are basically formed from kanji components but don’t actually make up real characters at all. These talismans are usually written in seal script, which ranges from “I can read it if I squint” to “how the heck is that supposed to be the same character”, but even so, the writing here is really more like drawing ; while it does contain valid characters like 竜 (dragon) and 王 (king), they aren’t arranged in such a way to suggest that they’re intended to either produce composite kanji nor that they should be interpreted on their own. There are also some other characters which are likely chosen for their appearance alone, like the one that looks like 丑 missing its bottom stroke, or 弗, which can be taken to mean “dollar” but considering the time period I think it’s more likely just the right-hand component of something like 沸. Other parts have no basis in writing at all, like the mirrored squiggles that extend from the bottom of the 田 character, or the cartouche that encloses the bottom two thirds.

Here’s a post (all in Japanese unfortunately) that has some interesting insights into this talisman and also some others that are found elsewhere in the game:

One other thing I’ll point out, is that this guy is definitely a wara-ningyou (lit. straw doll), but he’s not constructed in the typical way of tying together two straight bundles of straw. He’s actually made from a shimenawa, which is a type of rope which is used to cordon off sacred areas and provide protection from evil. The talisman itself (according to that link above) is a warding-against-evil type, though the author points out that depending on how the talisman is affixed, the effect can be reversed, resulting in an invitation for possession by an evil spirit. It’s not obvious which is the case here, but it’s an interesting thing to consider.

Translating Moyase with Deepl

I recently added localization support to Moyase and wrote a Japanese locale file to test it with. Just for fun, I thought I would take the translation strings and run them through a machine translation service to see how it fared. The results are not dramatically bad, but they definitely aren’t good.

Moyase’s localization files are available on Github. The Deepl translation I made for this video is available in my recycle bin.

Year Month Day

5…4…3…2…1…Happy New Year!

It’s midnight, January 1st, 2021. The ceremonial ball has dropped in Times Square and 2020 has just come to a close. As the festivities begin to wind down, your phone buzzes. It’s a text from your friend in Los Angeles.

“My wife just delivered our baby! It’s a boy!”

What is the baby’s birthday?

Continue reading →

Setting up a Kobo without logging in

My trusty Kobo Aura One recently died on me, and I replaced it with a Kobo Libra H2O, which…is honestly kind of a downgrade. I didn’t expect to like the physical buttons, but I’ve come around to them, and the screen is crisper, which makes reading small furigana easier, but the screen is also smaller and the storage size is pitiful (8gb compared to the 32gb I used to have, which is pretty important if you’re going to have a lot of manga on board). In any case…

The main thing I’ve been unhappy about with this new device is the fact that the database handling seems to be really flaky. I had my Aura for four years and never had a problem with it, but this new one has randomly corrupted its own database multiple times over the last few days. Since the only way to fix this is to reset the device and logging in is a hassle (especially since I don’t use any of the online features anyway), I wanted to figure out how to bypass the sign-in process entirely.

There are a few guides on the mobileread forums on how to set this up, but they’re all pretty old — the user database table was only five columns back then and it’s now at 27, which breaks the insert statements. Here’s an updated sqlite script that gets you into the device with minimal fuss, plus a little extra which blocks the analytics events (which seem to be the main culprit).

insert or replace into user
  (UserID, UserKey)
  ('-', '-');

drop index if exists analytics_events_timestamp;

create trigger if not exists delete_analytics
after insert on AnalyticsEvents begin
  delete from AnalyticsEvents;

The other steps are the same as ever:

  • Connect the ereader to your PC
  • Tap “Set up via USB” on the home screen
  • Download and run SqliteBrowser
  • Click “File/Open Database”, browse to your ereader, and select .kobo/KoboReader.sqlite
  • In the “Run SQL” tab, paste the above script and execute it by pressing F5 or clicking the play button
  • Click “File/Close Database” and save changes
  • Eject the ereader from your PC and disconnect it

You should be met with a fresh clean dashboard. One nice thing about this method is that the ereader never actually sees the internet, so it can’t download book suggestions. I recommend backing up the sqlite database after you set up your preferences (the calibre plugin Kobo Utilities can perform a backup automatically every time you connect the device, which is something I wish I had done much sooner).