The Perfect Keyboard(s) (for me)
I’m not a keyboard snob. But I love using my current keyboards now.
Background: I was very happy with the Apple “chicklet” style keyboards and even wrote about it in Not the Clicky Keyboard. There I declared that clicky keyboards were not for me.
I was wrong. But I did not know it at the time.
A while back, my boss went on a buying bender and purchased a whole bunch of different keyboards, including the DAS and some Microsoft ones. I tried them out too. Neither of us liked any of them, so he returned them all. As a joke, I ordered the CODE keyboard to show that I could buy “better” keyboards than him, and fully expected to return it.
One-Key Format Presets in Scrivener

I am writing a lot of business documents in Scrivener, and even though it’s the wrong way to do it, I use Scrivener’s format presets (think paragraph styles) to quickly format headings, bulleted lists and paragraphs in each sub-document. This way I minimize post-processing (and the business format is intentionally boring so I do not need any fancy layouts).
But it’s a hassle to have to take my hands off the keyboard to click through the Format / Apply Formatting / Apply Preset menu tree or hit the tiny format preset dropdown ¶a to set the current paragraph style. What I want is a single key-combination to apply a preset style.
Merge Asana Projects into OmniFocus (Updated)

A long long time ago in a galaxy far far away, I wrote a script to import Asana tasks into Omnifocus. If you ran it again, it would update the tasks in OmniFocus. See Merge Asana Projects Into OmniFocus.
I recently updated the script to work a smidge better with Asana and Omnifocus 2. The main changes are:
- Date formats can be changed (for those of us not in the USA)
- The Non-Project tasks now load
Setup
First, follow the instructions from the original post to set up Omnifocus and get your API keys.
Seeing the Bigger Picture
It is quite astounding to me that an astonishing amount of work is done and code written without any knowledge, view or understanding of the bigger picture. And yet no-one seems to have taken the time to consider just how remarkably ridiculous this common situation is. How can people be expected to perform at their best and create the best products when they have no clue as to what the big picture or goal is?
Eliminating Google Analytics Referral Spam

It seems that the Google Analytics use of a public tracking code was a mistake. Anyone can use your tracking code on their site, which adds to your traffic, or they can create ghost visits and spam referrals by hammering Google Analytics with your code while never visiting your site. Oh, and the codes are easy to guess, so they do not even need to know about your site.
In most cases, this is perfectly harmless (IMHO) as only Google Analytics data is affected and your reports look funny. Your ad stats, if not Google, remain the same as they are independent.
StackOverflow Programming
StackOverflow Programming happens when much of the functionality of an application is copied and pasted from the code examples found on StackOverflow. Unfortunately, it’s becoming the most popular and common programming paradigm amongst younger programmers, leading to (1) shockingly shoddy, bug laden, slow, incomprehensible, unmaintainable programs that work only once, and (2) to programmers who do not understand what they are doing, their work and how to solve problems.
For example1, one of my interns came into my office this week to see if there was a way to do dates and times easily in C++. Java and C# both have easy Date Times classes, he said, why not C++? I told him C++ was a low-level language, and to use time_t and the std::chrono libraries like all C++ programmers do. Off he went.
Write Timestamps containing Milliseconds to MongoDB in C++11
It took me several hours today to figure this one out, so I thought I’d write it up lest I forget.
I have a C++11 application that rapidly writes new documents to a MongoDB instance and I need high-resolution timestamps to determine the order things were written.
The problem is that the C++ standard time_t structure reports in seconds, so
builder.appendTimeT("updated_at",
std::chrono::system_clock::to_time_t(std::chrono::system_clock::now())
);
creates an ISODate without milliseconds in MongoDB.
There are many solutions to be found using Boost::time1, but since my code needs to be dependency-free and pure, I needed a C++11 clean solution.
CodeRunner 2

Nikolai Krill released a major update to CodeRunner today, and I highly recommend it to all programmers no matter what languages you use.
In my case I write a lot of code in C++, Objective-C, Ruby, Javascript and HTML as part of large, complex projects. Often I am unsure how best to write a snippet or function. One way would be to create a branch in the project, run and experiment, deal with compiling, branch again to try another solution, compile some more and work it out. But that is a slow process (and quite dangerous if you leave these experimental branches in, or forget to branch at all).
What to write about next?
I was asked in a blog comment today how I decide what to write about. And once decided, how do I go about doing it. In this case, the answer was easy, I decided to try to answer the question. And deconstruct the process I go through as it happens.
Instructions: Read this post in black font first, then come back and look at the gray which deconstructs my thinking.
Every story needs a starting point, I added the next paragraph in the second iteration of the post to create some context. And maybe to establish some kind of credentials and an authoritative tone. Why would you, the reader who does not know me, care how I answer this question. My goal was to show you that my answer to this question evolved, that it was not taught. And that I was surprised to find out I have been doing this for 10 years already.
Lose the WWW
I have finally removed the www from hiltmon.com. The 1990’s have passed and www no longer makes sense in URL’s. Maybe it’s time you did the same to your site too.
What triggered this change was that, as of 14 October 2014, Google Analytics started throwing an error if you had links to www.yoursite.com and yoursite.com. This is because it treated links with www and without as different.
Removing the www was easy. I used Global Search and Replace (⇧⌘F in TextMate 2) to find //www.hiltmon and replace it with //hiltmon. Then regenerated the site.
