Keeping a separate blog for journaling personal project work is becoming a bit of a hinderance. There’s always this uncertainty of where a post should go: it’s about my day but it’s about a side project but not really, so should it go here? Might be time to merge that blog into this one.

Update 21/5: I’ll keep them separate for the time being.

Full Width Notes In Obsidian

More custom styling of Obsidian today. This snippet turns off fixed-width display of notes, so that they can span the entire window. Useful if you’re dealing with a bunch of wide tables, as I am right now.

body {
    --file-line-width: 100%;
}

div.cm-sizer {
    margin-left: 0 !important;
    margin-right: 0 !important;
}

I wish I could say credit goes to ChatGPT, but the answer it gave wasn’t completely correct (although it was close). The way I got this was by enabling the developer tools β€” which you can do from the View menu β€” and just going through the HTML DOM to find the relevant CSS class. I guess this means that this’ll break the minute Obsidian decides to change their class names, but I guess we’ll cross that bridge when we come to it.

I’ve become so cynical of online service that I’ve been finding myself going to the pricing page whenever I’m evaluating something new. If I can’t find one, I get suspicious of how they’re able to support the service. Even if they have no ill intent, they need to keep the lights on somehow.

Did some Flutter development last night. Dart is such a weird language. Usually it’s really boring, maybe even too boring. But then you encounter something just bizarre. Like, if you format a DateTime as ISO-8601, the time-zone offset will not be included if the time-zone is not UTC. So strange.

I don’t do a lot of front-end JavaScript development. When I do, I tend to go towards something super lightweight like Stimulus or try to avoid using a framework altogether. But after looking at Svelte, and trying it out to build something simple, I think I can grow to like it.

It kills me that Stripe offers six test cards that simulate errors when attaching to a customer, yet only one test card that simulates payment failures once it’s attached.

I got a little bored today so I added task progress indicators to this Obsidian roadmap thing I built for work.

Screenshot of coloured rectangles next to a link with the text 'View In Jira' and below the heading 'Jira Tickets'
What the task progress indicators look like.

When a task is created, but is not yet scheduled, it appears as an outlined rectangle. It turns into a grey rectangle when it’s added to the sprint. It then changes colour as the task progresses through the software lifecycle; turning purple while it’s being developed, blue while it’s being tested, and finally green when it’s ready for release.

They’re implemented as embedded SVG images, added directly to the note much like the span element used for status labels.

Screenshot of the markup of the embedded SVG image next to the 'View In Jira' link
Move the insertion point over the the SVG image to edit the markup.

It’s nice being able to add embellishments like this. Obsidian treating notes as regular files on the file-system is a huge advantage for these sorts of automations. No need to learn how to make a plugin; just write a shell script1 that’ll output Markdown, schedule it to run a couple of times a day, and you’re good to go.


  1. The “shell script” is actually written in Go, using the really useful script package to simplify all the pipelining stuff. ↩︎

Trying to track down a bug this afternoon. Manage to reproduce it on my first attempt, which was great, until I tried again and was unable to induce the bug after that. Might be looking at a race condition, which is always fun to deal with.

πŸ”— Double-screen β€˜free’ TV will show you ads, even when not in use - Ars Technica

What would you be willing to do for a free TV? If the answer is hand over information about what you watch,[…] how much money your household makes, what food and brands you like, and your race and be subject to on-screen ads at any time, then Telly’s got the deal for you.

I understand that not everyone can afford a good TV, but the price here β€” tracking and a constant stream of ads β€” feels a bit too high. It occured to me that monitors can’t do this. If a company discovers that their monitor is tracking what the user is seeing, the manufacturer will get sued out of existance. Maybe having a monitor is the solution to a TV with zero tracking (they do need to be larger though). πŸ€”

It’ll also be funny to see how quickly people get into this and disable all the ad/tracking stuff. I’m betting it’ll be done within three months.

I’m finding it my Obsidian-based squad roadmap automations useful so I spent a little time on it this morning. I wanted the Jira status in the generated table to be more like the status label you find in Confluence. Obsidian Markdown doesn’t support this but I discovered that you can type span elements directly into a note, and it will be rendered as HTML.

So I’ve defined a bunch of status labels classes of various colours in a CSS file and included it as a snippet. To use them in the note, I just need to type out the following:

<span class="status">My status</span>

I’ve tried going with colours that worked well with the Obsidian colour scheme, using this online colour tool with some minor adjustments. This is the set I’ve come up with:

An Obsidian table with six status labels in the colours purple, red, amber, green, blue and grey

Looking at them now, I think the grey and red can be a little darker maybe, but otherwise they look pretty good to me.

They also look good in tables, which is what they’re designed for. I’ve set the white-space mode to no-wrap so that they occupy a single line in a table row. A long status label would cause the summary to wrap instead of the status label itself:

Example table of Jira tasks with their status labels

The CSS snippet is here, for anyone who wants it.

Back working on Micropub Checkin. Re-engineered the home page to now include a list of what would eventually be check-ins β€” both historical and soon to be published β€” complete with the check-in type emoji as the icon:

Main screen for Micropub Checkin
Main screen for Micropub Checkin

The same list of emoji icons now adorn the check-in type picker as well (except for the airplane one which seems to always be shown as what I can only describe as the β€œWingding” representation):

The check-in type picker
The check-in type picker

I went around a bit trying to work out how best to use these emojis icons in the leading slot of the ListTile widget. I expored trying to convert them to IconData, but it turns out just using a Text widget with a large font worked well. I wrapped in in a Widget type with a fixed font-size and so far it looks quite good, at least in the emulator:

class EmojiIcon extends StatelessWidget {
  final String emoji;

  const EmojiIcon({super.key, required this.emoji});

  Widget build(BuildContext context) {
    return Text(emoji, style: TextStyle(fontSize: 26.0));
  }
}

Also started working on a Cubit to handle state for the main page. I had a bit of trouble working ont where the soon-to-be database call to get the list of checkins should go in the cubit. After asking ChatGPT, it looks like the initializer is the best place for it:

class CheckinListCubit extends Cubit<CheckinListState> {

  CheckinListCubit(): super(LoadingCheckinListState()) {
    loadCheckinList();
  }

  void loadCheckinList() async {
    var listOfCheckins = await read_database(); 
    emit(FoundCheckinListState(checkins));
  }
}

I’ve got some scaffolding code in place to simulate this, and so far it seems to work.

I need to start working on the database layer and having the ability to edit and delete check-ins before they’re published. I think I’ll tackle that next.

This is your now monthly post about how I continue to be blown away by ChatGPT. I’ve been asking it questions all morning about how best to do something in Flutter and Dart, and it’s been coming up with answers that’s allowing me to produce better code at a faster pace. Phenomenal stuff.

Does this loading window really need to be modal?

The Android SDK Component Installer window showing installation of an emulator image at 47% through the download

Watched the Australian entry to the Eurovision Song Contest 2023: Promise, by Voyager. It’s good. It’s very good! Certainly the type of music that I prefer. Two thumbs up from me. πŸ‘πŸ‘

All the best to them in the competition. πŸ‡¦πŸ‡Ί

The Nexus 7: The Good Android Tablet

Telling that this article about the Nexus 7 came out during Google I/O this year.

The Nexus 7 was as close as Google (or, arguably, anyone) ever got to the platonic ideal of a small tablet. It was inexpensive but not cheap; it wasn’t underpowered; you didn’t have to put up with a mediocre low-resolution screen. It’s a balance Google rarely manages to get exactly right.

As a former owner of a Nexus 7, I must say that I found to be a quality table. In a world where the iPad ruled the roost, it was good to see some effort from Google in making a decent tablet for their operating system. It wasn’t top of the line, but it was the perfect device for reading eBooks and RSS feeds.

Were it not for the fact that the hardware was not being updated, I probably would’ve bought a second one when the one I had succumbed to old age. By then, Google moved to the Nexus 9, which I did buy; and despite the criticisms, found it to be decent enough for what I needed. Not that I pushed the hardware to its limit mind you: it was just more eBook and RSS reading.

That tablet eventually got so slow to be usable. This was early 2020, and by then, the writing was on the wall for Android tablets. I’ve decided to move over to the Apple ecosystem and acquire an iPad. It’s the tablet I’m currently using now, still going strong after three years.

In a way I feel for the Android team. Even ten years ago, it was obvious that Android software developers were not interest in making apps for tables. I’m not sure what would be different now. Google did try to get software devs to make tablet versions of their software, using their leverage over the Play Store and updating their own apps. But it wasn’t enough to move the needle in any way. And it was arguably easier to do it back then, when Android felt a little more important to Google. I get the feeling this importance is slipping a little.

As for me, I won’t be returning to the Android table ecosystem anytime soon.

Enjoying the Bike app, by Hog Bay Software. Good for those times when you need a bit of structure in what you’re working on, but not too much that the tool gets in the way.

Also rediscovered Fleetwood Mac, after a long pause since hearing it when I was a kid. Seems “Dreams” is the more popular one (I keep hearing it at the gym), but for myself, I just love the instrumentation of “Little Lies”. 🎡

Rediscovered Nigel Westlake’s Antarctica β€” Suit for guitar and orchestra. First heard it in Year 11 Music, when we had to study the score. Started listening to it again about a month ago. You’d want the version with the Tasmanian Symphony Orchestra. Slightly more refined than the original. 🎡

I’ve been finding myself doing less test driven development recently. I use to be… well, not “religious” about it, but it was definitely my preferred way of writing code for work. But now, I think I favour getting something working sooner, so I can test it and play around with it. Once I’m happy I can solidify the functionality with unit tests.

For code outside of work, you’d be lucky if I’d written tests for it at all (although I am getting better at this if the code is intended for others to run).

Kinda wish Go adopted the idea of explicitly nil types, similar to Kotlin or Swift. It’ll make the language less minimal, but the cost of minimalism is more boilerplate code. And after writing a bunch of it to traverse a structure in a nil-safe manner, it does make things a little less readable.