Welcome to the lab.

A Bunch update, and a Sublime Text package

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.

Some updates for howzit, Markdown notes for your projects

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.

Config File

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.

Code Blocks

Next, you can now use code blocks within your notes and make them executable. Just include a fenced code block with the language run:

```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.”

See the docs to learn more!

Just a SearchLink fix

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.

SearchLink v2.2.19

Generate Markdown links from web searches without leaving your editor.

Published 11/10/14.

Updated 05/15/21. Changelog

DonateMore info…

Nitty Gritty©

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.

  1. Don’t tell Marked 2, nvUltra, or Bunch, they all currently think they’re the favorite child. 

Catching up with progress

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.

  1. And then there’s me, who didn’t realize Marked 2 had reverted back to Intel-only after some library changes. Update forthcoming. 

Web Excursions for April 28, 2021

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.

dandavision/delta
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.
Git Town
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.
sobolevn/git-secret: A bash-tool to store your private data inside a git repository.
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.
MichaelMure/git-bug
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.
Mac Dev Survey 2021 Results | Tower Blog
The new Mac Dev Survey results are out. Turns out I’m in some smaller segments these days (I still use Sublime and everyone else uses VS Code). Fun results to look at, though (at least for devs).

Check out MindMeister and start brainstorming, collaborating, and boosting productivity.