Thanks to TextExpander for sponsoring BrettTerpstra.com this week!
TextExpander takes the repetition out of your work so you can focus on what matters most.
Say goodbye to repetitive text entry, spelling and message errors, and trying to remember the right thing to say. When you use TextExpander, you can say the right thing in just a few keystrokes.
Better than copy and paste, better than scripts and templates, TextExpander snippets allow you to maximize your time by getting rid of the repetitive things you type — all while still customizing and personalizing your messages.
TextExpander can be used on any platform, in any app, anywhere you type.
Take your time back and increase your productivity.
Since I last wrote about it, Bunch has received a lot of updates. It remains my favorite thing to do between 5:30 and 8am.
Everything is still happening in the Bunch Beta releases, but I’ve redirected all Bunch web traffic to the new site where the beta download is the prominent button, so hopefully new users are more likely to be on the 1.4 beta than on the (now seriously behind) stable channel. I swear I’m very close to releasing the Beta as the public release, but I keep adding things that I want tested. The plan is to draw a line today, test existing features, then make a public 1.4 release in the next week or two. The beta will continue to be where I release new features, and you can stay on the beta channel indefinitely. I’ll make stable releases more often, so those who don’t choose the cutting edge won’t end up a year behind. Which is, of course, how betas are supposed to work.
I wrote a macOS Service way back in 2012 that I’ve used ever since. It allows you to write some text and include special placeholders, then select it and repeat the text, incrementing the placeholders with each iteration. I last updated it in 2014 with better indentation handling and zero-padding, but otherwise it hasn’t seen many changes. Until this morning.
Thanks to A Fine Start for sponsoring BrettTerpstra.com again this week! Embrace the hyperlink with a new tab page that focuses on what makes that web work!
Hyperlinks are awesome. The web wouldn’t even be a web without them. A Fine Start gives the almighty hyperlink the respect it deserves.
When you open a new browser tab, A Fine Start gives you a list of links that you control. You can add whatever links you want and group and sort them however you see fit.
But where are all the widgets and photos and inspirational quotes, you ask? Not here. Not in this new tab. This space is a pristine sanctuary for the textual hyperlink, unimpeded by the whims and tomfoolery of the “modern” web.
Open a new tab, get to your destination. It’s fast, it’s simple, and it feels right.
I wrote a tool called howzit a while back. It allows you to keep track of all of the build tools and procedures for any project in a Markdown file, and easily reference topics in your terminal with a command like howzit deploy. Over time it became a task runner, too, and eventually I even had it updating my MacBook Pro’s Touch Bar with available tasks as I changed directories. It’s definitely become part of my development toolkit.
I recently added a few new features to it that I thought made it worth mentioning again. Let me start by saying this, though: if you’re mostly looking for a good task runner, there are some great projects like mask and maid that you should also check out. Howzit really focuses on being an easy-to-reference notepad. That said, its capabilities as a task runner are also pretty complete.
Howzit now allows default configuration options to be stored in a config file. It writes the defaults to ~/.config/howzit/howzit.yaml, which can be easily opened in your editor by running howzit --edit-config. All of the command line flags that modify how output is displayed can be adjusted in that file.
Next, you can now use code blocks within your notes and make them executable. Just include a fenced code block with the language run:
execute some code
It will display as formatted code when you view your notes on the command line, but will execute as a script if you run with howzit -r.
Topic Matching Options
When you run howzit and specify a topic to display, it uses partial matching to display the nearest match to your argument. So howzit depl would display the section titled “Deploy.” Now you can change the matching configuration option to partial, beginswith, fuzzy, or exact. Fuzzy matching gets a bit over-eager if you have a lot of topic titles containing the same characters, but can be a nice shortcut, allowing howzit bld to match “Build.”
I noticed last week as I was working on show notes for Overtired #238 that SearchLink was returning raw search urls instead of the results I expected. I didn’t have time to look at it until this weekend, so I finished the show notes jumping back and forth between my editor and my web browser, like some kind of primitive beast. I think I have it sorted now, though, and I just published version 2.2.17 which should fix the issue. Download below or visit the project page.
If you have no idea what I’m talking about but do any writing for the web, do yourself a favor and check it out. I even made some tutorials for you. Out of all the tools I’ve created, it’s among my most loved. Like top three. Maybe top two. I’ll be honest, it might just be my favorite1.
If you’re curious: something changed in the way DuckDuckGo’s nginx server responds to header requests, so the location: line wasn’t showing up in a curl request. Which is baffling. It threw a curl: (3) URL using bad/illegal format or missing URL error every time I tried to curl -SsLI (follow redirects and return headers), yet would redirect properly if I left the -I (return just response headers) out. So now SearchLink is doing a full download of the destination page just to get the location headers, but it works.
(Hopefully someday there will be a search engine with an actual API that doesn’t require all of this hacking. Google used to have one but they canned it years ago and made scraping impossible. DuckDuckGo puts up with scraping, for now, but I really do hope they offer an actual search API someday, like they do with Instant Answers.)
Side Note: Pinboard Searches
Since we’re talking SearchLink, I’d like to point out a feature I added a while back but hadn’t used all that much until recently. If you add your Pinboard API key in the config file, you can search your Pinboard bookmarks and insert the URL for the top match with the !pb search type. I’ve been using this more as of late because Hook can now create a private Pinboard bookmark every time you hook a web page (or even just copy a Hook link). So now any time I hook a page that I know will be of interest in the future, it’s readily available to my SearchLink searches, offering a nice, finite set of possibilities that all but guarantees I’ll get the URL I was hoping for.
Well, I finally updated the Jekyll instance that runs this blog. If everything went to plan, this post will be the inauguration of a new era. One that looks a lot like the last era, hopefully.
My Jekyll install had been stuck in about 2012 because a lot of the custom plugins I’d written over the years required very specific versions of various libraries, and it was working, so it got left alone. Then I got an M1 Mac mini, and my very specific requirements became impossible.
Much of the transition to Apple Silicon is easy, thanks to most developer’s readiness1 combined with Rosetta and Universal Binary, but anyone who spends time on the command line will know that things are a little stickier once you get into your shell. After wrestling with Mackup, brew bundle, and dotbot for a weekend, I got things mostly working.
The Homebrew community has done a great job of updating brew formulae for ARM compilation, and I only had trouble with about 3% of my (fairly large) Brewfile when I installed it on the M1. (It does, however, install everything to /opt/homebrew instead of /usr/local/bin, so I had to update a few scripts here and there where I’d hardcoded paths. But easy enough.)
However, Node and Ruby are a little bit stickier. If you want the latest versions of either, no problem, the edge builds are fine on ARM. But if you need, say, Node 10 and Ruby 2.6.5 for something (like this blog), you’re in trouble. You can kind of work around the Node issue by launching Terminal (or iTerm) using Rosetta (Get Info -> Open Using Rosetta) and using the arch command to fake an Intel machine, but no such luck with Ruby. Big Sur on the M1 ships with Ruby 2.6.3. If you want to use another version, you can install 3.0.1. That’s it. That’s all that will actually build.
So I’ve been updating everything to use newer versions of the various tools. The last thing that was keeping me from letting go of my Intel MacBook Pro was this blog. (Well, that and Izotope plugins for Logic Pro X. I really miss the RX plugins — which crash Logic on the M1 — and hope they get their act together soon.) I spent the weekend rewriting Jekyll plugins, giving up a few that I didn’t really need anymore, and revamping some templates and scripts as needed to work with Jekyll 4.
I have a 2012 Mac mini that actually handles the final build/deploy of this site (I needed an always-on machine to handle post scheduling hackery). It takes that machine about 30 minutes to render this blog with about 2100 posts dating back to 2010. I had gotten used to it. Now, with Jekyll 4 on an M1 Mac mini, it builds in 3-4 minutes. And that’s with all the crazy plugins I wrote to create tag indexes, search tools, related posts, and myriad other shenanigans. Running without plugins, it builds in about 30 seconds. Not bad!
I haven’t had time to pore over the site thoroughly and see if anything broke that I didn’t account for. Everything I consider vital seems to be working. If you’re looking around and something seems amiss, please let me know!
I’ll post again soon with some news about the new job I started last week at Oracle, some cool new stuff in the Bunch beta, and some updates to other projects that I’ve squeezed in despite the whole corporate day job thing.
And then there’s me, who didn’t realize Marked 2 had reverted back to Intel-only after some library changes. Update forthcoming. ↩
Thanks to PDFpen for sponsoring BrettTerpstra.com this week!
If you’re searching for a powerful PDF editing tool for your Mac, iPad, or iPhone, look no further than PDFpen. Whether you’re on the road or at your desk, need advanced editing features or just want to sign and email back a contract, PDFpen has you covered.
PDFpen allows you to do the basics:
Sign and fill out forms
Correct typos in your PDF
OCR scan documents
Redact sensitive info
But it also does so much more:
Password protected documents
Sync with email, Dropbox and iCloud
All of this comes standard in PDFpen. PDFpenPro takes it even further to allow you to add permissions, turn websites into PDFs, and even integrate with DocuSign to sign or send documents easily and securely.
PDFpen and PDFpenPro work with PDFpen for iPad & iPhone for seamless editing across devices with cloud services such as iCloud, Dropbox, Google Drive, OneDrive, and more.
Web excursions brought to you in partnership with MindMeister, the best collaborative mind mapping software out there.
This is a very developer-centric excursions post. I spent too long looking at git utilities this week, so you get a bunch of links to cool git stuff I found. If you are, somehow, a developer who doesn’t care about git, be sure to check out the last link anyway.
I’ve been using diff-so-fancy with git for a long time, but recently discovered delta. It does way more, with in-line diffs, side-by-side view, and themed output. It even makes copying text out of a diff easier by removing the +/- by default.
A set of git utilities that works on top of your favorite workflow (e.g. git-flow) and provides high-level (but simpler) commands for creating and shipping feature branches. I especially like git town sync for updating your working feature branch with all changes from the develop branch and updating remotes in one command.
A git command that allows you to store secret information (credentials, etc.) as encrypted files in a repo. Automates ignoring the original and adding an encrypted copy. Allow others access based on public PGP keys.
Distributed, offline-first bug tracker embedded in git, with bridges for major bug tracking apps (GitHub, Gitlab, Jira, Launchpad). Stores tickets as git objects that can move with a repo without affecting history. It even has a GUI for terminal and a web view.