Matthew Lindfield Seager

Text Replacement Pro Tips

If you’re in the Apple ecosystem1, Text Replacements are a powerful tool on Mac and iOS/iPadOS. If you’re using both, you can even sync your text replacements between all your devices via iCloud.

Here’s some tips to help you make the most of them:

  1. Use a character that’s usually on the iOS soft keyboard as your shortcut prefix to make typing replacements easier. I use z or zz for most of mine but choose what works for you
  2. Enter your name (I have a long surname), company name, addresses or frequently used Google map links quickly:
    • zmlsMatthew Lindfield Seager
    • zacmeAcme Corporation LLC GmbH Pty Ltd
    • zaddw432 Cheerful Drive, Happyton NSW 2345 (My mnemonic is z address work)
    • zaddh123 Long Avenue, Pleasantville NSW 2222 (z address home)
    • zmapwhttps://maps.app.goo.gl/HYXmwHvjLGXzYvEU6 (z map work)
    • zmaphhttps://maps.app.goo.gl/NtFrs1Qzn5uv1z886 (z map home)
  3. Enter email addresses with ease e.g. replace@@e with matthew.lindfieldseager@example.com. Even if you don’t have a long name like me this can still be a timesaver (I have 5 email addresses set up this way)
  4. Type currency, unusual punctuation, keyboard shortcuts or symbols without having to look them up (or remember option key combinations on Mac):
    • zeuro, zbaht฿, etc (or use a code like zGBP£)
    • zdiv÷, zsqrt, etc
    • zcommand, zshift, ztab, etc
    • zsquare, -> (typing that last one felt a bit meta)
  5. Type an emoji or emoji sequence quickly e.g. replace zspew with 🥴🤢🤮 or zlove with 🥰😍😘
  6. Type complex (or simple) emoticons easily e.g. zshrug with ¯\_(ツ)_/¯
  7. Override autocorrect changes that you don’t like:
    • tata to be able to informally thank people (Note: The shortcut and replacement can be the same… Adding the “misspelling” to your dictionary might also help in this scenario)
    • Replace ;) with ;) to stop autocorrect changing it to 😉
    • Or replace ;) with 😘 if you want it to use a different winking emoji
    • I sometimes mistype “my” as “mu” on my phone but someone has that surname in my address book so it autocorrects to “Mu” instead of “my”. I have two autocorrects to fix this; mumy and Mu to Mu.
  8. On that note, replacements are case sensitive so you can have different expansions for the “same” text if that makes sense to you
  9. Type in information without having to memorise it or look it up each time:
    • Bank account details for friends to pay you back
    • Meeting codes for regular Zoom/Google meetings
    • Zoom passwords to take on host privileges
    • Wifi passwords to share with guests
    • Infrequently used phone numbers
    • Business registration numbers

Bonus tips:

  1. Build up your replacements slowly. Next time you have to look up some often used but rarely changing information, create a text replacement and use it a few times to build up your muscle memory
  2. Print out a cheat-sheet for yourself or colleagues if you use lots of replacements at work
  3. Export/import text replacements on macOS as a .plist file
    • Back them up in case you have iCloud problems
    • Share snippets with family or colleagues
    • Programatically create or update snippets
    • Parse the file to generate or update a cheat-sheet you can print out
  4. Not all text entry areas support text replacement. Here’s a workflow that might make sense sometimes (other times it will be quicker to just type it out manually) and doesn’t require you to lift your hands off the keyboard:
    • bring up a text field that will work (Spotlight) with command-space
    • type your shortcut (followed by space to expand it)
    • press delete to remove the space you just added (optional)
    • select all with command-a
    • cut or copy with command-z or command-c
    • escape to close Spotlight
    • paste with command-v
  5. If you need more capabilities, investigate power user tools like Alfred, Keyboard Maestro or TextExpander.

  1. If you’re not (only) in the Apple ecosystem, TextExpander is cross platform and has a teams plan that lets you share snippets with your colleagues. [return]

Microsoft have really upped their game in their efforts to repulse long-time Mac users. Apparently it isn’t enough to make their apps behave like visitors from another planet, now they are calling attention to their alienness in every way they can

Screenshot showing the Teams icon with a 'New' label permanently burned into it and the clunky app name 'Microsoft Teams (work or school)'

Took me quite a while to figure out how to access the records in a collection object returned by the restforce Gem

It implements Ruby’s Enumerable module so you can map/collect, reject, slice, inject, etc to your heart’s content.

Seems obvious in hindsight 🤦‍♂️

Aussie Banks - A before and after story

Changing banks in Australia is a hassle, but here’s a before and after story that might help persuade you to make the effort to switch.

Before

Without calling them out by name, let’s just say we were with a large, national Australian bank (perhaps we can call them nAb for short 😉). We had our mortgage with them along with a savings offset account and a credit card we paid off in full each month. They were our bank from late 2013 to late 2023.

Their mobile app was reasonable and they eventually came to the party and supported Apple Pay (despite pushing hard to avoid it for a while). We didn’t love their interest rate rises or fees (see below) but we didn’t think our overall experience could be much better anywhere else, banks are banks after all.

Interest Rates

When interest rates dropped, our big bank was slow to update its mortgage rates. When interest rates rose, they were quick to update their mortgage rates and they gave us no notice. The only way to find out about rate rises was to regularly log in and check through all the transactions for a routine looking transaction with a message like “Your interest rate is w% from xx/yy/zz”. Looking back, in a period where official interest rates rose by 3.5%, our mortgage rate went up by 4.69%. When I complained about the excessive rate rises with no clear notice, they told me that according to their general terms, they only need to disclose interest rate rises in a newspaper(!!!) and on our statements (which they only issue every 6 months). Not cool.

Fees

In theory we had low-fee (maybe even fee-free) accounts but in practice we got slugged regularly. Even after they abolished the $30 fee for overdrawn accounts, they found other ways to extract their pound of flesh and keep their record profits growing:

  • Purchase in USD? 3% International transaction fee (plus a poor exchange rate)
  • Use an ATM overseas? $5 flat fee PLUS 3% international transaction fee (and a poor exchange rate)
  • Scheduled transfer to credit card fails? $15 late payment fee (plus interest charges)

To add insult to injury, rather than send a message saying “your scheduled transfer is about to fail due to insufficient funds”, they would wait until the next day and send a message saying “your credit card payment is late”! They have the messaging infrastructure but it’s like they deliberately choose what messages to send to maximise customer fees and bank profits. 🤦‍♂️

After

Back in 2018 I signed up with a “neobank” called Up. They added a number of clever features over time like virtual cards, “round-ups”, savers, auto-splitting and more but when I signed up (during their closed beta) they didn’t offer joint accounts and they didn’t offer home loans. I basically only used them for their fee-free overseas transactions and for Apple Pay (until our main bank finally caved and added support in mid-2019).

Up steadily improved over the subsequent 5 years and when I took a look at them again in 2023 they had added a unique take on joint accounts (you can add a “Player 2” and have a mixture of individual and joint accounts) plus they offer a home loan with no fees and a very attractive interest rate. With those two blockers removed I checked with my wife (“Whatever makes sense to you dear”) and then took the plunge.

I sent my wife a link to join and a few minutes later I received an invite to be her “Player 2”, she had already signed up, verified her identity, opened a personal account and figured out how to invite me to open a joint account. I accepted and within seconds we had a new joint savings account and new virtual debit cards linked to that account. We then made a joint application to refinance our mortgage and the whole process was shockingly easy! It was all done online (mostly on my phone) and the only slight hiccough we encountered during the process was having to cancel our home insurance and get it re-issued in both our names.

Communication

I thought I was going to talk about rates and fees (which are both significantly better with Up) but it turns out the biggest difference I’ve noticed since we switched in October is around communication. That may sound a little nebulous but there’s been lots of little things like:

  • They placed a soft hold on one of our cards due to some suspicious transactions. They sent a push notification straight away and we were able to check the transactions and lift the hold straight away. We did it all in the app and without having to talk to support
  • When our home loan settled, we received a personal offer of help to understand how our home loan works and how to manage it in the app
  • Advance notice of interest rate changes!!! Once a few weeks before the change and then another message on the day of the change. Not only that but they list the old AND the new rates so you can see how much they’re changing them by
  • And, the thing that served as a catalyst to write this post, a push notification yesterday saying “You have a payment scheduled for tomorrow for $1,500 but there is only $700 in your account”

Thanks to the proactive communication, I don’t have to worry about sneaky rate rises, surprise fees or dodgy transactions. I can now rely on my bank to be honest, up-front and transparent. It’s a really refreshing change!

What are you waiting for?

I realise Up might not be suitable for everyone. Their offering suits us but our banking is quite straight forward. One thing that might be a deal breaker for some is that, as a neobank, they don’t have any branches. If you still deal with cash you’ll have to bank it at a post office. On the other hand, these days there’s more post offices than there are bank branches so maybe that’s not such a big deal?

They also don’t offer credit cards. For the time being we’ve kept our big bank credit card as a back-up in case we ever have problems with our Up debit cards but we haven’t used it in over a month and I suspect we’ll cancel it, probably the next time our old bank charges us an annual fee and we remember we still have it.

So, if neither of those are dealbreakers and you’re sick of your big bank, I encourage you to investigate Up (Aussies only sorry). If you decide to join, use my referral code and we will both get a $10 bonus. Or just sign up without it.

You don’t even have to go all-in straight away. I was a member for 5 years before we switched (almost) all our banking.

Enjoyed another Aussie crime novel by Chris Hammer: The Tilt 📚🎧

Well written as always and liked the way he introduced a new main character by crossing over with some supporting ones from the previous books.

Thoroughly enjoyed reading The Last Devil to Die by Richard Osman 📚

Finished Silver by Chris Hammer 🎙️📚

I’m enjoying listening to audio books while working on the house and grateful for our local library making the service available.

Finished reading: Scrublands by Chris Hammer 📚🎧

Changing the starting ID in a Rails app

While procrastinating working on a new Rails app, I didn’t want object IDs to start at 1 but neither did I want to deal with the various hassles of using a UUID instead of an integer for the ID. My compromise was to start the ID numbering with a multiple digit number.

This requires adding an execute statement (which is technically non-reversible) to your create_table migration:

class CreateUsers < ActiveRecord::Migration[7.1]
  def change
    create_table :users do |t|
      t.string :name, null: false
      t.string :email, null: false

      t.timestamps
    end

    reversible do |direction|
      direction.up do
        # Set the starting ID on the users table so IDs don't start at 1
        execute <<-SQL
          INSERT INTO sqlite_sequence ('name', 'seq') VALUES('users', 2345);
        SQL
      end

      direction.down do
        # Do nothing (entry is automatically removed when table is dropped)
      end
    end
  end
end

Note: The relevant sequence row gets dropped when the table gets dropped, so in this case there’s no need to define a down action. I’ve included an empty one anyway to make it clear this isn’t an oversight.

Now when I create my first user, their ID is 1 higher than the sequence I assigned… app.example.com/users/2346.

You can choose whatever starting number you want. If you’re running this on a different table, replace the ‘users’ portion with your own table name:

INSERT INTO sqlite_sequence ('name', 'seq') VALUES('<table>', 1734);

The above example is specific to SQLite (I’m using Litestack to simplify deployment) but presumably you could do something very similar with other databases.

I haven’t tested this but for PostgreSQL it should be as simple as changing the execute command above to:

SELECT setval('users_id_seq', 2345);
--            '<table>_id_seq' for other table names

If you try this with PostgreSQL, make you sure test the migration works in both directions.

Couldn’t figure out why ruby debug was crashing on one machine but another “identical” machine was fine. I was about to redact my username from the crash reports when I started to wonder about its length.

Sure enough, a username longer than 20 characters triggers the bug 🐛

Can sleep easy now 😝

The Voice

Australia will vote tomorrow on a modest proposal to give Aboriginal and Torres Strait Islander peoples a voice to the parliament and the executive “on matters relating to Aboriginal and Torres Strait Islander peoples”. Unfortunately, it looks like the No campaign has sown enough fear, uncertainty and doubt to prevent us from taking this small step forward as a federation.

Australia has a long and dark history when it comes to our treatment of our First Peoples. It wasn’t until 1967 that they were included in the census and it was just 40 short years ago, in 1983, that our First Peoples finally received equal voting rights and responsibilities, after more than 80 long years of being denied a fair go and pushed to the margins. The No campaign say that this proposed change introduces race into the constitution, while conveniently ignoring the fact that racial prejudice has been baked into our constitution and our culture from the very beginning.

Our First People’s have spent years gathering consensus on a reasonable path forward towards reform that might go some way towards a more just and equitable future after centuries of injustice. They are asking for voice, treaty and truth and more than 80% of First Nations people support the change we are voting on (according to the only large-scale, representative survey that has been published).

Tomorrow we have a chance to vote yes and do what Proverbs 31:8 says:

Speak out on behalf of the voiceless, and for the rights of all who are vulnerable.

In 1903, a member of the first Australian National Parliament stated that “it is impossible for the average aboriginal to understand any political question, or to vote with intelligence”. If the No vote succeeds tomorrow, I fear it will be because, 120 years later, that sentiment carries the day amongst a majority of Australians.

I’m enjoying the conversation, talks, food and location of RubyConf Thailand. Rubyists may even recognise a certain someone who gave the keynote talk, 30 years of Ruby History 🤩

Love that the organisers leaned into the “competition” with Rails World 😉

#rubyconfth

It’s not much to look at but I’m very glad for this little national treasure park just 5km from where we are living.

Final day (day 30) of #mbsept

(Is it cheating to use a collage?)

Collage of 3 photos of the tracks, pond and picnic shelters in our local national park

There’s a bit of a contrast between the undeveloped parts of our suburb and the new estates popping up

Day 29 of #mbsept

A small rural-looking road lined by trees leading up to a new(ish) housing estate

Combining a workout with a commute

Day 28 of #mbsept

Cyclists riding along the bike path towards Redfern station

This little guy just wants an embrace.

Day 27 of #mbsept

A small plush toy Dumbo sitting on a pillow

I love it when people build useful, thoughtful and bookmarkable tools like this highly configurable countdown timer. I was looking for a timer that would continue into the negatives; this one does that and so much more.

Don’t be put off by the plain appearance of the configuration page.

Treated myself to my beverage of choice in honour of today’s prompt.

Day 26 of #mbsept

A half-finished bottle of Coca Cola in front of a lawn and a hedge

Today’s prompt is flare, suggested by me. I suggested it because it has multiple meanings and I thought I might be able to take a creative shot but this is the best I could manage today.

Day 25 of #mbsept

The sun shining through the leaves of a native Australian tree above a terrace house in Redfern

Belt drive for the alternator (I think 😉) in our 2009 Hyundai Tucson.

This is the first time I’ve had a phone with more than one lens so I had some fun experimenting with different angles and zooms.

Day 24 of #mbsept

Internal shot of car engine compartment with tubes, pulleys and two belts

A Day/Date in the Life of Micro.blog:

Just finished at my local Parkrun. Pretty happy with a sub-24 time on a hilly course.

Day 23 of #mbsept

A selfie of me (41 year old male with a goatee wearing black running clothes and a white running cap) standing in front of Parkrun banners and other parkrun participants and volunteers

This new road near me seems to be nearing completion, although there’s still a lot of work to be done connecting it to the intersection.

(Took this photo before I saw today’s prompt 🙂)

Day 22 of #mbsept

A photo of an under-construction road, seen through the wires of a temporary fence

Fall, water, fall. (Can you tell I really struggled for inspiration today!? 😉 This was my backup photo in case I couldn’t think of anything else 🤷‍♂️)

Day 21 of #mbsept

Water falling from a shower head

A minor disruption

Day 20 of #mbsept

A line of orange road barriers used to set aside a construction area that is normally available for parking

Starting with the edge.

Day 19 of #mbsept

A jigsaw puzzle in the early stages of being solved, with all the edge pieces in but little else